Come prevenire duplicati in wp_insert_post usando campi personalizzati

10 giu 2011, 21:36:25
Visualizzazioni: 14.5K
Voti: 2

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.

0
Tutte le risposte alla domanda 5
1

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.

2 mag 2012 11:26:04
Commenti

È una soluzione intelligente. Mi piace la sua semplicità. Esiste una funzione get_post_by_title invece di get_page_by_title e cosa dovrebbe essere l'OBJECT?

Ari Ari
1 nov 2013 03:07:50
1

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
}
10 giu 2011 23:07:17
Commenti

Grazie mille per questa soluzione fantastica !! Ma non dovrebbe essere (count($posts) == 0) invece di "<"

User User
25 mag 2014 23:21:25
0

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 */
    };
10 giu 2011 23:16:14
0

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.

7 ago 2017 18:46:44
1
-2

Non utilizzare campi personalizzati per risolverlo, dovresti provare questo:

if ( ! defined( 'DOING_AJAX' ) || ! DOING_AJAX ){
    $post_id = wp_insert_post( $my_post );
}
24 ago 2014 17:51:34
Commenti

Per favore aggiungi una spiegazione alla tua risposta: perché questa soluzione risolve il problema?

Sven Sven
24 ago 2014 18:27:22