Как предотвратить создание нового поста с помощью wp_insert_post каждую секунду?

Вопрос или проблема

Я пытаюсь создать простой плагин, который создает только один новый пост. Код, который я написал, создает тот же новый пост каждую секунду. Ниже приведен мой код. Что нужно добавить, чтобы он создавал только один пост?

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

Объяснение изменений:

  1. Проверка существования поста: get_page_by_title($page_title) используется для проверки, существует ли уже пост с заданным заголовком. Если переменная $page_exists равна null, это значит, что пост не найден, и можно создавать новый.

  2. Условие создания поста: Теперь код внутри условия if выполняется только в том случае, если поста с таким заголовком нет. В противном случае, код внутри else может быть оставлен пустым, или вы можете добавить логику, если это необходимо (например, уведомление о том, что пост уже существует).

Эти изменения позволят вам избегать создания повторяющихся постов каждый раз, когда функция вызывается (например, из-за механизма Heartbeat), и гарантировать, что будет создан только один пост с указанным заголовком.

Оцените материал
Добавить комментарий

Капча загружается...