web-dev-qa-db-ja.com

ほぼ同じ2つのカスタムフィールドタイプ - 1つは機能しますが、もう1つは機能しません。何が原因ですか?

カスタム投稿タイプにメタ情報を追加するためにAdvanced Custom Fieldsを使用しています。ACFでは、2つの異なる「選択」ドロップダウンを作成しました。1つは「シリーズ」、もう1つは「分類」と呼ばれます。

このコードを使用して、 'series'という用語の 'Compilation'ですべての投稿を表示するためのクエリを実行します。

<?php 
    $args_post = array('post_type' => 'release', 'orderby' => '_custom', 'order' => 'ASC', 'posts_per_page' => -1, 'meta_query' => array(
        array(
            'key' => 'series',
            'value' => 'Compilation',
        ),
      ), 
    );

    $loop = new WP_Query($args_post);

    while ($loop->have_posts() ) : $loop->the_post();
    ?>
    <li><a href="<?php the_permalink(); ?>" title="<?php the_title_attribute(); ?>"><?php the_title(); ?></a></li>
<?php endwhile; ?>

そしてそれは正しい結果を完璧に表示します。

ただし、次のコードを使用して「分類」という用語「データ」でクエリを実行すると、

<?php 
    $args_post = array('post_type' => 'release', 'orderby' => '_custom', 'order' => 'ASC', 'posts_per_page' => -1, 'meta_query' => array(
        array(
            'key' => 'classification',
            'value' => 'Data',
        ),
      ), 
    );

    $loop = new WP_Query($args_post);

    while ($loop->have_posts() ) : $loop->the_post();
    ?>
    <li><a href="<?php the_permalink(); ?>" title="<?php the_title_attribute(); ?>"><?php the_title(); ?></a></li>
<?php endwhile; ?>

それからそれは何も返さない。私は各分野の他の用語でそれを試しました - 「分類」用語のどれも働かない間、「シリーズ」用語は完全に働きます。ページテンプレートを正しいページに適用するのを忘れたり、投稿を用語に関連付けたりするのを忘れるほど愚かなことをしていないことを再確認しましたが、すべてが想定どおりに行われます。私もダムタイプミスをチェックしましたが、すべてチェックします。

最初に「シリーズ」という用語を使用して投稿のコードを作成し、それをそのままコピーして貼り付け、その後「分類」の投稿と一致するようにメタキーと値を変更しました。コードは同じです。

ここで明らかな何かが足りないのですか。

UPDATE

それで私は私が行方不明だった明白な事柄を考え出しました。 「系列」という用語は単一の値にしかなれませんが、「分類」は複数の意味を可能にし、配列です。しかし、私はまだ正しい投稿を表示する方法を理解するようには思えません。行を'value' => array('Data'),に変更しましたが、実際には何も変更されていないようです。それがまったく正しいアプローチであるかどうかもわかりません。

1
rpbtz

以前の投稿 コードに欠けていたものを示しているので、最初から十分な検索を行っていないようです。

クエリに'compare' => 'LIKE'が欠けていると思った人は、コードは次のようになります。

$args_post = array('post_type' => 'release', 'orderby' => '_custom', 'order' => 'ASC', 'posts_per_page' => -1, 'meta_query' => array(
    array(
        'key' => 'classification',
        'value' => 'Data',
        'compare' => 'LIKE',
    ),
  ), 
);

すべてが今魅力のように働いています!

UPDATE

このソリューションは機能しますが、質問に対する@PieterGoosenのコメントに注意してください。

LIKE比較は実行に非常にコストがかかります。また、シリアル化されたデータは、実際には検索および順序付け操作を目的としていません。ここでの問題はLIKEにもあります。dotを検索すると、mydotdotdotcomも返されます。

LIKEコンパレーターが行うことは、多分INが行うようなコンパレーターのような正確な一致を検索しません。用語に一致する可能性のあるものを検索します。たとえば、dotのカスタムフィールド値を検索する場合、または例のDataのように言うと、同様のコンパレーターは、dataのシーケンスでこれらの4文字を含むすべてのものを検索して返すため、Datadata-miningdatabaseを返しますデータベースにこれらの4つの単語がある場合は、crappy-data。したがって、これによりLIKEの信頼性が非常に低くなります。そのため、シリアル化されたデータを避ける必要があります。

1
rpbtz