web-dev-qa-db-fra.com

WP_Query utiliser pour un filtre avec plusieurs taxonomies et termes

Donc, ce que j'essaie de faire, c'est de faire un filtre ajax, c'est la partie du code de filtre qui construit les $ args en fonction des données provenant du formulaire de filtre, et ensuite (pas dans ce code) donne les résultats de la requête.

J'ai 3 taxonomies personnalisées (et leurs fonctionnalités de forme):
- type_emp (une option provient du formulaire)
- status_emp (ONE OR MORE options provient du formulaire)
- city_emp (une option provient du formulaire)

La chose est: Je ne suis pas en mesure de les utiliser dans WP_Query en tant que filtres, car ils correspondront à la publication même si elle ne contient pas tous les termes.

Exemple

type_emp est 1
status_emp est null
city_emp vaut 2

Il retournera des messages:

(type_emp/status_emp/city_emp)
post 1 (1/2/3)
post 2 (2/1, 4/2)
post 3 (1/4/2)

Comme vous pouvez le constater, le poste 3 devrait être le seul à être renvoyé, car il dispose de tous les paramètres. Y at-il un moyen de restreindre la requête comme ça ?
De plus, j'ai besoin de faire correspondre status_emp plus d'une fois, avec parfois plusieurs termes, dans le code, j'explose la chaîne pour créer un tableau et le mettre comme terme dans une requête fiscale. Comment faire correspondre les messages qui ont au moins un d'entre eux ?

 $ args = array (
 'orderby' => 'date', 
 'order' => 'DESC', 
 'post_status' => 'publier '
); 
 
 if (isset ($ _POST [' typefilter ']) && $ _POST [' typefilter ']! ==' ') {
 $ args ['post_type'] = 'post_type_x'; 
 $ args ['tax_query'] = array (
 array (
 'taxonomy' => 'type_emp', 
 'field' => 'id', 
 'terms' => $ _POST ['typefilter'] 
) 
); 
} 
 
 if ($ _POST ['typefilter'] == '') {
 $ args ['post_type'] = 'post_type_x'; 
} 
 
 // Si deux ou plusieurs options sont sélectionnées, elles sont triées ci-dessous 
 $ Query = explode ('&', file_get_contents ("php: // input")); 
 $ params = array (); 
 
 pour chaque recherche ($ query as $ param) 
 {
 liste ($ name, $ value) = exploser ('=' , $ param, 2); 
 $ params [urldecode ($ name)] [] = urldecode ($ value); 
} 
 
 if (isset ( $ params ['statusfilter']) && $ _POST ['statusfilter']! == '') {
 $ Args ['tax_query']. = Array (
 Array (
 'Taxonomy' => 'status_emp' , 
 'field' => 'id', 
 'terms' => $ params ['statusfilter'] 
) 
) 
 } 
 
 // pour les taxonomies/catégories 
 if (isset ($ _POST ['cityfilter'])) && $ _POST ['cityfilter']! == '') {
 $ args ['tax_query']. = array (
 array (
 'taxonomy' => 'city_emp', 
 'field' => 'id', 
 'terms' => $ _POST ['cityfilter'] 
) 
); 
} 
 $ query = new WP_Query ($ args) ; 

Désolé si ma question est un peu confuse, mais j'ai essayé d'être la plus claire possible.

1
atempel

Essayez de cette façon:

$args = array(
    'orderby'     => 'date',
    'order'       => 'DESC',
    'post_status' => 'publish'
);

if ( isset( $_POST['typefilter'] ) && $_POST['typefilter'] !== '' ) {
    $args['post_type']                = 'post_type_x';
    $args['tax_query'][0]['taxonomy'] = 'type_emp';
    $args['tax_query'][0]['field']    = 'id';
    $args['tax_query'][0]['terms']    = $_POST['typefilter'];
    $args['tax_query'][0]['operator'] = 'IN';
}

if ( $_POST['typefilter'] == '') {
    $args['post_type'] = 'post_type_x';
}

// If two or more options are selected they are sorted below
$query  = explode('&', file_get_contents("php://input"));
$params = array();

foreach( $query as $param )
{
  list($name, $value) = explode('=', $param, 2);
  $params[urldecode($name)][] = urldecode($value);
}

if( isset( $params['statusfilter'] ) && $_POST['statusfilter'] !== '' ) {
    $args['tax_query'][1]['taxonomy'] = 'status_emp';
    $args['tax_query'][1]['field']    = 'id';
    $args['tax_query'][1]['terms']    = $params['statusfilter'];
    $args['tax_query'][1]['operator'] = 'IN';
}

// for taxonomies / categories
if( isset( $_POST['cityfilter'] ) && $_POST['cityfilter'] !== '') {
    $args['tax_query'][2]['taxonomy'] = 'city_emp';
    $args['tax_query'][2]['field']    = 'id';
    $args['tax_query'][2]['terms']    = $_POST['cityfilter'];
    $args['tax_query'][2]['operator'] = 'IN';
}

$query = new WP_Query($args);

Je ne l'ai pas testé mais théoriquement, il devrait fonctionner :), dites-moi si cela fonctionne ou si vous avez besoin d'aide supplémentaire

2
benny-ben