Impedir publicaciones duplicadas en wp_insert_post usando campos personalizados

2

Mis enlaces de origen son algo relacionado con esto:

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

Almaceno en caché los enlaces de los formularios de contenido. Utilizo wp_insert_post para publicar contenido almacenado en caché desde el sitio de origen 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 );

Quiero poner cada enlace en los campos personalizados y en la siguiente memoria caché, antes de publicar en WP, comprobar los nuevos enlaces con enlaces en los campos personalizados. Si se repite el enlace, evita insertar contenido.

Lo siento por mi mala descripción.

    
pregunta Nulled 10.06.2011 - 20:36

5 respuestas

4

Para guardar el enlace en el meta de la publicación, puedes usar update_post_meta

como este por ejemplo:

$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);

y para evitar la inserción, agregue una comprobación condicional simple:

$args = array("meta_key" => "source_link", "meta_value" =>$url);
$posts = get_posts($args);
if (count($posts) < 0){
    //add new post
}
if (count($posts) < 0){
    //add new post
}

no funciona, cámbielo a

if (empty($posts)){ 
    //add new post
}
    
respondido por el Bainternet 10.06.2011 - 22:07
9

Es un problema bastante extraño al que todos se enfrentarán, especialmente si llaman a esta función dentro de un bucle <foreach> <for> <while> etc.

Deberías probar esto

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 );

}

Observe la función get_page_by_title que determina si existe una publicación con el mismo título o no, si es así, no llama a wp_insert_post .

Espero que esto ayude a alguien que lucha con el mismo problema.

    
respondido por el katie 02.05.2012 - 10:26
2

Tal vez si usas algo como una consulta wpdb que incluya wp_posts y wp_postmeta buscando este meta antes de insertar la publicación ...

$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)) {
    /* Insert your post */
    } else {
            /* Update the post or do other thing */
    };
    
respondido por el Álex Acuña Viera 10.06.2011 - 22:16
1

Si el problema, como se explica en una de las respuestas anteriores, es que la función está ocurriendo dentro de un bucle de algún tipo, la forma clásica de resolver, y que requiere menos recursos, es introducir una bandera.

$ran_already_flag = false;

{loop begins}

if ( ! $ran_already_flag ) {

    $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 );
    $ran_already_flag = true;

}

{loop ends}

Si el problema no es que la función se haya ejecutado dentro de un bucle de algún tipo, entonces me interesaría saber qué lo causó: podría ser que la función esté conectada a un gancho que se ejecute dos veces sobre el Curso de todo el script: Tal vez "update_post" se ejecute dos veces, por ejemplo. En ese caso, puede recurrir a una de las otras opciones ofrecidas en las otras respuestas, aunque en realidad equivalen a crear banderas por otros medios (el título de la publicación designada es una bandera), y el tipo más simple de variable de bandera podría transmitirse. si necesario.

    
respondido por el CK MacLeod 07.08.2017 - 17:46
0

No utilice campos personalizados para solucionarlo, debería intentar esto:

if ( ! defined( 'DOING_AJAX' ) || ! DOING_AJAX ){
    $post_id = wp_insert_post( $my_post );
}
    
respondido por el Sergio David Acosta 24.08.2014 - 16:51

Lea otras preguntas en las etiquetas