web-dev-qa-db-fra.com

Définit par programme 'meta_query' pour le filtre

J'essaie de définir par programme 'meta_query' pour un filtre censé filtrer un type de publication personnalisé en fonction de l'existence d'une métakey. J'ai essayé plusieurs manières, que j'ai laissées dans le code ci-dessous, commentées. Aucune des solutions ne modifie la propriété 'meta_query' de $ query, qui reste obstinément définie sur 'false'.

J'ai le sentiment qu'il me manque quelque chose de fondamental. Veuillez aider. Je vous remercie.

add_filter( 'parse_query', 'filter_posts_by_no_associated_contact' );
function filter_posts_by_no_associated_contact( $query ) {

global $pagenow;

$qv = &$query->query_vars;

if( $pagenow == 'edit.php' &&
    isset($qv['post_type']) && $qv['post_type'] == 'act' 
    && isset($_GET['contact_status']) && $_GET['contact_status'] != '' ){

    $compare = ( $_GET['contact_status'] == 'with_contact' ) ? 'EXISTS' : 'NOT EXISTS';

    // $query->meta_query[] = array(
    $metaquery = array(
            'key'       => 'contact_associated',
            'value'     => 'justAstring',
                'compare'   => $compare,
            'type'      => 'CHAR'
    );

    $query->set( 'meta_query', $metaquery );

    }

}

j'ai vu cela fait ailleurs :

$qv = &$query->query_vars;
$qv['meta_query'] = array();
$qv['meta_query'][] = array(
  'field' => 'meta-key',
  'value' => $whatever,
  'compare' => '',
  'type' => ''
);

Mais cette solution aboutit à un php "Attention: tentative de modification de la propriété d'un non-objet".

1
Ronnieinspain
  1. Un meta_query doit être un tableau de tableaux. Vous avez seulement un tableau.
  2. Un filtre doit avoir return informations. Le vôtre ne.
  3. Bien sûr, parse_query est unactionpas un filtre, malgré votre utilisation de add_filter. Utilisez add_action à la place.
  4. Je voudrais utiliser pre_get_posts au lieu de parse_query. C'est le prochain hook qui se déclenche après parse_query ( vérifiez la source ) et votre code fonctionne plus ou moins comme prévu si vous utilisez ce hook, en supposant la modification mentionnée dans le point 1.
4
s_ha_dum