Измените основной запрос цикла для постраничного и мета-ключа

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

$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).

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

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

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

Solutions Collecting From Web of "Измените основной запрос цикла для постраничного и мета-ключа"

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

 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, как я уже говорил ранее, ваш код дал хороший старт, но дал на предыдущих страницах некоторые ненужные сообщения, которые были показаны. Я добавил функцию для фильтрации posts_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; } 

Более того, поскольку мы изменили $ paged, поэтому функция 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>