如何控制根据Taxonomy术语显示什么模板?

时间:2018-05-05 作者:Micah K

我正在建立一个商业目录,并将给出一些背景,然后在最后有2个问题。

The development URL is: http://svcta.lainternet.biz/

The website I am rebuilding is: https://www.visitsimivalley.com/

当前网站要求每个分类法类型具有唯一的业务概要文件。例如,如果您是一家酒店,并且您也有会议室和婚礼场地,那么您最终会得到3个列表,一个用于酒店,一个用于会议,一个用于婚礼。

我希望有一个主配置文件,其中包含我们将显示的每个数据字段的信息,而不考虑分类类型。

为了尽量减少编码,我使用了高级自定义字段和CPT UI。

我有一个Custom Field “Directory Listing” with Slug “directory”. 它目前有一些地址和照片库的基本字段。

我创建了一个新的Taxonomy “Directory Categories” with Slug “directory_category” 并在WordPress管理>目录>类别下创建了以下术语:

Hotel
Meeting Space
Restaurant
Sports Venue
Things to Do
Wedding Venue
我创建了以下模板

archive-directory.php
single-directory.php   
taxonomy-directory_category-hotels.php   
taxonomy-directory_category-meetings.php   
taxonomy-directory_category-restaurants.php   
taxonomy-directory_category-sports.php   
taxonomy-directory_category-things-to-do.php   
taxonomy-directory_category-weddings.php
我可以查看目录列表并控制其存档/列表视图;单一视图。

我还可以控制每个分类法的归档/列表视图。

Question 1 – 这是一个合理的方法吗?我有没有犯过现在应该改正的错误?

Question 2 – 现在我可以控制列表了,如何设置模板文件来显示WordPress之外使用“single directory.php”的实际列表。

例如:我有一个酒店的目录列表,其中包含酒店页面、会议页面和婚礼页面所需的所有信息。我想根据用户来自的列表页面来控制用户看到的模板。以下3个链接均包含“最佳西方”简介。

http://svcta.lainternet.biz/directory_category/hotels/ http://svcta.lainternet.biz/directory_category/meetings/ http://svcta.lainternet.biz/directory_category/weddings/

如何使您在/hotels/页面上单击Best Western时被发送到酒店模板。当您在/meetings/or/weddings/page上单击Best Western时,它会加载相应的会议或婚礼模板?

更新5-9-18在Milo的帮助下,我能够将完成原始任务所需的其余代码和模板组合在一起。

现在,我的函数中有以下代码。php文件。

// Register Endpoints
// =============================================================================

function wpd_add_my_endpoints(){
    add_rewrite_endpoint( \'hotels\', EP_PERMALINK );
    add_rewrite_endpoint( \'meetings\', EP_PERMALINK );
    add_rewrite_endpoint( \'restaurants\', EP_PERMALINK );
    add_rewrite_endpoint( \'sports\', EP_PERMALINK );
    add_rewrite_endpoint( \'things-to-do\', EP_PERMALINK );
    add_rewrite_endpoint( \'weddings\', EP_PERMALINK );
}
add_action( \'init\', \'wpd_add_my_endpoints\' );



// Register Endpoint Templates
// =============================================================================

function wpd_endpoint_templates( $template ){
    global $wp_query;
    if( isset( $wp_query->query_vars[\'hotels\'] ) ){
        $template = locate_template( \'single-directory-hotels.php\' );
    }   
        elseif( isset( $wp_query->query_vars[\'meetings\'] ) ){
        $template = locate_template( \'single-directory-meetings.php\' );
    } 
        elseif( isset( $wp_query->query_vars[\'restaurants\'] ) ){
        $template = locate_template( \'single-directory-restaurants.php\' );
    } 
        elseif( isset( $wp_query->query_vars[\'sports\'] ) ){
        $template = locate_template( \'single-directory-sports.php\' );
    } 
        elseif( isset( $wp_query->query_vars[\'things-to-do\'] ) ){
        $template = locate_template( \'single-directory-things-to-do.php\' );
    } 
        elseif ( isset( $wp_query->query_vars[\'weddings\'] ) ){
        $template = locate_template( \'single-directory-weddings.php\' );
    }
    return $template;
}
add_filter( \'single_template\', \'wpd_endpoint_templates\' ); 
我有以下新的模板文件。

single-directory-hotels.php
single-directory-meetings.php
single-directory-restaurants.php
single-directory-sports.php
single-directory-things-to-do.php
single-directory-weddings.php
正如我想象的那样,前端一切正常,我的客户将对我交付的产品非常满意。

1 个回复
最合适的回答,由SO网友:Milo 整理而成

问题1:如果它检查了您的所有箱子,并为您提供了一个适合您的维护工作流,那么这似乎是合理的。

问题2-我认为至少有几种方法可以解决这个问题rewrite endpoints 是一个相当简单可行的解决方案。

我们将从一个端点开始—例如,假设Best Western的URL位于:

http://example.com/directory/best-western/

在我们添加hotels 端点,我们还将有URL:

http://example.com/directory/best-western/hotels/

执行此操作的代码:

function wpd_add_my_endpoints(){
    add_rewrite_endpoint( \'hotels\', EP_PERMALINK );
}
add_action( \'init\', \'wpd_add_my_endpoints\' );
您可以将其添加到主题中functions.php, 或者更好,put it in your own plugin. 你还必须flush rewrite rules 无论何时添加或删除端点,或以其他方式对其进行更改。在测试期间执行此操作的快速方法是访问Settings > Permalinks 管理侧的页面。

好了,现在你可以访问这个新的URL了,但它当前显示的内容与原来的相同。

要改变这一点,我们可以检查hotels 查询var以检测是否正在查看该URL,并在这种情况下加载不同的模板。我们通过single_template 过滤器,用于更改WordPress为此类查询选择的模板:

function wpd_endpoint_templates( $template ){
    global $wp_query;
    if( isset( $wp_query->query_vars[\'hotels\'] ) ){
        $template = locate_template( \'single-directory-hotels.php\' );
    }
    return $template;
}
add_filter( \'single_template\', \'wpd_endpoint_templates\' ); 
现在您可以创建single-directory-hotels.php 根据您的需要对其进行归档和自定义。您现在还必须修改您的相关directory_category 要链接到这些新hotels/ URL。

bonus 您还可以在端点之后添加(和读取)任何任意值,例如:

http://example.com/directory/best-western/hotels/gallery/

get_query_var( \'hotels\' ) 将返回包含的任何内容。

总之,你说这很酷,但如果这些URL像

http://example.com/directory/hotels/best-western/

这是可能的!这比这要复杂得多。

结束

相关推荐