авто создать только 1 страницу wp при активации пользовательского плагина

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

Я использую этот код для автоматического создания страницы, когда активирую свой плагин.

function insert_page(){
    // Создаем объект поста
    $my_post = array(
      'post_title'    => 'Мой пост',
      'post_content'  => 'Это мой пост.',
      'post_status'   => 'publish',
      'post_author'   => get_current_user_id(),
      'post_type'     => 'page',
    );

    // Вставляем пост в базу данных
    wp_insert_post( $my_post, '' );
}
add_action('init', 'insert_page');

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

Также у меня есть на уме, что когда это создано в wp_insert_post( $my_post, '' ), как я могу получить ID поста/страницы? Чтобы я мог определить, существует ли уже страница или нет…

    register_activation_hook( __FILE__ , 'my_plugin_install');
    function my_plugin_install() {
        global $wpdb;

        $the_page_title="Книга";
        $the_page_name="книга";

        // меню...
        delete_option("my_plugin_page_title");
        add_option("my_plugin_page_title", $the_page_title, '', 'yes');
        // слаг...
        delete_option("my_plugin_page_name");
        add_option("my_plugin_page_name", $the_page_name, '', 'yes');
        // id...
        delete_option("my_plugin_page_id");
        add_option("my_plugin_page_id", '0', '', 'yes');

        $the_page = get_page_by_title( $the_page_title );

        if ( ! $the_page ) {

            // Создаем объект поста
            $_p = array();
            $_p['post_title'] = $the_page_title;
            $_p['post_content'] = "[книга]";
            $_p['post_status'] = 'publish';
            $_p['post_type'] = 'page';
            $_p['comment_status'] = 'closed';
            $_p['ping_status'] = 'closed';
            $_p['post_category'] = array(1); // по умолчанию 'Без категории'

            // Вставляем пост в базу данных
            $the_page_id = wp_insert_post( $_p );

        }
        else {
            // плагин, возможно, был ранее активен, а страница просто была удалена...

            $the_page_id = $the_page->ID;

            // убедимся, что страница не удалена...
            $the_page->post_status="publish";
            $the_page_id = wp_update_post( $the_page );

        }

        delete_option( 'my_plugin_page_id' );
        add_option( 'my_plugin_page_id', $the_page_id );

    }

    /* Выполняется при деактивации плагина */
    register_deactivation_hook( __FILE__, 'my_plugin_remove') ;
    function my_plugin_remove() {

        global $wpdb;

        $the_page_title = get_option( "my_plugin_page_title" );
        $the_page_name = get_option( "my_plugin_page_name" );

        //  id нашей страницы...
        $the_page_id = get_option( 'my_plugin_page_id' );
        if( $the_page_id ) {

            wp_delete_post( $the_page_id ); // это будет перемещено в корзину, а не удалено

        }

        delete_option("my_plugin_page_title");
        delete_option("my_plugin_page_name");
        delete_option("my_plugin_page_id");

    }

Я завершил это с помощью

Класса PageTemplater

Вот мой код, который я использовал в своем плагине для автоматической генерации страницы и назначения шаблона при активации плагина

class PageTemplater {

        /**
         * Уникальный идентификатор
         */
         protected $plugin_slug;

        /**
         * Ссылка на экземпляр этого класса.
         */
        private static $instance;

        /**
         * Массив шаблонов, которые отслеживает этот плагин.
         */
        protected $templates;

        /**
         * Возвращает экземпляр этого класса. 
         */
        public static function get_instance() {

                if( null == self::$instance ) {
                        self::$instance = new PageTemplater();
                } 

                return self::$instance;

        } 

