对了,让我说这不是我前几天发布的问题(即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;
}
说