Вопрос или проблема
Кто-нибудь сталкивался с этой проблемой?
Я создал пользовательский PHP-скрипт, который добавляет новый пост с помощью wp_insert_post()
, но каждый раз, когда я запускаю код, он создает 2 новых поста, хотя должно быть только один. Это похоже на то, что он выполняется дважды, поэтому я протестировал другую функцию с использованием wpdb->query
, и результат тоже такой же. Это действительно странно. Пожалуйста, помогите, я не знаю, в чем причина и как исправить эту проблему.
Большое спасибо.
Вот пример кода, который я сделал только для тестирования проблемы, и он все еще создает 2 идентичных поста.
function testtest(){
$ads_data = array(
'post_title' => "тест",
'post_content' => "тест",
'post_status' => 'опубликовано',
'post_type' => 'рекламы',
//'post_author' => $user_id
);
// Вставить пост в базу данных
$ads_id = wp_insert_post( $ads_data );
}add_shortcode('testtest','testtest');
РЕШЕНО
Я разобрался с этой проблемой, причина в следующей строке кода в файле header.php:
<link rel="icon" type="image/png" href="https://wordpress.stackexchange.com/questions/174636/<?php echo esc_url( get_theme_mod("favicon' ) ); ?>" />
Мне это кажется очень странным, у меня нет понятия, почему эта строка кода вызывает проблему. В любом случае, спасибо всем!
Я решил свою аналогичную проблему (см. блок кода ниже), изменив путь к wp-load.php. На самом деле я использовал скрипт парсинга URI от Frankie Jaret, который работает только на стандартной установке, но, тем не менее, это то, что я использую. Уверен, вы можете найти функцию, которая распарсит его, где бы он ни находился. Код ниже:
$parse_uri = explode( 'wp-content', $_SERVER['SCRIPT_FILENAME'] );
require_once( $parse_uri[0] . 'wp-load.php' );
Не знаю, поможет ли это вам, но это решило проблему для меня.
Аналогичная проблема: Я понимаю, что это не ответ, но я не могу оставить комментарий, так как это мой первый пост и у меня 0 репутации. Но у меня есть эта точно такая же проблема, я только начал замечать ее недавно и не имею проблем с фавиконом, так как запускаю вставку из cronjob. Я смог воспроизвести это, по крайней мере, 30 раз подряд сегодня. Я опубликую ответ, как только разберусь. Но я точно знаю, что только определенное количество массивов постов передается, и тем не менее он все равно создает два поста, или пользовательских в моем случае.
Ответ или решение
Проблема с дублированием записей при использовании функций wpdb и wp_insert_post в WordPress
Вам, возможно, уже знакома проблема, связанная с дублированием записей, когда выполняются функции wp_insert_post()
, wpdb->query()
и другие аналогичные. Это может вызвать недоумение, особенно если вы уверены, что код запускается всего один раз. В этом материале мы рассмотрим основные причины, которые могут привести к подобной ошибке, а также способы их устранения.
Причины дублирования записей
-
Множественные вызовы функции: Убедитесь, что ваша функция, отвечающая за вставку данных, не вызывается несколько раз. Это может происходить в результате ошибки в логике управления, например, в случае автоматических вызовов через хуки или шорткоды.
-
Проблемы с фильтрами и экшенами: Если вы используете хуки WordPress, такие как
init
илиwp_footer
, ваша функция может быть вызвана несколько раз в процессе выполнения скрипта. Проверьте ваш код на наличие таких вызовов. -
Кэширование: Если вы используете какие-либо механизмы кэширования (плагин кэширования или CDN), это также может вызвать дублирование, так как система может пытаться снова выполнить код, который уже был выполнен. Пробуйте очищать кэш после внесения изменений.
-
Ошибки в HTML-коде: Обратите внимание на неожиданные ошибки в вашем HTML, которые могут привести к проблемному рендерингу страницы, как в случае из вашего примера с неправильным вставлением PHP кода в атрибут. Запись может создаваться дважды в результате некорректного выполнения кода. Убедитесь, что PHP внутри HTML правильно обрабатывается.
Как устранить проблему
-
Логирование: Включение логирования очень поможет. Вы можете использовать функции вроде
error_log()
для отслеживания того, сколько раз выполняется ваша функция. -
Проверка условий запуска:
Прежде чем выполнять вставку данных, вы можете добавить дополнительные условия, которые проверяют, существует ли данная запись в базе данных. Например:function testtest() { $title = "test"; if (!get_page_by_title($title, OBJECT, 'ads')) { $ads_data = array( 'post_title' => $title, 'post_content' => "test", 'post_status' => 'publish', 'post_type' => 'ads', ); wp_insert_post($ads_data); } } add_shortcode('testtest', 'testtest');
-
Оптимизация PHP-кода:
Важно следить за тем, как вставляется PHP-код в HTML. Здесь существует риск возникновения таких проблем, как в приведенном вами примере с вложением в<link>
. -
Корректный путь к wp-load.php: Как показано в вашем примере, убедитесь, что путь к
wp-load.php
прописан корректно. Неправильный путь может вызвать повторный запуск скрипта, если он не загружает необходимые компоненты WordPress корректно.
Заключение
Если вы сталкиваетесь с дублированием записей при использовании функций WordPress, важно провести всесторонний анализ вашего кода. Внесите изменения и учитывайте все аспекты, такие как кэширование, структуру HTML и логику вызовов функций. Правильный подход к отладке и внимательность к деталям помогут вам устранить эту проблему.
В случае возникновения дополнительных вопросов вы всегда можете обратиться к сообществу разработчиков WordPress или к специализированным форумам.