【问题标题】:Create sub page of sub pages using "fake pages"使用“假页面”创建子页面的子页面
【发布时间】:2016-03-23 15:38:53
【问题描述】:

我发现这个tutorial 可以制作所谓的假页面,因此我可以动态创建带有自定义字段的页面。它工作得很好,但我需要调整它以适应我的需要。

例如,如果一本书有来自不同来源的评论:

mysite.com/books/to-kill-mockingbird/reviews/id-for-review

这意味着 to-kill-mockingbird 是帖子类型书籍的 slug,而 id-for-review 是帖子类型评论的 slug。我可以通过删除 books/to-kill-mockingbird 轻松实现此功能,并且只保留 mysite.com/reviews/id-for-review,但我更喜欢完整的 url。

有什么建议吗?

我正在尝试创建一个新的重写规则,将id-for-review 放入查询变量中。为此,我添加了$review-id

这是我试图制定的规则

if ($slug == 'reviews') {
           $newrules['books/([^/]+)/' . $slug . '/([^/]+)/?'] = 'index.php?book=$matches[1]&fpage=' . $slug . '&review-id=$matches[2]';
           $newrules['books/([^/]+)/' . $slug . '/?$'] = 'index.php?book=$matches[1]&fpage=' . $slug;
        }
        else
        {
           $newrules['books/([^/]+)/' . $slug . '/?$'] = 'index.php?book=$matches[1]&fpage=' . $slug;
        }

我有一个名为 single-book.php 的模板,其中使用了正确的模板:

$current_fp = get_query_var('fpage');
$review-id = get_query_var('review-id');

if (!$current_fp) {
        get_template_part( 'single', 'book-index' );
    } else if ($current_fp == 'books') {
    if (!$review-id) {
        get_template_part( 'single', 'book-reviews' );
        }
        else
        {
        get_template_part( 'single', 'book-review' );
        }
    };

如果我现在转到 /books/to-kill-mockingbird/reviews/,它会使用列出所有评论的模板。但是当我去评论时,它似乎使用了标准的 WordPress 模板。

这是我的 .htaccess:

# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>

# END WordPress

【问题讨论】:

  • 到目前为止你做了什么?
  • @Ben 我已经尝试了很多东西,我认为将它们写在问题中会更容易,也不会令人困惑。我试图改变规则,但据我所知,它应该按照现在的方式工作。我尝试在模板中进行更改,但如果我在 /reviews/ 之后有某些内容,则会收到“找不到页面”错误,因此未使用模板。
  • 那你能告诉我们你的.htaccess吗?
  • @Ben 当然。添加到问题中。
  • 你用什么来改变 URL?通常这些规则是作为.htaccess 文件的一部分添加的——但我在这里看不到任何相关规则。你在用插件吗?

标签: php wordpress .htaccess wordpress-theming


【解决方案1】:

在对我的问题进行了一些调整和编辑之后,我似乎比我想象的更接近答案。我的大部分代码现在都是正确的。

以下是教程示例中需要替换的规则。这被放入 foreach 循环中,并为“评论”创建两个规则。

if ($slug == 'reviews') {
           $newrules['books/([^/]+)/' . $slug . '/([^/]+)/?'] = 'index.php?book=$matches[1]&fpage=' . $slug . '&review-id=$matches[2]';
           $newrules['books/([^/]+)/' . $slug . '/?$'] = 'index.php?book=$matches[1]&fpage=' . $slug;
        }
        else
        {
           $newrules['books/([^/]+)/' . $slug . '/?$'] = 'index.php?book=$matches[1]&fpage=' . $slug;
        }

现在在 single-books.php 模板中,使用它来获取正确的模板:

$current_fp = get_query_var('fpage');
$review-id = get_query_var('review-id');

if (!$current_fp) {
        get_template_part( 'single', 'book-index' );
    } else if ($current_fp == 'books') {
    if (!$review-id) {
        get_template_part( 'single', 'book-reviews' );
        }
        else
        {
        get_template_part( 'single', 'book-review' );
        }
    };

现在在 single-book-review.php 模板中,您可以使用它根据查询变量中的 slug 获取帖子数据:

$review_id = get_query_var('review-id');

$post = get_page_by_path( $review_id, OBJECT, 'review' )

还记得在更改规则时转到设置 -> 固定链接并点击保存,以刷新规则。

【讨论】:

    猜你喜欢
    • 2013-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-12
    相关资源
    最近更新 更多