Znajdziecie tutaj sporo postów dotyczących kodowania theme'ów pod wordpressa (hacki, pluginy, template-tags, funkcje), oraz inne przydatne rzeczy, takie jak na przykład skrypty jQuery, czy też snippety CSS2 / CSS3. Z góry przepraszam za ubogie opisy - bloga prowadzę głównie dla siebie, jako swoistą podręczną bazę wiedzy - bym rzeczy raz znalezionej nie musiał szukać ponownie;)
Wczoraj zmierzyłem się z dosyć nietypowym i jak zdążyłem zauważyć po ilości przeszukanych stron – częstym problemem. Strona którą składam obecnie pod WP na swojej stronie głównej zawiera dwa loopy. Jeden odpowiada za wyświetlanie ostatniego sticky post’a (odpowiednik jednego z serii pluginów „Featured”), natomiast w drugim loopie wyświetlane są wszystkie newsy wraz ze wszystkimi sticky postami. Problem pojawił się momencie, gdy chciałem ignorować podbijanie sticky postów implementując przy tym w pełni działającą paginację (za pomocą plugina wp-paginate).
Warto wspomnieć na samym początku o tym, że od WordPressa 3.xx wcześniej działający patent, polegający na wstawieniu odpowiedniego query już nie działa. Wyglądało to w następujący sposób:
$paged = (get_query_var('paged')) ? get_query_var('paged') : 1;
query_posts("category_name=category&paged=$paged");
I wtedy nasz loop działał jak ta lala. Niestety, zmiany wprowadzone w wp spowodowały, że powyższa metoda nie jest już skuteczna. Teraz, by wyświetlić żądaną ilość postów wraz z paginacją musimy użyć następującego rozwiązania:
query_posts( $query_string . '&posts_per_page=5&ignore_sticky_posts=1' ); if ( have_posts() ) : while ( have_posts() ) : the_post();
Jak widać, ustawiamy tutaj na sztywno posts_per_page, dodatkowo, tak jak wspomniałem wcześniej – chciałem, żeby WordPress ignorował przyklejone posty i nie podbijał ich w tym loopie. Do tego służy specjalny parametr ignore_sticky_posts, któremu należy ustawić wartość 1. Na samym wstępie napisałem, że posiadam na stronie głównej dwa loopy – jeden do wyświetlania ostatnio podklejonego posta, oraz drugiego, w którym wyświetlane są pozostałe newsy – poniżej prezentuję gotowe rozwiązanie jak to osiągnąć:
<?php /*featured loop*/
while ( have_posts() ) : the_post();
if (is_sticky()) {
?>
<article <?php post_class(); ?>>
<header>
<h1><a href="<?php the_permalink(); ?>" title="<?php the_title_attribute();?>"><?php the_title(); ?></a></h1>
<p><span class="facebook-share"><a href="#" title="#"></a></span> dodano: <time datetime="<?php the_time('c'); ?>"><?php the_time('j F, Y'); ?></time> <span class="comments"><a href="#">Komentarze: 12</a></span> <?php edit_post_link('Edytuj wpis','<span class="edit">','</span>');?></p>
</header>
<section>
<?php the_post_thumbnail('featured-post', array( 'class' => 'featured-icon' )); ?>
<?php the_content( "Czytaj dalej... <strong>»</strong>", $strip_teaser, $more_file ); ?>
</section>
</article>
<?php
break;
}
endwhile;
?>
<?php /* main loop */
query_posts( $query_string . '&posts_per_page=5&ignore_sticky_posts=1' );
if ( have_posts() ) : while ( have_posts() ) : the_post();
?>
<article>
<header>
<h1><a href="<?php the_permalink(); ?>" title="<?php the_title_attribute();?>"><?php the_title(); ?></a></h1>
<p><span class="facebook-share"><a href="#" title="#"></a></span> dodano: <time datetime="<?php the_time('c'); ?>"><?php the_time('j F, Y'); ?></time> <span class="comments"><a href="#">Komentarze: 12</a></span> <?php edit_post_link('Edytuj wpis','<span class="edit">','</span>');?></p>
</header>
<section>
<?php
if ( (function_exists( 'add_theme_support' )) && ( has_post_thumbnail() )){
the_post_thumbnail('post-thumbnail', array( 'class' => 'post-icon' ));
}
?>
<?php the_content( "Czytaj dalej... <strong>»</strong>", $strip_teaser, $more_file ); ?>
</section>
</article>
<?php
endwhile;
else:
?>
Rozwiązanie działa – naj przynajmniej póki co nie doszukałem się w jego działaniu żadnych nieprawidłowości – mam nadzieję, że pomoże potrzebującym hehe ;)
Oczywiście, by wyświetliła się nam na samym końcu paginacja (w moim przypadku to wp-paginate) naturalnie trzeba dodać poniżej:
<?php if(function_exists('wp_paginate')) {wp_paginate();} ?>