Исключить определенную категорию с главной

ОДИН ИЗ ВАРИАНТОВ:

Основной цикл (loop) для файла index.php темы будет выглядеть так:

<?php $top_query = new WP_Query('cat=-1&showposts=10'); ?>
<?php while($top_query->have_posts()) : $top_query->the_post();
$first_post = $post->ID; ?>
<div class="post" id="post-<?php the_ID(); ?>">
<h2><a href="<?php the_permalink() ?>" rel="bookmark"
title="Permalink: <?php the_title(); ?>"><?php the_title();
?></a></h2>
<div class="entry">
<?php the_content('Далее…'); ?>
</div>
</div>
<?php endwhile; ?>

Исключена категория с id=1 (cat=-1)
Выводятся посл. 10 постов (showposts=10)

UPD 28.05.2007
Можно воспользоваться плагином Category Visibility

не не работет исключение в версии 2.0.10, хоть убейся:)

во, вроде заработало только вместо new WP_Query(‘cat=-1&showposts=10’); ?> пставьте category а не cat

нет, я ошибся, не работает..ни так ни так..

Приведеный код рабочий, скорее всего вы где-то у себя ошиблись.

Код не рабочий, сообщение не показывается, но нет перехода в раздел который исключен

сделал так – привинтил файл functions.php в theme, в нем:

<?php
function myFilter($query) {
if ($query->is_feed || $query->is_home || $query->is_archive) {
        $query->set('cat','-2');
    }

return $query;
}

add_filter('pre_get_posts','myFilter');
 ?>

Код позволяет исключить категорию с главной или несколько, также исключает эту же категорию из фида
Правда не работает исключение поста на главной, но с второстпеенных страниц, типа page/2/ и т д

sonika а куда это вставлять, я несовсем понял? в любое место на главной странице

Смотря куда надо, если для главной— то в index.php темы вместо станд. цикла, который начинается с
<?php if (have_posts()) : ?>
и заканчивается примерно так:
<?php endif; ?>

Но вообще-то, если Вы читали комменты, этот код вроде не работает (я взяла его из Кодекса и не проверяла)
Присмотритесь коментом выше вашего, что писал euseller

А можно поподробнее описать способ euseller в папки темы создать файл functions.php туда вставить данный код, что дальше? всё?

Exact,
да, в папке вашей темы создать файл с тем содержимым, что я указал, в файл header.php шаблона включить этот файл в обработку:
<?php require_once get_template_directory()."/functions.php"; ?>
все, вроде больше ничего не надо.

появился новый вопрос : я хочу исключить показ категорию из постов, на главной пишется после поста:
Категория: Блог, Индекс, Интернет – Править – Комментировать
Вот мне надо чтобы не писалось в перечислении категорий допустим Индекс, но чтобы пост в этой категории находился, и в сайдбаре зайдя в категорию Индекс можно было увидеть пост.

никто не знает или на совсем ясно объяснил?))

Товарищи, проблема не решена. Как же всё-таки сделать, чтобы одна из категорий на главной не отображалась?
Неужели из-за такой мелочи надо ставить сомнительный плагин Category Visibility, от которого посты троятся? Вывод одной категории решается одной строчкой, как же всё-таки сделать обратное?

С functions.php не получилось?

Попробуйте такой способ из Кодекса:
http://codex.wordpress.org/Template_Tags/query_posts#Exclude_Categories_From_Your_Home_Page

Перед началом Цикла (<?php if (have_posts()) блаблабла) в index.php вставьте:

<?php
   if (is_home()) {
      query_posts("cat=-3");
   }
?>

Единственное условие — в Вашей теме index.php не отвечает за вывод всех типов записей, т.е. присутствуют также шаблоны single.php, page.php, category.php или archive.php

Про funktions.php было написано, что на последующих страницах новостей он не работает, это мне не подходит.

sonika, спаибо! Последний способ сработал. Просто я хотел отделить events calendar 3 посты от новостей. В этом плагине, кстати есть такая функция, но тогда они вообще нигде выводиться не будут. А для events хочу отдельную страницу создать. Вот и всё.

Пожалуйста! 🙂
Кстати, в своем предыдущем сообщении я кажется приврала немного насчет «единственного условия», сорри 🙂

Нашёл всё-таки неисправность. При добавлении кода архивные страницы новостей page/2, page/3… не отображаются, вместо них загружается первая страница новостей. Как можно это пправить?

http://trampampam.ru/blog/wordpress/postranichnyiy-vyivod-zapisey-v-kategorii/

Спасибо, данное решение помогло в том разделе, где надо было отобразить только одну категорию. Но там, где надо её исключить при добавлении:

$numpost=10;//сколько записей в обычной категории
if($paged>1) $offset=$numpost*($paged-1);
else $offset=0;//чтобы знать, с какой статьи начать, если это не первая страница категории

Первая страница продолжает отображаться на страницах архива. А при добавлении:

