唯一的问题是,wp\\u poststable中的默认搜索列(如post\\u title)似乎不再被搜索。
他们实际上正在被搜索,但使用的运算符是AND
而不是OR
如中所示WHERE ( <search query> AND <meta query> )
, 因此,如果搜索foo
, 然后WordPress将搜索。。
包含foo
在帖子标题/内容/摘录中
包含foo
在元数据中city
或state_county
因此,如果您想将操作员更改为OR
, i、 e.搜索帖子标题/内容/摘录or 然后,您可以尝试以下操作,只需在WHERE
条款:
此代码段修改元查询(以添加自定义字段),并设置一个用作标志的私有参数,如果为true,则我们将重新定位搜索查询。
add_action( \'pre_get_posts\', \'query_custom_admin_search\', 21 );
function query_custom_admin_search( $query ) {
// Check if the current user has the \'administrator\' role.
if ( ! in_array( \'administrator\', (array) wp_get_current_user()->roles ) ) {
return;
}
// Check if we\'re on the "Posts" page at wp-admin/edit.php?post_type=apartments
// and that a search keyword is set.
if ( ! is_admin() || ! $query->is_main_query() ||
\'edit-apartments\' !== get_current_screen()->id ||
! strlen( $query->get( \'s\' ) )
) {
return;
}
// Retrieve existing meta queries, if any.
$meta_query = (array) $query->get( \'meta_query\' );
// Define your custom fields (meta keys).
$custom_fields = array( \'city\', \'state_county\' );
// This is for your custom fields above.
$meta_query2 = array( \'relation\' => \'OR\' );
$s = $query->get( \'s\' );
foreach ( $custom_fields as $meta_key ) {
$meta_query2[] = array(
\'key\' => $meta_key,
\'value\' => $s,
\'compare\' => \'LIKE\',
);
}
// Add your meta query to the existing ones in $meta_query.
$meta_query[] = $meta_query2;
$query->set( \'meta_query\', $meta_query );
// Set a custom flag for the posts_search and posts_where.
$query->set( \'_search_OR\', true );
}
此代码段使用posts_search
hook “到”;“空”;将搜索查询存储在私有参数中后,我们将在posts_where
hook 重新定位搜索查询的位置。add_filter( \'posts_search\', \'wpse_401476_admin_posts_search\', 21, 2 );
function wpse_401476_admin_posts_search( $search, $query ) {
if ( $query->get( \'_search_OR\' ) ) {
$query->set( \'_search_SQL\', $search );
$search = \'\';
}
return $search;
}
现在,这个片段是重新定位搜索查询的片段。它使用WP_Meta_Query::get_sql()
检索元查询的(SQL)子句(join
和where
) 在当前查询中使用。add_filter( \'posts_where\', \'wpse_401476_admin_posts_where\', 21, 2 );
function wpse_401476_admin_posts_where( $where, $query ) {
if ( $query->get( \'_search_OR\' ) &&
$search = $query->get( \'_search_SQL\' )
) {
global $wpdb;
$clauses = $query->meta_query->get_sql( \'post\', $wpdb->posts, \'ID\', $query );
if ( ! empty( $clauses[\'where\'] ) ) {
$where2 = "( 1 $search ) OR ( 1 {$clauses[\'where\']} )";
$where = str_replace( $clauses[\'where\'], " AND ( $where2 )", $where );
$query->set( \'_search_SQL\', false );
$query->set( \'_search_OR\', false );
}
}
return $where;
}
因此,通过上述步骤,我们可以得到如下条件( ( 1 AND <search query> ) OR ( 1 AND <meta query> ) )
这相当于( <search query> OR <meta query> )
.尝试(&O);已在WordPress v5.8.3上测试。
注意:请使用上述片段,而不是问题中的片段。
只有当前用户具有administrator
角色,当前页面是管理中帖子的管理页面apartments
post类型,并且设置了搜索关键字,我还检查了当前查询/WP_Query
是主查询。
我用过21
作为优先级,因此您可能希望使用更大的数字(例如。100
) 使过滤器正确应用(即不被插件或活动主题覆盖)。