Вопрос или проблема
Я пытаюсь создать простой плагин, который создает только один новый пост. Код, который я написал, создает тот же новый пост каждую секунду. Ниже приведен мой код. Что нужно добавить, чтобы он создавал только один пост?
<?php
/**
*@package blog-poster
*/
/*
Plugin Name: Blog Poster
Plugin URI: http://www.litliving.com
Description: Это плагин для клиентов Litliving, который позволяет автоматически публиковать блоги.
Version: 1.0.0
Author: Ben Smith
Author URI: http://www.bengsmith.com
*/
if ( ! defined( 'ABSPATH') ){
die;
}
function AddThisPage() {
global $wpdb; // Не уверен, нужно ли это, возможно
$page = array(
'post_title' => 'Мой пост!!!',
'post_content' => 'Это мой пост.',
'post_status' => 'publish',
'post_author' => 1,
'post_type' => 'post',
);
wp_insert_post($page);
}
add_action( 'wp_insert_post', 'AddThisPage' );
register_activation_hook( __FILE__, 'AddThisPage' );
?>
Ваш плагин не делает никаких проверок, например, “существует ли уже пост?” Соответственно, он создает пост каждый раз, когда вызывается WordPress.
Существует система под названием WordPress heartbeat, которая контактирует с сервером каждые несколько секунд. Ваш плагин вызывается каждый раз, и пост создается.
Для справки, документация Heartbeat.
Спасибо за ответ. Иронично, но после того, как я опубликовал это, я нашел ответ. Мне нужно было создать условие if else в конце. Я написал
$page_exists = get_page_by_title( $page['post_title'] );
if( $page_exists == null ) {
$insert = wp_insert_post( $page );
if( $insert ) {
}
} else {
}
Ответ или решение
Чтобы предотвратить создание нового поста с помощью функции wp_insert_post
каждую секунду, необходимо добавить проверку на существование поста с заданным заголовком. Ваша текущая реализация вставляет новый пост каждый раз, когда вызывается функция, что приводит к повторениям. Это связано с тем, что ваша функция получает вызов в результате частых запросов, например, из-за механизма WordPress Heartbeat, который работает каждую секунду.
Для решения этой проблемы, вам нужно модифицировать код следующим образом:
<?php
/**
*@package blog-poster
*/
/*
Plugin Name: Blog Poster
Plugin URI: http://www.litliving.com
Description: This is a plugin for Litliving customers that allows for blog posts to be automatically posted.
Version: 1.0.0
Author: Ben Smith
Author URI: http://www.bengsmith.com
*/
if ( ! defined( 'ABSPATH') ){
die;
}
function AddThisPage() {
$page_title = 'My post!!!'; // Заголовок поста
$page_content = 'This is my post.'; // Содержание поста
// Проверка существования поста
$page_exists = get_page_by_title( $page_title );
if( $page_exists == null ) {
// Если пост не существует, создаем новый
$page = array(
'post_title' => $page_title,
'post_content' => $page_content,
'post_status' => 'publish',
'post_author' => 1,
'post_type' => 'post',
);
$insert = wp_insert_post( $page );
// Дополнительная обработка, если необходимо
if( $insert ) {
// Можно добавить логику после успешного создания поста
}
} else {
// Логика, если пост уже существует (можно оставить пустым)
}
}
add_action( 'wp_insert_post', 'AddThisPage' );
register_activation_hook( __FILE__, 'AddThisPage' );
?>
Объяснение изменений:
-
Проверка существования поста:
get_page_by_title($page_title)
используется для проверки, существует ли уже пост с заданным заголовком. Если переменная$page_exists
равнаnull
, это значит, что пост не найден, и можно создавать новый. -
Условие создания поста: Теперь код внутри условия
if
выполняется только в том случае, если поста с таким заголовком нет. В противном случае, код внутриelse
может быть оставлен пустым, или вы можете добавить логику, если это необходимо (например, уведомление о том, что пост уже существует).
Эти изменения позволят вам избегать создания повторяющихся постов каждый раз, когда функция вызывается (например, из-за механизма Heartbeat), и гарантировать, что будет создан только один пост с указанным заголовком.