2013-09-23 26 views
1

我在Wordpress中有一個搜索表單,它可以搜索自定義帖子類型中的所有帖子標題,內容和自定義字段。它不會被作者搜索。我希望搜索關鍵字與顯示名稱匹配,並輸出該作者的任何帖子。通過MySQL查詢獲取WordPress的用戶顯示名稱的帖子

這是我目前的代碼(它的display_name部分顯然是錯誤的,但說明了我想完成的)。除了通過display_name部分獲取帖子之外,一切都有效。任何幫助或指導表示讚賞:)

// Code originally modified 
// from http://www.deluxeblogtips.com/2012/04/search-all-custom-fields.html 

global $wpdb; 
// Gets the ?crs= search from the submitted form 
$keyword = sanitize_text_field($_GET['crs']); 
$keyword = '%' . like_escape($keyword) . '%'; 

// Search in all custom fields 
$post_ids_meta = $wpdb->get_col($wpdb->prepare(" 
    SELECT DISTINCT post_id FROM {$wpdb->postmeta} 
    WHERE meta_value LIKE '%s' 
", $keyword)); 

// Search in post_title and post_content 
$post_ids_post = $wpdb->get_col($wpdb->prepare(" 
    SELECT DISTINCT ID FROM {$wpdb->posts} 
    WHERE post_title LIKE '%s' 
    OR post_content LIKE '%s' 
", $keyword, $keyword)); 

// Search in User Table for Display Name 
// This is where I'm not sure what how to get the posts by display_name 
$post_ids_user = $wpdb->get_col($wpdb->prepare(" 
    SELECT DISTINCT post_id FROM {$wpdb->users} 
    WHERE display_name LIKE '%s' 
", $keyword)); 

$post_ids = array_merge($post_ids_meta, $post_ids_post, $post_ids_user); 

// Query arguments for WP_Query 
$args = array(
    'post_type' => 'courses', 
    'post_status' => 'publish', 
    'limit' => '', 
    'post__in' => $post_ids, 
); 
+0

據我所知,據我所知,應該寫成'%% keyword %%'。 ** %% **是轉義序列,並被解析爲**%**。 '$ wpdb-> prepare'會正確解析它。這是第一眼看到的。 – Rolice

+0

你是指這一部分?我不確定你指的是什麼或爲什麼它有幫助。對不起,我的知識缺乏:) '$ post_ids_user = $ wpdb-> get_col($ wpdb-> prepare(「 SELECT DISTINCT post_id FROM {$ wpdb-> users} WHERE display_name LIKE'%s' 」, $關鍵字));'' – Jerry

回答

2

有一件事我想建議,而不是運行多個查詢加入你的表,並在解決去

SELECT DISTINCT POST_ID FROM {$ wpdb- >用戶} WHERE DISPLAY_NAME LIKE「%s」的,這是錯誤的查詢,你不能從用戶表後的ID,職位和用戶的關係保持在職位表中的每個崗位包含post_author列用戶ID

試試這個

$post_ids = $wpdb->get_col($wpdb->prepare(" 
    SELECT p.ID FROM $wpdb->posts p 
INNER JOIN $wpdb->users u ON (p.`post_author` = u.`ID`) 
LEFT JOIN $wpdb->postmeta m ON (p.`ID`= m.`post_id`) 
WHERE (u.display_name LIKE '%s' OR p.post_title LIKE '%s' 
OR p.post_content LIKE '%s' OR m.meta_value LIKE '%s') 
GROUP BY p.`ID` 
", $keyword)); 

//print_r($post_ids); //you will get the post ids 
$post_ids=array_values(array_unique($post_ids)); 
+0

在一個搜索中完成所有操作將會非常棒 - 感謝您爲此提供指導。我刪除了//搜索所有自定義字段之前的所有內容//查詢WP_Query的參數,並將其替換爲您的代碼。對於輸出的數組,儘管如此,所有東西都有這個值:=> 1 – Jerry

+0

@Jerry對於'post__in',你需要一個像array一樣的數組('1','2'..)',只需從' $ post_ids'使用循環並獲取您的文章 –

+0

對不起,我不是更清楚我以前的評論。我有一個循環運行之後,正確使用數據。但是,當我使用上面編寫的代碼時,我沒有得到正確的結果。沒有結果,即使是正確的搜索。我創建了一個與我最初發布的代碼相比較的代碼演示。 www.permacourses.com/?crs=overflow是搜索的原始文件,www.permacourses.com/stack-overflow/?crs=overflow是您的搜索關鍵字溢出。結果在源代碼中是print_r'd。再次感謝您的時間! – Jerry

相關問題