web-dev-qa-db-fra.com

Rechercher le type de message personnalisé par métadonnées

J'ai un type de message personnalisé 'Propriété' que mes utilisateurs doivent pouvoir rechercher par métadonnées.

J'ai 3 fonctions de recherche - 2 sur le front-end 1 dans la zone d'administration - 2 fonctionnent comme prévu et une qui ne semble pas filtrer les résultats du tout.

Je pense que ma définition ou l'utilisation de query_vars personnalisé peut poser problème.

Dans mon functions.php, j'ai les éléments suivants:

function add_query_vars($public_query_vars) {
    $public_query_vars[] = 'bedrooms';
    $public_query_vars[] = 'type';
    $public_query_vars[] = 'location';
    return $public_query_vars;
}
add_filter('query_vars', 'add_query_vars');

function meta_search_query($query) {

    $query_args_code = array(
      'posts_per_page' => 5,
      'post_type' => 'nc_property',
      'meta_key' => 'nc_code',
      'meta_value' => $query->query_vars['s'],
      'meta_compare' => 'LIKE'
    );


    $query_args_meta = array(
        'posts_per_page' => -1,
        'post_type' => 'nc_property',
        'meta_query' => array(
            'relation' => 'AND',
            array(
                'key' => 'nc_bedrooms',
                'value' => $query->query_vars['bedrooms'],
                'compare' => 'LIKE'
            ),
            array(
                'key' => 'nc_type',
                'value' => $query->query_vars['type'],
                'compare' => 'LIKE'
            ),
            array(
                'key' => 'nc_location',
                'value' => $query->query_vars['location'],
                'compare' => 'LIKE'
            )
        )
    );

    if (is_admin() && $query->is_search ) {
        query_posts($query_args_code);

    } elseif (!is_admin() && $query->is_search ) {
        if ($_REQUEST["which_form"] == 'meta_form') {
            query_posts($query_args_meta);

        } elseif ($_REQUEST["which_form"] == 'code_form'){
            query_posts($query_args_code);

        }
    }  
}
add_filter( 'pre_get_posts', 'meta_search_query');

La recherche par code de propriété ne pose aucun problème à la fois au niveau du front-end et du back-end. Cependant, essayer de filtrer les résultats selon les vars de requête personnalisés - emplacement, type et chambres - tombe à plat à chaque fois.

Un exemple de chaîne de requête créée est le suivant:

/property/?post_type=nc_property&which_form=meta_form&bedrooms=Two&type=Apartment&location=Bahceli

Il existe une propriété sur le site qui correspond à ces détails, mais WordPress renvoie tous les résultats à chaque fois.

Ai-je raté quelque chose?

EDIT: Comme mon formulaire de recherche pour mes méta-requêtes n’utilisait pas un élément dont le nom était 's', la condition $query->is_search de mon instruction if retournait false, ce qui voulait dire que ma méta_query n’était tout simplement pas appelée.

Félicitations à fischi pour avoir remarqué cela pour moi! :RÉ

3
Jazibobs

Dans ce cas, lorsque vous mélangez de jolis permaliens avec des paramètres de requête, je voudrais utiliser les variables $_GET dans votre requête.

$query_args_meta = array(
    'posts_per_page' => -1,
    'post_type' => 'nc_property',
    'meta_query' => array(
        'relation' => 'AND',
        array(
            'key' => 'nc_bedrooms',
            'value' => sanitize_text_field( $_GET['bedrooms'] ),
            'compare' => 'LIKE'
        ),
        array(
            'key' => 'nc_type',
            'value' => sanitize_text_field( $_GET['type'] ),
            'compare' => 'LIKE'
        ),
        array(
            'key' => 'nc_location',
            'value' => sanitize_text_field( $_GET['location'] ),
            'compare' => 'LIKE'
        )
    )
);

Veillez à utiliser l'assainissement approprié, en fonction de vos besoins, ou à l'aide d'une fonction qui vérifie les valeurs des données $_GET figurant sur la liste blanche.

Vérifiez également votre fonction des conditions - vous modifiez simplement la requête s'il s'agit d'une demande de recherche (en utilisant s comme paramètre de recherche), ou modifiez l'instruction if.

3
fischi