web-dev-qa-db-fra.com

Utilisation de posts de requête avec plusieurs types de post et une taxonomie

Je développe un site qui a deux types de publication personnalisés différents; l'un d'eux s'appelle Articles et l'autre s'appelle Sketchpad. Sketchpad est un contenu soumis par l'utilisateur auquel est attribué une valeur de terme de taxonomie personnalisée: public ou privé. Les publications publiques sont affichées sur le site et les publications privées ne le sont pas.

L'article post type caleld Articles est ajouté par les administrateurs dans la zone d'administration de Wordpress. Les articles n'ont pas de taxonomie personnalisée.

Sur la page d’accueil, je dois extraire à la fois les articles de type "article" et "sketchpad", puis les trier par date, les plus récents en haut et les plus anciens en bas.

Mon code actuel est le suivant:

    <?php
        $args = array(
            'post_type' => array('sketchpad', 'article'),
            'taxonomy'  => 'type',
            'term'      => 'public'
        );
        // Only show content from the sketchpad post type where the taxonomy of type is public
        query_posts($args);
    ?>

Le code ci-dessus fonctionne, dans une certaine mesure. Vous voyez que seul le type de message "sketcphad" a la taxonomie de type et une valeur de terme de "public"; le problème est donc que la requête ci-dessus vérifie également si les publications de type "articles" ont également la taxonomie et la valeur de terme particulières.

Est-il possible de faire en sorte que la taxonomie et le terme de ma requête s'appliquent uniquement au type de publication "sketchpad" et que le type de publication de "article" ne comporte aucun critère de filtrage? Fondamentalement, ce que je veux faire est de fusionner deux requêtes différentes en une et de générer les résultats.

1
Dwayne Charrington

vous ne savez pas si vous avez déjà essayé, mais vous pouvez envisager de saisir les deux ensembles de publications séparément, puis de les fusionner. Enfin, utilisez get_posts pour créer une liste combinée triée comme vous le souhaitez. Quelque chose comme cela pourrait fonctionner pour vous (vous pouvez ajouter un argument posts par page aux variables $ args):

<?php
$sketchpad_args = array(
    'post_type' => 'sketchpad',
    'taxonomy'  => 'type',
    'term'      => 'public'
);
$sketchpad_posts = get_posts( $sketchpad_args );

$article_args = array(
    'post_type' => 'article',
);
$article_posts = get_posts( $article_args );

$all_posts = array_merge( $sketchpad_posts, $article_posts );

$post_ids = wp_list_pluck( $all_posts, 'ID' );//Just get IDs from post objects

// Do a new query with these IDs to get a properly-sorted list of posts
$posts = get_posts( array(
    'post__in'    => $post_ids,
    'post_status' => 'publish',
    'orderby' => 'date',
    'order' => 'ASC'
) );

foreach( $posts as $post ) :   
setup_postdata($post); ?>

// Your loop stuff

<?php endforeach; ?>
2
FourStacks

Avant de répondre, notez que query_posts n’est jamais la solution. Soit vous devez utiliser $myquery = new WP_Query() pour générer une nouvelle requête, soit filtrer la requête principale avec le filtre pre_get_posts.

Cela dit, supposons que vous souhaitiez simplement connaître les vars de requête à transmettre à WP_Query, que ce soit par query_posts ou un nouveau WP_Query.

Je pense que votre situation est en fait chanceuse dans la mesure où la taxonomie que vous filtrez ne comporte que deux termes. Pour cette raison, vous pouvez simplement EXCLURE les publications dans le terme que vous ne souhaitez pas, plutôt que d'inclure celles que vous utilisez.

C'est à dire. exclure les blocs à dessin "privés". Ainsi, les carnets de croquis sont filtrés à votre guise, tandis que tous les articles sont renvoyés, car aucun d’entre eux n’appartient au terme de taxonomie "privé".

Vous souhaitez créer un tableau 'tax_query' dans le cadre de votre WP_Query avec NOT IN en tant qu'opérateur. http://codex.wordpress.org/Class_Reference/WP_Query#Taxonomy_Parameters

FWIW Je vous recommanderais d'utiliser des métadonnées postales plutôt qu'une taxonomie pour votre commutateur privé/public. Parce que c'est binaire, cela fonctionnera bien dans la table postmeta et, finalement, la seule interface utilisateur dont vous avez besoin pour cela est une case à cocher, toute l'interface de taxonomie est excessive. Il convient également de noter que, avec votre solution de taxonomie, vous devez TOUJOURS définir l'un des termes de taxonomie, public ou privé, lorsque vous pouvez réellement en traiter un par défaut (public) et cocher la case "privé". Moins de merde dans votre base de données et une case à cocher au lieu d'une interface utilisateur compliquée.

0
jerclarke