我正在尝试从中批量添加自定义帖子类型的帖子。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”时,它会插入两次帖子。两个副本的状态均为“发布”。有人能帮我解决这个问题吗?谢谢
最合适的回答,由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.