Вопрос

Я стараюсь изменить основную петлю таким образом: у меня есть мета -ключ для отображения избранных элементов, которые следует отображать только на домашней странице блога. Я тяну их в код, отдельный от основного цикла, что -то вроде -

$leading = get_posts('showposts=5&meta_key=_pull_leading3&meta_value=on');      
    foreach ($leading as $post) : 
        setup_postdata($post);
        //some code to show posts data
    endforeach;

Затем в основном цикле я хочу показать только посты, которые не назначены как показанные, поэтому я изменяю основной цикл с помощью Query_posts:

query_posts('posts_per_page=7&paged='.$paged.'&meta_key=_pull_leading3&meta_value=off');

Пока здесь все в порядке. Но я также хочу, чтобы, если я пойду на любые другие старые страницы, я снова получу фигурные сообщения, если они будут там естественным образом через обычный заказ. В этом случае, поскольку я использую мета -значения, я их не понимаю. Если я попробую что -то подобное -

if (is_home() && $paged == '0') {  //$paged value is 0 on 1st page and not 1 !          
        query_posts('posts_per_page=7&paged='.$paged.'&meta_key=_pull_leading3&meta_value=off');                         
      }
      else {
        query_posts('posts_per_page=7&paged='.$paged);          
      } 

Затем на странице № 2 я получаю сообщения по мере необходимости, но я повторяю часть сообщений, которые были на странице № 1 (домашняя страница) (поскольку в цикле домашней страницы я показал только сообщения, которые не представлены, так что, так как эта часть Посты уже показаны там, и теперь должны быть исключены со страницы № 2).

Как я могу изменить основную петлю таким образом, чтобы на главной странице показана посты, которые не представлены, и что на других страницах $ Page будет отображаться посты. Сообщения с предыдущей страницы?

Я действительно надеюсь, что мне удастся объяснить свою проблему ...

Большое спасибо, маор

Это было полезно?

Решение

Я думаю, что это сделает то, что вы хотите. Но мне все еще интересно, не были бы липкие посты лучше ...

if (is_home() && $paged == '0') {  //$paged value is 0 on 1st page and not 1 !          
        query_posts('posts_per_page=7&paged='.$paged.'&meta_key=_pull_leading3&meta_value=off');                         
      }
      else {
        // recreate the home page "loop" to figure out which posts to exclude
        $excluded = array_map(
            create_function('$post', 'return $post->ID;' ),
            get_posts('numberposts=7&meta_key=_pull_leading3&meta_value=off')
            );
        query_posts( array(
            'posts_per_page' => 7,
            'paged' => $paged-1, // since we already excluded the first page
            'post__not_in' => $excluded) );          
      } 

Другие советы

@GoldenApples, как я прокомментировал ранее, ваш код дал хороший старт, но дал предварительные страницы несколько ненужных постов, которые были показаны. Я добавил функцию, чтобы фильтровать Post_where, и она вычисляет дату последнего поста на первой странице и фильтру, чтобы принести сообщения, которые раньше его. Похоже, что это делает это, но я не совсем уверен, что в этом нет ошибок. Не могли бы вы взглянуть на эту функцию и сказать свое мнение:

add_filter( 'posts_where' , 'tc_special_posts_where' );
function tc_special_posts_where( $where ) { 
    global $wpdb, $paged, $post;
    $paged = get_query_var('paged');
    $g = get_posts('numberposts=7&meta_key=_pull_leading3&meta_value=off&paged=0');
    foreach ($g as $p) { $i = $p->post_date; } 

    if (is_home() && $paged > 0) {
     $where .= " AND post_date < '" . $i . "'";
    }   
return $where; }

Более того, так как мы изменили $ page, поэтому функция next_posts_link () В таком случае отображается текущая страница в качестве следующей страницы, поэтому мне пришлось сделать некоторые замены -

$uri = $_SERVER["REQUEST_URI"];
$x = preg_match('/(\d){1,}/', $uri, $matches); //catch the digit of page number     
$nextlink = get_next_posts_link('Next Page »', 0);
if ($matches) {   //on the first page not needed to replace, only from page 2 and on
    $nextlink = preg_replace('/(\d){1,}/e', '"$1"+1'  ,$nextlink);  
}
<span class="alignleft"><?php echo $nextlink;?></span>
Лицензировано под: CC-BY-SA с атрибуция
Не связан с wordpress.stackexchange
scroll top