impedindo o duplicado wp_insert_post

Direito do morcego, deixe-me dizer que esta não é a mesma pergunta que eu publiquei no outro dia (isto é, postagens duplicadas ao tentar atualizar uma postagem usando o wp_insert_post. ) Causa, naquela pergunta, o post duplicado a que me referi estava sendo criado como uma revisão. E girar a configuração de revisão adequadamente no wp_config.php cuidou disso. Com esta pergunta no entanto, duas (às vezes três ou quatro) mensagens idênticas (onde uma não é a revisão do outro) são criadas. E não importa o que tenha feito para evitar isso, ele simplesmente falha. Às vezes, eu recebo 100 dups, às vezes 500 …

Isso faz parte de uma rotina de migration que eu escrevi onde um ciclo de tempo passa por 15.000 registros de uma tabela de ms sql e converte cada registro em uma matriz de pós-dados para ser alimentada na API do wp_insert_post. Tecnicamente, uma vez que estou lidando com 15000 recs no ms-sql, eu deveria terminar com 15000 postagens em uma nova tabela instalada wp_posts. Certo? No meu caso, às vezes eu consigo 16000, às vezes 290000. Nunca é o mesmo. Toda vez que é diferente. Estou quase ao ponto de rewrite o código. Mas se o próprio culpado o wp_insert_post e algum processo interno wp ou o cache wordpress que eu não conheço ou a configuração do servidor mysql e ou e ou e ou …, mesmo a nova abordagem não funcionará.

Depois de alguma pesquisa, eu vim para falar, não estou sozinho nisso. Mas do que eu li, não conseguiria um invólucro em torno disso.

Como eu disse acima, eu crio as postagens que vão por um loop while.

Uma vez que o processo leva muito tempo, tive que criar um módulo de tempo limite personalizado. À medida que o código atravessa as iterações do loop while, ele marca seu processo em uma tabela time_out e, se eu tiver uma página de cachorro assente que esteja executando em um iframe para manter o olho no progresso time_out table, mesmo que o quadro inferior aquele que lida com o processo ms-sql para wp_posts) expira, sei do registro para iniciar o processo.

Desta forma, eu não tenho que me sentar na frente do computador para continuar clicando em ‘continuar’. binding.

Bem, esse truque funciona em todas as minhas implementações que são interrompidas por tempos limite. Eu eventualmente acabo recebendo toda a mesa é processada e o iframe do cão do relógio pára de atualizar quando o número de registros a serem processados ​​é igual ao número de registros que foram processados ​​na última instância. Então, o módulo de tempo limite funciona perfeitamente, exceto ….

Somente e somente quando a tabela de destino é wp_posts e quando a API wp_insert_post está envolvida, recebo um problema.

Após o primeiro tempo de espera, as coisas começam a ficar com feno.

De vez em quando, wp_insert_post acaba atirando duas vezes / três vezes, fazendo com que o mesmo registro seja inserido várias vezes.

Para remediar a situação, tentei 3 técnicas diferentes, incluindo o uso de campos personalizados, mas sem sorte. Eu também tentei inserir uma chave única na própria publicação para minimizar a atividade do database. Descobriu que isso é melhor porque evita o envolvimento de campos personalizados, e ainda assim alcança o mesmo objective. Eu coloco a fonte_key (que é algo como – {$ db_name}. {$ Table_name}. {$ Recid_value} -) na publicação e at_insert_time, eu apenas verifico a existência dessa chave (usando like operador) para ver se essa postagem foi adicionada anteriormente. mas mesmo que falha … Wp_insert_post surpreendentemente cria registros duplos. e até agora, eu simplesmente não consigo definir a ocorrência do problema.

Eu leio isso, Impedir posts duplicados em wp_insert_post usando campos personalizados. Mas minhas técnicas eram simplesmente alternativas.

Aqui está um código reduzido de como faço isso …

 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'] . ""; //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; } 

dizer

Solutions Collecting From Web of "impedindo o duplicado wp_insert_post"