web-dev-qa-db-fra.com

Filtrage du type de publication personnalisé sur une combinaison de taxonomies personnalisées et de champs personnalisés?

J'ai un type de message personnalisé "artiste".

Il a une taxonomie personnalisée associée "artiste_type" avec les termes "voix", "acteur", "entreprise"

Un "artiste" a également des champs personnalisés pour le genre, l'emplacement, l'agerange de et l'agerangeto. Les deux derniers champs indiquent la tranche d'âge dans laquelle un acteur/artiste peut jouer.

J'affiche les artistes en fonction de leur taxonomie artist_type - j'utilise donc taxonomy-artist-type.php pour afficher "/ artist_type/voices /" et "/ artist_type/acteurs"/et "/ artist_type/corporate /".

Tout va bien.

Mais je dois ajouter un filtre pour qu'un utilisateur puisse affiner chacune de ces trois catégories en fonction des champs personnalisés mentionnés ci-dessus: sexe, emplacement, etc.

Je suis tombé sur un site ici qui fait quelque chose de similaire ici: http://artists.derricktalentelite.com.au/?post_type=actor&gender=male

Je suis confus sur la façon de mettre cela en place dans mon scénario. DOi-je utiliser meta_query et/ou pre_get_posts?

L’utilisateur doit pouvoir combiner des filtres, par exemple sur la page des voix: un homme de 20 à 30 ans basé à Londres. Comment formuler la chaîne de requête dans l'URL pour transmettre ces paramètres?

Tous les indices sur la meilleure façon de procéder seraient appréciés.

1
user6719

La meilleure façon de procéder est d'utiliser ajax et un tax_query. Le filtre Pre_get_posts n'a de sens que si vous souhaitez modifier la requête dans la hiérarchie des modèles, donc le paramètre taxonomy.php 'standard'.

Cette approche:

  1. faire une page avec qui montrer la liste par défaut, alors peut-être 'tout', juste une simple requête post_type. Et un menu latéral avec tous vos filtres sous forme de liens sur lesquels vous pouvez cliquer, bien sûr.

  2. faire un fichier php qui obtient un terme spécifique via tax_query, en utilisant $ _GET, quelque chose comme ceci:

    <?php
        define('WP_USE_THEMES', false);
        require_once('../../../wp-load.php');
        $gender = (isset($_GET['gender'])) ? $_GET['gender'] : 0;
        $args = array(
    'post_type' => 'artist',
    'tax_query' => array(
        array(
            'taxonomy' => 'artist_type',
            'field' => 'slug',
            'terms' => $gender
        )
    )
        );
        $tag_query = new WP_Query( $args );
        if ($tag_query->have_posts()) : while ($tag_query->have_posts()) :  $tag_query->the_post();
    

Ce n'est qu'un exemple de départ. Développez-le avec d'autres variables via $ _GET et vérifiez celles qui utilisent dans l'URL (? Genre = homme & voix = quelque chose).

Assurez-vous que cette boucle a exactement la même structure html que celle que vous avez initialement chargée, donc probablement juste une boucle de divs d’éléments.

  1. Ensuite, utilisez jquery pour charger les données dans le fichier ci-dessus, quelque chose comme ceci:

    <script>
    jQuery(document).ready(function($) {
    var template_path = $('#template_path').html();
        $.querySort = {
        path_to_template: template_path,
        }
    
        $('.filter').click(function(){
    $(this).toggleClass('active');
            var term = $(this).attr('data-gender');
    var query = '?term=' + term;
        $('#data_wrapper').animate({opacity: 0}, function() {
            $('#data_wrapper').append('<div id="loader"></div>');  
            $("#data_wrapper").load($.querySort.path_to_template + '/ajax_load_terms.php' + query, function() {
                $('#loader').remove();
                $("#data_wrapper").animate({opacity: 1}, function() { });
            });
        });
        return false; //prevents a link from being clicked, if needed
    
    });
    </script>
    

Voyez comment il charge le fichier que vous venez de créer, ici ajax_load_terms.php. Il ajoute la requête à l'URL et prend le terme du sélecteur sur lequel vous cliquez, ce qui ressemble à ceci dans mon exemple:

    <a href="javascript:void(0)" data-gender="[php echo your term here]">

Notez également que le js a besoin de connaître le chemin d'accès au fichier ajax, qu'il obtient d'un div caché sur votre page principale, comme ceci

    <div style="display: none" id="template_path"><?php bloginfo('template_url') ?></div>

J'espère que vous avez compris la direction et que vous êtes en mesure de combler les lacunes du code. Sinon, faites-moi signe, c'est compliqué à en avoir l'air, mais ce n'est pas vraiment le cas.

Bonne chance.

1
matiyin