使用干净URL的URL参数重写帖子模板中的问号

时间:2014-11-21 作者:NewUser

我使用以下代码(Source) 要通过url参数更改单个帖子模板,请执行以下操作:

function sjc_add_query_vars($vars) {
return array(\'template\') + $vars;
}
add_filter(\'query_vars\', \'sjc_add_query_vars\');

function sjc_template($template) {
global $wp;
if ($wp->query_vars[\'template\']==\'basic\') {
return dirname( __FILE__ ) . \'/single-basic.php\';
}
else {
return $template;
}
}
add_filter(\'single_template\', \'sjc_template\');
上述代码运行良好,例如:

。。。。。。。。com/我的问题/

通过调用更改模板:

。。。。。。。。com/我的问题/?模板=单个基本/

Question:

如何重写URL以删除“”template=“获取干净URL的部分,如

。。。。。。。。com/我的问题/单一基础/

Note:

这个问题的解决方案是awesome - 因为我还意识到,很遗憾,我的缓存插件“CACHIFY”没有使用url中的“”template=“部分”缓存帖子:(

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

您应该添加重写端点template 主题激活挂钩和init 钩此外,还需要执行一些小检查以防止出现错误。

function sjc_theme_activate(){
    sjc_theme_add_rewrite_endpoint();
    flush_rewrite_rules();
}
//for more info http://codex.wordpress.org/Plugin_API/Action_Reference/after_switch_theme
add_action( \'after_switch_theme\', \'sjc_theme_activate\' );


function sjc_theme_deactivate(){
    flush_rewrite_rules();
}
//for more info http://codex.wordpress.org/Plugin_API/Action_Reference/switch_theme
add_action( \'switch_theme\', \'sjc_theme_deactivate\' );

function sjc_add_query_vars($vars) {
    $vars[] = \'template\';
    return $vars;
}
add_filter(\'query_vars\', \'sjc_add_query_vars\');

function sjc_template($template) {
    global $wp_query;
    //you should check if file exists first
    if ( (isset($wp_query->query_vars[\'template\'])) && ($wp_query->query_vars[\'template\'] == \'basic\') && (file_exists(dirname( __FILE__ ) . \'/single-basic.php\')) ) {
        return dirname( __FILE__ ) . \'/single-basic.php\';
    }else {
        return $template;
    }
}
add_filter(\'single_template\', \'sjc_template\');

//add rewrite endpoint
function sjc_theme_add_rewrite_endpoint(){
     add_rewrite_endpoint( \'template\', EP_PERMALINK | EP_PAGES );
}
//for more info http://codex.wordpress.org/Rewrite_API/add_rewrite_endpoint
add_action(\'init\', \'sjc_theme_add_rewrite_endpoint\');
然后激活wordpress的漂亮链接。您可以使用访问任何帖子http://example.com/post-title/?template=basic
http://example.com/post-title/template/basic
并获得相同的结果(不要忘记添加single-basic.php 主题库目录中的文件)。我希望这对你有帮助。

SO网友:Ralph

Update: 我逐渐意识到我们有不同的目标@NewUser承认这两种URL样式都有效:

http://example.com/post-title/?template=basic

http://example.com/post-title/template/basic.

而我的目标是http://example.com/post-title/?template=basic, 通过将其重定向到一个漂亮的URL。就像domain.com/?p=100 重定向到一个漂亮的帖子/页面URL。WP本身通过wp_redirect 中的函数canonical.php.

Please note: 不同的URL样式(漂亮和不漂亮)服务于相同的内容,可能会被搜索引擎视为重复的内容。使用301重定向功能(如下所述)或规范标记来防止这种情况:https://support.google.com/webmasters/answer/139066?hl=en 这也解释了WP的全部目的canonical.php (防止重复)。

Non-pretty to Pretty URL / 301 redirect function: 我修改了以下内容function. 现在,它会重定向到pretty URL,并防止由于不同URL样式(pretty和non-pretty)服务于相同的内容而导致内容重复:

function redirect_to_pretty_url() {
    if ( is_singular() && !empty( $_GET[\'template\'] ) ) {
        wp_redirect( home_url( "/my-question/" ) . urlencode( get_query_var( \'template\' ) ), 301 );
        exit();
    }   
}
add_action( \'template_redirect\', \'redirect_to_pretty_url\' );

SO网友:Nik Lakhani

您还可以使用htaccess重写URL,它还可以重定向到一个漂亮的URL。只需将此代码放入.htaccess 文件

RewriteEngine On
RewriteRule ^my-question/([^/]*)$ /my-question/?template=$1 [L]

Or

您也可以使用函数来完成。php使用以下代码段。

global $wp_rewrite;
add_rewrite_rule(\'^my-question/([^/]*)?$\', \'/my-question/single-basic.php?template=$matches[1]\', \'top\');
$wp_rewrite->flush_rules();

结束

相关推荐

theme functions (hooks)

WordPress已经提出了这个问题,但没有答案。我只是想在这个论坛上试试,如果有人知道的话,因为我也有同样的问题。要使用jquery滑块编辑我的主题,如何转到该脚本?,显示“$主题->挂钩(\'content\\u before\');”在content div标记中。有人能帮忙吗?我的主题索引。php包含以下内容<div id=\"main\"> <?php $theme->hook(\'main_before\'); ?> &#x