在WordPress 3.7.1中混合使用自定义帖子类型和页面模板

时间:2013-11-21 作者:CodeSmith

概述

我有一个称为位置的自定义帖子类型。当用户访问时/locations, 我想让他们了解有关所有地点的一般信息。当用户访问时/location/{a-location}, 我希望他们了解有关“a-location”的具体信息。听起来很简单。

第一次尝试解决方案时,我在Wordpress仪表板中创建了一个位置页面,用于保存/位置url的内容。然后我创建了一个归档位置。php文件和单个位置。php。存档位置。php从Locations页面中提取信息,并列出所有自定义帖子类型的位置。当用户单击某个位置的链接时,用户将被重定向到/locations/{a-location}和单个位置。php被调用。这几乎成功了,但感觉不太对劲,还带来了其他一些问题。

问题

当用户访问/位置时,我更愿意使用位置页面的页面模板(而不是archive-locations.php页面)。我正在使用Yoast插件为每个页面指定一个自定义的元标题和描述。自存档位置起。php正在使用中,所有这些元都将被忽略。如果我使用页面模板,我的元信息将得到正确识别。而且,从逻辑上讲,我觉得我应该在位置页面上工作,而不是在归档。“位置”页面是它自己的实体,内容比自定义帖子类型的存档多得多。试图将其强制纳入归档概念似乎是一种延伸。

第二次尝试解决方案,因此我创建了一个页面位置。位置页面的php模板,我希望它能被调用,而不是归档位置。php。不幸的是,事实并非如此。然后我尝试删除存档位置。php认为它可能处于优先地位。这也没有帮助;Wordpress只是简单地呈现索引。php。如果禁用自定义帖子类型和访问/位置,则可以正确调用我的页面模板。将自定义帖子类型命名为与页面相同的名称可能会导致Wordpress出现一些问题。然而,我需要有点类似的URL结构才能工作/位置需要从页面模板中提取/位置/{a-location}需要从另一个php文件中提取。

问题

有没有办法让页面模板和具有类似永久链接的自定义帖子类型协同工作?如果没有,我想我唯一的选择是加强我的头球。php和更聪明地确定标题和描述。

以下是注册我的自定义帖子类型的代码,以防我做错了什么:

$args = array(
    \'labels\'        => $labels,
    \'description\'   => \'Holds our location specific data\',
    \'public\'        => true,
    \'menu_position\' => 20,
    \'supports\'      => array(\'title\', \'editor\', \'thumbnail\', \'page-attributes\' ),
    \'hierarchical\'  => true,
    \'has_archive\'   => true,
    \'rewrite\'       => array(\'with_front\' => false, \'slug\' => \'locations\') //remove /news/ from the permalink when displaying a custom post type
);
register_post_type( \'locations\', $args );
(我还尝试将has\\u archive更改为false,但没有帮助。)

1 个回复
SO网友:Chip Bennett

如果您希望您的单个帖子页面是/locations, 那么最简单的方法就是archive-locations.php.

当您可以修改archive-locations.php 模板文件以任何方式满足您的需要,包括输出自定义查询循环。

而且,由于您可以完全控制模板,因此可以添加自己的自定义元描述和标题。例如:

自定义标题

function wpse124052_locations_title( $title, $sep ) {
    if ( ! is_post_type_archive( \'locations\' ) ) {
        return $title;
    } else {
        return \'Your Custom Title Here\';
    }
}
add_filter( \'wp_title\', \'wpse124052_locations_title\', 10, 2 );
自定义元数据
function wpse124052_locations_meta() {
    if ( is_post_type_archive( \'locations\' ) ) {
        echo \'<meta....\'; // your meta tag/discription here
    }
}
add_action( \'wp_head\', \'wpse124052_locations_meta\' );

结束

相关推荐