在发布后删除帖子修订

时间:2012-11-02 作者:markratledge

发布帖子/页面时,是否可以从数据库中删除帖子/页面修订

11/05/12 Answer: See the plugin below by bueltge

我想在一个有5000篇帖子和125000条评论的网站上这样做;它位于VPS上,可以处理wp\\U posts表的大小-在我删除所有修订之前,表是1.5 gigs-但我仍然希望通过防止修订将总体数据库大小保持在最小。

但是,这位客户告诉我,由于浏览器冻结,他丢失了一篇大文章,所以:在发布每个文章/页面时,是否可以从数据库中删除文章/页面修订?

会用什么钩子?是save_post 正确的那个?http://codex.wordpress.org/Plugin_API/Action_Reference/save_post

我在wp config中设置了autosave参数。php,但根据文档,它会自动保存正在处理的帖子/页面,并覆盖每个自动保存。

我想做的是积累草稿的修订-无论有多少,取决于作者使用“保存”和“更新”的次数-但一旦草稿发布,请删除所有修订。只会对一篇文章进行修订,但SQL查询可以在所有文章中运行,而不是尝试解析post\\u ID。

这就是我在函数中尝试的。php,但我得到Call to a member function query() on a non-object 错误

function delete_revisions_on_publish( $post_id ) {

    if ( !wp_is_post_revision( $post_id ) ) {

remove_action(\'save_post\', \'delete_revisions_on_publish\');

    $wpdb->query( 
    $wpdb->prepare( 
    "DELETE a,b,c
    FROM wp_posts a
    LEFT JOIN wp_term_relationships b ON (a.ID = b.object_id)
    LEFT JOIN wp_postmeta c ON (a.ID = c.post_id)
    WHERE a.post_type = \'revision\' "
        )
);
        }
}
add_action( \'save_post\', \'delete_revisions_on_publish\' );

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

我认为一个带有“publish\\u posts”挂钩的小插件就足够了。但我不知道删除修订的核心函数,我使用带有WP函数的查询。源代码未经测试,仅为本文编写。

<?php
/**
 * Plugin Name: WPSE71248 Delete Revisions on Publish Posts
 * Plugin URI:  http://wordpress.stackexchange.com/questions/71248/
 * Description: 
 * Version:     1.0.0
 * Author:      Frank Bültge
 * Author URI:  http://bueltge.de
 * License:     GPLv3
 */

! defined( \'ABSPATH\' ) and exit;

add_action( \'publish_post\', \'fb_remove_revisions\' );

function fb_remove_revisions( $post_id = FALSE ) {

    $post_id = (int) $post_id;

    $revisions = \'\';
    // Get the revisions
    $revisions = new WP_Query( array(
        \'post_status\'    => \'inherit\',
        \'post_type\'      => \'revision\',
        \'showposts\'      => -1,
        \'posts_per_page\' => -1,
        \'post_parent\'    => $post_id
    ) );

    if ( empty( $revisions ) )
        return $post_id;

    // Remove the revisions the non-core-way
    global $wpdb;
    foreach ( $revisions->posts as $revision ) {
        $query = $wpdb->prepare(
            "
            DELETE FROM $wpdb->posts 
            WHERE ID = %d
            AND post_parent = %d
            ",
            $revision->ID, 
            $post_id
        );
        $wpdb->query( $query );
    }

    return $post_id;
}
或者使用下载自Gist 4017151

SO网友:Ahmad M

我更希望采用不同的方法来实现这一目标。而不是使用全局$wpdb 为了直接访问DB和删除修订,我使用了WP函数。以下代码将删除上的修订PublishUpdate 所有支持revisions 还有一个publish 状态:

add_action( \'admin_init\', \'add_delete_revision_actions\' );
function add_delete_revision_actions () {

    // get all post types, except \'revision\'
    $post_types = get_post_types( array( \'exclude_from_search\' => false ) );

    // add action for each post type that supports \'revisions\'
    foreach ($post_types as $post_type) {
        if ( post_type_supports( $post_type, \'revisions\' )) {
            add_action("publish_$post_type", \'delete_revisions_on_publish\', 10, 1);
        }
    }
}

function delete_revisions_on_publish ($post_id) {

    // get revisions for this post
    $revisions = wp_get_post_revisions($post_id);

    // .. and delete it
    foreach ($revisions as $revision) {
        $delete = wp_delete_post_revision($revision->ID);
        // check for errors
        // if ( is_wp_error($delete) ) { ... }
    }
}

SO网友:s_ha_dum

这应该是可能的,看起来你走在了正确的轨道上。

要解决“调用成员函数”错误,我认为您需要global $wpdb; 在该函数的顶部。

我想the hook formerly know as publish_post 这对你来说是一个更好的钩子,因为它是针对已发布帖子的。save_post 将运行所有保存。

此外,您还可以说“SQL查询可以运行所有帖子”,但如果您有多篇帖子在工作中,或者如果您在工作中有草稿时保存对已发布帖子的编辑,则会删除所有草稿的修订。无论如何,这是你的选择,但你不需要$wpdb->prepare 如果你那样做的话。除了硬编码的SQL字符串外,没有其他输入,因此无需“准备”任何内容。

$wpdb->query( 
    $wpdb->prepare( 
    "DELETE a,b,c
    FROM wp_posts a
    LEFT JOIN wp_term_relationships b ON (a.ID = b.object_id)
    LEFT JOIN wp_postmeta c ON (a.ID = c.post_id)
    WHERE a.post_type = \'revision\' 
    AND a.ID = %d",
    $post_id
  )
);

结束

相关推荐

WP_USER_QUERY不按元键排序

我试图列出按元值排序的用户。我将每个用户的分数存储在他们的用户元中,这只是一个数字,但循环没有排序。我将分数包括在循环中,以便我可以看到它没有被正确排序。我做错了什么? $args = array( \'meta_key\' => \'score\', \'meta_value\' => 0, \'meta_compare\' => \'>\', \'orderby\' => \'meta_value_num\'