web-dev-qa-db-fra.com

Comment modifier la boucle dans archives.php pour avoir 11 publications par page et style CSS

J'ai édité ma boucle dans archives.php afin de travailler avec la pagination et avec le widget Liste de publication de catégorie. J'ai essentiellement rassemblé tout cela à partir de code et d'idées aléatoires et je suis maintenant si éloigné de la requête de publication par défaut que j'ai du mal à revenir à la case départ. La raison pour laquelle je dois revenir à la case départ est que j'ai besoin de deux choses:

1) Mon code gâche mes publications de catégorie lorsque la publication a deux balises de catégorie. Lorsque cela se produit, ils sont placés dans les mauvaises catégories (ou ne sont pas placés du tout).

2) En faisant ce codage personnalisé, j'ai également perdu la requête pour les "balises", de sorte que les pages de balises ne fonctionnent pas correctement.

Je dois revenir à la case départ pour pouvoir configurer les balises et les publications de catégorie afin qu'elles s'affichent correctement, mais dans le <li>s correct que je stylise. Je ne suis même plus sûr d'avoir besoin du widget Liste de publication de catégorie car, si je ne me trompe pas, je peux appeler les fonctions set_post_thumbnail_size();, the_title();, the_excerpt(), etc. sans le widget et simplement nommer mes propres éléments de liste.

Quoi qu’il en soit, voici le code que j’ai, j’imagine que j’ai besoin d’en balayer un tas pour en revenir là où j’ai besoin. Merci beaucoup pour l'aide, je l'apprécie vraiment.

<?php if (have_posts()) : ?>

<ul style="list-style-type:none;">

<?php
if ($paged == 0)
  $offset = 0;
else
  $offset = ($paged - 1) * 11;
global $post;
$category = get_the_category($post->ID);
$category = $category[0]->cat_ID;
$myposts = get_posts(array('numberposts' => 11, 'offset' => $offset, 'category__in' => array($category), 'post__not_in' => array($post->ID),'post_status'=>'publish'));
foreach($myposts as $post) :
setup_postdata($post);
?>


<li id="category_li">
    <div id="image_con">
        <div id="image_recent">
        <a href="<?php the_permalink(); ?>"><?php set_post_thumbnail_size( 200, 200 );
the_post_thumbnail(); ?></a>
        </div>
    </div>

    <div id="cr_content">
    <a href="<?php the_permalink(); ?>">
    <div class="gloss_glam_font"> <?php the_title(); ?></div>
    <hr>
    <div class="excerpt_cat"><?php the_excerpt(); ?></div>
    </a>
    </div>

    <div id="clearfix">
    </div>
</li>

<?php endforeach; ?>
<?php wp_reset_query(); ?>
</ul>


<?php while (have_posts()) : the_post(); ?>

<?php endwhile; ?>

<?php if (function_exists("pagination")) {
    pagination($additional_loop->max_num_pages);
} ?>
    <?php else :

        if ( is_category() ) { // If this is a category archive
        printf("<div class='post-content'><p><em><strong>Not Found:</strong> Sorry, but there aren't any posts in the &middot;<strong>%s</strong>&middot; category yet.</em></p></div>", single_cat_title('',false));
    } else if ( is_date() ) { // If this is a date archive
        echo("<div class='post-content'><p><em><strong>Not Found:</strong> Sorry, but there aren't any posts with this date.</em></p></div>");
    } else if ( is_author() ) { // If this is a category archive
        $userdata = get_userdatabylogin(get_query_var('author_name'));
        printf("<div class='post-content'><p><em><strong>Not Found:</strong> Sorry, but there aren't any posts by &middot;<strong>%s</strong>&middot; yet.</em></p></div>", $userdata->display_name);
    } else {
        echo("<div class='post-content'><p><em>No posts found.</em></p></div>");
    }

endif; ?>

MODIFIER

D'accord, je l'ai édité et je ne peux pas savoir où je me trouve. J'utilise mon modèle tag.php comme exemple ici (pas le category.php). Voici ce que j'ai fait jusqu'à présent (basé sur le code fourni par Chip dans les réponses):

function wpse63424_filter_pre_get_posts( $query ) {
    if ( ! is_main_query() ) {
        return $query;
    } else {
        if ( is_category() || is_tag() ) {
            $query->set( 'posts_per_page',11 );
        }
        return $query;
    }
}
add_filter( 'pre_get_posts', 'wpse63424_filter_pre_get_posts' );

$tag = get_query_var('tag');
$myposts = get_posts('tag__in' => array($tag));
foreach($myposts as $post) :
setup_postdata($post);

Je pensais que j'avais défini un filtre de 11 publications par page, je recherchais une balise spécifique, je définissais les publications sur la balise de ce tableau, puis je les configurais en conséquence. Quand je viens de lancer get_posts (); il retourne 11 messages par page sans filtre, donc je sais que le code de Chip fonctionne bien. Je suppose que je ne comprends pas encore comment les fonctions sont appelées correctement ...

5
MxmastaMills

Premièrement, pour la mise en page et le style CSS, je recommanderais de créer fichiers de modèle pour les contextes que vous souhaitez personnaliser; c'est-à-dire créer un category.php et un tag.php pour les pages d'archive d'index de catégories et de balises, respectivement. Dans les deux cas, copiez archive.php (ou, s'il n'existe pas, copiez index.php) et renommez la copie en category.php. Ensuite, modifiez le balisage si nécessaire.

Pour CSS, assurez-vous que vous utilisez body_class() dans votre thème, puis vous pouvez utiliser les classes CSS * catégorie et basées sur des balises appliquées à la balise <body> .

L'étape suivante consiste à personnaliser la requête afin de générer 10 publications par page, au lieu de 10, pour les pages d'index d'archives de catégories/balises. Pour cela, utilisez le filtre pre_get_posts. Ajoutez le rappel et l'appel add_filter() suivants à functions.php:

function wpse63424_filter_pre_get_posts( $query ) {
    if ( ! is_main_query() ) {
        return $query;
    } else {
        if ( is_category() || is_tag() ) {
            $query->set( 'posts_per_page',11 );
        }
        return $query;
    }
}
add_filter( 'pre_get_posts', 'wpse63424_filter_pre_get_posts' );

Ce rappel informe WordPress:

  1. Si la requête n'est pas la requête main , renvoyez-la sans la modifier. (Cela évite, par exemple, que la requête du widget Messages récents ou les menus de navigation ne soit affectée.)
  2. Si la page en cours est un index d'archive de catégorie ou un index d'archive de balise, remplacez la variable de requête 'posts_per_page' par 11, puis renvoyez la requête.
8
Chip Bennett

Je ne sais pas si quelque chose a changé avec la dernière version de WP (4.4+), mais is_main_query() retournera un faux positif tel quel. CA devrait etre:

function wpse63424_filter_pre_get_posts( $query ) {
    if ( ! $query->is_main_query() ) {
        return $query;
    } else {
        if ( is_category() || is_tag() ) {
            $query->set( 'posts_per_page',11 );
        }
        return $query;
    }
}
add_filter( 'pre_get_posts', 'wpse63424_filter_pre_get_posts' );
1
darrinb