将模板文件用于特定的URL,而不创建页面


14

我想知道是否可以将模板文件用于特定的URL,而不必为该模板创建页面。

这是我的简化问题:

我已经在WP中创建了一个页面,其中包含一些链接内容,这些链接内容指向带有某些尾随表单数据的特定URL:(mysite.com/retail/?a=test&b=1234)

我希望该URL(零售)自动使用子主题目录中的模板文件template-retail.php,而无需创建名为“零售”的页面并从中选择模板页面。template-retail.php文件中只有外部内容,而Wordpress本身没有任何内容。

这可能吗?


1
您将需要创建一个HTAccess重定向到该文件,然后在那里处理请求。
Howdy_McGee

在这种情况下,我无权访问.htaccess文件。还有其他办法吗?
济慈

有一些插件可以让您访问执行这些类型的事情,无论哪种方式,您都需要将自定义文件上传到服务器,以便可以对其进行攻击。
Howdy_McGee

4
不确定项目的所有细节,但首先想到的template_redirect还是终点
s_ha_dum 2015年

Answers:


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

请注意,这样做绝对不能使用带有“零售”标签的真实页面。

这非常简单,但也经过硬编码,因此如果您需要在单个页面中使用它就可以了。如果您需要控制更多网址,请查看此答案中提出的解决方案。


感谢您的回答。我无法使以上代码正常工作。这永远是不正确的:“ if($ url_path ==='retail'){” $ url_path是一个字符串,其值是:“ example.com/retail
Keat

尝试var_dump($url_path);看一下它的外观并调整代码。该值取决于您的真实网址。例如,自定义主页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-templateshttps://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


0

@ shivanand-sharma这是一种完美且清洁的方法(https://developer.wordpress.org/themes/template-files-section/page-template-files/),可以像在wordpress中创建任何其他页面一样,如果需要隐藏您的页面,我只使用简单有效的插件' https://wordpress.org/plugins/exclude-pages/ '

我必须说,我需要一个URL来对自己的页面进行POSTGET并保存一些会话数据'WC()-> session',这解决了此问题和其他问题,因为您可以拥有一个自定义的主干PHP代码包括所有的“需要对整个的wordpress的(” WP-负载“)等”,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);
?>

第二:通常通过“ wp-admin”>“页面”在Wordpress上创建一个页面(比如说一个名为MYPAGE的名称,或者您可以根据需要更改该段符号),然后当然将先前的模板链接为该页面的模板,即name 模板属性部分上的“ WhateverName”

因此,我们打开新页面“ mysite.com/index.php/MYPAGE”,您将看到。

Hello World
object(WC_Session_Handler)#880 .....................

附加功能:让我们在购物车,结帐中创建任何javascript或jquery函数,无论您在'script'HTML标记中可以想象到什么,并包括如下代码:

var data = { action : actionName, dataA : etcA, dataB : etcB}
$.ajax({
    type:     'post',
    url:      'index.php/MYPAGE',
    data:     data,
    success:  function( response ) {
    },
    complete: function() {
    }
});
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.