2016-05-10 9 views
1

私が所有している一部のウェブサイトでは、訪問者が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にあります。

ありがとうございます。

答えて

1

ここでは、meta_queryをクエリに追加するために使用するコードを示します。

$values_to_search = explode(',', $_GET[ $name ]); 
$meta_query = array('relation' => 'OR'); 
foreach ($values_to_search as $value) { 
    $meta_query[] = array(
     'key'  => $name, 
     'value'  => $value, 
     'compare' => 'LIKE', 
    ); 
} 

私はこれがなぜ機能し、以前の「解決策」がそうでなかったのか分かりません。アイデアがあれば教えてください!

+0

WordPressのデフォルトが「AND」関係になっているため、最初に結果が得られなかったようです。 明示的に関係を 'OR'に設定しているため、結果が表示されます。これは、どちらかのメタ値が見つかった場合に結果を返します。 –

関連する問題