        /**
         * Инициализирует плагин установкой фильтров и административных функций.
         */
        private function __construct() {

                $this->templates = array();

                // Добавляем фильтр к метабоксу атрибутов, чтобы внедрить шаблон в кеш.
                add_filter(
                    'page_attributes_dropdown_pages_args',
                     array( $this, 'register_project_templates' ) 
                );

                // Добавляем фильтр к сохранению поста, чтобы внедрить наш шаблон в кеш страницы
                add_filter(
                    'wp_insert_post_data', 
                    array( $this, 'register_project_templates' ) 
                );

                // Добавляем фильтр к включению шаблона, чтобы определить, имеет ли страница наш 
                // шаблон и вернуть его путь
                add_filter(
                    'template_include', 
                    array( $this, 'view_project_template') 
                );

                // Добавьте свои шаблоны в этот массив.
                $this->templates = array(
                        'shop-template.php'     => 'Страница магазина',
                        'item_details-template.php'     => 'Страница деталей товара',
                        'review-order-template.php'     => 'Страница обзора',
                        'delivary-method-template.php'     => 'Страница метода доставки',
                        'print-order-template.php'     => 'Страница печати заказа',
                        'print-template.php'     => 'Страница печати',
                        'pdf-print-template.php'     => 'Страница печати PDF',
                        'login-registration-template.php'     => 'Страница регистрации входа',
                        'user_dashborad-template.php'     => 'Страница панели управления',
                );  
        } 
        /**
         * Добавляет наш шаблон в кеш страниц, чтобы обмануть WordPress
         * заставить его думать, что файл шаблона существует, где на самом деле он не существует.
         *
         */

        public function register_project_templates( $atts ) {

                // Создаем ключ, используемый для кеша тем
                $cache_key = 'page_templates-' . md5( get_theme_root() . "https://wordpress.stackexchange.com/" . get_stylesheet() );

                // Получаем список кеша. 
                // Если он не существует или пуст, подготавливаем массив
                $templates = wp_get_theme()->get_page_templates();
                if ( empty( $templates ) ) {
                        $templates = array();
                } 

                // Новый кеш, поэтому удаляем старый
                wp_cache_delete( $cache_key , 'themes');

                // Теперь добавляем наш шаблон в список шаблонов путем объединения наших шаблонов
                // с существующим массивом шаблонов из кеша.
                $templates = array_merge( $templates, $this->templates );

                // Добавляем измененный кеш, чтобы позволить WordPress обнаружить его для отображения
                // доступных шаблонов
                wp_cache_add( $cache_key, $templates, 'themes', 1800 );
                return $atts;
        } 
        /**
         * Проверяет, назначен ли шаблон странице
         */
        public function view_project_template( $template ) {
                global $post;
                if (!isset($this->templates[get_post_meta( 
                    $post->ID, '_wp_page_template', true 
                )] ) ) {
                        return $template;   
                } 
                $file = plugin_dir_path(__FILE__). get_post_meta( 
                    $post->ID, '_wp_page_template', true 
                );
                // Просто на всякий случай проверяем, существует ли файл
                if( file_exists( $file ) ) {
                        return $file;
                } 
                else { echo $file; }
                return $template;
        } 
} 
add_action( 'plugins_loaded', array( 'PageTemplater', 'get_instance' ) );

register_activation_hook( __FILE__, 'my_plugin_install_function');
function my_plugin_install_function()
{
    $item_details_page = get_option('item_details_page'); 
    if(!$item_details_page){
        //статус поста и параметры
        $post = array(
              'comment_status' => 'closed',
              'ping_status' =>  'closed' ,
              'post_author' => 1,
              'post_date' => date('Y-m-d H:i:s'),
              'post_name' => 'Расскажите о ваших товарах',
              'post_status' => 'publish' ,
              'post_title' => 'Расскажите о ваших товарах',
              'post_type' => 'page',
        );  
        //вставляем страницу и сохраняем id
        $newvalue = wp_insert_post( $post, false );
        if ( $newvalue && ! is_wp_error( $newvalue ) ){
            update_post_meta( $newvalue, '_wp_page_template', 'item_details-template.php' );
        }
        //сохраняем id в базе данных
        update_option( 'item_details_page', $newvalue );
    }
}

Надеюсь, это поможет вам.

