Cum să previnți postările duplicate în wp_insert_post folosind câmpuri personalizate

10 iun. 2011, 21:36:25
Vizualizări: 14.5K
Voturi: 2

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ă.

0
Toate răspunsurile la întrebare 5
1

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ă.

2 mai 2012 11:26:04
Comentarii

Aceasta este o soluție inteligentă. Îmi place simplitatea ei. Există o funcție get_post_by_title în loc de get_page_by_title și care ar trebui să fie OBJECT-ul?

Ari Ari
1 nov. 2013 03:07:50
1

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ă
}
10 iun. 2011 23:07:17
Comentarii

Mulțumesc mult pentru această soluție minunată!! Dar nu ar trebui să fie (count($posts) == 0) în loc de "<"

User User
25 mai 2014 23:21:25
0

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

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.

7 aug. 2017 18:46:44
1
-2

Nu utiliza câmpuri personalizate pentru a rezolva problema, ar fi mai bine să încerci asta:

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

Te rog să adaugi o explicație la răspunsul tău: de ce această soluție rezolvă problema?

Sven Sven
24 aug. 2014 18:27:22