Предотвращение дублирования записей в 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 для публикации закешированного контента из исходного сайта в 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, проверять новые ссылки с ссылками в произвольных полях. Если ссылка повторяется, предотвращать вставку контента.
Извините за плохое описание.

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

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

Возможно, если использовать запрос через 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 {
/* Обновить запись или выполнить другое действие */
};

Если проблема, как указано в одном из ответов выше, заключается в том, что функция выполняется внутри какого-либо цикла, то классический и менее ресурсоемкий способ решения — ввести флаг.
$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" может выполняться дважды. В таком случае можно прибегнуть к одному из других решений, предложенных в ответах, хотя по сути они сводятся к созданию флагов иными способами (указанный заголовок записи выступает в роли флага), и более простой вариант с флаговой переменной можно передавать при необходимости.
