可以使用metabox创建一篇帖子吗?

时间:2012-01-06 作者:mor7ifer

我正在尝试使用“save\\u post”挂钩从元数据库创建一篇帖子(最终是多篇帖子)。我执行了一次脚本,创建了3900个左右的新帖子,然后才爬到帖子中。发现wp\\u insert\\u post()调用“save\\u post”挂钩。有没有人有一个创造性的解决方案,可以在不直接插入db的情况下创建帖子(解决方案越简单越好)。

代码

add_action( \'add_meta_boxes\', \'my_metabox_init\' );
add_action( \'save_post\', \'my_metabox_save\' );
function my_metabox_init()
{
    add_meta_box(
        \'my-metabox\',
        \'My Metabox\',
        \'my_metabox_render\'
        \'post\',
        \'normal\',
        \'core\'
    );
    //enquque scripts and styles
}
function my_metabox_render() {
    //generate datasets
}
function my_metabox_save() {
    //data authenticity check
    //process & sanitize data

    //create posts
    for( $i=0; $i<$count; $i++ ) {
        $args = array(
            \'post_status\' => \'pending\',
            \'post_title\'  => $_POST[\'post_title\'][$i],
            \'post_type\'   => \'custom_post_type\',
        );
        foreach( $category_array[$i] as $category ) {
            $args[\'tax_input\'][\'custom-taxonomy\'][] = $category;
        }
        if( $_POST[\'id_of_previously_created_post\'][$i] != \'\' ) {
            $args[\'ID\'] = $_POST[\'id_of_previously_created_post\'][$i];
            unset( $args[\'post_status\'] );
        }
        $new_post_id = wp_insert_post( $args );
    }
}
谢谢!

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

我想出来了,我最后做的是:

function my_metabox_save() {
    //do this just once
if( MY_DOING_SAVE != \'my_doing_save\' ) {
    define( MY_DOING_SAVE , \'my_doing_save\' );

    //data authenticity check
    //process & sanitize data

    //create posts
    for( $i=0; $i<$count; $i++ ) {
        $args = array(
            \'post_status\' => \'pending\',
            \'post_title\'  => $_POST[\'post_title\'][$i],
            \'post_type\'   => \'custom_post_type\',
        );
        foreach( $category_array[$i] as $category ) {
            $args[\'tax_input\'][\'custom-taxonomy\'][] = $category;
        }
        if( $_POST[\'id_of_previously_created_post\'][$i] != \'\' ) {
            $args[\'ID\'] = $_POST[\'id_of_previously_created_post\'][$i];
            unset( $args[\'post_status\'] );
        }
        $new_post_id = wp_insert_post( $args );
        }
    }
}
@toscho的方法不起作用的原因是因为变量的范围,尽管他肯定走在了正确的轨道上。

SO网友:fuxia

更新答案很简单,一开始我看不到。:)

只需在第一次函数调用期间删除该操作。这样,你的工作within the API, 函数只被调用一次。不需要静态甚至全局变量或常量。

function my_metabox_save() {
    remove_action( \'save_post\', \'my_metabox_save\' );
    // go on with your function ...
我将保留旧的答案,以说明如果您认为太抽象,解决方案可能会变得多么尴尬…

旧答案添加检查my_metabox_save() 阻止第二次呼叫。

示例代码(未测试):

function my_metabox_save() {
    static $done = FALSE;
    if ( $done )
    { // No, not again!
        return;
    }
    //data authenticity check
    //process & sanitize data

    //create posts
    for( $i=0; $i<$count; $i++ ) {
        $args = array(
            \'post_status\' => \'pending\',
            \'post_title\'  => $_POST[\'post_title\'][$i],
            \'post_type\'   => \'custom_post_type\',
        );
        foreach( $category_array[$i] as $category ) {
            $args[\'tax_input\'][\'custom-taxonomy\'][] = $category;
        }
        if( $_POST[\'id_of_previously_created_post\'][$i] != \'\' ) {
            $args[\'ID\'] = $_POST[\'id_of_previously_created_post\'][$i];
            unset( $args[\'post_status\'] );
        }
        $new_post_id = wp_insert_post( $args );
    }
    $done = TRUE; // Remember that we’re done.
}

SO网友:hacksy

您只需在保存帖子之前添加wp\\u nonce检查即可http://codex.wordpress.org/Function_Reference/wp_nonce_field第一次保存后,wp\\u nonce将被分解,不再调用wp\\u insert\\u post

结束

相关推荐

从Metabox保存数据不起作用

我已经使用了添加metabox的教程。但我的数据不会保存在框中。我在编辑链接页面中有元框,但当我将任何数据放入框中并按下更新按钮时,它不会保存数据。那么实际上,我想知道我什么时候把数据放进框中,我可以使用$\\u POST[]获取数据吗?如果是,请帮助我,使我的代码部分出错。。// backwards compatible add_action( \'admin_init\', \'blc_add_custom_link_box\', 1 ); /*