Использование файла шаблона для определенного URL без создания страницы
Интересно, возможно ли использовать файл шаблона для определенного URL без необходимости создания страницы для этого шаблона.
Вот моя упрощенная проблема:
Я создал страницу в WordPress с некоторыми ссылками, которые указывают на определенный URL с дополнительными параметрами формы: (mysite.com/retail/?a=test&b=1234).
Я хочу, чтобы этот URL (retail) автоматически использовал мой файл шаблона template-retail.php, который находится в директории дочерней темы, без необходимости создавать страницу с названием "retail" и выбирать шаблон страницы оттуда. В файле template-retail.php содержится только внешний контент, ничего из самого WordPress.
Это возможно?

Вы можете просто проверить URL, загрузить файл и завершить выполнение.
Это можно сделать, когда WordPress загрузил свою среду, например, на хуке 'init'
.
add_action('init', function() {
$url_path = trim(parse_url(add_query_arg(array()), PHP_URL_PATH), '/');
if ( $url_path === 'retail' ) {
// загружаем файл, если он существует
$load = locate_template('template-retail.php', true);
if ($load) {
exit(); // просто завершаем выполнение, если шаблон был найден и загружен
}
}
});
Обратите внимание, что при таком подходе реальная страница с ярлыком "retail" никогда не сможет быть использована.
Это довольно просто, но жестко закодировано, поэтому если вам нужно это для одной страницы — этого достаточно. Если вам нужно контролировать больше URL-адресов, ознакомьтесь с решением, предложенным в этом ответе.

Спасибо за ответ. У меня не получается заставить этот код работать. Это условие никогда не выполняется: "if ( $url_path === 'retail' ) {" Значение $url_path представляет собой строку со значением: "http://example.com/retail"

Попробуйте выполнить var_dump($url_path);
и посмотрите, как это выглядит, затем скорректируйте код. Это значение зависит от вашего реального URL. Например, для пользовательского домашнего URL или WordPress, установленного в подпапке, оно может отличаться. @Keat

Спасибо за ответ и извините за задержку с ответом.
Я использовал это решение, и оно работает идеально.
$url_path = trim(parse_url(add_query_arg(array()), PHP_URL_PATH), '/');
$templatename = 'retail';
$pos = strpos($url_path, $templatename);
if ($pos !== false) {

Привет, я только что попробовал это, и мой шаблон загрузился нормально, но я заметил, что некоторые другие элементы на странице не работают. Например, у меня есть echo do_shortcode()
в шапке, но он не срабатывает, и вместо этого отображается сам шорткод — это как-то связано с тем, что WordPress не инициализирует их после загрузки шаблона из-за exit()
?

Действие init
не подходит для того, что вы пытаетесь сделать. Вместо этого следует использовать фильтр template_include
. Вы можете комбинировать его с функцией get_query_var
для получения параметров URL и проверки, какой шаблон нужно загрузить. Вот ссылки:
- https://developer.wordpress.org/reference/hooks/template_include/
- https://developer.wordpress.org/reference/functions/get_query_var/
Код:
add_filter( 'template_include', 'portfolio_page_template', 99 );
function portfolio_page_template( $template ) {
if ( is_page( 'portfolio' ) ) {
$new_template = locate_template( array( 'portfolio-page-template.php' ) );
if ( '' != $new_template ) {
return $new_template ;
}
}
return $template;
}

В WordPress правильный способ сделать это - использовать page-templates
(шаблоны страниц). https://developer.wordpress.org/themes/template-files-section/page-template-files/
Вам понадобится только код для шаблона WordPress. В вашей теме WordPress вы можете создать шаблон страницы и переименовать его в
page-id.php
Эта конкретная страница автоматически подхватит и будет использовать данный шаблон.
Например, если ID вашей страницы 5874, вы назовете шаблон page-5784.php
Также можно назвать шаблон на основе слага (slug) страницы. Например, если слаг страницы hello-world
, то имя шаблона будет page-hello-world.php
Также смотрите: - https://developer.wordpress.org/files/2014/10/template-hierarchy.png

@shivanand-sharma это идеальный и более чистый метод (https://developer.wordpress.org/themes/template-files-section/page-template-files/) для создания любой страницы, как и других в WordPress. А если вы хотите скрыть свою страницу, я просто использую простой и эффективный плагин 'https://wordpress.org/plugins/exclude-pages/'.
Должен сказать, что мне нужен был URL, чтобы делать POST или GET запросы на свою собственную страницу и сохранять некоторые данные сессии 'WC()->session', и это решает данную и другие проблемы, потому что вы можете иметь основу из собственного PHP-кода, включая все 'require('wp-load') и т.д.' всего WordPress, WooCommerce и прочего, чтобы работать через mysite.com/index.php/MYPAGE...
Вам нужно всего лишь:
Первое: Создать файл внутри вашей темы в качестве шаблона новой страницы, например: 'wp-content/themes/mytheme/customtemplate.php' (Комментарий важен, чтобы WordPress увидел 'Template Name'):
<?php /* Template Name: ЛюбоеИмя */
echo 'Привет, мир!'; echo '</br>';
var_dump(WC()->session);
var_dump($_POST);
var_dump($_GET);
?>
Второе: Создать страницу в WordPress обычным способом через 'wp-admin' > Страницы (Дайте ей имя, например, MYPAGE, или можете изменить slug как угодно) и, конечно, привязать предыдущий шаблон как шаблон этой страницы, который назван 'ЛюбоеИмя' в разделе атрибутов шаблона.
Теперь откройте новую страницу 'mysite.com/index.php/MYPAGE', и вы увидите:
Привет, мир!
object(WC_Session_Handler)#880 .....................
Дополнительно: Создайте функции на JavaScript или jQuery в корзине, оформлении заказа или где угодно внутри HTML-тегов 'script' и добавьте код, например:
var data = { action : actionName, dataA : etcA, dataB : etcB}
$.ajax({
type: 'post',
url: 'index.php/MYPAGE',
data: data,
success: function( response ) {
},
complete: function() {
}
});
