如何更改管理员搜索帖子字段?

时间:2012-03-08 作者:hannit cohen

我有一个自定义的帖子类型,其中包括许多自定义字段。我想将它们作为搜索目标添加到管理搜索。

目前管理员搜索只搜索内容和标题,我想它搜索这些自定义字段以及。

有没有办法做到这一点?

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

这是可能的,但您必须对实际查询进行一些处理。一如既往,愤怒的posts_clauses 过滤器开始工作:

function wpse_alter_posts_search( $pieces )
{
    global $wpdb;

    // Make the input save
    $search_string = like_escape( $_GET[\'s\'] );

    // Your new WHERE clause
    $where  = $wpdb->prepare(
        "$wpdb->postmeta.%s LIKE %s",
        \'YOUR_COLUMN\', // Should match your col name 1)
        "%{$search_string}%"
    );

    // Not sure if this exactly the same on your install 2)
    $pieces[\'where\'] = str_replace( \'AND (((\', "AND ((({$where} ", $pieces[\'where\'] );

    return $pieces;
}
add_filter( \'posts_clauses\', \'wpse_alter_posts_search\' );
<小时>

NOTES

<可能是您需要取消某些部件的序列化才能进行搜索$pieces 在更改查询之前(在$search_string 已收到)

SO网友:jordan314

凯撒的回答让我走上了正确的道路,但我必须加入postmeta 并添加分组依据。

现在like_escape$wpdb->esc_like. 代替[your_post_type] 与您的帖子类型和[your_postmeta_key] 使用元密钥:

//join postmeta for search
add_filter( \'posts_join\' , function($join){
    global $wpdb;
    if(is_search() && is_admin() && $_GET[\'post_type\'] == \'[your_post_type]\')
    {
     $join .= " LEFT JOIN $wpdb->postmeta ON $wpdb->posts.ID = $wpdb->postmeta.post_id ";
    }
     return $join;
});

//search [your_postmeta_key] for search string
add_filter( \'posts_where\', function( $where )
{
    global $wpdb;
    if(is_search() && is_admin() && $_GET[\'post_type\'] == \'[your_post_type]\')
    {
        $searchstring = \'%\' . $wpdb->esc_like( $_GET[\'s\'] ) . \'%\';
        //search [your_postmeta_key] as well
        $where .= $wpdb->prepare(" OR ($wpdb->postmeta.meta_key = \'[your_postmeta_key]\' AND $wpdb->postmeta.meta_value LIKE %s) ", $searchstring);   
    }
    return $where;
});

//group by post ID
add_filter( \'posts_groupby\', function ($groupby, $query) {

    global $wpdb;
    if(is_search() && is_admin() && $_GET[\'post_type\'] == \'[your_post_type]\')
    {
        $groupby = "{$wpdb->posts}.ID";
    }
    return $groupby;

}, 10, 2 );

结束