搜索自定义字段将删除POST_TITLE列上的搜索

时间:2022-01-18 作者:AdamJones

我在我们的WP admin中为管理员激活了以下自定义搜索

add_action(\'pre_get_posts\', \'query_custom_admin_search\', 21  );
function query_custom_admin_search( $wp_query ) {
    global $current_user;

    if( is_admin() ) {
        if (get_current_user_role()=="administrator"){
            if ( $wp_query->query[\'post_type\'] != "apartments" ){
                return;
            }else{
                $custom_fields = array("city","state_county",);
                $search_term = $wp_query->query_vars[\'s\'];
                
                if ( $search_term != \'\' ) {
                    $meta_query = array( \'relation\' => \'OR\' );
                    foreach( $custom_fields as $custom_field ) {
                        array_push( $meta_query, array(
                            \'key\' => $custom_field,
                            \'value\' => $search_term,
                            \'compare\' => \'LIKE\'
                        ));
                    }
                    $wp_query->set( \'meta_query\', $meta_query );
                };

                return;
            }
        }else{
            return;
        }
    }else{
        return;
    }
}
这将搜索我们需要检查的自定义元密钥,效果非常好。唯一的问题是,wp\\u posts表中的默认搜索列(如post\\u title)似乎不再被搜索。

如何在此查询中同时执行这两项操作?

2 个回复
最合适的回答,由SO网友:Sally CJ 整理而成

唯一的问题是,wp\\u poststable中的默认搜索列(如post\\u title)似乎不再被搜索。

他们实际上正在被搜索,但使用的运算符是AND 而不是OR 如中所示WHERE ( <search query> AND <meta query> ), 因此,如果搜索foo, 然后WordPress将搜索。。

包含foo 在帖子标题/内容/摘录中

  • 包含foo 在元数据中citystate_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)子句(joinwhere) 在当前查询中使用。

    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) 使过滤器正确应用(即不被插件或活动主题覆盖)。

    SO网友:tiago calado

    当不是admin时,尝试返回$wp\\u查询

    add_action(\'pre_get_posts\', \'query_custom_admin_search\', 21  );
    function query_custom_admin_search( $wp_query ) {
        global $current_user;
        if (current_user_can(\'administrator\' && is_admin()){
            if ( $wp_query->query[\'post_type\'] != "apartments" ){
                return;
            }else{
                $custom_fields = array("city","state_county",);
                $search_term = $wp_query->query_vars[\'s\'];
                if ( $search_term != \'\' ) {
                    $meta_query = array( \'relation\' => \'OR\' );
                    foreach( $custom_fields as $custom_field ) {
                        array_push( $meta_query, array(
                            \'key\' => $custom_field,
                            \'value\' => $search_term,
                            \'compare\' => \'LIKE\'
                        ));
                    }
                    $wp_query->set( \'meta_query\', $meta_query );
                }
                return;
            }
        }else{
            return $wp_query;
        }
    }
    

    相关推荐

    在将代码添加到函数后无法登录WordPress wp-admin。php

    我在函数末尾添加以下代码。php文件,用于根据自定义帖子的帖子标题填充分类法。问题是,当我添加代码时,尝试登录wp admin时会出现以下错误。非常感谢您能帮助我们弄清楚为什么会发生这种情况。Error:错误:由于意外输出,Cookie被阻止。有关帮助,请参阅此文档或尝试支持论坛。Code: <?php function update_custom_terms($post_id) { // only update terms if