web-dev-qa-db-ja.com

Wordpressの税務クエリ使用演算子LIKE

カスタム投稿タイプに関連付けられている分類色があります。私はすべての投稿メタと分類法をテーブルにリストしています。検索値に一致する投稿を検索するためのオプションがテーブルにあります。

検索キーが入力されると、投稿を取得するためにajax呼び出しを行います。

これは、検索文字列に一致するすべての投稿を取得するためのクエリです。

function get_query_posts_custom($post_id,$start,$length)  {
    //get_posts arguments
    $args =  array(
        'post_type'     => 'custom_post',
        'post_status'   => array('publish'),
        'numberposts'   => $length,
        'offset'        => $start,
        'orderby'       => 'menu_order',
        'order'         => 'asc',
        'post_parent'   => $_product->id
    );


    //get custom post taxonomy
    $taxonomies = (array) maybe_unserialize(get_post_meta( $post_id, 'post_taxonomy', true));
    if(empty($attributes)) {
        $taxonomies = array();
    }

    $meta_keys  = array('type','code','key');       
    if(!empty($search)) {
        foreach($meta_keys as $meta_key) {
            $meta_query[] = array(
                        'key'   => $meta_key,
                        'value' => $search,
                        'compare'   => 'LIKE';
                    );

        }

        $args['meta_query'] = $meta_query;
        $tax_query = array();

        foreach($taxonomies as $taxonomy) {
            $tax_query  = array(
                'taxonomy'  =>  $taxonomy;
                'field' =>  'slug';
                'terms' =>  $search;
                'operator'  => 'LIKE';
            );
        }
        if(count($tax_query)) {
            $args['tax_query'] = $tax_query;
        }
    }
    $results    = get_posts($args);
            return $results;
}

分類法の検索文字列に一致する投稿を取得する方法

私はそれがtax_queryに許可されている演算子だけが 'IN、NOT IN、ORおよびAND'であると言っているワードプレス関数参照を検索しました)LIKE演算子を使用できますか?

1
B L Praveen

唯一の選択肢は、独自のSQLを posts_clauses filterに書き込むことです。ここでは、変更、追加、削除などが可能なJOINWHEREORDERなどの句の配列を取得します。

これについての1つのメジャーメジャーメモは、常にグローバルな$wpdbprepare 関数を使うことです。そして、それはあなたのすべてのあなたの素敵なデータを消毒します。あなたはあなたの検索語カスタムクエリを通してどんな種類の注入も許可したくありません。 :)

4
Eric Holmes

他の答えで述べたように、あなたは単にtax_queryを使ってLIKE_wise検索をすることはできません。

できることは、@ Eric Holmesによって提案されているようにフィルターを使用してSQLステートメントを変更することです。これは高度な手法です。あなたは自分がしていることを知る必要があります。あるいは、最初に(LIKEを使用して)分類用語をロードしてから実際の投稿をロードするという別のクエリを作成することもできます。

これは、LIKE$search変数との比較に一致する用語に関連する投稿をロードするための簡単なサンプルです。

//  load the terms using LIKE
$termIds = get_terms([
    'name__like' => $search,
    'fields' => 'ids'
]);


//  load the posts using the found term IDs
$posts = get_posts([
    'tax_query' => [
        'relation' => 'OR',
        [
            'taxonomy' => 'yourtaxonomy',
            'field' => 'id',
            'terms' => $termIds,
        ],
        [
            'taxonomy' => 'othertaxonomy',
            'field' => 'id',
            'terms' => $termIds,
        ],
    ],
]);
2
Arvid

WP_Tax_Query それぞれ WP_Query または get_posts() の分類パラメータは、operator引数には次のものだけを取ります。

'operator'文字列(オプション)
指定可能な値: 'AND'、 'IN'、または 'NOT IN'。
デフォルト値: 'IN'

そのため、LIKEoperatorとして使用することはできません。

1
Nicolai