1

WP クエリで表示するページのフィルタリングで問題が発生しました。

ページをフィルタリングするために、ACF(Advanced Custom Fieldsプラグイン - ただし、WPカスタムフィールドと同じように機能するので問題ありません)パラメータを使用して、カスタムフィールドのCodex WPクエリリファレンスを使用します。

「Multiple Custom Field Handling」の段落で、Codex は 2 つの条件を持つ例を取得しました。OR または AND 関係を使用できます。3番目の条件(配列)が得られるまで、私は両方のために働きます。

彼らは例を使用します:

    'relation' => 'OR',
      array(
       'key' => 'color',
       'value' => 'blue',
       'compare' => 'NOT LIKE'
      ),
      array(
       'key' => 'price',
       'value' => array( 20, 100 ),
       'type' => 'numeric',
       'compare' => 'BETWEEN'
      )

アレイは 2 つしかありません。3番目に置くと、何も表示されません。デバッグ モードでは、次のエラーが表示されます。

WordPress database error: [Lost connection to MySQL server during query]

AND を使用すると機能しますが、OR を使用する必要があります。残念ながら、MySQL が切断されます。WP と同じクエリを phpMySQL に問い合わせてみました。それは問題を引き起こします-phpMyAdminは同じことを言います:

Lost connection

何か案が?たぶん、フィルタリングに別のアプローチを試す必要がありますか?(多分私は分類法を使用する必要がありますか?)

私が使用するコードは次のとおりです。

$query_array = array('relation' => 'OR');
  array_push($query_array,
  array(
    'key' => 'filter1',
    'value' => 'value1',
    'compare' => 'LIKE'
  ),
  array(
    'key' => 'filter1',
    'value' => 'value2',
    'compare' => 'LIKE'
  ),
  array(
    'key' => 'filter1',
    'value' => 'value3',
    'compare' => 'LIKE'
  )
);

$args = array(
  'order' => $order_array,
  'meta_key' => $meta_key,
  'orderby'   => $orderby,
  'post_type' => 'page',
  'paged' => $paged,
  'post__in' => $postIDs,
  'posts_per_page' => 12,
  'paged' => get_query_var('paged'),
  'meta_query' => $query_array
);

query_posts($args);
?>

(もちろん $args の変数は設定されています)

なんで使えないのかわからない

'compare' => '='

しかし、おそらくそれが私が使用できない理由です:

$query_array = array('relation' => 'OR');
  array_push($query_array,
  array(
    'key' => 'filter1',
    'value' => array('value1', 'value2', 'value3'),
    'compare' => 'IN'
  )
);
4

1 に答える 1

1

あなたのコメントが私を助けたと言いたかっただけです。私はしばらくの間、非常によく似た問題に頭を悩ませていました。私も ACF を使用していますが、それを使用して、ある投稿タイプのアイテムを別のカスタム投稿タイプに添付するのは簡単でした。たとえば、Person_1 と Person_3 を「Project_A」に添付します。

これにより、特定のプロジェクトに関連付けられているユーザーを簡単に一覧表示できるようになりました。しかし、逆に同じことを行うようになると、どのプロジェクトがどのユーザーに関連付けられているかを示すために、大きな頭痛の種になりました.

あなたのコメントのおかげで、私は最終的にそれを理解しました-他の誰かが同じ問題を抱えている場合に備えて、ここに私の解決策を投稿します:

$args = array(
    'numberposts'   => -1,
    'post_type'     => 'project',
    'meta_query'    => array(
    'relation'      => 'IN',
        array(
            'key'       => 'people',
            'value'     => ';s:1:"' . $person->ID . '";',
            'compare'   => 'LIKE'
        )
    )
);

要するに、リピーター フィールドなどの ACF 値はシリアル化されるため、compare キーワードは「LIKE」である必要があり、値にコンテキストを追加して、誤ったリターンを排除しました。「1」のような ID を検索するだけで、 (間違った)投稿がたくさんありますが、「;s1;」一部は、指定された値がインデックス 1 にあることを保証します。これは、私の場合は正しいインデックスです。

そのため、ケースバイケースで微調整が必​​要になります。一致させようとしているものを var_dumping "get_post_meta($post->ID, 'people')" で検査すると、正しい値を取得するのに役立ちます。

于 2015-08-10T14:16:58.960 に答える