web-dev-qa-db-ja.com

Wordpress 3.1の新しい "posts_clauses"フィルタの使い方は?

ちょうど3.1がクエリをカスタマイズするための新しいフィルタを追加したことに気づいた:posts_clauses。私が知ることができるのは、posts_whereやposts_joinのような別々のクエリフィルタを使う代わりに、それらすべてを一度に編集できるということです。誰かが新しい "posts_clauses"フィルタの使い方の例をあげることができるかどうか疑問に思いましたか?

6
Manny Fleurmond

以下は私がどこかで見つけたそしてそれを通過していた質問です。クエリの目的は、分類法に基づいて投稿を並べ替えることです。それで、私はコードを共有しているので、posts_clausesの使い方を理解するのに役立つかもしれません。

function color_clauses_mike( $clauses, $query ) {
global $wpdb;

if ( isset( $query->query['orderby'] ) && 'color' == $query->query['orderby'] ) {

    $clauses['join'] .= <<<SQL
LEFT OUTER JOIN {$wpdb->term_relationships} ON {$wpdb->posts}.ID={$wpdb->term_relationships}.object_id
LEFT OUTER JOIN {$wpdb->term_taxonomy} USING (term_taxonomy_id)
LEFT OUTER JOIN {$wpdb->terms} USING (term_id)
SQL;

    $clauses['where'] .= " AND (taxonomy = 'color' OR taxonomy IS NULL)";
    $clauses['groupby'] = "object_id";
    $clauses['orderby']  = "GROUP_CONCAT({$wpdb->terms}.name ORDER BY name ASC) ";
    $clauses['orderby'] .= ( 'ASC' == strtoupper( $query->get('order') ) ) ? 'ASC' : 'DESC';
}

return $clauses;
}
add_filter( 'posts_clauses', 'color_clauses_mike', 10, 2 );

ここで私は上記のクエリを見つけたソースです: http://scribu.net/wordpress/sortable-taxonomy-columns.html

6

Scribu/Hameedullahからの答えは優れた指針ですが、異なる分類法(たとえば「カテゴリ」)のメンバーであるが「色」のメンバーではない投稿を隠します。私はコードを修正しました、そしてこれはうまくいくようです:

if ( isset( $wp_query->query['orderby'] ) && 'color' == $wp_query->query['orderby'] ) {

    $clauses['join'] .= <<<SQL
LEFT OUTER JOIN {$wpdb->term_relationships} ON {$wpdb->posts}.ID={$wpdb->term_relationships}.object_id
LEFT OUTER JOIN {$wpdb->term_taxonomy} ON wp_term_taxonomy.term_taxonomy_id=wp_term_relationships.term_taxonomy_id AND wp_term_taxonomy.taxonomy='color'
LEFT OUTER JOIN {$wpdb->terms} USING (term_id)
SQL;

    $clauses['groupby'] = "wp_posts.ID";
    $clauses['orderby']  = "GROUP_CONCAT({$wpdb->terms}.name ORDER BY name ASC) ";
    $clauses['orderby'] .= ( 'ASC' == strtoupper( $wp_query->get('order') ) ) ? 'ASC' : 'DESC';
}
1
Yousef