Можем ли мы создать php “страницу” без “страницы” WordPress?

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

Где-то вне главной страницы нам нужно показать контейнерную страницу, которая делает что-то с пользовательскими типами записей. На самом деле не важно, что она делает, главное, что она должна существовать и быть доступной из меню главной страницы.

Мы уже делали это раньше и создали “страницу” WordPress, чтобы она функционировала как контейнерная страница, а затем в теме/бэкенде/PHP создали файл page-xxx.php, где вся работа контейнера происходит и это … вроде как … работает.

Но это значит, что в меню администратора WordPress появляется эта бесполезная “страница”, которую мы должны объяснить клиенту не редактировать, так как “это не настоящая страница, просто заполнител”. В основном, это нормально. Но это не идеально.

Я знаю, что мы можем скрыть страницу-заполнитель от клиента. Но есть ли более элегантное решение?

Можем ли мы создать страницу на PHP с кодом для выполнения конкретной задачи и иметь возможность обращаться к этому коду как к слагу/адресу без фактического существования страницы как страницы в администраторе?

Ну, внутри вашей директории просто оставьте обычный php файл, например my-page.php, а затем создайте красивый URL для него, используя .htaccess. Откройте файл .htaccess (если он присутствует в директории установки) или создайте новый

RewriteEngine On
RewriteRule ^my-page-slug my-page.php

Это должно сработать

обновление

если вы хотите получить доступ к записям WP и другим объектам, вам нужно включить “wp-load.php”, и вы сможете получить доступ к обычному объекту $wpdb или $WP_query. Вот небольшой пример кода

<?php
//path/to/your/wordpress/installation/my-page.php

include_once ("wp-load.php");

$posts = get_posts();
foreach($posts as $post){
    echo $post->post_name;
    echo "<hr/>";
}

Когда мне нужна пользовательская php страница, которая работает с WordPress, я обычно делаю следующее:

  1. Я добавляю переменную запроса к переменным, разрешенным WordPress:

    add_filter( 'query_vars', 'myplugin_add_query_var' );
    
    function myplugin_add_query_var( $query_vars ){
       $query_vars[] = 'myplugin_page_name';
    }
    
  2. Я добавляю функцию к действию parse_request, которая проверяет, установлена ли ранее объявленная переменная.

     add_action( 'parse_request', 'myplugin_front_controller' );
    
     function myplugin_front_controller( $query ){
        if( array_key_exists( 'myplugin_page_name', $query->query_vars ) ){
          myplugin_dosomething();
          die();
        }
     }
    
  3. Я оборачиваю в функцию код, который мог бы написать на php странице

     function myplugin_dosomething(){
         echo 'Hello World';
     }
    

Обратите внимание, что я на самом деле не знаю, является ли это хорошей практикой.
Тем не менее, прежде чем делать всю эту работу, я подумываю, не осуществимо ли это с помощью AJAX.

Как насчет создания пользовательского шаблона страницы для главной страницы и вставки своих пользовательских запросов и других элементов туда? Вы можете назначить эти шаблоны страниц для всех видов страниц. Используйте что-то вроде front-page.php, home.php или custom.php (Ссылка) Таким образом, у вас будет ваша обычная главная страница в бэкенде, но на фронтенде она будет отображаться с вашими дополнительными модулями. С таким подходом вы могли бы добавить пользовательские поля (например: с ACF) для этого конкретного шаблона страницы тоже.

Редактировать:
Создайте пользовательский шаблон страницы: custom-template.php

<?php
/**
 * Имя шаблона: Пользовательская главная страница
 */

get_header();

    if ( have_posts() ):

        while ( have_posts() ): the_post();

            get_template_part( 'template-parts/content', get_post_type() );

        endwhile;
    endif;

// Добавьте свой пользовательский модуль
get_template_part( 'template-parts/your-custom-stuff' );

get_footer(); 

.. а затем назначьте созданный шаблон (атрибуты страницы) на страницу, которую вы хотите

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

Вы можете создать пользовательский тип записи с помощью функции register_post_type() с false в качестве параметра show_ui, как это.

