【问题标题】:Get posts by Wordpress user display name via MySQL query通过 MySQL 查询按 Wordpress 用户显示名称获取帖子
【发布时间】:2013-09-23 18:26:33
【问题描述】:

我在 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,
);

【问题讨论】:

  • 据我所知,据我所知,它应该写成%%keyword%%%% 是转义序列,被解析为 %$wpdb->prepare 将正确解析它。这是第一眼。
  • 你的意思是在这个部分吗?我不确定你指的是什么或为什么它有帮助。抱歉我在这里缺乏知识 :) '$post_ids_user = $wpdb->get_col( $wpdb->prepare( " SELECT DISTINCT post_id FROM {$wpdb->users} WHERE display_name LIKE '%s' ", $keyword ) ) ;'

标签: php mysql wordpress


【解决方案1】:

我想建议的一件事不是运行多个查询,而是加入您的表并立即解决

从 {$wpdb->users} 中选择不同的 post_id WHERE display_name LIKE '%s' 这是错误的查询,您无法从 users 表中获取帖子 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));

【讨论】:

  • 在一次搜索中完成所有这些将是惊人的 - 感谢您指导我。我删除了从 //search all custom fields 到 // WP_Query 的查询参数之前的所有内容,并将其替换为您的代码。对于输出的数组,所有东西都有这个值:=> 1
  • @Jerry for post__in 你需要一个像 array('1','2'..) 这样的 id 数组,只需使用循环从 $post_ids 获取 id 并获取你的帖子
  • 抱歉,我之前的评论不太清楚。之后我有一个循环运行,它正确使用了数据。但是,当我使用您上面编写的代码时,我没有得到正确的结果。没有结果,即使是正确的搜索。与我最初发布的代码相比,我设置了您的代码演示。 www.permacourses.com/?crs=overflow 是原始的带有搜索的,而 www.permacourses.com/stack-overflow/?crs=overflow 是您的带有关键字溢出的搜索。结果在源代码中打印。再次感谢您抽出宝贵时间!
  • @Jerry 你能用循环显示你的整个代码,而不会看到任何我猜不出有什么问题的东西
  • 我在这里设置了一个 git repo,所以我不会不小心遗漏任何你需要的东西 :) github.com/jeryj/permacourses 你需要查看的文件名是 content-googlemap.php 和 content- googlemapstackoverflow.php。谢谢!
猜你喜欢
  • 1970-01-01
  • 2013-02-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-01
相关资源
最近更新 更多