Вопрос или проблема
Я использую этот код для автоматического создания страницы, когда активирую свой плагин.
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 при активации вашего плагина, необходимо правильно настроить код, чтобы он выполнялся только один раз, когда плагин активируется. Далее я приведу подробный ответ на ваш вопрос и объясню, как реализовать это в вашем плагине.
Шаги для Автоматического Создания Страницы при Активации Плагина
-
Использование Хука Активации: Вы можете использовать
register_activation_hook
для выполнения кода при активации плагина. -
Проверка на Существование Страницы: Перед созданием страницы важно проверить, существует ли она уже. Это можно сделать с помощью функции
get_page_by_title
. Если страница существует, её не нужно создавать заново. -
Сохранение 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');
}
Объяснение Кода
-
Хук Активации:
register_activation_hook
связывает вашу функциюmy_plugin_install
с активацией плагина. -
Сохранение ID: Мы проверяем наличие ID страницы в опции
my_plugin_page_id
. Если он не установлен, мы проверяем существование страницы по заголовку. -
Создание Страницы: Если страница не найдена, мы создаем новую с заданными параметрами.
-
Удаление Страницы При Деактивации: В функции
my_plugin_remove
, если страница существует, мы её удаляем и убираем опции.
Заключение
Этот код поможет вам автоматически создать страницу при активации вашего плагина и избежать дублирования при повторной активации. Кроме того, он содержит функции для управления страницей и её параметрами, так что вы сможете модифицировать их под свои нужды.