2013-09-23 27 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

相关问题