$posts = get_posts('numberposts='.$numpost.'&category='.$cat.'&offset='.$offset);
foreach($posts as $post) : start_wp();
setup_postdata($post);
название записи, автор записи, анонс записи
endforeach;

Порядок, но при этом показываются все рубрики без исключения. Видимо query_posts в связке с ними не работает.

Кстати понял, почему Category Visibility работает с косяками. Если одна новость под более чем одной рубрикой, то будет она отображаться столько раз, в скольких рубриках она находится. Нашёл и другой самописный плагин, исключающий одну рубрику, но проблема с ним та же, что и с Category Visibility.

Пробую с functions.php, но там у меня уже прописано:

<?php
if ( function_exists('register_sidebar') )
    register_sidebar();
?>

Если добавляю:

<?php
function myFilter($query) {
if ($query->is_feed || $query->is_home || $query->is_archive) {
        $query->set('cat','-15');
    }

return $query;
}

add_filter('pre_get_posts','myFilter');
 ?>

меняется кодировка на Западноевропейскую ISO(блог в UTF-8), а админка вообще отказывает в работе. Хотя задача выполняется и страницы листаются как надо. Подскажите, что сделать, чтобы победить это на данном этапе?

Надеюсь, ещё не утомил 🙂 Сам второй день мучаюсь 😉

Ну, всё, проблема решена. Добавил строки в functions.php через FTP клиент. Теперь заработало. Спасибо всем за помощь.

С functions.php не получилось?

Попробуйте такой способ из Кодекса:
http://codex.wordpress.org/Template_Tags/query_posts#Exclude_Categories_From_Your_Home_Page

Перед началом Цикла (<?php if (have_posts())  блаблабла) в index.php вставьте:
<?php
   if (is_home()) {
      query_posts("cat=-3");
   }
?>

я сделала, но не получилось. отображаются все темы.
скажите, а для того чтобы этот код работал, должна существовать страница home.php?

нет, home.php иметь не обязательно.

Что именно Вы сделали?
Создали файл functions.php в папке своей Темы и заполнили его по инструкции, которую дал euseller?
http://forum.maxsite.org/viewtopic.php?pid=3275#p3275

Или вписали в файл index.php своей Темы строчку

<?php
   if (is_home()) {
      query_posts("cat=-3");
   }
?>

ПЕРЕД началом цикла

Почему могло не работать: если у Вас версия wp 2.0.x, то такой «финт» с index.php не проходит…

у меня WP 2.2.1

я вставила код перед началом цикла. Вот так оно выглядит:

<?php get_header(); ?>

    <div id="content" class="narrowcolumn">

<?php
   if (is_home()) {
      query_posts("cat=-4");
   }
?>
<?php if (have_posts()) : ?>
        
        <?php while (have_posts()) : the_post(); ?>
                
            <div class="post">
                <h2 id="post-<?php the_ID(); ?>"><a href="<?php the_permalink() ?>" rel="bookmark" title="Permanent Link to <?php the_title(); ?>"><?php the_title(); ?></a></h2>
                <small><?php the_time('F jS, Y') ?> <!-- by <?php the_author() ?> --></small>
                
                <div class="entry">
                    <?php the_content('Читать полностью &raquo;'); ?>
                </div>
        
                
                <!--
                <?php trackback_rdf(); ?>
                -->
            </div>
    
        <?php endwhile; ?>

нашел такое работающее решение здесь:

в index.php вместо:

<?php if(have_posts()): ?><?php while(have_posts()):the_post(); ?>

вставить:

<?php
$query='cat=ID&paged='.$paged;
if (have_posts()) :
    if (is_home()) {
        query_posts($query);
        }
?>
<?php while(have_posts()):the_post(); ?>

По-моему, самое правильное решение приведено в Кодексе:

If you want to preserve that information, you can use the variable $query_string in the call to query_posts().

For example, to set the display order of the posts without affecting the rest of the query string, you could place the following before The Loop:

query_posts($query_string . "&order=ASC")

а при этом переходы по страницам постов будут работать? в приведенном мной хаке – работают.

Порой мне кажется, что есть люди, которые хранят файлы на каменных скрижалях.

🙂

время – не только деньги, но и жизнь.

ОДИН ИЗ ВАРИАНТОВ:

Основной цикл (loop) для файла index.php темы будет выглядеть так:
<?php $top_query = new WP_Query('cat=-1&showposts=10'); ?>
<?php while($top_query->have_posts()) : $top_query->the_post();
$first_post = $post->ID; ?>
<div class="post" id="post-<?php the_ID(); ?>">
<h2><a href="<?php the_permalink() ?>" rel="bookmark"
title="Permalink: <?php the_title(); ?>"><?php the_title();
?></a></h2>
<div class="entry">
<?php the_content('Далее…'); ?>
</div>
</div>
<?php endwhile; ?>

