Cum să previnți postările duplicate în wp_insert_post folosind câmpuri personalizate
Linkurile mele sursă arată astfel:
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
.
.
.
Cachez conținutul din aceste linkuri. Folosesc wp_insert_post pentru a posta conținutul cache-uit din site-ul sursă în 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);
Doresc să stochez fiecare link în câmpuri personalizate și la următoarea operațiune de cache, înainte de a posta în WP, să verific noile linkuri cu cele existente în câmpurile personalizate. Dacă linkul este deja existent, să prevenim inserarea conținutului.
Îmi cer scuze pentru descrierea mea neclară.

Aceasta este o problemă destul de ciudată cu care se vor confrunta mulți, mai ales dacă apelează această funcție în interiorul unui loop <foreach>
<for>
<while>
etc.
Ar trebui să încerci asta:
if (!get_page_by_title($title, 'OBJECT', 'post') ){
$my_post = array('post_title' => $title,
'post_content' => 'Conținut',
'tags_input' => $tags,
'post_category' => array(2),
'post_status' => 'publish'
);
$result = wp_insert_post( $my_post );
}
Observă funcția get_page_by_title
care verifică dacă există deja un post cu același titlu. Dacă există, nu se apelează wp_insert_post
.
Sper că acest lucru va ajuta pe cineva care se confruntă cu aceeași problemă.

Pentru a salva link-ul în meta-ul postării poți folosi update_post_meta
de exemplu astfel:
$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);
și pentru a preveni inserarea adaugă o simplă verificare condițională:
$args = array("meta_key" => "source_link", "meta_value" =>$url);
$posts = get_posts($args);
if (count($posts) < 0){
//adaugă postare nouă
}
if (count($posts) < 0){
//adaugă postare nouă
}
nu funcționează, schimbă-l în
if (empty($posts)){
//adaugă postare nouă
}

Poate dacă folosești ceva de genul unei interogări wpdb care include tabelele wp_posts și wp_postmeta, căutând acest metadate înainte de a insera postarea...
$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)) {
/* Inserează postarea ta */
} else {
/* Actualizează postarea sau fă altceva */
};

Dacă problema, conform unui răspuns de mai sus, este că funcția se execută într-o buclă de un fel, atunci soluția clasică - și mai puțin consumatoare de resurse - este să introduci un flag.
$ran_already_flag = false;
{începe bucla}
if ( ! $ran_already_flag ) {
$my_post = array('post_title' => $title,
'post_content' => 'Conținut',
'tags_input' => $tags,
'post_category' => array(2),
'post_status' => 'publicat'
);
$result = wp_insert_post( $my_post );
$ran_already_flag = true;
}
{se termină bucla}
Dacă problema nu este că funcția a rulat într-o buclă de un fel, atunci aș fi interesat să știu ce a cauzat-o: Este posibil ca funcția să fie atașată unui hook care rulează de două ori pe parcursul întregului script: Poate "update_post" rulează de două ori, de exemplu. În acest caz, ai putea recurge la una dintre celelalte opțiuni oferite în celelalte răspunsuri, deși ele se reduc în esență la crearea de flag-uri prin alte mijloace (titlul postului desemnat este un flag), iar tipul mai simplu de variabilă flag ar putea fi transmis dacă este necesar.
