防止重复的wp_sert_post

时间:2012-06-21 作者:Average Joe

对了,让我说这不是我前几天发布的问题(即duplicate posts when trying to update a post using the wp_insert_post. ) 因为,在那个问题上,我提到的重复帖子是作为修订版创建的。并在wp\\U配置中适当地旋转修订设置。php处理了它。然而,对于这个问题,创建了两个(有时是三个或四个)相同的职位(其中一个不是另一个的修订版)。不管我做了什么来避免这种情况,它都失败了。有时,我会重复100次,有时会重复500次。。

这都是我编写的迁移例程的一部分,其中while循环遍历ms-sql表中的15000条记录,并将每条记录转换为post\\u数据数组,以馈送到wp\\u insert\\u post API。从技术上讲,由于我在ms sql中处理15000个REC,我应该在新安装的wp\\U posts表中处理15000个POST。正当就我而言,我有时得到16000,有时290000。从来都不一样。每次都不一样。我几乎要重写代码了。但是如果罪魁祸首本身是wp\\u insert\\u post和一些我不知道的内部wp进程或wordpress缓存或mysql服务器配置和/或和/或,即使是新方法也行不通。

经过一些研究,我了解到我并不是唯一一个这样做的人。但从我读到的情况来看,我找不到一个包裹。

正如我上面所说,我创建了经过while循环的帖子。

由于这个过程需要很长时间,我不得不构建一个定制的超时模块。当代码经过while循环的迭代时,它会将其进程标记到一个timeout表中,因为我有一个在iframe中运行的看门狗页面来监视timeout表的进度,即使底部框架(处理ms-sql-to-wp\\u posts进程的框架)超时,我也知道从哪个记录启动进程。

这样我就不必坐在电脑前一直单击“继续”。链接

嗯,这个技巧适用于我所有因超时而中断的实现。最终,当要处理的记录数等于上一个实例中已处理的记录数时,我会处理整个表,并且看门狗iframe会停止刷新。因此,超时模块工作正常,除了。。。。

只有当目标表是wp\\u posts并且涉及wp\\u insert\\u post API时,我才会遇到问题。

第一次暂停后,事情开始变得复杂起来。

wp\\u insert\\u post有时会触发两次/三次,导致同一条记录被多次插入。

为了纠正这种情况,我尝试了3种不同的技术,包括使用自定义字段,但没有成功。我还尝试在帖子中插入一个唯一的键,以最小化数据库活动。我发现这更好,因为它避免了自定义字段的参与,但实现了相同的目标。我将source\\u键(类似于--{$db\\u name}.{$table\\u name}.{$recid\\u value}--)放在post中,在插入时,我只检查该键的存在性(使用like 操作员)查看该职位之前是否已添加。但即使这样也失败了。。。Wp\\U insert\\U post意外地创建了两条记录。到目前为止,我无法确定问题的发生。

我读过这个,Prevent duplicate posts in wp_insert_post using custom fields 但我的技术只是它的替代品。

这是我如何做的简化代码。。。

while ($row = mysql_fetch_assoc($RS)) :

        $source_recid = $row[\'source_recid\'];
        //source_recid is something like db.table.tablerecid
            //example services.media.1223

        $post_data[\'post_content\'] = $row[\'some_field_thats_got_page_content\'];

        //append the source_recid to the post data in forms of an html comment for uniqueness purposes      
        $post_data[\'post_content\'] = $post_data[\'post_content\'] . "<!--{$source_recid}-->";

        //do the other stuff... ( shortened here for the clarify purposes... )

        ....

        $post_data[\'post_status\'] = \'publish\';

        Insert_or_UpdatePost($dbh,$post_data,$source_recid,$post_id);


        if ($post_id==0):

            //log the error and move on 

            continue;

        endif;


endwhile;

function Insert_or_UpdatePost($dbh,$post_data,$source_recid,&$post_id){

        // this function first looks up the --db.table.tablerecid-- sequence 
        // across all wp_posts post_content field 
        // in determining if this record has been already INSERTed! 

        // and depending on the outcome, it does an insert or update 
        // and return the $post_id accordingly

        // if the function determines there are no such records, 
        // then and only then, it runs the wp_insert_post! 

        // if the function determines that there is a post like that, 
        // it retrieves the post_id 
        // and then switches to operation 
        // to use the wp_update_post instead! 

        // with this approach, technically speaking, 
        // it should impossible to run wp_insert_post on an existing post! 

        // and yet, I still get duplicate posts...

        // here we go;

        $post_id_probed = blp_sql_getdbvals($dbh,"select id from wp_posts where post_content LIKE \'%--{$source_recid}--%\'");

        if (blp_isnumber($post_id_probed)):
            $post_id = $post_id_probed;

            $post_data[\'ID\'] = $post_id;
            $post_id = wp_update_post( $post_data );

            if ($post_id == 0): 

                //add error     

                return FALSE;


            else:

                update_post_meta($post_id, "wpcf-blp-migration-date", blp_now(\'mysql\')); 

                return TRUE;

            endif;


         endif;

         // if we make it this part, it means only one thing!
         // there is no post for the db.table.tablerecid yet, 
         // so do the insert!

        $post_id = wp_insert_post( $post_data );



        if ($post_id == 0): 

            //add error 

            return FALSE;


        else:

            //add_post_meta($post_id, "wpcf-blp-migration-source", $source_recid,TRUE);
            //no need for that anymore

            return TRUE;


        endif;          


}

1 个回复
SO网友:Gembel Intelek

如果没有找到与tablerecid匹配的内容,请插入帖子,否则请添加帖子meta

if (!preg_match(\'/tablerecid/\', $data[ \'post_content\' ])){
wp_insert_post
} else {
add_post_meta
}

结束

相关推荐