作为自定义帖子类型存档页面的页面模板

时间:2020-03-18 作者:blogob

我知道这类问题已经得到了回答,但答案对我来说并不清楚!!

我有一些自定义的帖子类型。我以“wordpress”的方式创建了它们,所以我有了“归档-{mycustomPostType}”。php文件。它工作得很好。

正如您所知,问题是后端没有这样的页面:页面列表中没有存档页面。因此客户端无法编辑页面。

我正在使用elementor,以及许多其他页面中使用的部分或小部件。我想在归档文件{mycustomPostType}.php中重用它们,但不可能:

-我无法使用elementor编辑存档页,因为没有“存档页”。

-我无法使用短代码在我的归档文件{mycustomPostType}.php文件中显示这些小部件,因为elementor小部件没有短代码。

因此,我想创建一些页面{mycustomPostType}.php文件,这样我就可以对页面进行硬编码,还可以使用\\u content()通过elementor编辑器显示elementor小部件。

现在的问题是,由于它是一个页面,当我访问自定义post类型的post时,父级仍然是wordpress自动创建的归档页面(例如在面包屑中),而不是我的页面{mycustomPostType}“。php

问题:如何使用页面模板模拟组合的正常行为:归档-{mycustomPostType}+自定义PostType post??

在我的自定义页面模板中,我可以显示所有相关自定义帖子的循环,没有问题。我有我的单曲-{mycustomPostType}。php文件,并且帖子显示正确。没问题。

但我如何连接两者以获得逻辑上的“父子”url?

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

通过在创建CPT时设置重写,可以为用户提供一个实际的页面进行编辑,并提供所需的永久链接。

注意:您需要用实际的CPT slug替换“mycpt”的所有实例。

<?php
function wpse_360965_register_cpt() {
    // First unregister this post type so we\'re starting from scratch
    unregister_post_type( \'mycpt\' );
    $args = array(
        // Set the CPT to not have an actual Archive
        \'has_archive\' => false,
        // Set a Rewrite so permalinks still fall under the URL you desire
        \'rewrite\' => array( \'slug\' => \'mycpt\' ),
        // Add your other arguments here too
    );
    register_post_type( \'mycpt\' , $args );
}
add_action( \'init\' , \'wpse_360965_register_cpt\' );
?>
这样做的目的是确保WP不会创建实际的归档文件,从而可以创建页面。重写可以确保各个CPT的发布方式看起来像是该页面的“子级”,即使它们不是。

运行一次后,可以删除unregister_post_type() 线

从这里,您将创建page-mycpt.php (再次更换slug)模板。您的需要将决定您是需要自定义循环,还是只需要编辑器提供的常规内容。

最后,面包屑将取决于您使用什么来生成面包屑。如果您使用的是Yoast WP SEO,那么您可能需要使用过滤器来使面包屑看起来正确。例如:

<?php
function wpse_360965_filter_yoast_breadcrumbs( $links ) {
    // Only affect individual "mycpt" CPTs
    if ( is_singular( \'mycpt\' ) ) {
        // Add "My CPT" breadcrumb
        $addedBreadcrumbs = array(
            array( \'text\' => \'My CPT\', \'url\' => \'/mycpt/\', \'allow_html\' => 1)
        );
        // Add the new breadcrumb before the single CPT title
        array_splice( $links, 1, 0, $addedBreadcrumbs );
    }
    // Always return the links, even if we didn\'t change them
    return $links;
}
add_filter( \'wpseo_breadcrumb_links\', \'wpse_360965_filter_yoast_breadcrumbs\' );
?>
(再次,根据需要替换“My CPT”文本和“/mycpt/”URL。)

相关推荐