web-dev-qa-db-ja.com

カスタムフィールドを使用してwp_insert_postで重複した投稿を防ぐ

私のソースリンクは、これを裏付けるものです。

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

私はコンテンツフォームのリンクをキャッシュします。ソースサイトからワードプレスにキャッシュされたコンテンツを投稿するのにwp_insert_postを使います:

 $my_post = array(
'post_title' => "$title",
'post_content' => "$content",
'post_status' => 'draft',
'post_author' => 1,
'post_category' => array(1),
);
 wp_insert_post( $my_post );

WPに投稿する前に、各リンクをカスタムフィールドと次のキャッシュに入れて、カスタムフィールド内のリンクで新しいリンクを確認します。リンクが繰り返される場合は、コンテンツを挿入しないでください。

私の悪い説明ですみません。

2
Morteza

リンクを投稿メタに保存するにはupdate_post_metaを使います。

このように例えば:

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

挿入を防ぐために、単純な条件付きチェックを追加します。

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

動作していない、それをに変更

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

これはかなり奇妙な問題で、特にループ<foreach><for><while>などでこの関数を呼び出すと、誰もが直面することになります。

これを試してみてください

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

}

同じタイトルの投稿が存在するかどうかを決定するget_page_by_title関数に注意してください。そうであれば、wp_insert_postを呼び出しません。

これが、同じ問題に苦しんでいる人の助けになることを願っています。

9
katie

あなたが投稿を挿入する前にこのメタを検索するwp_postsとwp_postmetaを含むwpdbクエリのような何かを使用するなら多分...

$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

上記の1つの答えが示すように、関数がある種のループ内で発生していることが問題である場合、古典的な(リソースをあまり必要としない)解決方法はフラグを導入することです。

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

関数が何らかのループ内で実行されているという問題ではない場合は、その原因が何であるかを知りたいと思います。関数が2回実行されるフックに接続されている可能性があります。スクリプト全体:たとえば、 "update_post"が2回実行される可能性があります。その場合、他の答えで提供されている他の選択肢の1つに頼るかもしれませんが、それらは他の方法でフラグを作成することになり(指定された役職はフラグです)。必要であれば。

1
CK MacLeod

それを修正するためにカスタムフィールドを使用しないでください。

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