web-dev-qa-db-fra.com

Utiliser les catégories et "stickyness" ensemble

J'ai une requête personnalisée sur ma page d'accueil montrant tous les messages dans une certaine catégorie. J'ai besoin de cette requête pour respecter les posts collants, mais d'après mes recherches, il semble que les requêtes par catégorie ignorent le caractère persistant. Ma question est deux (et demi) fois:

  1. Quelqu'un peut-il me dire où et comment, dans la base de données, Stickyness est appliqué à un message? Je ne le vois pas dans wp_postmeta ou wp_posts. Celui-ci est le plus important et sera probablement suffisant pour vous win réponse acceptée.
  2. Existe-t-il un moyen simple et élégant d’acquérir des articles collants appartenant à une certaine catégorie?
  3. Si non, alors que diriez-vous d'une manière laide de le faire?

Juste pour le plaisir, voici ma question, bien que je pense que cela ne changera rien à la réponse.

$getHighlights = array(
    'posts_per_page' => 7,
    'post_type' => array('post','Event'),
    'category_name' => 'Highlights', 
);

Désolé pour le titre long, mais je voulais préciser ce que je demandais.

2
JakeParis

Ajoutez simplement 'post__in' => get_option('sticky_posts') à votre requête, pour limiter votre requête à des posts collants. Alors,

$getHighlights = array(
    'numberposts' => 7,
    'post_type' => array('post','Event'),
    'post__in' => get_option('sticky_posts'),
    'category_name' => 'Highlights'
);

devrait travailler pour vous.

Edit: Voici comment vous pouvez fusionner deux tableaux pour obtenir les posts collants en haut de votre requête:

$getHighlights_sticky = get_posts( array(
        'numberposts' => 7,
        'post_type' => array('post','Event'),
        'post__in' => get_option('sticky_posts'),//it should be post__in but not posts__in
        'category_name' => 'Highlights'
    ));
$getHighlights_other = get_posts( array(
        'numberposts' => 7 - count( $getHighlights_sticky ),
        'post_type' => array('post','Event'),
        'post__not_in' => get_option('sticky_posts'),//it should be post__not_in but not posts__not_in
        'category_name' => 'Highlights'
    ));
foreach ( array_merge( $getHighlights_sticky, $getHighlights_other ) as $post ) {
    setup_postdata( $post );

    // your display loop

}

Cela affichera 7 posts, avec les collants en haut (bien sûr, cela suppose que vous n'avez pas plus de 7 collants, sinon tout sera foiré ...) (édité pour utiliser numberposts selon le commentaire de l'OP ci-dessous ...)

8
goldenapples

Le post-it n'est pas enregistré par article, il existe une option sticky_posts qui contient un tableau de ces éléments. Donc, vous pouvez aller chercher ça avec $sticky_posts = get_option('sticky_posts');

Reportez-vous à Paramètres de post-traitement dans le Codex pour plus de détails sur l'interrogation des post-it.

Je ne suis pas tout à fait sûr de ce qui serait la meilleure approche pour rendre votre requête respectueuse. En regardant rapidement dans le code, il est probable que is_home conditionnel soit remplacé et que cela provoque des problèmes. Peut-être capable d'accrocher quelque part et de simuler ce conditionnel, mais cela pourrait casser quelque chose de plus dans le traitement.

2
Rarst