私が所有している一部のウェブサイトでは、訪問者がWordpress Archiveページの異なるAdvanced Custom Fieldsでフィルタリングできるようにしたいと考えています。このようなフィルタを作成するには、this tutorialを使用しました。高度なカスタムフィールドチェックボックスのクエリが機能しない
しかし、私が望むようにフィルタを動作させることができないようです。アーカイブページのコードは次のとおりです。
SELECT SQL_CALC_FOUND_ROWS wp_posts.ID
FROM wp_posts
INNER JOIN wp_term_relationships ON (wp_posts.ID = wp_term_relationships.object_id)
INNER JOIN wp_postmeta ON (wp_posts.ID = wp_postmeta.post_id)
WHERE 1 =1
AND (
wp_term_relationships.term_taxonomy_id
IN (2, 9, 11)
)
AND (
(
wp_postmeta.meta_key = 'payment_method'
AND CAST(wp_postmeta.meta_value AS CHAR)
IN (
'Delta', 'Visa'
)
)
)
AND wp_posts.post_type = 'post'
AND (
wp_posts.post_status = 'publish'
OR wp_posts.post_status = 'private'
)
GROUP BY wp_posts.ID
ORDER BY wp_posts.post_date DESC
LIMIT 0 , 100
しかし、このSQL文が0の結果を返します。
function my_pre_get_posts($query) {
// bail early if is in admin
if(is_admin()) {
return;
}
// get meta query
$meta_query = $query->get('meta_query');
// loop over filters
foreach($GLOBALS['my_query_filters'] as $key => $name) {
// continue if no values found in url
if(empty($_GET[ $name ])) {
continue;
}
// get the values for this filter
$value = explode(',', $_GET[ $name ]);
// append meta query
$meta_query[] = array(
'key' => $name,
'value' => $value,
'compare' => 'IN'
);
}
// update meta query
$query->set('meta_query', $meta_query);
//print_r($query);
echo $GLOBALS['wp_query']->request;
は、ここでは、実行中に吐き出すSQLコードです。私もこのクエリを実行しました:
SELECT *
FROM `wp_postmeta`
WHERE `meta_key` = 'payment_method'
LIMIT 0 , 30
これは結果を返します。これらの結果のメタ値は、次のようなものです。
a:3:{i:0;s:5:"Delta";i:1;s:4:"Visa";i:2;s:11:"Visa(debit)";}
生成されたクエリには問題がありますが、正確にはわかりません。誰かが私を助けてくれることを願っています。気づいても分かりませんが、コードの最初の部分を実行すると、トップメニューがロードされないので、テーマが崩れます。たとえば、payment_method = Deltaの場合、VisaはURLにあります。
ありがとうございます。
WordPressのデフォルトが「AND」関係になっているため、最初に結果が得られなかったようです。 明示的に関係を 'OR'に設定しているため、結果が表示されます。これは、どちらかのメタ値が見つかった場合に結果を返します。 –