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


14

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

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

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

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

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


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

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

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

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

Ответы:


16

Вы можете просто посмотреть на URL, загрузить файл и выйти.

Это можно сделать, когда WordPress загрузил свою среду, например, на 'init'.

add_action('init', function() {
  $url_path = trim(parse_url(add_query_arg(array()), PHP_URL_PATH), '/');
  if ( $url_path === 'retail' ) {
     // load the file if exists
     $load = locate_template('template-retail.php', true);
     if ($load) {
        exit(); // just exit if template was found and loaded
     }
  }
});

Обратите внимание, что при этом нельзя использовать настоящую страницу с слагом "retail".

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


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

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

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

5

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;
}

2

WordPress-способ сделать это с page-templates. https://developer.wordpress.org/themes/template-files-section/page-template-files/

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

page-id.php

Эта конкретная страница автоматически поднимет ее и будет использовать шаблон.

Например, если ваша страница имеет идентификатор 5874, вы назовете шаблон как page-5784.php

Вы также можете назвать шаблон на основе слаг страницы. Например, если слаг страницы, hello-worldто имя шаблона будетpage-hello-world.php

Также смотрите: - https://developer.wordpress.org/files/2014/10/template-hierarchy.png


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 () -> сеанс', и это решает эту и другие проблемы, потому что вы можете иметь основу пользовательских PHP-код, включая все 'require (' wp-load ') и т. д. "всего wordpress, woocommerce и т. д. для работы с ним, mysite.com/index.php/MYPAGE .....

Вам просто нужно:

Во-первых: создайте файл внутри местоположения вашей темы в качестве шаблона новой страницы, например, «wp-content / themes / mytheme / customtemplate.php» (комментарий важен, так что Wordpress может наблюдать «имя шаблона»):

<?php /* Template Name: WhateverName */ 
echo 'Hello World';echo '</br>';
var_dump(WC()->session); 
var_dump($_POST);
var_dump($_GET);
?>

Во-вторых: Создайте страницу в WordPress обычно через «wp-admin»> «Страницы» (скажем, имя, подобное MYPAGE , или вы можете изменить слаг, как хотите) и, конечно же, свяжите предыдущий шаблон как шаблон этой страницы, который называется «WhwhatName» в разделе атрибутов шаблона.

Итак, давайте откроем новую страницу «mysite.com/index.php/MYPAGE», и вы увидите.

Hello World
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() {
    }
});
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.