发布帖子/页面时,是否可以从数据库中删除帖子/页面修订
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\' );
最合适的回答,由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函数。以下代码将删除上的修订Publish
或Update
所有支持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
)
);