当发布帖子(在某些类别中,我使用ID为333的类别作为示例)时,我会存储一个生命周期为24小时的瞬态。无论何时发布后续帖子,如果24小时过去了,临时帖子已被删除,则更新或重新创建临时帖子。
逻辑
每当帖子从一种状态更改为发布(包括当前发布帖子的更新)帖子类型时
transition_post_status
已启动。此操作传递旧状态、新状态和te post对象。联系到这一点,我们可以检查:
新状态为“发布”,旧状态为其他状态(即新发布的状态)。
为“发布”类型,属于333类,如果是,则更新持续24小时的瞬态。add_action(\'transition_post_status\', \'wpse_maybe_update_new_post_transient\',10,2);
function wpse_maybe_update_new_post_transient($new_status, $old_status,$post){
if( \'post\' != get_post_type($post) || !has_term( 333, \'category\', $post) ){
return;
}
if( \'publish\' == $new_status && $new_status != $old_status && ){
set_transient(\'wpse_post_published\', $post->ID, 60*60*24 );
}
}
get_transient(\'wpse_post_published\')
只有在过去24小时内发布帖子后,才应返回内容。因此,在生成菜单时,我们可以检查临时菜单元素,并有条件地添加类new post published菜单元素。
在本例中,我将类添加到的菜单元素对应于一个“category”术语(ID为333)。我在这里没有这样做,但您可以使用$arg
检查菜单是否也位于特定位置。
add_filter( \'nav_menu_css_class\',\'wpse_maybe_add_new_post_class\',10,3);
function wpse_maybe_add_new_post_class($classes, $item, $arg){
if( \'taxonomy\' == $item->type && \'category\' == $item->object && 333 == $item->object_id ){
if( get_transient(\'wpse_post_published\') ){
$classes[] = \'new-post-published\';
}
}
return $classes;
}
然后可以适当地设置元素的样式。同样的想法,可以使用其他过滤器插入额外的元素(例如。walker_nav_menu_start_el
) 或者通过定制步行器。警告此方法的以下缺点是:
如果发布了帖子,则不会观察到通过恢复到草稿状态或安排未来发布来“取消”发布,即暂时发布仍然存在,菜单仍将显示“新发布的帖子”类似地,如果您在333类别中发布帖子,然后将其从该类别中删除如果你发布了一篇文章,而不是在333类中,然后将其更新,这样就不会添加“新发布的文章”
使用上述方法可以轻松修复最后一点。前两个有点棘手,如果这两个问题,那么你应该在过去24小时内查询333类中最新发布的帖子。如果您找到它,请更新瞬态,使其在发布帖子24小时后过期。
第二种方法更加稳健,但成本稍高。