query_posts($args) исключить категорию

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

Это мой код (к сожалению, я его не писал, но его нужно отредактировать):

function blogcuts_homepage_sc($atts, $content = null) {
    $blogH = '';
    $last = '';
    $counter = 1;
    $args = array(
        'post_type' => 'post',
        'order' => 'DESC',
        'posts_per_page' => 4
    );
    query_posts( $args );
    if ( have_posts() ) : while ( have_posts() ) : the_post();
    if ($counter == $args['posts_per_page']) { $last = ' last-column'; }
        $img_array = wp_get_attachment_image_src(get_post_thumbnail_id(), 'small');
        $comments = get_comments_number();
        $custom = get_post_custom();

        $blogH.= '<article class="blog-excerpt'.$last.'">';
        $blogH.= '<h3><a class="bg-transition" href="'.get_permalink(get_the_ID()).'">'.get_the_title().'</a></h3>';
        $blogH.= '<a href="'.$img_array[0].'" rel="prettyPhoto" title="'.get_the_title().'">';
        $blogH.= get_the_post_thumbnail($post->ID, 'item', array('title'    => get_the_title()));
        $blogH.= '<div class="meta"><span class="date">'.get_the_date().'</span><div class="alignright"><span class="number-of-comments">'.$comments.'</span><a class="comments" href="'.get_permalink(get_the_ID()).'#comments"></a>';

        if (get_option('op_likeit') == 'Enabled') {
            $blogH.= '<span class="number-of-likes likes-'.get_the_ID().'">'.likes(get_the_ID()).'</span><a id="likeit-'.get_the_ID().'" class="liked-after-'.get_the_ID().' likes likeit'.liked(get_the_ID()).'" href="#"></a>';
        }
        $blogH.= '</div></div><p class="excerpt">'.$custom['desc'][0].'</p></article>';
        $counter++;
        endwhile; endif;
        wp_reset_query();
        return $blogH;
    }
}
add_shortcode("blogcuts_homepage", "blogcuts_homepage_sc");

Идентификатор кошки равен 23. Я попытался добавить «исключить» => «23» в массив, но это не сработало. Буду очень признателен за любые предложения или тех, кто может указать мне в правильном направлении!


person Awooga    schedule 15.08.2013    source источник


Ответы (1)


Изменить: я думаю, что get_posts() является предпочтительным способом сделать это, так как он не будет мешать the_loop() (см. ниже). Вы уверены, что хотите использовать query_posts(), а не get_posts()?

Query_posts изменяет основной цикл, что может привести к неожиданному поведению, когда пользователь добавляет ваш шорткод на страницу, а затем его страница «ломается».

При этом этот код будет использовать query_posts для исключения категорий 1, 2 и 3:

Изменить: удалено «array_merge» и ненужные слова «post», «order» => «DESC», «cat» => «-1,-2,-3», «posts_per_page» => 4 ); запрос_сообщения ($ аргументы); ?>

Если вместо этого вы решили использовать get_posts, это, вероятно, выглядело бы так: 'post', 'order' => 'DESC', 'cat' => '-1,-2,-3', 'posts_per_page' => 4 );

$myposts = get_posts( $args );
foreach ( $myposts as $post ) : setup_postdata( $post ); ?>
    ....  now you can operate just like in the_loop()
endforeach; 
wp_reset_postdata();
?>

http://codex.wordpress.org/Class_Reference/WP_Query

Exclude Posts Belonging to Category

Display all posts except those from a category by prefixing its id with a '-' (minus) sign.

$query = new WP_Query( 'cat=-12,-34,-56' );
person Lotus    schedule 15.08.2013
comment
Большое спасибо, Лотос. Я попробую! - person Awooga; 20.08.2013
comment
Дайте мне знать, если это работает для вас. Я буду рад помочь вам разобраться с любыми ошибками, с которыми вы столкнетесь. Wordpress — это так весело! - person Lotus; 21.08.2013
comment
удалось заставить его работать с глобальным $wp_query; $args = array( 'post_type' =› 'post', 'order' =› 'DESC', 'cat' =› '-1,-2,-3', 'posts_per_page' =› 4 ); запрос_сообщения ($ аргументы); - person Awooga; 01.09.2013
comment
холодные бобы. Так что нет интереса к слиянию массива с $wp_query-›query_vars. Я отредактирую свой ответ. - person Lotus; 05.09.2013