以自定义字段作为查询搜索帖子

时间:2018-04-27 作者:Edogawa Kudo

这有点难以解释,但我想你可以理解,如果我再详细阐述一下。。。

通常,当您在WordPress网站上搜索时,结果基于标题、内容、类别和标记。

我希望我的搜索能够浏览帖子并查看自定义字段。。。因此,如果用户搜索特定的自定义字段,假设我的帖子标题为“Blah”,我创建的字段名称为“Chocolate”,字段内容为“Cadbury”,那么当用户搜索“Cadbury”时,应该会显示帖子“Blah”。。。我知道像这样的插件很少<http://wordpress.org/plugins/relevanssi/> 但我最好不要用太多的插件和每件小事的插件来膨胀我的网站。。。

我对WordPress不是很在行,但我想wp\\u query可以完成这项工作。。。谢谢你的帮助

2 个回复
最合适的回答,由SO网友:Krzysiek Dróżdż 整理而成

解决这个问题的方法很少。。。

1。不要费心去使用Relevansi(或其他类似的插件)

你经常会听到使用许多插件是件坏事。这不完全是真的。只有当这些插件对资源的使用有很大影响时,这才是糟糕的。在这种情况下,相关性不会造成这种影响。

当然,插件还有另一个问题——你必须维护它们(更新等)。

2。使用posts\\u join和posts\\u where hooks这是解决问题的最简单方法。只需加入POST和POSTETA表,并添加WHERE子句,即可在适当的自定义字段中搜索您的值。

// Join with postmeta table
function mycf_search_join( $join ) {
    global $wpdb;

    if ( is_search() ) {    
        $join .= " LEFT JOIN {$wpdb->postmeta} mycfpm ON ({$wpdb->posts}.ID = mycfpm.post_id ";
    }

    return $join;
}
add_filter(\'posts_join\', \'mycf_search_join\' );

// Add where clauses
function mycf_search_where( $where ) {
    global $wpdb;

    if ( is_search() ) {
        $where = preg_replace(
            "/\\(\\s*".$wpdb->posts.".post_title\\s+LIKE\\s*(\\\'[^\\\']+\\\')\\s*\\)/",
            "({$wpdb->posts}.post_title LIKE $1) OR (mycfpm.meta_value LIKE $1)", $where );
    }

    return $where;
}
add_filter( \'posts_where\', \'mycf_search_where\' );

// Prevent duplicates
function cf_search_distinct( $distinct ) {
    global $wpdb;

    if ( is_search() ) {
        return \'DISTINCT\';
    }

    return $distinct;
}
add_filter( \'posts_distinct\', \'mycf_search_distinct\' );
这个解决方案唯一的问题是速度可能有点慢。尤其是如果您不想在所有自定义字段中搜索。

3。自定义CF索引也可以使用save_post 钩子创建类似索引的内容。保存帖子后,您将获得所有应可搜索的自定义字段,合并它们的值并另存为另一个自定义字段。

那么让我们假设CFs有一篇帖子:color=red, location=europe, name=john 所有这些都应该可以搜索。您可以获取这些值,用一些分隔符char/sequence(例如#)分隔它们,这样您就可以red#europe#john) 并将此字符串另存为新CF(我们称之为\\u CF\\u search\\u string)。

function mycf_prepare_search_index_cf( $post_id ) {
    if ( wp_is_post_revision( $post_id ) ) return;

    $meta_keys = array(\'cf_key1\', \'cf_key2\', \'cf_key3\');
    $search_string = \'\';
    foreach ( $meta_keys as $k ) {
        $search_string .= get_post_meta( $post_id, $k, true ) . \'#\';
    }
    update_post_meta( $post_id, \'_cf_search_string\', $search_string );
}
add_action( \'save_post\', \'mycf_prepare_search_index_cf\', 100, 1 );
然后可以使用2中的代码。只在这一个自定义字段中搜索,而不是全部字段,因此它将只添加一个联接,并且不会使DB查询期间要搜索的行相乘。

SO网友:Viktor Borítás

通过将自定义字段添加为meta_query-s转换为aWP_Query() 也可以执行以下操作:

$args = array(
        \'post_type\' => \'your_custom_post_type\', // for example

        \'meta_query\' => array(  
            \'relation\' => \'AND\',  //so you can add any number of arrays = CF fields
            array(
                \'key\' => \'Chocolate\',  //acf meta field name
                \'value\'   => $searched_term,  //e.g.:"Cadbury"
                \'compare\' => \'LIKE\',
            ),
            array(
                \'key\' => \'Your_another_custom_field\',
                \'value\'   => $searched_term2,
                \'compare\' => \'LIKE\', 
            ),
        ),         
    );

//then running the query
$the_query = new WP_Query( $args ); 

if ( $the_query->have_posts() ) {   
   <!-- your code in the loop -->
}

有关official Wordpress dev docs page about WP_Query.

结束

相关推荐

Twenty Seventeen search error

每当我在wordpress网站上搜索某个内容时,我都会得到以下错误:Fatal error: Uncaught Error: Call to undefined function get_exID() in /var/www/html/wp-content/themes/twentyseventeen/functions.php:360 Stack trace: #0 /var/www/html/wp-includes/class-wp-hook.php(298): twen