Come prevenire duplicati in wp_insert_post usando campi personalizzati
I miei link sorgente sono qualcosa di questo tipo:
http://sample.com/entertainment/default.aspx?tabid=2305&conid=102950
http://sample.com/entertainment/default.aspx?tabid=2418&conid=104330
http://sample.com/entertainment/default.aspx?tabid=2429&conid=104264
http://sample.com/entertainment/default.aspx?tabid=2305&conid=102949
.
.
.
Memorizzo nella cache i contenuti dai link. Uso wp_insert_post per pubblicare i contenuti memorizzati dalla cache dal sito sorgente a WordPress:
$my_post = array(
'post_title' => "$title",
'post_content' => "$content",
'post_status' => 'draft',
'post_author' => 1,
'post_category' => array(1),
);
wp_insert_post( $my_post );
Voglio inserire ogni link nei campi personalizzati e nella prossima cache, prima di pubblicare su WP, verificare i nuovi link con quelli presenti nei campi personalizzati. Se il link è già presente, prevenire l'inserimento del contenuto.
Scusate per la mia descrizione non perfetta.

Questo è un problema piuttosto strano che tutti incontreranno, specialmente se chiamano questa funzione all'interno di qualche ciclo <foreach>
<for>
<while>
ecc.
Dovresti provare questo
if (!get_page_by_title($title, 'OBJECT', 'post') ){
$my_post = array('post_title' => $title,
'post_content' => 'Content',
'tags_input' => $tags,
'post_category' => array(2),
'post_status' => 'publish'
);
$result = wp_insert_post( $my_post );
}
Nota la funzione get_page_by_title
che determina se esiste già un post con lo stesso titolo, in caso affermativo non chiama wp_insert_post
.
Spero che questo possa aiutare qualcuno che sta affrontando lo stesso problema.

Per salvare il link nei meta del post puoi usare update_post_meta
ad esempio così:
$url = "http://sample.com/entertainment/default.aspx?tabid=2305&conid=102950"
$my_post = array(
'post_title' => "$title",
'post_content' => "$content",
'post_status' => 'draft',
'post_author' => 1,
'post_category' => array(1),
);
$post_id = wp_insert_post( $my_post );
update_post_meta($post_id,'source_link',$url);
e per prevenire l'inserimento duplicato aggiungi un semplice controllo condizionale:
$args = array("meta_key" => "source_link", "meta_value" =>$url);
$posts = get_posts($args);
if (count($posts) < 0){
//aggiungi nuovo post
}
if (count($posts) < 0){
//aggiungi nuovo post
}
non funziona, cambialo con
if (empty($posts)){
//aggiungi nuovo post
}

Forse se usi qualcosa come una query wpdb includendo wp_posts e wp_postmeta per cercare questo meta prima di inserire il post...
$string = 'the_url.html';
$output = $wpdb->get_var($wpdb->prepare("SELECT count(id)
FROM $wpdb->posts wpo, $wpdb->postmeta wpm
WHERE wpo.ID = wpm.post_id
AND wpm.meta_key = 'name_of_ur_meta'
AND wpm.meta_value = '$string'"));
if(empty($output)) {
/* Inserisci il tuo post */
} else {
/* Aggiorna il post o fai altro */
};

Se il problema, come per una risposta sopra, è che la funzione viene eseguita all'interno di un ciclo di qualche tipo, allora il modo classico - e meno dispendioso in termini di risorse - per risolverlo è introdurre un flag.
$ran_already_flag = false;
{inizio del ciclo}
if ( ! $ran_already_flag ) {
$my_post = array('post_title' => $title,
'post_content' => 'Contenuto',
'tags_input' => $tags,
'post_category' => array(2),
'post_status' => 'publish'
);
$result = wp_insert_post( $my_post );
$ran_already_flag = true;
}
{fine del ciclo}
Se il problema non è che la funzione viene eseguita all'interno di un ciclo di qualche tipo, allora sarei interessato a sapere cosa l'ha causato: potrebbe essere che la funzione è collegata a un hook che viene eseguito due volte durante l'intero script: ad esempio, forse "update_post" viene eseguito due volte. In quel caso, potresti ricorrere a una delle altre opzioni offerte nelle altre risposte, anche se in sostanza si tratta di creare flag con altri mezzi (il titolo del post designato è un flag), e il tipo più semplice di variabile flag potrebbe essere passato lungo se necessario.
