Использование файла шаблона для определенного URL без создания страницы

30 мар. 2015 г., 18:03:41
Просмотры: 34.8K
Голосов: 23

Интересно, возможно ли использовать файл шаблона для определенного URL без необходимости создания страницы для этого шаблона.

Вот моя упрощенная проблема:

Я создал страницу в WordPress с некоторыми ссылками, которые указывают на определенный URL с дополнительными параметрами формы: (mysite.com/retail/?a=test&b=1234).

Я хочу, чтобы этот URL (retail) автоматически использовал мой файл шаблона template-retail.php, который находится в директории дочерней темы, без необходимости создавать страницу с названием "retail" и выбирать шаблон страницы оттуда. В файле template-retail.php содержится только внешний контент, ничего из самого WordPress.

Это возможно?

4
Комментарии

Вам нужно создать редирект в HTAccess к файлу, а затем обработать запрос там.

Howdy_McGee Howdy_McGee
30 мар. 2015 г. 18:09:55

У меня нет доступа к файлу .htaccess в этом случае. Есть ли другой способ?

Keat Keat
30 мар. 2015 г. 18:13:03

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

Howdy_McGee Howdy_McGee
30 мар. 2015 г. 18:16:38

Не уверен во всех деталях вашего проекта, но первое, что приходит на ум — это template_redirect или эндпоинт

s_ha_dum s_ha_dum
30 мар. 2015 г. 18:29:44
Все ответы на вопрос 4
5
27

Вы можете просто проверить 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-адресов, ознакомьтесь с решением, предложенным в этом ответе.

30 мар. 2015 г. 19:37:22
Комментарии

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

Keat Keat
1 апр. 2015 г. 12:42:24

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

gmazzap gmazzap
1 апр. 2015 г. 12:45:35

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

Keat Keat
13 апр. 2015 г. 16:28:52

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

Adrian Adrian
21 сент. 2020 г. 01:25:53

Дополнение к предыдущему комментарию: изменил хук с init на wp_loaded, и теперь шорткоды загружаются.

Adrian Adrian
21 сент. 2020 г. 01:32:15
0
11

Действие init не подходит для того, что вы пытаетесь сделать. Вместо этого следует использовать фильтр template_include. Вы можете комбинировать его с функцией get_query_var для получения параметров URL и проверки, какой шаблон нужно загрузить. Вот ссылки:

Код:

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;
}
28 мар. 2017 г. 06:10:27
0

В 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

3 апр. 2017 г. 12:52:24
0

@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() {
    }
});
11 окт. 2017 г. 16:00:50