使用 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');

尝试使用:

wp_loaded

add_action('wp_loaded', 'cpt_to_cpt');

wp

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 的命令行界面)。

请查看此处的文档:https://developer.wordpress.org/cli/commands/post/