如何连接到现有的WordPress批量操作?

时间:2015-11-06 作者:T Andrew

我正在创建一个插件,该插件使用SQL查询将编辑后页面上自定义元框中的标准WP数据和自定义字段同步到外部资源。然而,我的功能目前只在管理单个帖子时起作用,我正在尝试添加对现有批量操作的支持(移动到垃圾箱、从垃圾箱还原和编辑)。目前,我的同步功能已连接到save\\u post中,并且我已添加了对使用“wp\\u trash\\u post”从外部资源中删除和使用“untrashed\\u post”重新插入的支持(尽管这仅在从垃圾桶中单击还原时有效,而在垃圾桶中单击管理通知中的撤消时无效)。以下是位于add metabox类的\\uu构造中的代码:

add_action( \'save_post\', array( $this, \'save_post_function\' ) ); //which eventually calls myOtherClass::runs_sync_to_external_resource_SQL_query($post_id);
add_action( \'wp_trash_post\', \'my_delete_function\' );
function my_delete_function( $post_id ){
    myClass::runs_delete_from_resource_SQL_query($post_id);
}
add_action( \'untrashed_post\', \'my_undelete_function\' );
function my_undelete_function($post_id) {
    myOtherClass::runs_sync_to_external_resource_SQL_query($post_id);
}
我读过this blog post 关于添加自定义批量操作(这似乎是本主题的参考),但这并不是我想要的,因为我不需要修改批量操作选择下拉列表并添加自定义操作,只需挂接到现有垃圾箱并还原批量操作即可。

此外,我还需要挂接到“编辑批量”操作中,因为同步到外部资源的一些数据可以通过该操作进行编辑(类别、标记、帖子格式和帖子状态)。

最后,我需要使用Undo按钮来运行恢复功能。我怀疑它不起作用,因为它与批量操作有关。

有什么建议吗?提前感谢

编辑:下面是使用状态转换挂钩从上面修改的代码:

add_action( \'save_post\', array( $this, \'save_post_function\' ) ); //which eventually calls pluginname_sync::pluginname_syncpost($post->ID);
add_action( \'transition_post_status\', \'cp_sync\', 10, 3 );
function cp_sync( $new_status, $old_status, $post ) {
            if ( $old_status == \'publish\'  &&  $new_status != \'publish\' ) {
                pluginname_sync::pluginname_delete($post->ID);
            }
            if ( $old_status != \'publish\'  &&  $new_status == \'publish\' ) {
                pluginname_sync::pluginname_syncpost($post->ID);
            }
        }

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

正如您所描述的,您希望在帖子被丢弃、编辑或取消刷新时同步数据。您正在尝试save_post 操作,但它仅在编辑后屏幕上触发(根据codex,此操作在导入、发布/页面编辑表单、xmlrpc或通过电子邮件发布时触发),因此您认为还需要挂接批量操作和快速编辑,但您错了。通过批量操作或快速编辑编辑帖子时,不会触发特定的保存操作(您发布的关于添加自定义bulck操作的链接是为了添加自定义批量操作,而不是为了在预定义的批量操作上执行任务)。

在我看来,没有什么比同步数据更适合后期状态转换了。

您尝试了后状态转换,但逻辑错误。例如,当一篇文章从“发布”转换为“未发布”时,您可以运行“删除同步”功能,但这种情况并不意味着一篇文章被删除:一篇未发布的文章可能会被丢弃,一篇草稿,一篇未来的文章,等等。

让我们看一些例子:

add_action( \'transition_post_status\', \'cp_sync\', 10, 3 );
function cp_sync( $new_status, $old_status, $post ) {

    // Check $old_status also if you need specific actions
    // when the post transits from a specific status

    if ( $new_status == \'draft\' ) {
        // The post is now draft, no matter what status it had previously
        // sync draft posts here
    }

    if ( $new_status == \'publish\' ) {
        // The post is now published, no matter what status it had previously
       // sync published posts here
    }

    if ( $new_status == \'trashed\' ) {
        // The post is now in the trash, no matter what status it had previously
        // sync trashed posts here
    }

    // Cotinue checking more post statues if you need (future, private, etc)
    // For a complete list, see https://codex.wordpress.org/Post_Status_Transitions 

}
删除的帖子没有状态转换,您必须使用actions described in the docs for delete_post action; 我会使用before_delete_post 如果需要捕获所有post数据:

add_action( \'before_delete_post\', \'my_func\' );
function my_func( $postid ){
    // Post has been deleted
    pluginname_sync::pluginname_delete( $postid );
}
编辑:仅同步已发布的帖子,从外部数据库中删除其余帖子:

add_action( \'transition_post_status\', \'cp_sync\', 10, 3 );
function cp_sync( $new_status, $old_status, $post ) {

    // This will cover the transition from any status to published,
    // including published to published.
    if ( $new_status == \'publish\' ) {
        pluginname_sync::pluginname_syncpost($post->ID);
    } else {
        pluginname_sync::pluginname_delete($post->ID);
    }

}
add_action( \'before_delete_post\', \'my_func\' );
function my_func( $postid ){
    pluginname_sync::pluginname_delete( $postid );
}

相关推荐

Bulk update wordpress posts

编码器。我对WP编码真的很陌生,我没有任何知识,我们到了。我创建了一个插件(实际上找到了它,但我做了一些修改),更新了我所有的wp帖子。让我们向您展示代码,if ( ! class_exists( \'MyPlugin_BulkUpdatePosts\' ) ) : class MyPlugin_BulkUpdatePosts { public function __construct() { register_activa