Помогите с query_posts

Проблема в следующем, не хочу выводить определенные рубрики на главную и в постраничную навигацию (например: http://www.site.ru/page/2/ и т.д.) применяю следующий код в index.php

<?php query_posts($query_string.'&cat=-18,-19,-20'); ?>
<?php if (have_posts()) : ?>
<?php while (have_posts()) : the_post(); ?>
<!--Тут содержимое поста-->
<?php endwhile; ?>
    <div id="navigation">
    <?php posts_nav_link('','','<span class="prev">&laquo; Следующие записи</span>') ?>
    <?php posts_nav_link('','<span class="next">Предыдущие записи &raquo;</span>','') ?>
    </div>
<?php else : ?>

Он их не выводит (тут все ок), но проблема в том, что когда обращаешься к пустой странице http://www.site.ru/page/10/ например (где эти записи должны были быть – все записи которые не надо выводить были опубликованы в начале жизни сайта), то она не отдает 404 ошибку, т.е. WordPress их как бы видет…. и даже выводит:

    <div id="navigation">
    <?php posts_nav_link('','','<span class="prev">&laquo; Следующие записи</span>') ?>
    <?php posts_nav_link('','<span class="next">Предыдущие записи &raquo;</span>','') ?>
    </div>

Как то можно это побороть? Просто не хорошо иметь пустые страницы без 404….

1. а после <?php else : ?> что?
2. шаблон 404.php есть?
3. Точно статус не 404?

Дак в том то и дело что условия else не выполняется, он выводит:
<div id="navigation">
<?php posts_nav_link(”,”,'<span class="prev">&laquo; Следующие записи</span>’) ?>
<?php posts_nav_link(”,'<span class="next">Предыдущие записи &raquo;</span>’,”) ?>
</div>
Попробуйте у себя на локальном… Если есть время…. Похоже это косяк ВордПресса, посмотрел на 2.8. тоже самое =(

Про query_posts. Смотрите код над строкой «Теперь должно работать […]».

Помогло?

Нашел время. WP 2.8.1, Тема classic. После добавления &cat=-n, на страницах, где могли бы быть посты, WP 404 не выдал, а написал "Извините, нет записей, удовлетворяющих вашим условиям". За "пределами" – честные 404. Не принципиально, но как-то неаккуратненько 🙂

У меня также! Ю.Б., спасибо успокоили! Думал у меня у одного такое, кто нибудь может написать тикет в WordPress, у меня с переводом с англ на русский нормально, а вот на оборот – плохо! Заранее спасибо! Кстати тут нашел один сайтик у него так более 1000 страниц без 404) Могут воспользоваться завистники 😉

Вообще-то, говорят, полезно сначала думать, а потом делать. Это я про себя. Сначала сделал, а потом подумал 😀

Смотрите, что получается. Что просят показать движок определяет по урлу, готовит массив постов для вывода и после всего этого подключает шаблон. А тут мы ему говорим: "чувак, забудь! мы хотим вывести не то, что ты там насобирал, а то, что мы тебе в шаблоне в query_posts укажем". Улавливаете мысль? Убирать с морды посты неугодных рубрик нужно где-то раньше, до того, как движок соберет массив и посчитает посты под вывод. Может плагин какой-нибудь так делает, например advanced-category-excluder. Честно скажу – облом проверять. Жара жуткая, мозг плавится…

Да, действительно advanced-category-excluder решает эту проблему, но не люблю я эти плагины до жути… обновлять надо, грузят сайт, уязвимости и т.д.
В действительности все равно WordPress не правильно срабатывает, вот сами посмотрите, мы ему говорим выведи все посты с нашим условием, а условие у нас &cat=-18,-19,-20, если нет постов удовлетворяющих этому требованию иди по <?php else : ?>, а он не слушается!

Мой слушается. На "промежуточных" страницах по if (have_posts()) вернул false и написал "Извините, нет записей". А 404 уже поздно возвращать, когда хедер выведен.

готовит массив постов для вывода

и готовит массив с количеством страниц. Потом мы выводим посты по данным из первого массива, попутно из него выбрасывая ненужные, но при этом не пересчитываем количество страниц. Тогда получается, что в первом масиве уже все закончилось – выдавать нечего, а во втором все еще продолжается «показ».

… я почему-то подумал, что код, на который я попытался обратить внимание автора как раз и решал проблему пересчета

Anonymous
Отправить
Ответ на: