web-dev-qa-db-fra.com

Créer un filtre de recherche par plugin

J'utilise wordpress pour les projets immobiliers. Pour cela, j'utilise un thème associé à un plugin (realia real estate). Donc, je crois que ce n’est pas un point important ... Ma question est simple, j’ai plusieurs méta_key personnalisées, telles que property_baths (salles de bains), property_beds (chambres), etc. recherche avancée dans la gestion de wordpress, dans l'onglet "Posts". J'ai également besoin que cette recherche soit cumulative, par exemple, si les "salles de bains" et les "chambres" sont toutes deux remplies, il convient de filtrer les messages en fonction de ce qui a été rempli.

Après de nombreuses recherches, j'ai trouvé un moyen de le faire en créant un plugin, mais le code que j'ai ici ne passe que 1 méta_key avec votre meta_value, j'ai besoin de passer plusieurs meta_key avec leurs valeurs ...

Ce que j'ai jusqu'ici est ceci:

add_action( 'restrict_manage_posts', 'wpse45436_admin_posts_filter_restrict_manage_posts' );

function wpse45436_admin_posts_filter_restrict_manage_posts(){
    $type = 'property';
    if (isset($_GET['post_type'])) {
        $type = $_GET['post_type'];
    }

    //only add filter to post type you want
    if ('property' == $type){
        //change this to the list of values you want to show
        //in 'label' => 'value' format
        $values = array(
            'Banheiros' => 'property_baths', 
            'Quartos' => 'property_beds'
        );

        $current_v = isset($_GET['ADMIN_FILTER_FIELD_VALUE'])? $_GET['ADMIN_FILTER_FIELD_VALUE']:'';
        foreach ($values as $label => $value) {
            printf
            (
            '<input type="text" name="%s"%s placeholder="%s"></option>',
            $value, 
            $value == $current_v? ' value="'.$current_v.'"':'', 
            $label 
            );
        }
    }
}

add_filter('parse_query', 'wpse45436_posts_filter');

function wpse45436_posts_filter( $query ){
    global $pagenow;
    $type = 'property';
    if (isset($_GET['post_type'])) {
        $type = $_GET['post_type'];
    }
    if ( 'property' == $type && is_admin() && $pagenow=='edit.php' && isset($_GET['property_baths']) && $_GET['property_baths'] != '') {

        $query->query_vars['meta_key'] = 'property_baths';
        $query->query_vars['meta_value'] = $_GET['property_baths'];
    }
}

Avec ce code (plugin), je ne peux filtrer que 1 méta_key, je dois le faire de manière à pouvoir utiliser plusieurs "meta_keys" avec leurs valeurs.

J'ai essayé la boucle, j'ai essayé le tableau, mais rien n'a fonctionné. J'espère que quelqu'un pourra m'aider ... Merci d'avance ...

3
Vinícius Óliver

Vous pouvez ajouter plus d'un appel de filtre afin que chacun de vos meta_key personnalisés puisse être traité dans un code séparé et, une fois exécuté, ajustera la requête de manière cumulative.

Regardez peut-être le filtre pre_get_posts plutôt que parse_query (même si la solution que je suggère pourrait éventuellement fonctionner dans les deux cas). pre_get_posts vous donne accès à la requête en cours avant son exécution par WordPress, et vous limiterez les publications que la requête extraira de la base de données.

Je n'ai pas testé ce code: il s'agit simplement d'une modification ici de votre code pour vous montrer comment vous pouvez l'aborder (donc vérifiez la syntaxe pour voir s'il y a des erreurs).

Vous vous retrouveriez avec quelque chose comme ça:

add_filter('pre_get_posts', 'wpse45436_property_baths_posts_filter');

function wpse45436_property_baths_posts_filter( $query ){
    global $pagenow;
    $type = 'property';
    if (isset($_GET['post_type'])) {
        $type = $_GET['post_type'];
    }
    if ( 'property' == $type && is_admin() && $pagenow=='edit.php' && isset($_GET['property_baths']) && $_GET['property_baths'] != '') {

        $query->query_vars['meta_key'] = 'property_baths';
        $query->query_vars['meta_value'] = $_GET['property_baths'];
    }
}

add_filter('pre_get_posts', 'wpse45436_property_beds_posts_filter');

function wpse45436_property_beds_posts_filter( $query ){
    global $pagenow;
    $type = 'property';
    if (isset($_GET['post_type'])) {
        $type = $_GET['post_type'];
    }
    if ( 'property' == $type && is_admin() && $pagenow=='edit.php' && isset($_GET['property_beds']) && $_GET['property_beds'] != '') {

        $query->query_vars['meta_key'] = 'property_beds';
        $query->query_vars['meta_value'] = $_GET['property_beds'];
    }
}

Consultez le Codex pour plus de détails sur le filtre pre_get_posts

1
Paul Zee