Turn query string to sub page

时间:2016-08-21 作者:Johan B

我有一个自定义的post类型,称为event。URL结构如下所示。

http://my-url.com/events/2016/08/21/workshop

其中,“workshop”是活动的名称。现在,模板将根据查询字符串显示不同的数据。例如,此URL:

http://my-url.com/events/2016/08/21/workshop?sub=files

将循环输出一些文件。我正在添加查询字符串,以便可以在同一模板中执行此操作。

<?php
$sub = isset( $_GET[\'sub\'] ) ? $_GET[\'sub\'] : null;
switch ( $sub ) {
    case "files":
        echo "TODO: Loop out files";
        break;
    case "participants":
        echo "TODO: Loop out participants";
        break;
    case "agenda":
        echo "TODO: Write out the agenda!";
        break;
        <!-- etc -->
}
?>
但我不喜欢这个URL结构!我希望URL为:

http://my-url.com/events/2016/08/21/workshop/files

所以我在“事件”模板中(/workshop/) 可以查看URL结构,而不是查询字符串。问题是/files到URL将使wordpress查找不存在的页面,并给出404。

是否可以执行一些URL向导,以便此URL的模板(和发布数据)可以:

http://my-url.com/events/2016/08/21/workshop/

还可以使用以下URL:

http://my-url.com/events/2016/08/21/workshop/agenda/

2 个回复
最合适的回答,由SO网友:Johan B 整理而成

我最终使用了end points. 这是我的最终(但简化)代码。在函数中,我添加了这个。

add_action(\'init\', \'jbenjaminsson_add_endpoints\');
function jbenjaminsson_add_endpoints()
{
    add_rewrite_endpoint( \'files\', EP_PERMALINK );
    add_rewrite_endpoint( \'participants\', EP_PERMALINK );
    add_rewrite_endpoint( \'agenda\', EP_PERMALINK );
}

add_filter( \'request\', \'jbenjaminsson_filter_request\' );
function jbenjaminsson_filter_request( $vars )
{
    if( isset( $vars[\'files\'] ) ) $vars[\'files\'] = true;
    if( isset( $vars[\'participants\'] ) ) $vars[\'participants\'] = true;
    if( isset( $vars[\'agenda\'] ) ) $vars[\'agenda\'] = true;
    return $vars;
}
在模板上,我这样做了:

if ( get_query_var( \'files\' ) ) {
    get_template_part( \'/template-parts/event\', \'files\' );
} elseif ( get_query_var( \'participants\' ) ) {
    get_template_part( \'/template-parts/event\', \'participants\' );
} elseif ( get_query_var( \'agenda\' ) ) {
    get_template_part( \'/template-parts/event\', \'agenda\' );
}

SO网友:CodeMascot

将此代码放入functions.php-

function the_dramatist_url_rewrite() {
    global $wp_rewrite;
    add_rewrite_tag(\'%sub%\', \'([^&]+)\');
    add_rewrite_rule(
        \'^events/%year%/%monthnum%/%day%/%postname%/?\', 
        \'index.php/events/%year%/%monthnum%/%day%/%postname%?sub=$matches[1]\', 
        \'top\'
    );
}
add_action(\'init\', \'the_dramatist_url_rewrite\', 10, 0);
转到仪表板设置菜单中的permalinks页面,点击Save Changes 按钮希望这能有所帮助。

相关推荐

Updating modified templates

我想调整一些。php模板文件在我的WordPress主题中,我知道正确的过程是将相关文件复制到子主题文件夹中并在那里编辑文件,这样我的修改就不会在将来的主题更新中丢失。但这是否意味着我将无法从主题更新中获益,因为我将文件放在了我的子主题文件夹中?这可能不是一件好事,因为主题更新可能添加了一些有用的特性,甚至修复了我最初需要对代码进行调整的问题!这方面的常见解决方案是什么?有人推荐了一款Diff应用程序——这是人们常用的吗?