web-dev-qa-db-fra.com

Ajout de la fonctionnalité Sticky aux archives de type de message personnalisé

Dans WordPress, les types de publication personnalisés ne possèdent pas la fonctionnalité Sticky en tant que fonctionnalité principale. Il est possible, j'en suis sûr, de le créer dans certains cas - et je travaille sur un projet qui l'exige pour les modèles archive-{customposttype}.php.

J'ai téléchargé et installé un plugin, appelé Types de publications personnalisées , que j'ai lu dans cet article qui pourrait être utilisé avec un peu de PHP à get_option ('sticky_posts' ) et reconfigurez le tableau de la requête en cours d’exécution.

Je sais que le plug-in fonctionne parce que l'utilisation de if (!is_sticky()) {et cetera} dans la boucle me permet de modifier le résultat des messages postés (type de message personnalisé).

Je n'ai pas réussi à implémenter avec succès le code de l'article - la commande ne semble pas du tout changer lorsque je l'ai placée en haut de mon modèle archive-{customposttype}.php, et je n'ai pas réussi à le faire fonctionner après plusieurs autres tentatives. . C'est probablement parce que je ne suis pas très habile en PHP.

Une autre chose que j'ai essayée est de créer une nouvelle requête, en spécifiant que je ne veux que des posts collants (ce qui m'a permis de ne montrer que des posts collants); essayer de stocker cette requête dans une variable, puis d'appeler wp_reset_query(), puis de créer une autre requête spécifiant que I ne pas veux des posts persistants, en essayant de la stocker dans une variable, en appelant à nouveau wp_reset_query(); puis en fusionnant les deux matrices de requête avec array_merge(). Malheureusement, mes différentes implémentations ont soit cassé la page, soit réussi à ne rien faire du tout, soit simplement affiché le résultat de la seconde requête ... et je les ai supprimées par mépris.

Je ne sais pas si j'y vais de la bonne façon, vraiment; et je suis sûr que beaucoup de gens ont affronté et surmonté ce problème. Si quelqu'un a des conseils ou des extraits de code pour m'aider à implémenter cette fonctionnalité, ce serait grandement apprécié.

Par souci de clarté, j'essaie d'afficher les posts collants en haut de mes pages d'archives pour les types de posts personnalisés.

2
aminimalanimal

Je pense que la réponse à vos questions se trouve sur la page Web suivante.

Son auteur (Tareq Hasan) a rencontré le même problème que nous et a trouvé une solution.

https://tareq.co/2013/01/sticky-posts-in-custom-post-type-archives/

En gros, vous devez installer le plug-in que vous avez déjà (Sticky Custom Post Types) et ajouter un filtre: (Je colle le code ici, donc si la page est tombée, nous l'avons toujours.)

Le plugin est assez ancien mais il est très simple dans sa façon de fonctionner, donc il fonctionne toujours parfaitement avec WordPress 4.2. La même chose s'applique à l'extrait de code ci-dessous.

J'espère que cela vous aide comme cela m'a aidé.

/**
 * Put sticky posts to top at custom post archives
 * Author: Tareq Hasan
 * Source: http://tareq.wedevs.com/2013/01/sticky-posts-in-custom-post-type-archives/
 * 
 * WordPress doesn't do any processing for sticky posts in custom post type archives.
 * It process sticky posts in homepage only (is_home()). This function processes
 * sticky posts at custom post archive page and puts them to the top of list.
 * 
 * @author Tareq Hasan (http://tareq.weDevs.com)
 *
 * @param array $posts array of queried posts
 * @return array
 */
function wedevs_cpt_sticky_at_top( $posts ) {

    // apply the magic on post archive only
    if ( is_main_query() && is_post_type_archive() ) {
        global $wp_query;

        $sticky_posts = get_option( 'sticky_posts' );
        $num_posts = count( $posts );
        $sticky_offset = 0;

        // loop through the post array and find the sticky post
        for ($i = 0; $i < $num_posts; $i++) {

            // Put sticky posts at the top of the posts array
            if ( in_array( $posts[$i]->ID, $sticky_posts ) ) {
                $sticky_post = $posts[$i];

                // Remove sticky from current position
                array_splice( $posts, $i, 1 );

                // Move to front, after other stickies
                array_splice( $posts, $sticky_offset, 0, array($sticky_post) );
                $sticky_offset++;

                // Remove post from sticky posts array
                $offset = array_search($sticky_post->ID, $sticky_posts);
                unset( $sticky_posts[$offset] );
            }
        }

        // Fetch sticky posts that weren't in the query results
        if ( !empty( $sticky_posts) ) {

            $stickies = get_posts( array(
                'post__in' => $sticky_posts,
                'post_type' => $wp_query->query_vars['post_type'],
                'post_status' => 'publish',
                'nopaging' => true
            ) );

            foreach ( $stickies as $sticky_post ) {
                array_splice( $posts, $sticky_offset, 0, array( $sticky_post ) );
                $sticky_offset++;
            }
        }

    }

    return $posts;
}

add_filter( 'the_posts', 'wedevs_cpt_sticky_at_top' );
2

J'implémente des posts collants dans deux types de posts personnalisés et je viens de jeter un coup d'œil au plugin que vous mentionnez ici. Il utilise l'option globale de messages collants utilisée par Wordpress pour identifier les messages collants - pour autant que je sache dans le code, les types de messages personnalisés seront collés sur la page d'accueil. Ce que vous devez faire dans votre page d’archive est:

Obtenez des messages collants

$sticky = get_option( 'sticky_posts' );

Utilisez une requête pour n’obtenir que des posts collants pour votre type de message, puis affichez-les en haut de la page.

$args = array(
    'posts_type' => [your custom post type slug],
    'post__in'  => $sticky
);
$sticky_query = new WP_Query( $args );
while( $sticky_query->have_posts() ) {
    $sticky_query->next_post();
    echo '<li>' . get_the_title( $sticky_query->post->ID ) . '</li>';
}
wp_reset_postdata();

Modifiez ensuite la requête principale pour exclure les publications persistantes à l'aide de

query_posts(array('post__not_in' => $sticky))
0
user34211