如何在标题、内容或作者中搜索帖子?

时间:2014-12-24 作者:Gixty

我看了很多关于自定义元搜索的帖子和问题,但我想搜索帖子,如果搜索查询与作者姓名匹配,就包括这些帖子。

我已经想出了以下代码,但它不起作用。出于某种原因,它返回状态为“修订”的帖子

首先,我将三个函数连接到各自的挂钩上:

add_filter(\'posts_join\', \'custom_posts_join\' );
add_filter(\'posts_groupby\', \'custom_posts_groupby\' );
add_filter(\'posts_where\', \'custom_posts_where\' );
然后,我继续执行每个功能:

custom_posts_join

function custom_posts_join($join){
    global $wpdb;
    if( is_search() && !is_admin()) {

        $join .= " LEFT JOIN $wpdb->postmeta ON $wpdb->posts.ID = $wpdb->postmeta.post_id ";
    }
    return $join;
}

custom_posts_groupby

function custom_posts_groupby( $groupby ) {
    global $wpdb;
    if( is_search() && !is_admin()) {

        $groupby = "$wpdb->posts.ID";
    }
    return $groupby;
}

custom_posts_where

function custom_posts_where( $where = \'\' ){
    if ( is_search() && !is_admin()) {
        global $wpdb;

        $search = ( isset($_GET["s"]) ) ? sanitize_text_field($_GET["s"]) : false ;
        $search = (string)$search;

        $users = $wpdb->get_results( "SELECT user_id FROM $wpdb->usermeta WHERE meta_key = \'first_name\' AND meta_value = \'$search\'",OBJECT_K  );

        foreach ($users as $user)
        {
            $users_ids.=$user->user_id.\',\'; 
        }
        $users_ids = rtrim($users_ids, \',\');

        $where .= " AND ( ($wpdb->posts.post_author IN ({$users_ids})) 
               OR ($wpdb->posts.post_title LIKE \'$search\')
               OR ($wpdb->posts.post_content LIKE \'$search\') )
            AND $wpdb->posts.post_type = \'post\'
            AND $wpdb->posts.post_status = \'publish\'";  

        }
    return $where;
}

1 个回复
最合适的回答,由SO网友:Gixty 整理而成

经过一些艰苦的工作和研究,我终于想出了这个可行的解决方案。

请随时改进此代码并发布替代答案。出于某种原因,查询似乎运行了不止一次(在我的情况下是三到四次)。

这里,我用三个钩子,posts_search, posts_joinposts_groupby

作用custom_search_posts 允许您一起搜索术语和用户。

-搜索用户和术语。例如:如果有一篇标题为“金钱”的帖子,是由用户史密斯写的。你可以搜索Smith money,结果将在帖子中显示。注意:作者姓名必须排在术语之前。

-仅搜索用户(usermeta, first_namelast_name)

-仅搜索术语(仅在标题中)。

-您甚至可以一次搜索多个用户。

function custom_search_posts( $search, &$wp_query )
{
    global $wpdb;
    if ( empty( $search ) )
        return $search; // exit if search is empty

    $q = $wp_query->query_vars;
    $n = ! empty( $q[\'exact\'] ) ? \'\' : \'%\';
    $search = \'\';
    $searchand = \'\';

    add_filter(\'posts_join\', \'custom_posts_join\' );
    add_filter(\'posts_groupby\', \'custom_posts_groupby\' );   
    foreach ( (array) $q[\'search_terms\'] as $term ) {
      $user_args = array( 
       \'meta_query\' => array(
        \'relation\' => \'OR\',
          array(
            \'key\'     => \'first_name\',
            \'value\'   => $term,
            \'compare\' => \'LIKE\'
        ),
          array(
            \'key\'     => \'last_name\',
            \'value\'   => $term,
            \'compare\' => \'LIKE\'
        )
        ));
        $user_query = new WP_User_Query( $user_args );
        $users = $user_query ->get_results();
        $term = esc_sql( like_escape( $term ) );
        $search .= "{$searchand} $wpdb->posts.post_title LIKE \'{$n}{$term}{$n}\' ";
        if (!empty($users)) {
            foreach ($users as $user) {   
                $user_id = $user->ID;    
                $search .= " OR $wpdb->posts.post_author IN (\'{$user_id}\') ";           
            }                   
        }       

        $searchand = \' AND \';
    }
    if ( ! empty( $search ) ) {
        $search = " AND ({$search}) ";
        if ( ! is_user_logged_in() )
            $search .= " AND ($wpdb->posts.post_password = \'\') ";
    }

    $search .= " AND $wpdb->posts.post_type IN (\'post\')";
    $search .= " AND $wpdb->posts.post_status = \'publish\'";

    remove_filter(\'posts_join\', \'custom_posts_join\' );
    remove_filter(\'posts_groupby\', \'custom_posts_groupby\' );        
    return $search;
}
add_filter( \'posts_search\', \'custom_search_posts\', 500, 2 );
功能custom_posts_join 允许我们加入postmeta 在…上posts 按作者搜索帖子。

function custom_posts_join($join){
    global $wpdb;
    if( is_search() && !is_admin()) {
        $join .= " LEFT JOIN $wpdb->postmeta ON $wpdb->posts.ID = $wpdb->postmeta.post_id ";    
    }
    return $join;
}
功能custom_posts_groupby 现在我们分组postmetaposts 按职位ID

function custom_posts_groupby( $groupby ) {
    global $wpdb;
    if( is_search() && !is_admin()) {   
        $groupby = "$wpdb->posts.ID";
    }
    return $groupby;
}
我在通过mysql查询用户时遇到了一些问题,所以我改用WP\\u User\\u Query。

我希望有人来改进代码,主要是在性能方面。

EDIT:没有必要posts_joinposts_groupby 在这种情况下。

结束

相关推荐

关于共享主机上基于WordPress的大型MySQL数据库的帮助

我的WordPress数据库中有近50000篇帖子。该网站尚未上线,我在本地计算机上有数据。我在读关于WOrdpress的https://wordpress.org/plugins/hyperdb/ 可能有用的插件。然而,我不知道如何开始。我问了一位朋友,他建议我将数据库拆分,然后使用这样的插件“与”不同的数据库进行“对话”。例如,他建议我使用一个临时数据库/表从最近添加的帖子中提取帖子。临时数据库根据用户当前位置等发布帖子。您对运行大型数据库有何建议?