Venho brincando com trechos de código que adicionam metadados às pesquisas de administrador.
O melhor trecho que encontrei foi escrito por Stefano sobre esta questão .
No entanto, parece ter um bug irritante ao pesquisar termos não meta.
Aqui estão algumas dicas da minha instalação local do desenvolvedor. Eu imprimi as 2 consultas MySQL na tela.
Visualização da postagem única de CPT que estou usando para testar
Este é o código que funciona como esperado e me permite pesquisar metadados do administrador
Infelizmente, o código cria duplicatas em correspondências não meta, neste caso no título da postagem
Uma garra mostrando o status da postagem, o tipo de postagem e os ancestrais das postagens
! Uma garra mostrando o status da postagem, o tipo de postagem e os ancestrais de dupes
Aqui está o código que estou executando, é basicamente o mesmo de Stefano, mas com minhas tentativas grosseiras de fazer a consulta funcionar.
/*
* 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' );