この管理クエリスニペットを改善して、非メタ検索で重複した結果が生成されないようにするにはどうすればよいですか?


11

私は管理者検索にメタデータを追加するコードスニペットをいじっています。

私が見つけた最高のスニペットは、この質問についてStefanoによって書かれました。

ただし、メタ以外の用語を検索すると、1つの厄介なバグがあるようです。

ここに私のローカル開発インストールからのいくつかのグラブがあります。2つのMySQLクエリを画面に出力しました。

テストに使用している単一のCPT投稿の表示

テストに使用している単一のCPT投稿の表示

これは期待どおりに機能し、管理者からメタデータを検索できるようにするコードです

これは期待どおりに機能し、管理者からメタデータを検索できるようにするコードです

残念ながら、コードは非メタ一致、この場合は投稿のタイトルに重複を作成します

残念ながら、コードは非メタ一致、この場合は投稿のタイトルに重複を作成します

デュープの投稿ステータス、投稿タイプ、投稿先祖を示すグラブ

デュープの投稿ステータス、投稿タイプ、投稿先祖を示すグラブ

これが私が実行しているコードです。基本的にはStefanoのコードと同じですが、クエリを機能させるための大まかな試みが行われています。

/*
 * Search custom fields from admin keyword searches
 */

function rel_search_join( $join ) {
    global $pagenow, $wpdb;
    if ( is_admin() && $pagenow == 'edit.php' && $_GET['post_type'] == 'listings' && $_GET['s'] != '') {    
        $join .= 'LEFT JOIN ' . $wpdb->postmeta . ' ON '. $wpdb->posts . '.ID = ' . $wpdb->postmeta . '.post_id ';
    }
    echo '<br><strong>JOIN</strong>: ';
    print_r ( $join );
    echo '<br>';
    return $join;
}
add_filter('posts_join', 'rel_search_join' );

function rel_search_where( $where ) {
    global $pagenow, $wpdb;
    if ( is_admin() && $pagenow == 'edit.php' && $_GET['post_type']=='listings' && $_GET['s'] != '' ) {
        $where = preg_replace( "/\(\s*".$wpdb->posts.".post_title\s+LIKE\s*(\'[^\']+\')\s*\)/", "(".$wpdb->posts.".post_title LIKE $1) OR (".$wpdb->postmeta.".meta_value LIKE $1)", $where );
        $where = str_replace( "OR wp_posts.post_status = 'pending'", "", $where );
        $where = str_replace( "OR wp_posts.post_status = 'private'", "", $where );
        $where = str_replace( "OR wp_posts.post_status = 'draft'", "", $where );
        $where = str_replace( "OR wp_posts.post_status = 'future'", "", $where );
    }
    echo '<br><strong>WHERE</strong>: ';
    print_r ( $where );
    echo '<br>';
    return $where;
}
add_filter( 'posts_where', 'rel_search_where' );  

多分それは改訂もリストしていますか?
passatgt 2013

保留中、プライベート、ドラフト、フューチャーを削除したので、公開済みのものだけを見ていたと思いました。リビジョンタイプに気づかなかった。
jnthnclrk 2013


列の1つで投稿タイプまたは投稿IDをprint_rしようとします。リビジョンは投稿タイプだと思うので、リビジョンを確認できる場合は、結果にも表示されます。しかし、リストの投稿タイプからの結果のみを表示していることも確認できるので、私は間違っていると思います。しかし、試してみる価値はあります:)
passatgt 2013

投稿ステータス、投稿タイプ、投稿先祖を含む新しいグラブを追加しました。
jnthnclrk 2013

回答:


11

GROUP BY声明缶グループの後にあなたの記事JOIN。Wordpressの場合、posts_groupbyフィルターを使用できます。

add_filter( 'posts_groupby', 'my_post_limits' );
function my_post_limits($groupby) {
    global $pagenow, $wpdb;
    if ( is_admin() && $pagenow == 'edit.php' && $_GET['post_type']=='listings' && $_GET['s'] != '' ) {
        $groupby = "$wpdb->posts.ID";
    }
    return $groupby;
}

4

これに関するあなたの仕事をありがとう、皆さん。このコードでほとんどの方法が得られましたが、WP 3.8を使用すると、SQLの一意でないテーブル/エイリアスエラーが発生したため、いくつか変更を加えました。それが私のセットアップで機能するためには、JOINステートメントで使用される$ wpdb-> postmetaエイリアスを設定する必要がありました。また、フックを使用して、毎回起動しないようにする必要があるかどうかを1回だけチェックします。これが誰かを助けることを願っています!

global $postmeta_alias, $is_specials_search;
$cpt_name = 'special';
$postmeta_alias = 'pdpm'; // Change this to whatever your custom post type is
$is_specials_search = is_admin() && $pagenow=='edit.php' && isset( $_GET['post_type'] ) && $_GET['post_type']==$cpt_name && isset( $_GET['s'] );

// Extend search to include 'description' field
if ( $is_specials_search ) {
  add_filter( 'posts_join',      'pd_description_search_join' );
  add_filter( 'posts_where',     'pd_description_search_where' );
  add_filter( 'posts_groupby',   'pd_search_dupe_fix' );
}

function pd_description_search_join ($join){
  global $pagenow, $wpdb, $postmeta_alias, $is_specials_search;

  if ( $is_specials_search )  
    $join .='LEFT JOIN '.$wpdb->postmeta. ' as ' . $postmeta_alias . ' ON '. $wpdb->posts . '.ID = ' . $postmeta_alias . '.post_id ';

  return $join;
} // END search_join

function pd_description_search_where( $where ){
  global $pagenow, $wpdb, $postmeta_alias, $is_specials_search;

  if ( $is_specials_search )
    $where = preg_replace(
     "/\(\s*".$wpdb->posts.".post_title\s+LIKE\s*(\'[^\']+\')\s*\)/",
     "(".$wpdb->posts.".post_title LIKE $1) OR (".$postmeta_alias.".meta_value LIKE $1)", $where );

  return $where;
} // END search_where

function pd_search_dupe_fix($groupby) {
    global $pagenow, $wpdb, $is_specials_search;

    if ( $is_specials_search )
      $groupby = "$wpdb->posts.ID";

    return $groupby;
} // END pd_search_dupe_fix
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.