wake-up-neo.com

WP_Query wird für einen Filter mit mehreren Taxonomien und Begriffen verwendet

Ich versuche also, einen Ajax-Filter zu erstellen. Dies ist der Teil des Filtercodes, der die $ args basierend auf den Daten erstellt, die aus dem Filterformular stammen, und danach (nicht in diesem Code) gibt die Ergebnisse der Abfrage an.

Ich habe 3 benutzerdefinierte Taxonomien (und deren Funktionalität aus dem Formular):
- type_emp (eine Option kommt aus dem Formular)
- status_emp (EINE OR MEHR Optionen stammen aus dem Formular)
- city_emp (eine Option kommt aus dem Formular)

Die Sache ist: Ich kann sie nicht in der WP_Query als Filter verwenden, da sie mit dem Beitrag übereinstimmen, auch wenn er nicht alle Begriffe enthält.

Beispiel

type_emp ist 1
status_emp ist null
city_emp ist 2

Es werden Beiträge zurückgegeben:

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

Wie Sie sehen, sollte nur Post 3 zurückgegeben werden, da er alle Parameter hat. Gibt es eine Möglichkeit, die Abfrage so einzuschränken ?
Außerdem muss ich status_emp mehrmals mit manchmal mehreren Begriffen abgleichen. Im Code explodiere ich die Zeichenfolge, um ein Array zu erstellen, und setze sie als Begriffe in eine Steuerabfrage ein. Wie kann ich Posts zuordnen, die mindestens einen von ihnen haben ?

 $ args = array (
 'orderby' => 'date', 
 'order' => 'DESC', 
 'post_status' => 'publish '
); 
 
 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'; 
} 
 
 // Wenn zwei oder mehr Optionen ausgewählt sind, werden sie unter 
 $ Query = explode ('&', file_get_contents ("php: // input"); 
 Sortiert. $ params = array (); 
 
 foreach ($ query as $ param) 
 {
 list ($ name, $ value) = explode ('=' , $ param, 2); 
 $ params [URL-Code ($ name)] [] = URL-Code ($ value); 
} 
 
 if (isset ( $ params ['statusfilter']) && $ _POST ['statusfilter']! == '') {
 $ Args ['tax_query']. = Array (
 Array (
 'Taxonomy' => 'status_emp' , 
 'field' => 'id', 
 'terms' => $ params ['statusfilter'] 
) 
); 
 } 
 
 // für Taxonomien/Kategorien 
 if (isset ($ _POST ['cityfilter']) && $ _POST ['cityfilter']! == '') {
 $ args ['tax_query']. = array (
 array (
 'taxonomy' => 'city_emp', 
 'field' => 'id', 
 'terms' => $ _POST ['cityfilter'] 
) 
); 
} 
 $ query = new WP_Query ($ args) ; 

Es tut mir leid, wenn meine Frage etwas verwirrt ist, aber ich habe versucht, so klar wie möglich zu sein.

1
atempel

Versuchen Sie diesen Weg:

$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);

Ich habe es nicht getestet, aber theoretisch sollte es funktionieren :) Sag mir, ob es funktioniert oder ob du mehr Hilfe brauchst

2
benny-ben