使用瞬变在导航中添加通知气泡通知

时间:2018-02-22 作者:Simon

我想在管理中的导航项旁边添加一个漂亮的小通知气泡。但我不想每次都触发一个post查询来显示小气泡中的值,从而减慢整个管理的速度。希望将这一整数值加载到临时缓存中,以便在菜单中显示。

开发一个注册自定义帖子类型的自定义插件。这会自动在admin中创建导航项,我想在其中添加气泡。气泡中的值将从一个简单的查询中提取,该查询显示有多少帖子(这个CPT)被分配给了自定义分类法。例如,如果帖子已分配给自定义术语“待定审核”,则添加到气泡计数。

虽然我不知道如何过渡到使用瞬态缓存来存储和检索数据,但这个函数很有魅力。。。。如有任何建议,将不胜感激。谢谢

add_action( \'admin_menu\', \'add_cpt_menu_bubble\' );
function add_cpt_menu_bubble() {
    global $menu;
    $count_posts = 0;

    // count the number of posts to show in bubble
    $args = array(
        \'order\'    => \'DESC\',
        \'posts_per_page\' => \'-1\',
        \'post_type\' => \'custom_post_type_name\',
        \'custom_tax_name\' => \'pending-review\'
    );
    // The Query
    query_posts( $args );
    if (have_posts()) : 
        while ( have_posts() ) : the_post(); 
            $count_posts++;
        endwhile; 
        else: 
    endif; 
    wp_reset_query();

    // only display the number of pending posts over a certain amount
    if ( $count_posts > 5 ) {
        foreach ( $menu as $key => $value ) {
            if ( $menu[$key][2] == \'edit.php?post_type=custom_post_type_name\' ) {
                $menu[$key][0] .= \' <span class="update-plugins count-2"><span class="update-count">\' . $count_posts . \'</span></span>\';
                return;
            }
        }
    }

} // EOF

2 个回复
SO网友:Simon

再次感谢jdm2112的帮助。更新了一些语法错误,并使用了您建议的相同结构,效果很好!

// Add notification bubble to custom post type menu nav 
add_action( \'admin_menu\', \'add_cpt_menu_bubble\' );
function add_cpt_menu_bubble() {
    global $menu;
    $count_posts = tms_count_pending_posts();
    if ( $count_posts > 3 ) {
        foreach ( $menu as $key => $value ) {
            if ( $menu[$key][2] == \'edit.php?post_type=custom_post_type_name\' ) {
                $menu[$key][0] .= \' <span class="update-plugins count-2"><span class="update-count">\' . $count_posts . \'</span></span>\';
                return;
            }
        }
    }
}
function tms_count_pending_posts() {
    if ( false === ( $num_posts = get_transient( \'tms_pending_posts_key\' ) ) ) {
        $args = array(
            \'order\'    => \'DESC\',
            \'posts_per_page\' => \'-1\',
            \'post_type\' => \'custom_post_type_name\',
            \'custom_tax\' => \'pending-review\'
        );
        $posttype_query = new WP_Query( $args );
        ($posttype_query->post_count) ? $num_posts = $posttype_query->post_count : $num_posts = 0;
        set_transient( \'tms_pending_posts_key\', $num_posts, 30 ); 
    } 
    return $num_posts;
}

SO网友:jdm2112

使用您的原始代码,我将查询/计数/缓存代码拉到一个单独的函数中。我还没有机会测试这些,所以如果您遇到任何错误,我深表歉意。如果你这样做了,请在这里发布,我会在测试时更新。

简单地说,想法是首先根据每个值唯一的键(名称)检查有效的瞬态,如果不存在值,则重新创建并存储它。无论哪种方式,调用函数都应返回posttype 帖子,最长4小时。

我随机选择了4个小时,但这是一个容易编辑的参数。只要想出一些东西来代替“你的临时钥匙”,你就可以很好地使用了。

add_action( \'admin_menu\', \'add_cpt_menu_bubble\' );
function add_cpt_menu_bubble() {
    global $menu;

    // Retrieve cached value or count current number of posttype posts.
$count_posts = wpse_count_of_posttype_posts

    // only display the number of pending posts over a certain amount
    if ( $count_posts > 5 ) {
        foreach ( $menu as $key => $value ) {
            if ( $menu[$key][2] == \'edit.php?post_type=custom_post_type_name\' ) {
                $menu[$key][0] .= \' <span class="update-plugins count-2"><span class="update-count">\' . $count_posts . \'</span></span>\';
                return;
            }
        }
    }

}

function wpse_count_of_postype_posts() {

    // First try to get a cached value
    if ( false === ( $num_posts = get_transient( \'your-transient-key\' ) ) ) {
        // this code runs when there is no valid transient set

        // Your original query args
        $args = array(
            \'order\'    => \'DESC\',
            \'posts_per_page\' => \'-1\',
            \'post_type\' => \'custom_post_type_name\',
            \'custom_tax_name\' => \'pending-review\'
        );

        // Instantiate WP_Query instead
        $posttype_query = new WP_Query( $args );

        // One of the properties of the class is a count of the posts. No need to loop and increment a counter
        // https://codex.wordpress.org/Class_Reference/WP_Query#Properties
        $num_posts = $posttype_query->post_count;

        // Store the count in your transient; build it now for the future https://www.youtube.com/watch?v=XjYLvpwDNOY
        set_transient( \'your-transient-key\', $num_posts, 4 * HOUR_IN_SECONDS );

        return $num_posts;
    }
}

结束

相关推荐

WP-Admin显示(1)更新,但没有更新插件、主题或WordPress

我有一个奇怪的问题,在我的wp管理,它说有一个更新需要。然而,我检查了主题、插件,甚至重新安装了最新版本的Wordpress,它仍在向我显示更新。我还删除了我的缓存插件,并做了各种其他任务试图修复它,但没有运气。有人知道是什么原因导致了这一问题,以及/或者我如何解决这一问题吗?这很烦人。谢谢你的帮助。以下是两张图片: