메타가 아닌 검색에서 중복 결과가 생성되지 않도록이 관리 쿼리 스 니펫을 개선하려면 어떻게해야합니까?


11

관리자 검색에 메타 데이터를 추가하는 코드 스 니펫으로 놀고있었습니다.

내가 찾은 최고의 스 니펫은 Stefano 가이 질문에 대해 작성했습니다 .

그러나 메타가 아닌 용어를 검색 할 때 1 성가신 버그가있는 것으로 보입니다.

다음은 로컬 개발 설치에서 가져온 것입니다. 2 개의 MySQL 쿼리를 화면에 인쇄했습니다.

테스트에 사용중인 단일 CPT 게시물보기

테스트에 사용중인 단일 CPT 게시물보기

이것은 예상대로 작동하는 코드이며 관리자에서 메타 데이터를 검색 할 수 있습니다

이것은 예상대로 작동하는 코드이며 관리자에서 메타 데이터를 검색 할 수 있습니다

불행히도 코드는 메타가 아닌 일치 항목 (이 경우 게시물 제목)에 중복을 만듭니다

불행히도 코드는 메타가 아닌 일치 항목 (이 경우 게시물 제목)에 중복을 만듭니다

Dupe의 게시물 상태, 게시물 유형 및 게시물 조상을 보여주는 잡기

! Dupe의 게시물 상태, 게시물 유형 및 게시물 조상을 보여주는 잡기

다음은 내가 실행중인 코드입니다. 기본적으로 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

보류중인 개인, 초안 및 미래를 제거했기 때문에 게시 만보고 있다고 생각했습니다. 개정 유형을 보지 못했습니다.
jnthnclrk

흠, "개정"상태가 아닌 것 같습니다 : codex.wordpress.org/Post_Status
jnthnclrk

열 중 하나에서 게시물 유형 또는 게시물 ID를 print_r하려고하면 수정본이 게시물 유형이라고 생각하므로 개정판을 볼 수 있으면 결과에도 표시됩니다. 그러나 목록 게시물 유형의 결과 만 표시한다는 것을 알 수 있으므로 잘못된 것 같습니다. 그러나 시도해 볼만한 가치가 있습니다 :)
passatgt

게시물 상태, 게시물 유형 및 게시물 조상과 함께 새로운 횡령을 추가했습니다.
jnthnclrk

답변:


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 별칭을 설정해야했습니다. 또한 매번 발사되지 않도록 후크를 사용해야하는지 한 번만 확인합니다. 이것이 누군가를 돕기를 바랍니다!

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.