WP_INSERT_POST()使用‘POST_STATUS’=>‘PUBLISH’创建重复项

时间:2017-12-02 作者:Trevor M

我正在尝试从中批量添加自定义帖子类型的帖子。csv文件。除了两次添加帖子外,其他一切都正常。它们在数据库中完全相同,只是一个有作者1,另一个有作者2。此外,它在post\\u名称后面附加“-2”。以下是我所拥有的:

add_action(\'wp_loaded\', \'add_from_csv\', 10);
function add_from_csv() {
    if (($handle = fopen(dirname(__FILE__) . "/posts.csv", "r")) !== FALSE) {
        while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) {
            $term_1 = $data[0];
            $term_2 = $data[1];
            $term_3 = $data[2];
            $term_4 = $data[3];
            $term_5 = $data[4];
            $meta_1 = $data[5];
            $meta_2 = $data[6];
            $meta_3 = $data[7];
            $meta_4 = $data[8];
            $meta_5 = $data[9];
            $meta_6 = isset($data[10]) ? $data[10] : \'\';

            $post_id = wp_insert_post( 
                array(
                    \'post_title\' => $meta_1 . \' \' . $meta_2 . \' \' . $meta_3 . \': \' . $meta_4,
                    \'post_type\' => \'custom_type\',
                    \'post_status\' => \'publish\',
                )
            );

            if(!is_wp_error($post_id) || $post_id != 0) {
                $tax_1_terms = array($term_1, $term_2, $term_3, $term_4);
                wp_set_object_terms( $post_id, $tax_1_terms, \'tax_1\' );
                wp_set_object_terms( $post_id, $term_5, \'tax_2\' );

                update_post_meta($post_id, \'meta-1\', $meta_1);
                update_post_meta($post_id, \'meta-2\', $meta_2);
                update_post_meta($post_id, \'meta-3\', $meta_3);
                update_post_meta($post_id, \'meta-4\', $meta_4);
                update_post_meta($post_id, \'meta-5\', $meta_5);
                update_post_meta($post_id, \'meta-6\', $meta_6);
            } else {
                echo \'There was a WP_Error when loading posts from csv!\';
                break;
            }
        }
        fclose($handle);
    }
}
我有一个插件本身。如果我没有设置“post\\u status”,并且它使用默认状态“draft”,那么就没有重复项。但当我设置“post\\u status”=>“publish”时,它会插入两次帖子。两个副本的状态均为“发布”。有人能帮我解决这个问题吗?谢谢

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

我把你的代码最小化了,然后做了一个。csv有3行,并且能够得到与您相同的错误。

然而,我得到了同一帖子的三个实例。我的csv中有3行,这绝非巧合。您的插入代码是正确的,因此必须是每次触发插入时重新调用的挂钩。

我把钩子改成了一些看似随机的东西,但对于仅作为用户端和管理员来说非常具体admin_notices 钩子,它工作了,没有为我启用代码的一页加载创建重复/三次条目。

虽然我没有文档来证明这一点,但我相信许多Wordpress钩子都会使用wp_insert_post 打电话,这就是你的问题。

 // causes duplicates ---
//add_action(\'wp_loaded\', \'add_from_csv\', 10);

// no duplicates ---
//add_action(\'admin_notices\', \'add_from_csv\', 10);

function add_from_csv() {
    if (($handle = fopen(dirname(__FILE__) . "/posts.csv", "r")) !== FALSE) {
        while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) {
            $post_id = wp_insert_post( 
                array(
                    \'post_title\' => $data[0],
                    \'post_type\' => \'post\',
                    \'post_status\' => \'publish\',
                )
            );
            if(!is_wp_error($post_id) || $post_id != 0)
                echo "<pre>Added {$data[0]}</pre>";

        }
        fclose($handle);
    }
}
我建议创建一个非常简单的管理设置/选项页面来存放代码,并通过表单提交按钮激活代码,verified with nonce.

结束

相关推荐