每个类别的“Sticky”帖子(filve.php)

时间:2015-06-04 作者:Django Reinhardt

我需要有能力有每个类别的贴子粘性。最简单的方法似乎是在页面上创建两个循环。这是我写的:

<?php
//Custom "sticky" loop
$sticky_posts = new WP_Query(array(
    \'post__in\' => get_option(\'sticky_posts\')
));

if ($sticky_posts->have_posts()) :
    while ($sticky_posts->have_posts()) : $sticky_posts->the_post();

        get_template_part(\'post-formats/content\', \'sticky\');

    endwhile; endif;

// CLEAR DATA
wp_reset_postdata();

if (have_posts()) : 
// Normal loop

while (have_posts()) : the_post(); 

    $format = get_post_format();
    if (false === $format) {
        $format = \'standard\';
    }
    get_template_part(\'post-formats/content\', $format);

endwhile; 
不幸的是,它没有按预期工作:

这会将粘性项目放在所有类别的顶部,无论它们是否属于该类别

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

为了使这一点更加完整,以下是我在评论中回答当前问题时所说的话

只是为了快速解释一下WP_Query在某些情况下会发生灾难性的失败,其中空数组被传递给它的一些参数,而不是像我们预期的那样返回空数组WP_Query返回所有帖子。至于获得正确的粘性,正如我之前所说的,您需要获得当前的类别id,并使用它来过滤粘性帖子。记住,使用这种方法时,需要从主查询中删除粘性帖子,否则会得到重复的帖子

作为一种替代解决方案,在主查询上使用挂钩和过滤器,并从similar question/answer, 这就是我想到的:(代码有很好的注释,因此可以遵循。注意:这还没有经过测试,至少需要PHP 5.4+)

function get_term_sticky_posts()
{
    // First check if we are on a category page, if not, return false
    if ( !is_category() )
        return false;

    // Secondly, check if we have stickies, return false on failure
    $stickies = get_option( \'sticky_posts\' );

    if ( !$stickies )
        return false;

    // OK, we have stickies and we are on a category page, continue to execute. Get current object (category) ID
    $current_object = get_queried_object_id();

    // Create the query to get category specific stickies, just get post ID\'s though
    $args = [
        \'nopaging\' => true,
        \'post__in\' => $stickies,
        \'cat\' => $current_object,
        \'ignore_sticky_posts\' => 1,
        \'fields\' => \'ids\'
    ];
    $q = get_posts( $args );

    return $q;
}

add_action( \'pre_get_posts\', function ( $q )
{
    if (    !is_admin() // IMPORTANT, make sure to target front end only
         && $q->is_main_query() // IMPORTANT, make sure we only target the main query
         && $q->is_category() // Only target category archives
    ) {
        // Check if our function to get term related stickies exists to avoid fatal errors
        if ( function_exists( \'get_term_sticky_posts\' ) ) {
            // check if we have stickies
            $stickies = get_term_sticky_posts();

            if ( $stickies ) {
                // Remove stickies from the main query to avoid duplicates
                $q->set( \'post__not_in\', $stickies );

                // Check that we add stickies on the first page only, remove this check if you need stickies on all paged pages
                if ( !$q->is_paged() ) {

                    // Add stickies via the the_posts filter
                    add_filter( \'the_posts\', function ( $posts ) use ( $stickies )
                    {   
                        $term_stickies = get_posts( [\'post__in\' => $stickies, \'nopaging\' => true] );

                        $posts = array_merge( $term_stickies, $posts );

                        return $posts;
                    }, 10, 1 );
                }
            }
        }
    }
});
少数注意事项:此选项仅适用于默认设置category 分类学代码可以很容易地修改(请这样做,根据您的需要进行修改),以使用任何分类法及其相关术语

您只需将其添加到函数中即可。php。无需更改模板文件或使用自定义查询。您所需要的只是带有默认循环的主查询

上述代码现在已在Wordpress 4.2.1和PHP 5.4上进行了测试和使用+

SO网友:bz-mof

由于声誉规则,我无法评论Pieter Goosen的回答/-:

当前的代码对当前的wordpress 4.8(2018年3月)有副作用,当访问不存在的页面时,它会显示粘性帖子,thta应该给出404错误。如“www.example.com/asd”,其中“asd”不存在。同样的问题是“wp admin”。这是因为在这种情况下,“asd”或“wp admin”作为类别名称保存在$q中,尽管这不是现有类别。

修复:通过将此代码的最后一行添加到上面发布的代码中,检查传递的类别是否确实存在:

if (    !is_admin() // IMPORTANT, make sure to target front end only
     && $q->is_main_query() // IMPORTANT, make sure we only target the main query
     && $q->is_category() // Only target category archives         
     && $q->is_tax(get_query_var ( \'category_name\')) // Only target existing category names   

SO网友:Django Reinhardt

这两个问题的答案都很简单。

只需向WP\\u Query添加一个参数,将其限制为当前类别,确保WP\\u Query不会运行,除非确实存在一些粘性帖子,如:

<?php
// Get sticky posts
$sticky_ids = get_option( \'sticky_posts\' );

// BEGIN Custom "sticky" loop

// If sticky posts found...
if(!empty($sticky_ids)) {
    $args = array(
        \'post_type\' => \'post\',
        \'category__in\' => get_query_var(\'cat\'), // Get current category only
        \'post__in\' => get_option(\'sticky_posts\') // Get stickied posts
    );

    $sticky_posts = new WP_Query($args);

    if ($sticky_posts->have_posts()) :
        while ($sticky_posts->have_posts()) : $sticky_posts->the_post();

            get_template_part(\'post-formats/content\', \'sticky\');

    endwhile; endif;
// END Custom "sticky" loop

    // Reset post data ready for next loop
    wp_reset_postdata();
}

if (have_posts()) :

    /* Start the Loop */
    while (have_posts()) : the_post();

        $format = get_post_format();
        if (false === $format) {
            $format = \'standard\';
        }
        get_template_part(\'post-formats/content\', $format);

    endwhile; endif; ?>

结束

相关推荐

GET_CATEGORIES()返回“未分类”

在我的WPMU网站前端,所有类别都消失了,每个帖子都标有“未分类”。然而,这只是单曲。php,而不是在主页上。php。相同的错误发生在get_categories(), wp_list_categories() 和the_category().我试着用var_dump(get_categories()) 但就像WordPress一样,它只是认为应该这样。

每个类别的“Sticky”帖子(filve.php) - 小码农CODE - 行之有效找到问题解决它

每个类别的“Sticky”帖子(filve.php)

时间:2015-06-04 作者:Django Reinhardt

我需要有能力有每个类别的贴子粘性。最简单的方法似乎是在页面上创建两个循环。这是我写的:

<?php
//Custom "sticky" loop
$sticky_posts = new WP_Query(array(
    \'post__in\' => get_option(\'sticky_posts\')
));

if ($sticky_posts->have_posts()) :
    while ($sticky_posts->have_posts()) : $sticky_posts->the_post();

        get_template_part(\'post-formats/content\', \'sticky\');

    endwhile; endif;

// CLEAR DATA
wp_reset_postdata();

if (have_posts()) : 
// Normal loop

while (have_posts()) : the_post(); 

    $format = get_post_format();
    if (false === $format) {
        $format = \'standard\';
    }
    get_template_part(\'post-formats/content\', $format);

endwhile; 
不幸的是,它没有按预期工作:

这会将粘性项目放在所有类别的顶部,无论它们是否属于该类别

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

为了使这一点更加完整,以下是我在评论中回答当前问题时所说的话

只是为了快速解释一下WP_Query在某些情况下会发生灾难性的失败,其中空数组被传递给它的一些参数,而不是像我们预期的那样返回空数组WP_Query返回所有帖子。至于获得正确的粘性,正如我之前所说的,您需要获得当前的类别id,并使用它来过滤粘性帖子。记住,使用这种方法时,需要从主查询中删除粘性帖子,否则会得到重复的帖子

作为一种替代解决方案,在主查询上使用挂钩和过滤器,并从similar question/answer, 这就是我想到的:(代码有很好的注释,因此可以遵循。注意:这还没有经过测试,至少需要PHP 5.4+)

function get_term_sticky_posts()
{
    // First check if we are on a category page, if not, return false
    if ( !is_category() )
        return false;

    // Secondly, check if we have stickies, return false on failure
    $stickies = get_option( \'sticky_posts\' );

    if ( !$stickies )
        return false;

    // OK, we have stickies and we are on a category page, continue to execute. Get current object (category) ID
    $current_object = get_queried_object_id();

    // Create the query to get category specific stickies, just get post ID\'s though
    $args = [
        \'nopaging\' => true,
        \'post__in\' => $stickies,
        \'cat\' => $current_object,
        \'ignore_sticky_posts\' => 1,
        \'fields\' => \'ids\'
    ];
    $q = get_posts( $args );

    return $q;
}

add_action( \'pre_get_posts\', function ( $q )
{
    if (    !is_admin() // IMPORTANT, make sure to target front end only
         && $q->is_main_query() // IMPORTANT, make sure we only target the main query
         && $q->is_category() // Only target category archives
    ) {
        // Check if our function to get term related stickies exists to avoid fatal errors
        if ( function_exists( \'get_term_sticky_posts\' ) ) {
            // check if we have stickies
            $stickies = get_term_sticky_posts();

            if ( $stickies ) {
                // Remove stickies from the main query to avoid duplicates
                $q->set( \'post__not_in\', $stickies );

                // Check that we add stickies on the first page only, remove this check if you need stickies on all paged pages
                if ( !$q->is_paged() ) {

                    // Add stickies via the the_posts filter
                    add_filter( \'the_posts\', function ( $posts ) use ( $stickies )
                    {   
                        $term_stickies = get_posts( [\'post__in\' => $stickies, \'nopaging\' => true] );

                        $posts = array_merge( $term_stickies, $posts );

                        return $posts;
                    }, 10, 1 );
                }
            }
        }
    }
});
少数注意事项:此选项仅适用于默认设置category 分类学代码可以很容易地修改(请这样做,根据您的需要进行修改),以使用任何分类法及其相关术语

您只需将其添加到函数中即可。php。无需更改模板文件或使用自定义查询。您所需要的只是带有默认循环的主查询

上述代码现在已在Wordpress 4.2.1和PHP 5.4上进行了测试和使用+

SO网友:bz-mof

由于声誉规则,我无法评论Pieter Goosen的回答/-:

当前的代码对当前的wordpress 4.8(2018年3月)有副作用,当访问不存在的页面时,它会显示粘性帖子,thta应该给出404错误。如“www.example.com/asd”,其中“asd”不存在。同样的问题是“wp admin”。这是因为在这种情况下,“asd”或“wp admin”作为类别名称保存在$q中,尽管这不是现有类别。

修复:通过将此代码的最后一行添加到上面发布的代码中,检查传递的类别是否确实存在:

if (    !is_admin() // IMPORTANT, make sure to target front end only
     && $q->is_main_query() // IMPORTANT, make sure we only target the main query
     && $q->is_category() // Only target category archives         
     && $q->is_tax(get_query_var ( \'category_name\')) // Only target existing category names   

SO网友:Django Reinhardt

这两个问题的答案都很简单。

只需向WP\\u Query添加一个参数,将其限制为当前类别,确保WP\\u Query不会运行,除非确实存在一些粘性帖子,如:

<?php
// Get sticky posts
$sticky_ids = get_option( \'sticky_posts\' );

// BEGIN Custom "sticky" loop

// If sticky posts found...
if(!empty($sticky_ids)) {
    $args = array(
        \'post_type\' => \'post\',
        \'category__in\' => get_query_var(\'cat\'), // Get current category only
        \'post__in\' => get_option(\'sticky_posts\') // Get stickied posts
    );

    $sticky_posts = new WP_Query($args);

    if ($sticky_posts->have_posts()) :
        while ($sticky_posts->have_posts()) : $sticky_posts->the_post();

            get_template_part(\'post-formats/content\', \'sticky\');

    endwhile; endif;
// END Custom "sticky" loop

    // Reset post data ready for next loop
    wp_reset_postdata();
}

if (have_posts()) :

    /* Start the Loop */
    while (have_posts()) : the_post();

        $format = get_post_format();
        if (false === $format) {
            $format = \'standard\';
        }
        get_template_part(\'post-formats/content\', $format);

    endwhile; endif; ?>

相关推荐

Pagination in Archives

你好,我是wordpress的新手,我很烂。我试图在wordpress中为我的博客页面添加编号分页。我下载了插件“page navi”,进入编辑器并更改了索引中的一个文件。php收件人: <?php if ( $wp_query->max_num_pages > 1 ) : ?> <div class=\"post-nav archive-nav\"> <?php wp_pagenavi();