如何计算所选帖子类型的帖子总数?

时间:2014-12-03 16:11:22

标签: php wordpress

我想在我的Wordpress网站上制作一个通知栏,当发布新帖子时会显示该通知栏。不幸的是,我在使代码工作方面遇到了一些问题。

目标

目标是让用户知道网站上有可用的新帖子,并附有通知栏。所以代码应检查帖子数量是否增加。如果是,我想在网站上显示通知栏两天。

问题

以下代码仅输出我在$post_types数组中指定的每种帖子类型的帖子总数。 if语句无法正常工作。当我发布新帖子,删除它并发布另一个帖子时,它不会更新数据库中的号码。只有在我删除旧版本后发布时,该值才会增加。

我的代码

下面的代码现在只回显帖子类型名称和帖子数量。

$args = array( 
        'public' => true, 
        '_builtin' => false 
    );
    $post_types = array( 'post', 'roosters', 'downloads', 'reglements', 'alv' );

    foreach ( $post_types as $post_type ) {
        // variable
        $postCountTotal = wp_count_posts( $post_type )->publish;

        echo '<strong>' . $post_type . '</strong>';
        echo ' has total posts of : ' . $postCountTotal;
        echo '<br>';

        // First read the previous post count value from the databse so we can compare the old value with the new one 
        // EDIT: use 0 as the default value if no data in database - first run
        $previousCount = get_option( 'post_count_total', 0 );

        if ( $postCountTotal != $previousCount ) {
            //echo 'New post detected';
            update_option( 'post_count_total', $postCountTotal );
        } elseif ( '' == $postCountTotal && $previousCount ) {
            delete_option( 'post_count_total', $previousCount );
        }


    }
    echo $postCountTotal;

3 个答案:

答案 0 :(得分:3)

计算帖子以确定是否有新帖子是浪费资源而不准确,因为帖子状态的转换会影响计数。例如,正如您所说,如果删除帖子并发布新帖子,则计数将保持不变

为了使这项工作,我们需要遵循以下工作流程

WORKSFLOW

我们需要确定发布帖子的时间。这可以通过transition_post_status操作挂钩完成。每次更改帖子的状态时都会触发此挂钩。即使帖子更新,它的状态也会改变。

我们应该只在发布新帖子时做点什么,所以我们需要检查帖子发布前后的状态(这里的“新”状态不起作用,因为我预期它会起作用,所以我报废了那个想法)。

接下来将保存新的帖子对象到wp_options表中,我们可以在模板中稍后将其用于显示通知栏。这里使用的函数是add_option()来创建我们的选项(如果它不存在)和update_option()如果选项已经存在。

邮政对象现在保存在wp_options表中。我们现在必须在函数或模板文件中检索该选项。我们将使用get_option()。从保存的post对象中我们需要获取post_date_gmt才能将它用于comaprison,我们需要确定2天后的确切时间

我们还需要使用current_time()

获取的当前时间

在最后一段时间,我们现在可以比较日期,如果我们比较的日期少于两天,我们需要让事情发生,显示通知栏,如果比较超过两天,我们要么什么也不显示

代码

这是最终的代码。我评论得很好,你可以关注它

在您的functions.php中,添加以下内容

add_action( 'transition_post_status', function ( $new_status, $old_status, $post )
{
    //Check if our post status then execute our code
    if ( $new_status == 'publish' && $old_status != 'publish' ) {
        if ( get_option( 'new_post_notification' ) !== false ) {

            // The option already exists, so we just update it.
            update_option( 'new_post_notification', $post );

        } else {

            add_option( 'new_post_notification', $post );

        }
    }

}, 10, 3 );

现在,如果您愿意,可以在模板或自定义功能中添加以下内容

// Get the new_post_notification which holds the newest post
$notification = get_option( 'new_post_notification' );

if( false != $notification ) {

    //Get the post's gmt date. This can be changed to post_date
    $post_date = strtotime( $notification->post_date_gmt );

    //Get the current gmt time
    $todays_date = current_time( 'timestamp', true );

    //Set the expiry time to two days after the posts is published
    $expiry_date = strtotime('+2 day', $post_date);

    if( $expiry_date > $todays_date ) { 
        // Display your notification if two days has not been passed
    }

}

答案 1 :(得分:0)

内置WP功能:

<?php
$count_posts = wp_count_posts();
?>

WP Codex提供的良好文件: http://codex.wordpress.org/Function_Reference/wp_count_posts

如果您只想要所有帖子的总数,您应该能够简化代码。

答案 2 :(得分:0)

我需要计算当前语言的帖子数。这是我的代码:

        $allpost_arg = array(
            'numberposts' => -1,
            'post_type'     => 'post',
            'suppress_filters' => 0,
        );

        $allposts = get_posts( $allpost_arg );
        if($allposts){
            $count_the_posts = 0;
            foreach ($allposts as $allpost){
                $count_the_posts++;
            }
        }
        echo $count_the_posts;