以编程方式更改SAVE_POST操作的POST可见性返回500

时间:2015-01-29 作者:Rubberducker

我正在尝试更改自定义帖子类型的帖子可见性。在“编辑”上。php屏幕用户可以使用自定义字段将帖子类型设置为普通或扩展。该字段应作为post\\U状态的抽象。但是,在save_post action 终止为500 Internal Server Error:

add_action( \'save_post\', array( $this, \'save_meta_box\' ), 10, 2 );
[...]
public function save_meta_box( $post_id, $post ) {
    [...]
    if( isset( $_POST[\'options\'] ) ) {
        myplugin_set_options( $post_id, $_POST[\'options\'] );

        // switch post visibility
        switch ( $_POST[\'options\'][\'type\'] ) {
            case \'normal\':
                wp_update_post( array( \'ID\' => $post_id, \'post_status\' => \'private\' ));
                break;
            case \'extended\':
                wp_update_post( array( \'ID\' => $post_id, \'post_status\' => \'publish\' ));
                break;
        }
    }
在中运行此代码load-post.php 工作正常。但我只想将可见性设置为保存,而不是每次打开帖子时都保存。如何做到这一点,有什么建议吗?

提前感谢!

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

中有一些有关此问题的信息Action Reference for save post:

如果调用包含save\\u post挂钩的wp\\u update\\u post等函数,那么挂钩函数将创建一个无限循环。为了避免这种情况,请在调用所需函数之前先取消钩住函数,然后再重新钩住它。

因此,类似这样的方法应该有效:

[...]
add_action( \'save_post\', array( $this, \'save_meta_box\' ), 13, 2 );
[...]
public function save_meta_box( $post_id, $post ) {
    if ( isset( $_POST[\'options\'] ) ) {
        myplugin_set_options( $post_id, $_POST[\'options\'] );

        remove_action( \'save_post\',  array( $this, \'save_meta_box\' ), 13, 2 );

        // switch post visibility
        switch ( $_POST[\'options\'][\'type\'] ) {
            case \'normal\':
                wp_update_post( array( \'ID\' => $post_id, \'post_status\' => \'private\' ));
                break;
            case \'extended\':
                wp_update_post( array( \'ID\' => $post_id, \'post_status\' => \'publish\' ));
                break;
        }

        add_action( \'save_post\', array( $this, \'save_meta_box\' ), 13, 2 );
    }
}

结束

相关推荐