具有自定义分类并根据分类限制显示内容的Query_Posts

时间:2015-05-07 作者:FranticJ3

我有一个自定义的帖子类型,technologies, 为其定义了自定义分类,importance. 我们的想法是,一项具有任何意义的技术importance 贴上标签(featured 是我正在测试的)。

下面是我的查询,并检查了分类法:

$paged = (get_query_var(\'paged\')) ? get_query_var(\'paged\') : 1;
$temp = $wp_query; $wp_query= null;
$args = array(
\'posts_per_page\'   => $num,
\'offset\'           => 0,
\'orderby\'          => \'post_date\',
\'order\'            => \'DESC\',
\'post_type\'        => \'technologies\',
\'post_status\'      => \'publish\',
\'paged\'            => $paged,
\'suppress_filters\' => true ); 

query_posts($args);

if (has_term(\'featured\',\'importance\')) {
// do nothing since these are feeding in somewhere else
} else {
// feed in stuff
}
$num 定义为10 从现在开始。if语句的else部分在post中输入了大量代码(它做得很正确),但正在输入technologies 标记为featuredimportance 分类学

我是否使用正确的函数检查分类?

1 个回复
最合适的回答,由SO网友:Pieter Goosen 整理而成

你这里有很多问题;

永远不要使用query_posts, 它打破了主查询和页面功能。

甚至在之前,您就已经中断并取消了主查询query_posts 可以在这一行进行更改$wp_query= null

由于这是一个短代码(摘自您的评论),因此使用这一行,\'posts_per_page\' => $num,, 我相信你正在使用extract(). 你不应该使用extract() 因为它几乎不可调试,不可靠,并且会无声地失败。因此,它被从核心功能中删除`

正确的值orderby 按发布日期排序是date, 不post_date. 这是默认值,因此您可以忽略它,因为您没有通过属性修改它。这也适用于offsetorder

您需要使用tax_query 从特定术语获取帖子

这里有一个小示例,您可以从中学习。(请注意,您应该清理并验证所有用户输入。我没有这样做过)。

add_shortcode( \'my_shortcode\', function ( $atts )
{
    $attributes = shortcode_atts(
        [
            \'numberposts\' => 10, // Default amount of posts to show
            \'post_type\'   => \'technologies\', // Default post type
            \'taxonomy\'    => \'importance\', // Default taxonomy
            \'terms\'       => \'featured\' // Default term to exclude
        ],
        $atts, 
        \'my_shortcode\' 
    );

    $paged = (get_query_var(\'paged\')) ? get_query_var(\'paged\') : 1;
    $args = [
        \'posts_per_page\'   => $attributes[\'numberposts\'],
        \'post_type\'        => $attributes[\'post_type\'],
        \'tax_query\'        => [
            [
                \'taxonomy\' => $attributes[\'taxonomy\'],
                \'field\'    => \'slug\',
                \'terms\'    => $attributes[\'terms\'],
                \'operator\' => \'NOT IN\' // This will exclude all posts with terms set in \'terms\'
            ]
        ],
        \'post_status\'      => \'publish\',
        \'paged\'            => $paged,
        \'suppress_filters\' => true
    ];
    $q = new WP_Query( $args );

    $output = \'\';
    if ( $q->have_posts() ) {
        while ( $q->have_posts() ) {
            $q->the_post();

            $output .= apply_filters( \'the_title\', get_the_title() );

        }
        $output .= get_next_posts_links( \'Next\', $q->max_num_pages );
        $output .= get_previous_posts_links( \'Previous\' );
        wp_reset_postdata();
    }
    return $output;
});
你可以把它叫做[my_shortcode] 如果不需要更改默认值

最后的注释我假设您希望排除featured 学期,所以我写了tax_query 围绕这一点。

您需要PHP5。4+因为代码使用了新的短数组语法([]). 如果有旧版本,只需更改为旧的数组语法(array()). 只需确保至少有PHP 5.3支持使用的闭包

结束

相关推荐

在WordPress主题中包含jQuery库吗?

我在主题的JS文件夹中有一个名为cycle2的文件。js。如何包含来自wordpress的Jquery→在我的主题中包含?如何加载此自定义JavaScript文件“cycle2”。加入我的主题?我有:function watercolor_js_scripts(){ if (!is_admin()) { wp_register_script(\'cycle2\', get_template_directory_uri() . \'/js/cycle2.js\', \'jq