web-dev-qa-db-fra.com

Commande Résultats de la recherche Page par meta_value Si aucune valeur ne renvoie les résultats restants

J'essaie de commander la page de résultats de recherche de mon site avec un meta_key spécifique. Le problème, c’est que j’ai besoin de renvoyer tous les résultats même s’il n’ya pas de valeur dans le meta_key

Les publications sont des types de publication personnalisés qui sont des événements.

Les résultats sont déjà triés dans un ensemble spécifique de types de publication personnalisés à l'aide de ceci:

function SearchFilter($query) {
    if (!is_admin() && $query->is_search() ) {
        $query->set('post_type', array( 'event', 'university', 'organization'));
    }
    return $query;
}

add_action('pre_get_posts','SearchFilter', 9999);

Un autre filtrage est en cours afin de filtrer les événements qui ont réussi ou ceux qui sont définis sur un champ personnalisé "off". Je peux poster le code utilisé pour le faire aussi, si nécessaire.

Essentiellement, je peux utiliser

$query->set('meta_key', 'wpcf-start-date');
$query->set('orderby', array('meta_value' => 'ASC'));

pour commander les événements par date. Cela fonctionne bien, mais ne renverra aucun résultat comportant '' (ce qui est supposé être nul) dans le champ wpcf-start-date.

J'ai essayé d'utiliser la réponse à cette question:

Ordre les publications par champ personnalisé et si le champ personnalisé est vide, renvoie les publications restantes

Mais soit je ne comprends pas assez bien ce qui se passe pour le personnaliser, mais cela ne fonctionne tout simplement pas pour moi.

Je peux fournir toute information supplémentaire sur demande.

Toute aide serait grandement appréciée!


UPDATE:

Je regardais à nouveau l’autre question de Stack à laquelle je me réfère. J'ai ce qui fonctionne:

function sortResults( $query ) {
    if ( is_admin() || ! $query->is_main_query() ) {
        return;
    }

    $query->set( 'meta_key', 'wpcf-start-date' );
    $query->set( 'orderby', 'meta_value');
    $query->set( 'order', 'DESC');

    add_filter( 'get_meta_sql', 'filterResults' );
}
add_action( 'pre_get_posts', 'sortResults' );

function filterResults( $clauses ) {
    remove_filter( 'get_meta_sql', 'filterResults' );

    // Change the inner join to a left join,
    // and change the where so it is applied to the join, not the results of the query.
    $clauses['join']  = str_replace( 'INNER JOIN', 'LEFT JOIN', $clauses['join'] ) . $clauses['where'];
    $clauses['where'] = '';

    return $clauses;
}

Mais comme l’autre question, cela place les événements sans dates en haut et les événements avec dates en bas. L'autre question suggère d'utiliser deux boucles. Je n'arrive pas à faire fonctionner deux boucles sur mon site. La page de résultats de recherche est hautement personnalisée.

5
Nick Taylor

Vous pouvez accomplir cela avec plusieurs méta-requêtes.

$query->set( 'meta_query', [
  'relation' => 'OR',
  'wpcf-start-date' => [
    'key' => 'wpcf-start-date',
    'compare' => 'EXISTS',
  ],
 'no-start-date' => [
    'key' => 'wpcf-start-date',
    'compare' => 'NOT EXISTS'
  ],
] );
$query->set( 'orderby', 'wpcf-start-date' );
$query->set( 'order', 'ASC' );

Ceci indiquera à WP de créer une requête qui correspondra à chaque publication, si elle possède ou non la clé, en la définissant comme LEFT JOIN, puis en triant la valeur de cette clé, y compris celles avec la valeur NULL. valeurs.

1
Jonathan Brinley