Clause WP_Query OR pour tax_query et mots-clés
-
-
[modifiez] votre questionet partagez ce que vous avez déjàfait.Personnene voudra dessiner sur votrefeuille depapier vierge,mais vous devez vous lancer.[edit] your Question and share what you've already done. Nobody will eager to draw on your blank sheet of paper, but you have to initiate.
- 0
- 2014-12-31
- Mayeenul Islam
-
@MayeenulIslam Ma questionest assez claire;obtenir les articles qui correspondent au critère `tax_query` ou` s`.@MayeenulIslam My question is quite clear; get posts that match either the `tax_query` or the `s` criterion.
- 0
- 2014-12-31
- tyteen4a03
-
1 réponses
- votes
-
- 2015-01-07
Voici unepetite expérience:
Vouspouvezessayer la configuration suivante:
$args = array( 'wpse_search_or_tax_query' => true, // <-- New parameter! 's' => 'some search text', 'tax_query' => array( array( 'taxonomy' => 'category', 'field' => 'slug', 'terms' => array( 'some-category-slug' ), 'operator' => 'IN', ), ), ); $query = new WP_Query( $args );
oùnousintroduisons leparamètrepersonnalisé
wpse_search_or_tax_query
pour activer lesmodifications de la requête.Ceciestprisen chargepar leplugin de démonstration suivant:
<?php /** * Plugin Name: Modify the WP_Query to use OR between the search and tax query parts. * Description: Activation through the boolean 'wpse_search_or_tax_query' parameter. * Plugin URI: http://wordpress.stackexchange.com/a/174221/26350 * Author: Birgir Erlendsson (birgire) * Version: 0.0.2 */ add_action( 'init', function() { if( ! is_admin() && class_exists( 'WPSE_Modify_Query' ) ) { $o = new WPSE_Modify_Query; $o->activate(); } }); class WPSE_Modify_Query { private $search = ''; public function activate() { add_action( 'pre_get_posts', array( $this, 'pre_get_posts' ) ); } public function pre_get_posts( WP_Query $q ) { if( filter_var( $q->get( 'wpse_search_or_tax_query' ), FILTER_VALIDATE_BOOLEAN ) && $q->get( 'tax_query' ) && $q->get( 's' ) ) { add_filter( 'posts_clauses', array( $this, 'posts_clauses' ), 10, 2 ); add_filter( 'posts_search', array( $this, 'posts_search' ), 10, 2 ); } } public function posts_clauses( $clauses, \WP_Query $q ) { remove_filter( current_filter(), array( $this, __FUNCTION__ ) ); // Generate the tax query: $tq = new WP_Tax_Query( $q->query_vars['tax_query'] ); // Get the generated taxonomy clauses: global $wpdb; $tc = $tq->get_sql( $wpdb->posts, 'ID' ); // Remove the search part: $clauses['where'] = str_ireplace( $this->search, ' ', $clauses['where'] ); // Remove the taxonomy part: $clauses['where'] = str_ireplace( $tc['where'], ' ', $clauses['where'] ); // Add the search OR taxonomy part: $clauses['where'] .= sprintf( " AND ( ( 1=1 %s ) OR ( 1=1 %s ) ) ", $tc['where'], $this->search ); return $clauses; } public function posts_search( $search, \WP_Query $q ) { remove_filter( current_filter(), array( $this, __FUNCTION__ ) ); $this->search = $search; return $search; } } // end class
J'espère que vouspourrez l'ajuster davantage à vosbesoins.
Here's a little experiment:
You can try the following setup:
$args = array( 'wpse_search_or_tax_query' => true, // <-- New parameter! 's' => 'some search text', 'tax_query' => array( array( 'taxonomy' => 'category', 'field' => 'slug', 'terms' => array( 'some-category-slug' ), 'operator' => 'IN', ), ), ); $query = new WP_Query( $args );
where we introduce the custom
wpse_search_or_tax_query
parameter to activate the query modifications.This is supported by the following demo plugin:
<?php /** * Plugin Name: Modify the WP_Query to use OR between the search and tax query parts. * Description: Activation through the boolean 'wpse_search_or_tax_query' parameter. * Plugin URI: http://wordpress.stackexchange.com/a/174221/26350 * Author: Birgir Erlendsson (birgire) * Version: 0.0.2 */ add_action( 'init', function() { if( ! is_admin() && class_exists( 'WPSE_Modify_Query' ) ) { $o = new WPSE_Modify_Query; $o->activate(); } }); class WPSE_Modify_Query { private $search = ''; public function activate() { add_action( 'pre_get_posts', array( $this, 'pre_get_posts' ) ); } public function pre_get_posts( WP_Query $q ) { if( filter_var( $q->get( 'wpse_search_or_tax_query' ), FILTER_VALIDATE_BOOLEAN ) && $q->get( 'tax_query' ) && $q->get( 's' ) ) { add_filter( 'posts_clauses', array( $this, 'posts_clauses' ), 10, 2 ); add_filter( 'posts_search', array( $this, 'posts_search' ), 10, 2 ); } } public function posts_clauses( $clauses, \WP_Query $q ) { remove_filter( current_filter(), array( $this, __FUNCTION__ ) ); // Generate the tax query: $tq = new WP_Tax_Query( $q->query_vars['tax_query'] ); // Get the generated taxonomy clauses: global $wpdb; $tc = $tq->get_sql( $wpdb->posts, 'ID' ); // Remove the search part: $clauses['where'] = str_ireplace( $this->search, ' ', $clauses['where'] ); // Remove the taxonomy part: $clauses['where'] = str_ireplace( $tc['where'], ' ', $clauses['where'] ); // Add the search OR taxonomy part: $clauses['where'] .= sprintf( " AND ( ( 1=1 %s ) OR ( 1=1 %s ) ) ", $tc['where'], $this->search ); return $clauses; } public function posts_search( $search, \WP_Query $q ) { remove_filter( current_filter(), array( $this, __FUNCTION__ ) ); $this->search = $search; return $search; } } // end class
Hopefully you can adjust this further to your needs.
-
J'aifini par écriremonpropregénérateur de requêtes,maisj'espère que cela aidera quelqu'un d'autre.I ended up writing my own query builder but hopefully this'll help somebody else.
- 1
- 2015-01-08
- tyteen4a03
-
Bonjour,l'avez-voustesté?cela semblene pasfonctionner,lancez la ligne d'erreur 78 `Erreurfatale capturable: l'argument 2passé à WPSE_Modify_Query ::posts_search () doit être uneinstance de WP_Query`.J'ai donc supprimé lesparamètres,mais çane faittoujourspas letruc OR ...Hello, did you test it ? it seems not to be working, throw error line 78 `Catchable fatal error: Argument 2 passed to WPSE_Modify_Query::posts_search() must be an instance of WP_Query`. So I removed the params, but it still does not make the OR thing...
- 0
- 2015-10-02
- Vincent Wasteels
-
merci @VincentWasteels,j'aimis àjour le code doncj'espère qu'ilfonctionnemaintenant commeprévu ;-)thanks @VincentWasteels, I updated the code so hopefully it works now as expected ;-)
- 0
- 2015-10-02
- birgire
-
okmonmauvais,je l'utilisais avec `get_posts` au lieu de` WP_Query () `.Je suistrès surpris que le comportement soit unepensée différente ...ok my bad, I was using it with `get_posts`instead of `WP_Query()`. I'm very surprised the behaviour is different thought...
- 0
- 2015-10-02
- Vincent Wasteels
-
nonnonton code était okenfin :)no no your code was ok finally :)
- 0
- 2015-10-02
- Vincent Wasteels
-
heureux d'entendre que cela afonctionnépour vous ;-) @VincentWasteelsglad to hear it worked out for you ;-) @VincentWasteels
- 0
- 2015-10-02
- birgire
Est-ilpossible de créer une clause ORentre
tax_query
et desmots-clés?J'aimerais queWP_Query
renvoie des articles s'il y a une correspondance detax_query
ou une correspondance demot-clés
.