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' );
plugin-development
custom-field
wp-admin
search
jnthnclrk
fonte
fonte
Respostas:
Uma
GROUP BY
declaração pode agrupar suas postagens após oJOIN
. Para o Wordpress, você pode usar oposts_groupby
filtro.fonte
Obrigado pelo seu trabalho nisso, pessoal. Esse código me levou a maior parte do caminho até lá, mas usando o WP 3.8 eu estava recebendo um erro de tabela / alias não exclusivo do SQL, então fiz algumas alterações. Para que funcionasse na minha configuração, tive que definir um alias $ wpdb-> postmeta que foi usado na instrução JOIN. Também verifico apenas uma vez para ver se os ganchos devem ser usados para que eles não disparem toda vez. Espero que isso ajude alguém!
fonte