Meta olmayan aramalarda yinelenen sonuçlar elde etmemek için bu yönetici sorgu snippet'ini nasıl geliştirebilirim?


11

Yönetici aramalarına meta veri ekleyen kod parçacıklarıyla oynuyorum.

Bulduğum en iyi snippet, Stefano tarafından bu soru üzerine yazıldı .

Ancak, meta olmayan terimler aranırken 1, can sıkıcı bir hata var gibi görünüyor.

İşte yerel geliştirici kurulumumdan bazı kapmalar. Ekrana 2 MySQL sorgusu yazdırdım.

Test etmek için kullandığım tek CPT gönderisinin görünümü

Test etmek için kullandığım tek CPT gönderisinin görünümü

Bu, beklendiği gibi çalışan ve yöneticiden meta verileri aramama izin veren kod

Bu, beklendiği gibi çalışan ve yöneticiden meta verileri aramama izin veren kod

Maalesef kod meta olmayan eşleşmelerde, bu durumda yazı başlığında kopyalar oluşturuyor

Maalesef kod meta olmayan eşleşmelerde, bu durumda yazı başlığında kopyalar oluşturuyor

Duplerin post durumunu, post tipini ve post atalarını gösteren bir yakalama

! Duplerin post durumunu, post tipini ve post atalarını gösteren bir yakalama

İşte ben kod çalışıyorum, temelde Stefano'nın aynı, ama benim sorgu çalışması yapmak için benim kaba girişimleri ile.

/*
 * 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' );  

Belki revizyonları da listeliyor?
passatgt

Sadece yayınlandığımı düşündüm, çünkü beklemedeki, özel, taslak ve geleceği kaldırdım. Bir düzeltme türü fark etmedim.
jnthnclrk

Hmmm, "düzeltmeler" durumu gibi görünmüyor: codex.wordpress.org/Post_Status
jnthnclrk

sütunların birinde yazı tipi veya yazı kimliği print_r deneyin, ben revizyonlar yazı türleri olduğunu düşünüyorum, bu yüzden revizyonları görebiliyorsanız, sonuçlarda da var. Ama aynı zamanda sadece listeler yazı tipi sonuçları görüntülemek görebilirsiniz, bu yüzden yanlış olduğumu düşünüyorum. Ama denemeye değer :)
passatgt

Posta durumları, posta türleri ve posta ataları ile yeni bir yaka eklendi.
jnthnclrk

Yanıtlar:


11

Bir GROUP BYifade, yayınlarınızı JOIN. Wordpress için posts_groupbyfiltreyi kullanabilirsiniz .

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

Bu konudaki çalışmalarınız için teşekkürler millet. Bu kod beni orada en çok yol var, ama WP 3.8 kullanarak bir SQL benzersiz olmayan tablo / diğer hata alıyordum, bu yüzden bazı değişiklikler yaptım. Benim kurulum üzerinde çalışması için JOIN deyiminde kullanılan bir $ wpdb-> postmeta diğer adı ayarlamak zorunda kaldı. Ayrıca, kancaların kullanılması gerekip gerekmediğini görmek için sadece bir kez kontrol ediyorum, böylece her seferinde ateş etmiyorlar. Umarım bu birine yardımcı olur!

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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.