使用 wp_insert_post() - 创建重复项
Using wp_insert_post() - creates duplicates
我正在将一个 CPT 动态添加到另一个 CPT。当使用 wp_insert_post()
时,当我 add_action('init', 'function_name');
知道使用什么钩子来简单地添加它们时,它会创建重复项:
function cpt_to_cpt(){
// Grab posts
$args = array(
'post_type' => ' custom_type1 ',
'order' => 'ASC',
'post_status' => 'publish',
'numberposts' => -1,
);
$posts = get_posts($args);
foreach ( $posts as $post ) {
wp_insert_post(array(
'post_type' => 'custom_type2',
'post_title' => $post->post_title,
'post_date' => $post->post_date,
'post_author' => $post->post->author,
'post_status' => 'publish',
)
);
}
add_action('init', 'cpt_to_cpt');
尝试使用:
add_action('wp_loaded', 'cpt_to_cpt');
或
add_action('wp', 'cpt_to_cpt')
WordPress init
and wp_loaded
钩子在 "loading" 阶段启动。这意味着它们在刷新页面时都可以触发多次。
解决方案 1
您可以使用另一个稍后触发的挂钩。
例如,wp
钩子在 "processing" 阶段触发,并且应该 运行 只触发一次。
add_action('wp', 'cpt_to_cpt');
优先顺序:init
wp_loaded
wp
解决方案 2
如果你真的想使用 init
钩子并确保它会 运行 一次。您可以使用下面的代码段。
function cpt_to_cpt() {
$runtime = 'run_only_01;
if (get_option('my_run_only_once_option') != $runtime) {
$updated = update_option('my_run_only_once_option', $runtime);
if ($updated === true) {
// do some stuff
}
}
}
add_action('init', 'cpt_to_cpt');
它将在您的 wp_option
table 上创建一个选项。最后,您需要手动(在您的数据库上)或在您的代码中删除该选项。
delete_option('my_run_only_once_option');
解决方案 3
也许创建多个 post 或 CPT(自定义 post 类型)的最佳专业解决方案应该是使用 wp-cli
(WordPress 的命令行界面)。
我正在将一个 CPT 动态添加到另一个 CPT。当使用 wp_insert_post()
时,当我 add_action('init', 'function_name');
知道使用什么钩子来简单地添加它们时,它会创建重复项:
function cpt_to_cpt(){
// Grab posts
$args = array(
'post_type' => ' custom_type1 ',
'order' => 'ASC',
'post_status' => 'publish',
'numberposts' => -1,
);
$posts = get_posts($args);
foreach ( $posts as $post ) {
wp_insert_post(array(
'post_type' => 'custom_type2',
'post_title' => $post->post_title,
'post_date' => $post->post_date,
'post_author' => $post->post->author,
'post_status' => 'publish',
)
);
}
add_action('init', 'cpt_to_cpt');
尝试使用:
add_action('wp_loaded', 'cpt_to_cpt');
或
add_action('wp', 'cpt_to_cpt')
WordPress init
and wp_loaded
钩子在 "loading" 阶段启动。这意味着它们在刷新页面时都可以触发多次。
解决方案 1
您可以使用另一个稍后触发的挂钩。
例如,wp
钩子在 "processing" 阶段触发,并且应该 运行 只触发一次。
add_action('wp', 'cpt_to_cpt');
优先顺序:init
wp_loaded
wp
解决方案 2
如果你真的想使用 init
钩子并确保它会 运行 一次。您可以使用下面的代码段。
function cpt_to_cpt() {
$runtime = 'run_only_01;
if (get_option('my_run_only_once_option') != $runtime) {
$updated = update_option('my_run_only_once_option', $runtime);
if ($updated === true) {
// do some stuff
}
}
}
add_action('init', 'cpt_to_cpt');
它将在您的 wp_option
table 上创建一个选项。最后,您需要手动(在您的数据库上)或在您的代码中删除该选项。
delete_option('my_run_only_once_option');
解决方案 3
也许创建多个 post 或 CPT(自定义 post 类型)的最佳专业解决方案应该是使用 wp-cli
(WordPress 的命令行界面)。