Предотвращение дублирования записей в wp_insert_post с использованием произвольных полей

10 июн. 2011 г., 21:36:25
Просмотры: 14.5K
Голосов: 2

Мои исходные ссылки выглядят примерно так:

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 для публикации закешированного контента из исходного сайта в 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);

Я хочу сохранять каждую ссылку в произвольных полях и при следующем кешировании, перед публикацией в WP, проверять новые ссылки с ссылками в произвольных полях. Если ссылка повторяется, предотвращать вставку контента.

Извините за плохое описание.

0
Все ответы на вопрос 5
1

Это довольно странная проблема, с которой сталкивается каждый, особенно если вызывать эту функцию внутри какого-либо цикла <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.

Надеюсь, это поможет тем, кто столкнулся с такой же проблемой.

2 мая 2012 г. 11:26:04
Комментарии

Это умное решение. Мне нравится его простота. Существует ли функция get_post_by_title вместо get_page_by_title и каким должен быть параметр OBJECT?

Ari Ari
1 нояб. 2013 г. 03:07:50
1

Для сохранения ссылки в мета-данных записи можно использовать 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){
    //добавить новую запись
}

if (count($posts) < 0){
    //добавить новую запись
}

не работает, замените на

if (empty($posts)){ 
    //добавить новую запись
}
10 июн. 2011 г. 23:07:17
Комментарии

Спасибо большое за это замечательное решение !! Но разве не должно быть (count($posts) == 0) вместо "<"

User User
25 мая 2014 г. 23:21:25
0

Возможно, если использовать запрос через wpdb, включая таблицы wp_posts и wp_postmeta, чтобы проверить мета-данные перед добавлением записи...

$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)) {
    /* Вставить запись */
    } else {
            /* Обновить запись или выполнить другое действие */
    };
10 июн. 2011 г. 23:16:14
0

Если проблема, как указано в одном из ответов выше, заключается в том, что функция выполняется внутри какого-либо цикла, то классический и менее ресурсоемкий способ решения — ввести флаг.

$ran_already_flag = false;

{начало цикла}

if ( ! $ran_already_flag ) {

    $my_post = array('post_title' => $title,
                     'post_content' => 'Содержание',
                     'tags_input' => $tags,
                     'post_category' => array(2),
                     'post_status' => 'publish'
                    );


    $result = wp_insert_post( $my_post );
    $ran_already_flag = true;

}

{конец цикла}

Если проблема не в том, что функция выполняется внутри цикла, то было бы интересно узнать, что вызвало её повторный запуск: возможно, функция привязана к хуку, который срабатывает дважды в течение выполнения скрипта. Например, "update_post" может выполняться дважды. В таком случае можно прибегнуть к одному из других решений, предложенных в ответах, хотя по сути они сводятся к созданию флагов иными способами (указанный заголовок записи выступает в роли флага), и более простой вариант с флаговой переменной можно передавать при необходимости.

7 авг. 2017 г. 18:46:44
1
-2

Не используйте пользовательские поля для исправления, лучше попробуйте это:

if ( ! defined( 'DOING_AJAX' ) || ! DOING_AJAX ){
    $post_id = wp_insert_post( $my_post );
}
24 авг. 2014 г. 17:51:34
Комментарии

Пожалуйста, добавьте объяснение к вашему ответу: почему это решает проблему?

Sven Sven
24 авг. 2014 г. 18:27:22