web-dev-qa-db-fra.com

Utilisation du nouveau filtre "posts_clauses" dans Wordpress 3.1?

Je viens de remarquer que 3.1 a ajouté un nouveau filtre pour personnaliser les requêtes: posts_clauses. Tout ce que j'ai pu trouver à ce sujet, c'est qu'au lieu d'utiliser des filtres de requête distincts, tels que posts_where ou posts_join, vous pouvez les éditer tous en une seule fois. Je me demandais si quelqu'un pourrait donner un exemple d'utilisation du nouveau filtre "posts_clauses"?

6
Manny Fleurmond

Ci-dessous, la requête que j'ai trouvée quelque part et que je traversais. Le but de la requête est de trier les publications en fonction de la taxonomie. Je partage donc le code afin que cela puisse vous aider à comprendre l'utilisation de 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 );

voici la source où j'ai trouvé la requête ci-dessus: http://scribu.net/wordpress/sortable-taxonomy-columns.html

6
Hameedullah Khan

La réponse de scribu/Hameedullah est un excellent pointeur, mais il masquera les publications appartenant à une taxonomie différente (par exemple, "catégorie"), mais pas de "couleur". J'ai modifié le code et cela semble bien fonctionner:

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