2016-08-13 9 views
14

Ponieważ funkcja Wordpress sticky posts umożliwia sprawdzenie postu jako przyklejanego w panelu publikowania postów, który zostanie umieszczony na górze pierwszej strony postów. Zamierzałem też projektować lepką słupek inaczej niż normalnymi wewnątrz pętli dostosowując The Loop domyślnego kodowania w następujący sposób:

<?php if (have_posts()) : ?> 
    <?php $post = $posts[0]; $c=0;?> 
    <?php while (have_posts()) : the_post(); ?> 

    <?php $c++; 
     if(is_home() && !$paged && $c == 1) :?> 
     <!--First sticky post content --> 

    <?php elseif(is_home() && !$paged && $c == 2) :?> 
     <!--Second sticky post content --> 

    <?php elseif(is_home() && !$paged && $c == 3) :?> 
     <!--Third sticky post content --> 

    <?php else:?> 
     <!-- Standard post content --> 

    <?php endif;?> 
    <?php endwhile; ?> 
    <!-- End of the main loop --> 
     //pagination 

    <?php else : ?> 
     <?php _e('Sorry, no posts matched your criteria.'); ?> 

    <?php endif; ?> 

W rezultacie otrzymuję pierwsze trzy posty (zaznaczone jako lepki) doda stylu podczas duplikowane w ramach standardowych wiadomości danych wyjściowych, których nie udało mi się pozbyć.

Próbowałem zastąpić <?php else : ?> z <?php elseif(!is_sticky()) : ?> ale wykonana strona wyświetlana jest „Paged” czy ma aktualny numer strony jest większy niż jeden został posty Liczba odejmowane przez lepkie stanowisk według daty za każdym stronie opublikować.

Każda pomoc, aby przyklejone posty nie były duplikowane, jest bardzo doceniana.

+0

masz 2 pętle lub tylko 1? Uprzejmie udostępnij cały kod, jeśli to możliwe ... – shramee

+0

Hej @Ehab, Zakładając, że masz tylko jedną pętlę, Sprawdź moją odpowiedź poniżej – shramee

Odpowiedz

4

Proponuję zapoznać się z dokumentacją WP_Query:
https://codex.wordpress.org/Class_Reference/WP_Query#Pagination_Parameters

Można utworzyć nowy (lub zmienić istniejące) zapytania i sprowadzić posty bez lepkich nich.

Nie pokazuj Sticky Posty

Wykluczenie wszystkich lepkie posty z zapytania:

$query = new WP_Query(array('post__not_in' => get_option('sticky_posts')));

sugeruję zrobić 2 kolejnych zapytań.

Pierwsza osoba, która pobrała lepkie posty, a druga, aby pobrać wszystkie inne posty (z wyjątkiem jednego przyklejonego, jak opisano powyżej).

+0

Jestem zaznajomiony z argumentami zapytania. To całkowicie usunie lepkie posty z całej pętli, podczas gdy ja potrzebuję ich tylko na pierwszej stronie https://codex.wordpress.org/Sticky_Posts –

+1

W takim przypadku proponuję użyć dwóch pętli, najpierw do uzyskania lepkich postów, i drugi, aby uzyskać wszystkie pozostałe posty (z wyłączeniem tych, które są zlepione). –

1

można oddzielić posty domu stronie i innych stanowisk tak:

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

<!-- if home page --> 
<?php if(is_home() && !$paged) :?> 

    <!-- First page loop --> 
    <?php $post = $posts[0]; $c=0;?> 
    <?php while (have_posts()) : the_post(); ?> 

    <?php $c++; 
    if($c == 1) { ?> 
    <!--First sticky post content --> 
    <?php } ?> 

    <?php if($c == 2) { ?> 
    <!--Second sticky post content --> 
    <?php } ?> 

    <?php if($c == 3) { ?> 
    <!--Third sticky post content --> 
    <?php } ?> 

    <?php endwhile; ?> 
    <!-- End of first page loop --> 

<!-- else if not home page --> 
<?php else:?> 

    <!-- exclude stuicky posts, then run the standard loop --> 
    <?php $query = new WP_Query(array('post__not_in' => get_option('sticky_posts'))); 

    <?php while (have_posts()) : the_post(); ?> 
    <!-- Standard post content --> 

    <?php endwhile; ?> 

<?php endif;?> 
<!-- end if home page/else --> 
    //pagination 

<!-- else if have no posts --> 
<?php else : ?> 
    <?php _e('Sorry, no posts matched your criteria.'); ?> 

<?php endif; ?> 
<!-- end if have posts/else --> 
1

Aby obsłużyć lepkie posty nie

<?php 
    $sticky_query = new WP_Query(array('post__in' => get_option('sticky_posts'))); 
    while ($sticky_query->have_posts()) : $sticky_query->the_post(); 
?> 

Do obsługi wiadomości, które nie są lepkie zrobienia

<?php 
    $non_sticky_query = new WP_Query(array('post__not_in' => get_option('sticky_posts'))); 
    while ($non_sticky_query->have_posts()) : $non_sticky_query->the_post(); 
?> 


PS - is_sticky() nie będzie działać tutaj, jak przypuszczam, ten kod działa na twojej stronie głównej. is_sticky() wymaga, aby post_id działał zgodnie z wymaganiami na stronach innych niż strona postu.

Możesz zrobić coś takiego: is_sticky(get_the_ID()) wewnątrz pętli w bieżącym kodzie.

1

Wystarczy continue w else jeśli post jest lepki

Put

<?php if (is_sticky()) continue;?> 

na górnej części innego ...
kod Będziesz wyglądać jak ten

<?php if (have_posts()) : ?> 
<?php $post = $posts[0]; $c=0;?> 
<?php while (have_posts()) : the_post(); ?> 

<?php $c++; 
    if(is_home() && !$paged && $c == 1) :?> 
    <!--First sticky post content --> 

<?php elseif(is_home() && !$paged && $c == 2) :?> 
    <!--Second sticky post content --> 

<?php elseif(is_home() && !$paged && $c == 3) :?> 
    <!--Third sticky post content --> 

<?php else:?> 
    <?php if (is_sticky()) continue;?> 
    <!-- Standard post content --> 

<?php endif;?> 
<?php endwhile; ?> 
<!-- End of the main loop --> 
    //pagination 

<?php else : ?> 
    <?php _e('Sorry, no posts matched your criteria.'); ?> 

<?php endif; ?> 
1

ty może używać tego kodu do wyświetlania tylko przyklejonych postów

następnie użyć tego kodu, aby usunąć tylko lepkie posty z pętli

<?php 
$args = array(
'posts_per_page' => 4, 
'post__not_in' => get_option('sticky_posts') //that will remove only sticky posts 
); 
$my_query = new WP_Query($args); 
while($my_query->have_posts()) : $my_query->the_post(); 
?> 
    <!-- normal posts content without sticky --> 

<?php endwhile; ?> 
<?php wp_reset_postdata(); ?>