在网站上保持固定的最大帖子数量

时间:2015-06-11 作者:eddallen

我正试图找出如何设置整个站点允许的最大帖子数量,但当新帖子超过限制时,通过将旧帖子发送到垃圾箱来保持其流动性。

(我正试图阻止数据库被淹没,并减缓整个网站的速度)

例如,我有一个工作板,它将定期导入大量的帖子,但我只希望网站上最多有1000篇帖子。旧帖子会被删除,所以一旦有人添加了1001号帖子,最旧的帖子就会被移动到垃圾箱。

我发现了一个限制非管理员帖子数量的片段:

    add_action("load-post-new.php","limit_user_by_post_count");
function limit_user_by_post_count(){
    $user = get_current_user_id();
    if (!current_user_can( \'manage_options\')) { 
        //not an admin - so impose the limit
        $user_post_count = count_user_posts($user);
        if($user_post_count>=10)
            header("Location: /wp-admin/edit.php");
    }
}
但它是通过将用户重定向到“所有帖子”页面(阻止他们发布任何新内容)来实现的,而我对修改该页面以将最旧的帖子发送到垃圾桶还不够精通?

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

这是一个想法,但在我们深入讨论细节之前,以下是VERY VERY IMPORTANT 注释

注意:在运行此代码之前,请先阅读此内容并备份数据库。出于测试目的,建议首先在本地安装上运行此操作。

注意wp_trash_post(), 来自法典

如果禁用垃圾箱,则会永久删除帖子或页面。

我已经对代码进行了测试,它可以正常工作。但是,您可以对其进行更改以满足您的需要。目前,代码应该只在发布新帖子时删除帖子

我们需要做的是

发布新帖子时,运行自定义功能删除帖子。为此,我们将使用transition_post_status 钩只需注意,当一篇文章被发布、丢弃、更新和删除时,这个钩子就会触发。我们需要将自定义函数限制为仅在发布帖子时运行。这条线,if ( $new_status == \'publish\' && $old_status != \'publish\' ) 会处理好的

使用get_posts() 获取所有已发布的帖子。您可以根据自己的需要进行调整。我们只需要post ID,所以这就是我们将得到的。它使查询速度非常快,并且不会占用资源

返回的帖子数组get_posts() 需要统计,如果有1000多个帖子,我们需要在前1000个帖子之后获得帖子ID。我们将使用array_slice 在这里

我们需要跑步wp_trash_post 如果我们有1000多个帖子要丢弃这些帖子。如果您还需要删除帖子附带的所有内容,可以使用wp_delete_post 此处代替wp_trash_post. 您只需取消对此行的注释,wp_delete_post( $trash_post ); 在代码中,并注释掉这一行wp_trash_post( $trash_post );. 不要同时运行两者

将其放入代码中,代码也有很好的注释,因此很容易理解。只需注意一点,您至少需要PHP5。由于使用了新的数组语法,您的服务器上安装了4个以上。还要注意的是,闭包至少需要PHP5。3.

add_action( \'transition_post_status\', function ( $new_status, $old_status, $post )
{
    // Run this only when a new post is publish to save on unnecessary waste of resources
    if ( $new_status == \'publish\' && $old_status != \'publish\' ) {
    
        /*
         * Use get_posts() to count all the posts published, get only post ids to improve performance
         * This array of post ids will also be used to get the post ids of posts to be trashed
         */
        $total_posts = get_posts( [\'posts_per_page\' => -1, \'fields\' => \'ids\'] );
        // Count the amount of posts in the returned array from get_posts
        $count = count( $total_posts );
        
        // Run the following only if we have more than a thousand posts
        if ( $count > 1000 ) {
        
            // Get all post id after the first 1000 posts
            $set_to_trash = array_slice( $total_posts, 1000 );
            foreach ( $set_to_trash as $trash_post ) {
                // Use wp_trash_post to trash the posts 
                wp_trash_post( $trash_post  );
               // You can also use wp_delete_post here to delete everything attached to the post
               //wp_delete_post( $trash_post );
            }
            // Unset $trash_post for safety
            unset( $trash_post );
            
        }
        
    }
    
}, 10, 3 );
最后,您可以通过将以下行添加到wp-config.php

define(\'EMPTY_TRASH_DAYS\', 0 );
请注意,这将永久删除帖子,并且无法恢复

结束

相关推荐

在使用诸如‘PRE_GET_POSTS’和‘POSTS_WHERE’之类的过滤器时,确定‘IS_FORWART_PAGE’的正确方法是什么?

在我的网站上,如果用户正在查看静态主页,则应应用多个过滤器。我的理解是is_front_page() 应确定是否确实如此。然而,每当我使用这个函数时,我发现它有时会返回true (例如。posts_orderby) 但大多数情况下,它会回来false (例如。pre_get_posts, posts_fields, posts_join 和posts_where). 不管结果如何,我总是收到以下通知-正在尝试获取{my\\u path}\\wp includes\\query中非对象的属性。php在线4