web-dev-qa-db-ja.com

WPクエリ引数 - タイトルまたはメタ値

Meta_valueまたはtitleでクエリする方法

Meta_valuesを設定すると、

$args['meta_query'] = array(
   'relation' => 'OR',
    array(
        'key' => 'model_name',
        'value' => $thesearch,
        'compare' => 'like'
    )
);

それらは自動的にANDとして追加されます。

この検索は次のようになります。

 WHERE title = 'Search' AND (model_name = 'Search' OR ...)

私は欲しい

WHERE title = 'Search' OR (model_name = 'Search' OR ...)
5
Bryan

meta_query引数のrelation部分は、 sub meta query間の関係を定義するためにのみ使用されることに注意してください。

あなたはこの設定を試すことができます:

$args = [ 
    '_meta_or_title' => $thesearch,   // Our new custom argument!
    'meta_query'    => [
        [
            'key'     => 'model_name',
            'value'   => $thesearch,
            'compare' => 'like'
        ]
    ],
];

meta OR title クエリを有効にするためにカスタム引数_meta_or_titleを導入しました。

これは以下のプラグインでサポートされています。

<?php
/**
 *  Plugin Name:   Meta OR Title query in WP_Query
 *  Description:   Activated through the '_meta_or_title' argument of WP_Query 
 *  Plugin URI:    http://wordpress.stackexchange.com/a/178492/26350
 *  Plugin Author: Birgir Erlendsson (birgire)
 *  Version:       0.0.1
 */

add_action( 'pre_get_posts', function( $q )
{
    if( $title = $q->get( '_meta_or_title' ) )
    {
        add_filter( 'get_meta_sql', function( $sql ) use ( $title )
        {
            global $wpdb;

            // Only run once:
            static $nr = 0; 
            if( 0 != $nr++ ) return $sql;

            // Modify WHERE part:
            $sql['where'] = sprintf(
                " AND ( %s OR %s ) ",
                $wpdb->prepare( "{$wpdb->posts}.post_title = '%s'", $title ),
                mb_substr( $sql['where'], 5, mb_strlen( $sql['where'] ) )
            );
            return $sql;
        });
    }
});
15
birgire