web-dev-qa-db-ja.com

1つのカスタムフィールドで投稿を注文し、別のカスタムフィールドでそれらからフィルタリングする方法は?

私のWordPressブログには、カスタムフィールドで注文したりフィルタをかけたいイベントがあります。順序はカスタムフィールド "event_date_end"によって行われるべきです。これはまだ実行中のすべてのイベントが表示されることを意味します。

イベントを注文するには、2番目のカスタムフィールド "event_date_start"を使います。そのため、10日に始まり20日に終わるイベントは、20日まで表示されますが、10日から始まる他のすべてのイベントの隣に表示されます。

私は親テーマとしてThematicを使っているので、query_posts()関数を使って両方のルールをパラメータとして追加します。これが私がインデックスループで使う方法です:

function my_index_loop($content) {
    global $query_string;
    query_posts($query_string
    // filter by event_date_end
    ."&meta_key=event_date_end&meta_compare=>=&meta_value=".date('Y-m-d')
    // order by event_date_start
    ."&meta_key=event_date_start&orderby=meta_value&order=ASC"); 
}
add_filter('thematic_indexloop', 'my_index_loop');

これで、投稿は正しく順序付けされましたが、フィルターは "event_date_start"値に対しても行われます。そのため、昨日開始され続けているイベントは表示されません。

「フィルター」と「順序」の部分の順序を入れ替えると、すべてのイベントが表示されますが、10日から20日までのイベントは20日のすべてのイベントに配置されます。

自分でSQLでクエリを作成できることは知っていますが、それらはThematicと連携するのでしょうか。そして、どうやってアーカイブ、カテゴリ、タグリストの文を書く必要があるのでしょうか?

解決策

上記のページを読んだ後、私は以下の解決策を見つけました。私はいくつかの生のSQLを使用し、特定のループフィルタ内のフィルタを通してそれらを追加しなければなりませんでした。これらは私が追加した機能です:

function my_loop_where($where){
    global $wpdb;
    $where .= " AND pm_where.meta_value >= '".date('Y-m-d')."'";
    return $where;
}

function my_loop_join($join){
    global $wpdb;
    $join .= " LEFT JOIN " . $wpdb->postmeta . " AS pm_order ON (" . $wpdb->posts . ".ID = pm_order.post_id AND pm_order.meta_key = 'event_date_start')";
    $join .= " LEFT JOIN " . $wpdb->postmeta . " AS pm_where ON (" . $wpdb->posts . ".ID = pm_where.post_id AND pm_where.meta_key = 'event_date_end')";
    return $join;
}

function my_loop_order(){
    return 'pm_order.meta_value ASC';
}

そして、私は単にこれらの関数にフィルタを追加しただけではありません。インデックスループ:

function my_index_loop($content) {
    global $query_string;
    add_filter('posts_where', 'my_loop_where' );    
    add_filter('posts_join', 'my_loop_join' );
    add_filter('posts_orderby', 'my_loop_order' );
    query_posts($query_string . "&meta_key=event_date_end&meta_compare=>=&meta_value=".date('Y-m-d')/*."&meta_key=event_date_start&orderby=meta_value&order=ASC"*/);
}
add_filter('thematic_indexloop', 'my_index_loop');

これで、インデックスとカテゴリループでそのフィルタと順序を簡単に使用できますが、アーカイブページではデフォルトの "ログスタイル"フィルタと順序をそのまま使用できます。

1
2ndkauboy

同じmeta_keyパラメータを異なる値で2回設定していて、有効になるのは1つだけなので、これはうまくいきません。

生のクエリを構築するよりも、フィルタを使用してWP queryを変更することをお勧めします。 クエリの概要 ドキュメントには、modを挿入できるフックのリストがあります(最後に変更できるプラグイン ).

1
Rarst