自定义查询变量-让WordPress重定向到漂亮的固定链接URL

时间:2013-09-02 作者:mndmkr

在过去的几个小时里,我一直在寻找答案,但没有找到任何正确的方向。非常感谢您的建议!

我已有的内容:自定义帖子类型\'stores\'\'query_vars\' 过滤器挂钩:\'state\'.添加了相应的重写规则:

  • 模式:stores/state/([^/]+)/?$index.php?post_type=stores&state=$matches[1]
  • As\'state\' 是一个自定义元字段,我添加了一个函数pre_get_posts 操作挂钩执行所有查询魔术(创建meta_query etc)仅显示匹配的stores 在存档页中

    所以如果我进去www.myurl.com/stores/state/austria 我的档案页面只显示奥地利商店。

    为了不仅按url过滤存储,归档页面还包括一个表单来过滤它们。这就是我遇到的问题:表单显然只传递POST或GET数据,例如如下所示:

    www.myurl.com/stores/?state=austria
    
    我可以通过在我的pre_get_posts 过滤器功能:

    if( isset( $_REQUEST[\'state\'] ) || $query->get(\'state\') != "" ) {
    
    但是,这有点脏,因为我希望wordpress自动重定向到重写的URL:

    www.myurl.com/stores/?state=austria
    
    应重定向到

    www.myurl.com/stores/state/austria
    
    如果我输入一个页面或帖子ID并将其重定向到永久链接,也是这样。

    有没有另一个我还没有发现的动作钩?如何让wordpress自动重定向到pretty permalink?

    谢谢你的每一个提示。

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

    我自己想出了一个解决办法。不需要javascript,只需要另一个模板函数。手动创建URL。

    我们的想法是使用挂钩“template\\u redirect”,检查请求的页面是否是相应的存储存档页面,然后检查那里的$\\u请求变量并构建一个新的URL。最后重定向到此URL。

    function my_template_redirect() {
        if ( is_post_type_archive( \'stores\' ) ) {
            if ( isset( $_REQUEST[\'state\'] )  ) {
                $myurl = get_post_type_archive_link( \'stores\' );
                if (substr($myurl, -1) != "/") $myurl .= "/";
                $myurl .= "state/";
                $myurl .= trim( sanitize_title_for_query( $_REQUEST[\'state\'] ) ) . "/";
                exit( wp_redirect( $myurl ) ) ;
            }
        }
    }
    add_action( \'template_redirect\', \'my_template_redirect\' );
    
    效果很好。当然欢迎任何更正/更好的想法。

    SO网友:gmazzap

    也许这不是最好的解决方案,也不是你正在寻找的解决方案,但我现在想到了这个,也许有人可以给你另一个。

    我认为在页面表单中,您有如下内容:

    <select name="state">
       <option value="austria">Austria</option>
       ...
    </select>
    
    使用javascript很容易将用户发送到漂亮的url。

    (我把javascript放在这里,你确保把它放在一个单独的js文件中,并用wp_enqueue_script)

    未经测试:

    jQuery().ready(function($) {
      $(\'select[name="state"]\').change(function(e){
        e.preventDefault();
        var state = $(this).children(\'option:selected\').val();
        window.location.href = window.location.href + \'/\' + state;
      });
    });
    

    结束

    相关推荐

    自定义查询变量-让WordPress重定向到漂亮的固定链接URL - 小码农CODE - 行之有效找到问题解决它

    自定义查询变量-让WordPress重定向到漂亮的固定链接URL

    时间:2013-09-02 作者:mndmkr

    在过去的几个小时里,我一直在寻找答案,但没有找到任何正确的方向。非常感谢您的建议!

    我已有的内容:自定义帖子类型\'stores\'\'query_vars\' 过滤器挂钩:\'state\'.添加了相应的重写规则:

    • 模式:stores/state/([^/]+)/?$index.php?post_type=stores&state=$matches[1]
  • As\'state\' 是一个自定义元字段,我添加了一个函数pre_get_posts 操作挂钩执行所有查询魔术(创建meta_query etc)仅显示匹配的stores 在存档页中

    所以如果我进去www.myurl.com/stores/state/austria 我的档案页面只显示奥地利商店。

    为了不仅按url过滤存储,归档页面还包括一个表单来过滤它们。这就是我遇到的问题:表单显然只传递POST或GET数据,例如如下所示:

    www.myurl.com/stores/?state=austria
    
    我可以通过在我的pre_get_posts 过滤器功能:

    if( isset( $_REQUEST[\'state\'] ) || $query->get(\'state\') != "" ) {
    
    但是,这有点脏,因为我希望wordpress自动重定向到重写的URL:

    www.myurl.com/stores/?state=austria
    
    应重定向到

    www.myurl.com/stores/state/austria
    
    如果我输入一个页面或帖子ID并将其重定向到永久链接,也是这样。

    有没有另一个我还没有发现的动作钩?如何让wordpress自动重定向到pretty permalink?

    谢谢你的每一个提示。

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

    我自己想出了一个解决办法。不需要javascript,只需要另一个模板函数。手动创建URL。

    我们的想法是使用挂钩“template\\u redirect”,检查请求的页面是否是相应的存储存档页面,然后检查那里的$\\u请求变量并构建一个新的URL。最后重定向到此URL。

    function my_template_redirect() {
        if ( is_post_type_archive( \'stores\' ) ) {
            if ( isset( $_REQUEST[\'state\'] )  ) {
                $myurl = get_post_type_archive_link( \'stores\' );
                if (substr($myurl, -1) != "/") $myurl .= "/";
                $myurl .= "state/";
                $myurl .= trim( sanitize_title_for_query( $_REQUEST[\'state\'] ) ) . "/";
                exit( wp_redirect( $myurl ) ) ;
            }
        }
    }
    add_action( \'template_redirect\', \'my_template_redirect\' );
    
    效果很好。当然欢迎任何更正/更好的想法。

    SO网友:gmazzap

    也许这不是最好的解决方案,也不是你正在寻找的解决方案,但我现在想到了这个,也许有人可以给你另一个。

    我认为在页面表单中,您有如下内容:

    <select name="state">
       <option value="austria">Austria</option>
       ...
    </select>
    
    使用javascript很容易将用户发送到漂亮的url。

    (我把javascript放在这里,你确保把它放在一个单独的js文件中,并用wp_enqueue_script)

    未经测试:

    jQuery().ready(function($) {
      $(\'select[name="state"]\').change(function(e){
        e.preventDefault();
        var state = $(this).children(\'option:selected\').val();
        window.location.href = window.location.href + \'/\' + state;
      });
    });
    

    相关推荐