web-dev-qa-db-fra.com

Empêcher les publications en double dans wp_insert_post à l'aide de champs personnalisés

Mes liens de source sont quelque chose comme ceci:

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

Je cache le contenu du formulaire links.I utilise wp_insert_post pour publier le contenu mis en cache du site source vers 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 );

Je souhaite placer chaque lien dans des champs personnalisés et dans le cache suivant, avant de publier sur WP, vérifiez les nouveaux liens avec des liens dans des champs personnalisés. Si le lien est répété, empêchez l'insertion de contenu.

Désolé pour ma mauvaise description.

2
Nulled

Pour enregistrer le lien dans la méta de publication, vous pouvez utiliser update_post_meta

comme ceci par exemple:

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

et pour empêcher l'insertion, ajoutez un contrôle conditionnel 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
}

ne fonctionne pas, changez le en

if (empty($posts)){ 
    //add new post
}
3
Bainternet

C'est un problème assez étrange auquel tout le monde devra faire face, surtout s'il appelle cette fonction dans une boucle <foreach><for><while> etc.

Tu devrais essayer ça

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

}

Remarquez la fonction get_page_by_title qui détermine si un article du même titre existe ou non. Si oui, il n'appelle pas wp_insert_post.

J'espère que cela aidera quelqu'un aux prises avec le même problème.

9
katie

Peut-être que si vous utilisez quelque chose comme une requête wpdb incluant wp_posts et wp_postmeta, recherchez ce méta avant d'insérer le message ...

$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 */
    };
2
Álex Acuña Viera

Si le problème, comme indiqué dans la réponse ci-dessus, est que la fonction se déroule dans une boucle, alors la solution classique - et moins gourmande en ressources - consiste à introduire un drapeau.

$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 le problème ne réside pas dans le fait que la fonction a été exécutée à l'intérieur d'une boucle, alors j'aimerais savoir ce qui l'a provoquée: il est possible que la fonction soit attachée à un hook fonctionnant deux fois au cours de la le script entier: Peut-être que "update_post" est exécuté deux fois, par exemple. Dans ce cas, vous pouvez utiliser l'un des autres choix proposés dans les autres réponses, bien qu'il s'agisse en réalité de créer des drapeaux par d'autres moyens (le titre de poste désigné est un drapeau), et le type de variable drapeau plus simple pourrait être transmis. si nécessaire.

1
CK MacLeod

N'utilisez pas de champs personnalisés pour y remédier, essayez plutôt ceci:

if ( ! defined( 'DOING_AJAX' ) || ! DOING_AJAX ){
    $post_id = wp_insert_post( $my_post );
}
0
Sergio David Acosta