Этот код работает хорошо с новой версией WordPress.

  • Создайте папку в плагине. Например: myplugin также создайте файл с таким же именем myplugin.php
  • Добавьте этот код в файл, после активации этого плагина страница будет создана автоматически.

    register_activation_hook( __FILE__, 'myplugin_activate' );
        function myplugin_activate() {
       //создаем переменную, чтобы указать детали страницы
           $post = array(     
                     'post_content'   => 'содержание', //содержание страницы
                     'post_title'     =>'Выберите план', //название страницы
                     'post_status'    =>  'publish' , //статус страницы - опубликован или черновик
                     'post_type'      =>  'page'  // тип поста
    );
           wp_insert_post( $post ); // создает страницу
        }
    

Ответ или решение

Для автоматического создания страницы в WordPress при активации вашего плагина, необходимо правильно настроить код, чтобы он выполнялся только один раз, когда плагин активируется. Далее я приведу подробный ответ на ваш вопрос и объясню, как реализовать это в вашем плагине.

Шаги для Автоматического Создания Страницы при Активации Плагина

  1. Использование Хука Активации: Вы можете использовать register_activation_hook для выполнения кода при активации плагина.

  2. Проверка на Существование Страницы: Перед созданием страницы важно проверить, существует ли она уже. Это можно сделать с помощью функции get_page_by_title. Если страница существует, её не нужно создавать заново.

  3. Сохранение ID Созданной Страницы: После создания страницы можно сохранить её ID в опции базы данных, чтобы избежать повторного создания при повторной активации плагина.

Пример кода

Вот пример кода, который иллюстрирует указанные шаги:

// Регистрация хука активации
register_activation_hook(__FILE__, 'my_plugin_install');

function my_plugin_install() {
    // Уникальные идентификаторы
    $the_page_title = "Моя Страница";
    $the_page_slug = "moya-stranitsa";
    $the_page_id = get_option('my_plugin_page_id'); // Получаем ID страницы из опций

    // Проверяем, существует ли страница
    if (empty($the_page_id)) {
        $existing_page = get_page_by_title($the_page_title);

        // Если страница не существует, создаем её
        if (!$existing_page) {
            $page_data = array(
                'post_title'   => $the_page_title,
                'post_content' => 'Контент вашей страницы.',
                'post_status'  => 'publish',
                'post_type'    => 'page',
                'post_name'    => $the_page_slug,
            );

            // Вставляем страницу в базу данных
            $the_page_id = wp_insert_post($page_data);

            // Сохраняем ID страницы в опции
            if (!is_wp_error($the_page_id)) {
                add_option('my_plugin_page_id', $the_page_id);
            }
        } else {
            // Если страница существует, сохраняем её ID в опции
            $the_page_id = $existing_page->ID;
            add_option('my_plugin_page_id', $the_page_id);
        }
    }
}

// Деактивация плагина (по желанию, для удаления страницы)
register_deactivation_hook(__FILE__, 'my_plugin_remove');

function my_plugin_remove() {
    $the_page_id = get_option('my_plugin_page_id');
    if ($the_page_id) {
        // Удаление страницы (вы можете изменить на wp_trash_post, если не хотите сразу удалять)
        wp_delete_post($the_page_id, true);
    }
    // Удаление опции
    delete_option('my_plugin_page_id');
}

Объяснение Кода

  1. Хук Активации: register_activation_hook связывает вашу функцию my_plugin_install с активацией плагина.

  2. Сохранение ID: Мы проверяем наличие ID страницы в опции my_plugin_page_id. Если он не установлен, мы проверяем существование страницы по заголовку.

  3. Создание Страницы: Если страница не найдена, мы создаем новую с заданными параметрами.

  4. Удаление Страницы При Деактивации: В функции my_plugin_remove, если страница существует, мы её удаляем и убираем опции.

Заключение

Этот код поможет вам автоматически создать страницу при активации вашего плагина и избежать дублирования при повторной активации. Кроме того, он содержит функции для управления страницей и её параметрами, так что вы сможете модифицировать их под свои нужды.

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

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