Исключена категория с id=1 (cat=-1)
Выводятся посл. 10 постов (showposts=10)

UPD 28.05.2007
Можно воспользоваться плагином Category Visibility

Что-то после этого, на всех страницах (следующая и прерыдущая) отображаются одни и те же записи

Ещё одна проблема:
заспамили коменты, была сильная нагрузка на сайт. Теперь новости отображаются по дате в обратном порядке. Знаю, есть настройки:

Orderby Parameters

Sort retrieved posts by this field.

    * orderby=author
    * orderby=date
    * orderby=category
    * orderby=title
    * orderby=modified
    * orderby=modified
    * orderby=menu_order
    * orderby=parent
    * orderby=ID
    * orderby=rand

Also consider order parameter of "ASC" or "DESC"

http://codex.wordpress.org/Template_Tags/query_posts

Но как их вставить в функцию?

<?php
function myFilter($query) {
if ($query->is_feed || $query->is_home || $query->is_archive) {
        $query->set('cat','-15');
    }

return $query;
}

add_filter('pre_get_posts','myFilter');
 ?>

Выручайте, тут я вообще ноль:/

Ещё одна проблема:
заспамили коменты, была сильная нагрузка на сайт. Теперь новости отображаются по дате в обратном порядке.

Для начала посмотрите, какой SQL запрос генерируется, может там и так стоит нужный порядок.

Как недавно выяснилось, ORDER BY post_date DESC не всегда сортирует посты в обратном хронологическом порядке (сначала последние). Чесно говоря, никогда б не подумал, что такое возможно.

Похоже, проблема в functions.php

#
Warning: Cannot modify header information - headers already sent by (output started at /homepages/8/d180102457/htdocs/wp-content/themes/lavrentisdark-10/functions.php:6) in /homepages/8/d180102457/htdocs/wp-includes/pluggable.php on line 391

Раньше всё работало нормально, до того, как начали спамить в комментах. Даже и не знаю, что могло повлиять… Удаляю из functions.php – всё нормально, но мне надо исключить категорию. Как быть? Что посоветуете?

functions.php выше постом

Не могу найти решение.

Задача следующая. Нужно на главной странице выводить. к примеру рубрики id4 id7 id9 и не выводить id1 id2 id8.
Как это реализовать?

Не могу найти решение.

Задача следующая. Нужно на главной странице выводить. к примеру рубрики id4 id7 id9 и не выводить id1 id2 id8.
Как это реализовать?

Для вывода записей в WordPress используется цикл, называемый "The Loop" и имеющий обычно такой вид:

<?php if (have_posts()) : ?>
<?php while (have_posts()) : the_post(); ?>
//Тут Ваш код
<?php endwhile; ?>

Если перед циклом "The Loop" прописать функцию query_posts с нужными нам параметрами, то мы сможем получить тот результат, который нам требуется. Вот пример такого использования:

<?php query_posts('cat=-1,-2,-3'); ?>
<?php if (have_posts()) : ?>
<?php while (have_posts()) : the_post(); ?>
//Тут Ваш код
<?php endwhile; ?>

Код из данного примера выводит на главную страницу записи из всех категорий, кроме категорий с ID 1, 2 и 3.

Если вам требуются несколько другие результаты, то для достижения рекомендую воспользоваться следующими примерами использования функции query_posts:

query_posts(‘cat=-3’) – Не показывать категорию id которой равно 3;
query_posts(‘cat=-1,-2,-3’) – Не показывать категории, id которых равны 1, 2 и 3;
query_posts(‘cat=2,6,17’) – Вывести категории с id равным 2, 6 и 17;
query_posts(‘category_name=WordPress’) – Вывести категорию с названием “WordPress”;
query_posts(‘name=Hello World’) – Вывести один пост с названием “Hello World”;
query_posts(‘p=5’) – Вывести один пост, id которого равно 5;
query_posts(‘page_id=7’) – Вывести страницу id которой равно 7;
query_posts(‘pagename=about’) – Вывести страницу с названием “about”;
query_posts(‘cat=18&showposts=5’) – Вывести 5 постов из категории с id=18;
query_posts(‘cat=3&orderby=date&order=ASC’) – Вывести посты из категории id которой равно 3, сортировать по дате в хронологическом порядке(DESC – в обратном порядке);
query_posts(‘posts_per_page=10’) – Вывести 10 постов на страницу (при значении -1 выводит все посты);
query_posts(‘cat=3&year=2008’) – Вывести посты из категории с id=3 за 2008 год;
query_posts(‘orderby=rand&showposts=3&cat=3’) – выводин рандомно, т.е. случайно 3 записи из 3 категории;
query_posts(‘orderby=rand&showposts=3’) – выводит случайно 3 записи из всех категорий;
query_posts(‘meta_key=cars&meta_value=volvo’) – выводит список постов с произвольным полем “cars” и значением этого поля volvo.

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