//код взят из codex
//имя пользовательского типа записи здесь book. Измените имя типа записи и другие параметры по своему усмотрению
//Установите `show_ui` и `show_in_menu` в false
add_action( 'init', 'codex_book_init' );
function codex_book_init() {
$labels = array(
    'name'               => _x( 'Книги', 'Общее имя типа записи', 'your-plugin-textdomain' ),
    'singular_name'      => _x( 'Книга', 'Единичное имя типа записи', 'your-plugin-textdomain' ),
    'menu_name'          => _x( 'Книги', 'админ-меню', 'your-plugin-textdomain' ),
    'name_admin_bar'     => _x( 'Книга', 'добавить новую в админ-меню', 'your-plugin-textdomain' ),
    'add_new'            => _x( 'Добавить новую', 'книга', 'your-plugin-textdomain' ),
    'add_new_item'       => __( 'Добавить новую книгу', 'your-plugin-textdomain' ),
    'new_item'           => __( 'Новая книга', 'your-plugin-textdomain' ),
    'edit_item'          => __( 'Редактировать книгу', 'your-plugin-textdomain' ),
    'view_item'          => __( 'Просмотреть книгу', 'your-plugin-textdomain' ),
    'all_items'          => __( 'Все книги', 'your-plugin-textdomain' ),
    'search_items'       => __( 'Искать книги', 'your-plugin-textdomain' ),
    'parent_item_colon'  => __( 'Родительские книги:', 'your-plugin-textdomain' ),
    'not_found'          => __( 'Книг не найдено.', 'your-plugin-textdomain' ),
    'not_found_in_trash' => __( 'Книг не найдено в Корзине.', 'your-plugin-textdomain' )
);

$args = array(
    'labels'             => $labels,
    'public'             => true,
    'publicly_queryable' => true,
    'show_ui'            => false,
    'show_in_menu'       => false,
    'query_var'          => true,
    'rewrite'            => array( 'slug' => 'book' ),
    'capability_type'    => 'post',
    'has_archive'        => true,
    'hierarchical'       => false,
    'menu_position'      => null,
    'supports'           => array( 'title', 'editor', 'author', 'thumbnail', 'excerpt', 'comments' )
);

register_post_type( 'book', $args );
}

Таким образом, он не будет показан в меню администратора. Но вы все равно сможете использовать его с URL, например example.com/wp-admin/edit.php?post_type=book.

Вы можете создать отдельный шаблон single-book.php, чтобы отображать его так, как вам нравится. Вы также можете создать отдельный файл с id, как вы сделали со страницей.

Если у вас есть группа файлов, которые попадают в одну и ту же категорию, вы можете использовать register_taxonomy() для создания таксономии и использовать разные шаблоны для этих групп страниц.

Я верю, что это отвечает всем вашим требованиям:

  • Он не отображается в меню администратора.
  • Вы можете использовать все функции WordPress
  • Создавать отдельный php код для каждой страницы (или группы страниц, если вам нужно, с пользовательской таксономией)

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

Можно ли создать "страницу" на PHP без "страницы" в WordPress?

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

1. Зачем нам нужна PHP-страница?

Прежде всего, необходимо понять, что "страница" в контексте WordPress обычно подразумевает контент, который управляется через панель администратора. Однако, если ваша задача заключается в создании родительской "контейнерной" страницы, которая выполняет определенные функции (например, работу с пользовательскими типами записей), и если эта страница не требует редактирования администратора, то есть более элегантные решения, нежели создание "пустышек" в админке.

2. Использование .htaccess для создания чистого URL

Одним из наиболее простых способов создания PHP-страницы, доступной по URL, является использование файла .htaccess и правила перезаписи:

RewriteEngine On
RewriteRule ^my-page-slug my-page.php

В этом случае вы создаете файл my-page.php в корневом каталоге вашего проекта. Данный подход позволит вам обратиться к нему через адрес example.com/my-page-slug.

Однако стоит учитывать, что если вам понадобятся функции WordPress (например, доступ к записям), вам потребуется включить файл wp-load.php:

<?php
include_once("wp-load.php");

$posts = get_posts();
foreach($posts as $post) {
    echo $post->post_title; // или любое другое свойство поста
    echo "<hr/>";
}
?>

3. Альтернативный подход: пользовательские переменные запросов

Если вы хотите интегрировать свою PHP-страницу с WordPress, не создавая "пустышек", можно использовать переменные запросов. Для этого вам потребуется следующее:

  1. Добавление переменной запроса:
add_filter('query_vars', 'myplugin_add_query_var');

function myplugin_add_query_var($query_vars) {
    $query_vars[] = 'myplugin_page_name';
    return $query_vars;
}
  1. Обработка запроса:
add_action('parse_request', 'myplugin_front_controller');

function myplugin_front_controller($query) {
    if (array_key_exists('myplugin_page_name', $query->query_vars)) {
        myplugin_dosomething();
        die();
    }
}
  1. Функция обработки:
function myplugin_dosomething() {
    // Ваш код
    echo 'Hello, World!';
}

В таком случае вы сможете обращаться к вашей странице через URL, например, example.com/?myplugin_page_name=1.

4. Использование пользовательских типов записей

Создание пользовательского типа записей с параметром show_ui установленным в false позволит вам скрыть его из админки, но все равно использовать через URL:

add_action('init', 'codex_custom_post_type_init');

function codex_custom_post_type_init() {
    $args = array(
        'public' => true,
        'show_ui' => false, // Не отображать в админке
        'rewrite' => array('slug' => 'custom-type'),
        // Другие параметры...
    );

    register_post_type('custom_type', $args);
}

Теперь вы сможете обращаться к записям этого типа через example.com/custom-type.

5. Заключение

Подводя итог, можно сказать, что да, вы можете создать PHP-страницу, которая будет доступна через URL без создания видимой страницы в админке WordPress. Использование .htaccess, переменных запросов или пользовательских типов записей — это различные подходы, которые могут помочь вам достичь вашей цели. Они позволят вам более гибко управлять функциональностью вашего сайта, избегая ненужных сложностей и оптимизируя процесс администрирования.

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

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

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