Evita postagens duplicadas em wp_insert_post usando campos personalizados

2

Meus links de origem são algo assim:

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

Eu armazeno em cache os links do formulário de conteúdo.Eu uso wp_insert_post para postar conteúdo em cache do site de origem para o 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 );

Eu quero colocar cada link em campos personalizados e no próximo cache, antes de postar no WP, verifique novos links com links em campos personalizados. Se o link for repetido, evite inserir conteúdo.

Desculpe pela minha má descrição.

    
por Nulled 10.06.2011 / 20:36

5 respostas

4

Para salvar o link no post meta, você pode usar update_post_meta

assim, por exemplo:

$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 para evitar a inserção, adicione uma verificação condicional simples:

$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
}

não está funcionando, mude para

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

Esse é um problema muito estranho que todos irão enfrentar especialmente se chamarem essa função dentro de algum loop <foreach> <for> <while> etc.

Você deve tentar isso

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 a função get_page_by_title , que determina se uma postagem com o mesmo título existe ou não, se sim, não chama wp_insert_post .

Espero que isso ajude alguém com o mesmo problema.

    
por katie 02.05.2012 / 10:26
2

Talvez se você usar algo como uma consulta wpdb incluindo wp_posts e wp_postmeta pesquisando esta meta antes de inserir o 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)) {
    /* Insert your post */
    } else {
            /* Update the post or do other thing */
    };
    
por Álex Acuña Viera 10.06.2011 / 22:16
1

Se o problema, como uma resposta acima, é que a função está ocorrendo dentro de um loop de algum tipo, então a maneira clássica - e menos intensiva de recursos - de resolver é introduzir um sinalizador.

$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}

Se o problema não é que a função foi executada dentro de um loop de algum tipo, então eu estaria interessado em saber o que causou isso: Pode ser que a função esteja conectada a um gancho que é executado duas vezes Durante todo o script: Talvez "update_post" seja executado duas vezes, por exemplo. Nesse caso, você pode recorrer a uma das outras opções oferecidas nas outras respostas, embora elas realmente signifiquem criar sinalizações por outros meios (o título de postagem designado é um sinalizador), e o tipo mais simples de variável de sinalizador poderia ser transmitido se necessário.

    
por CK MacLeod 07.08.2017 / 17:46
0

Não use campos personalizados de usuário para corrigi-lo. É melhor tentar isso:

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