2017-10-19 16 views
0

J'ai trois boîtes de sélection qui permettent de filtrer une liste de publications personnalisées, de sélectionner une ou toutes les options, puis de cliquer sur un bouton "Filtre" qui recharge la page et ajoute la (les) variable (s) filtrée (s) l'URL en tant que chaîne de requête. Cela fonctionne parfaitement bien avec les deux taxonomies personnalisées je:Comment modifier Wordpress WP_Query avec une valeur de champ personnalisée après le filtrage?

$categories = array('company-sector', 'company-location'); 
foreach ($categories as $category) { 
    if (isset($_GET[$category]) && !empty($_GET[$category])) { 
     $query['tax_query'][] = array(
      'taxonomy' => $category, 
      'field'  => 'slug', 
      'terms'  => $_GET[$category] 
     ); 
    } 
} 

Cependant, en utilisant la même logique sur le troisième filtre (un champ personnalisé créé avec ACF), la liste des messages ne change pas:

if (isset($_GET['company-status']) && !empty($_GET['company-status'])) { 
    $query['meta_query'][] = array(
     'key' => 'company_status', 
     'value' => $_GET['company-status'], 
    ); 
} 

Cette méta requête fonctionne très bien si je l'ajouter manuellement dans le WP_Query initial comme ceci:

$query = array(
    'post_type' => 'company-post', 
    'posts_per_page' => $posts_per_page, 
    'orderby' => 'title', 
    'order' => 'ASC', 
    'meta_query' => array(
     array(
      'key' => 'company_status', 
      'value' => 'acquired' 
     ) 
    ) 
); 

Cependant, en essayant d'ajouter dans la requête initiale après avoir obtenu la variable fr om la chaîne de requête ne semble pas fonctionner, qu'est-ce que je fais mal ici?

// modifier

Même cela fonctionne:

$query = array(
    'post_type' => 'company-post', 
    'posts_per_page' => $posts_per_page, 
    'orderby' => 'title', 
    'order' => 'ASC', 
    'meta_query' => array(
     array(
      'key' => 'company_status', 
      'value' => $_GET['company-status'] 
     ) 
    ) 
); 

Il doit être quelque chose à voir avec la façon dont je suis le meta_query annexant au WP_Query initial ...

+0

Si votre var_dump ($ _ GET ['company-status']) obtenez-vous les résultats escomptés? – Stender

+0

N'a pas essayé var_dump(), mais echo $ _GET ['company-status']; retourne ce que je m'attends à voir. – JFK1980

+0

var_dump() renvoie: string (7) "current". ('current' ou 'acquire' sont les deux options actuellement, qui apparaissent dans le backend comme des boutons radio ACF.) – JFK1980

Répondre

0

Je suppose que vous pouvez utiliser pour pre_get_posts dans votre functions.php

// Load our function when hook is set 
add_action('pre_get_posts', 'js-modifying-main-query'); 

function js-modifying-main-query($query) { 
    $status = $_GET['company-status']; 
    if($status && $status != ""){ 

     if(!is_admin() && $query->is_main_query() && $query->query_vars['post_type'] == 'company-post') { 

      $query->set('meta_key', 'company_status'); 
      $query->set('meta_value', $status); 

     } 

    } 
} 

n'ont pas essai ed it - juste une première pensée.

// EDIT

Pour voir vos variables de requête, vous pouvez utiliser ceci:

global $wp_query; 
var_dump($wp_query->query_vars); 
+0

Si rien d'autre - cela devrait vous mettre sur la bonne voie. – Stender

+0

A dû changer les '-' en '_' en déclarant la fonction pour l'exécuter et même alors j'obtiens: Undefined index: post_type – JFK1980

+0

hmm - vous pouvez var vider vos vars de requête, pour voir ce qui est présent dedans. – Stender

0

Je ne suis toujours pas sûr de savoir pourquoi ne fonctionne pas mon code initial, mais je suis parvenu à trouver une solution de contournement qui semble faire ce que je dois à:

$status = false; 
if (isset($_GET['company-status']) && !empty($_GET['company-status'])) { 
    $status = array(
     'key' => 'company_status', 
     'value' => $_GET['company-status'], 
    ); 
} 

$query = array(
    'post_type' => 'company-post', 
    'posts_per_page' => $posts_per_page, 
    'orderby' => 'title', 
    'order' => 'ASC', 
    'meta_query' => array($status) 
); 

// modifier

Même cela fonctionne:

$status = false; 
if (isset($_GET['company-status']) && !empty($_GET['company-status'])) { 
    $status[] = array(
     'key' => 'company_status', 
     'value' => $_GET['company-status'], 
    ); 
} 

$query = array(
    'post_type' => 'company-post', 
    'posts_per_page' => $posts_per_page, 
    'orderby' => 'title', 
    'order' => 'ASC', 
    'meta_query' => $status 
); 

Mais dès que je tente cela, il échoue:

if (isset($_GET['company-status']) && !empty($_GET['company-status'])) { 
    $query['meta_query'][] = array(
     'key' => 'company_status', 
     'value' => $_GET['company-status'], 
    ); 
} 

$query = array(
    'post_type' => 'company-post', 
    'posts_per_page' => $posts_per_page, 
    'orderby' => 'title', 
    'order' => 'ASC', 
); 
0

Vous poussez la mauvaise valeur pour company-status.

if (isset($_GET['company-status']) && !empty($_GET['company-status'])) { 
    $query['meta_query'][] = array(
     array(
      'key' => 'company_status', 
      'value' => $_GET['company-status'], 
     ) 
    ); 
} 

... fait ceci:

Array 
(
    [0] => Array 
     (
      [key] => company_sector 
      [value] => val1 
     ) 

    [1] => Array 
     (
      [key] => company_status 
      [value] => val2 
     ) 

    [2] => Array 
     (
      [0] => Array 
       (
        [key] => company_status 
        [value] => val3 
       ) 

     ) 

) 

Vous devriez pousser à un tableau meta_query cette façon:

$query['meta_query'][] = array(
    'key' => 'company_status', 
    'value' => $_GET['company-status'], 
); 

En outre, si le paramètre relation est ommited, requête vérifierait pour tous les clés et valeurs - mais je suppose que vous le savez.

+0

J'ai déjà essayé les deux sens, j'ai oublié de le mentionner dans ma question initiale. J'ai mis à jour ma question pour refléter cela. J'ai également mis à jour ma réponse avec d'autres tests, en fonction de ce que vous avez suggéré, et cela ne semble toujours pas fonctionner. Aussi, si 'relation' est requis, alors cela ne change-t-il pas la façon dont je pousse vers meta_query? – JFK1980

+0

S'il vous plaît poster 'print_r' de votre variable' $ query', je pense que c'est là que le problème sera. –