使用wp_insert_post() - 创建重复项

时间:2017-11-28 11:22:39

标签: php wordpress custom-post-type

我正在向另一个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');

2 个答案:

答案 0 :(得分:1)

尝试使用:

wp_loaded

add_action('wp_loaded', 'cpt_to_cpt');

wp

add_action('wp', 'cpt_to_cpt')

答案 1 :(得分:0)

WordPress initwp_loaded在“加载”阶段引起轰动。这意味着刷新页面时它们都可以触发多次。

解决方案1 ​​

您可以使用另一个稍后触发的钩子。

例如,

wp挂钩会在“处理”阶段触发,并且只能运行一次。

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表上创建一个选项。最后,您需要手动(在数据库中)或在代码中删除该选项。

delete_option('my_run_only_once_option');

解决方案3

也许创建多个帖子或CPT(自定义帖子类型)的最佳专业解决方案应该使用wp-cli(WordPress的命令行界面)。

请在此处查看文档:{​​{3}}