如何在不同的归档和单个插件之间无缝重定向?

时间:2012-06-26 作者:Rarst

我有一个带slug的CPTfunction (单数)和存档slugfunctions (复数)。

Permalink结构:

单数是/function/[postname]/ /functions/[page-x/].(可以在QueryPosts )

这很有效,看起来也不错,但我记录了一些人们直接操纵URL的情况,如:

  • /functions/[postname] (在存档页后键入名称)
  • /function/ (擦除函数名)
虽然用一些代码显式更正并不复杂,但会有更多的post类型,而且似乎数据和逻辑对于通用解决方案来说已经足够了(实际上我有点希望WP来处理它,它在更正链接问题方面做了很多)。

然而,我有很深的WP重写创伤,可以使用一些指针。:)

总而言之:

如何捕获和重定向正确的URL,而不是wrongly using archive slug instead of singular and vice versa?

存档设置的注册方式如下:

\'has_archive\' => \'functions\',
\'rewrite\'     => array(
    \'feeds\'      => false,
    \'with_front\' => false,
),

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

钩住\'404_template\'. (Example)

  • Fetch all public custom post types 哪里has_archive 不是FALSE.has_archive 字符串并查看它是否是当前请求url的一部分get_page_by_title() 请求的最后一部分
  • wp_redirect() 到找到的帖子的永久链接
  • exit;.
  • SO网友:Rarst

    好吧,我可能想得太多了。根据建议的算法,我的处理程序到目前为止编码为:

    /**
     * Redirect manually edited URLs to proper pages.
     *
     * @param $template
     *
     * @return mixed
     */
    static function if_404_template( $template ) {
    
        $post_types     = get_post_types( array( \'has_archive\' => true, ), \'objects\' );
        $url_path       = @parse_url( $_SERVER[\'REQUEST_URI\'], PHP_URL_PATH );
        $url_path_parts = array_filter( explode( \'/\', $url_path ) );
    
        if ( ! empty( $url_path_parts ) ) {
            $last_url_path_part = end( $url_path_parts );
    
            foreach ( $post_types as $name => $post_type_object ) {
                if ( $name == $last_url_path_part ) {
                    wp_safe_redirect( get_post_type_archive_link( $name ), 301 );
                    die;
                }
    
                if ( count( $url_path_parts ) > 1 && in_array( $post_type_object->has_archive, $url_path_parts ) ) {
                    $post = get_page_by_title( $last_url_path_part, OBJECT, $name );
    
                    if ( ! empty( $post ) ) {
                        wp_safe_redirect( get_permalink( $post ), 301 );
                        die;
                    }
                }
            }
        }
    
        trigger_error( \'Uncaught 404 at \' . esc_html( $_SERVER[\'REQUEST_URI\'] ) );
    
        return $template;
    }
    

    结束
    如何在不同的归档和单个插件之间无缝重定向? - 小码农CODE - 行之有效找到问题解决它

    如何在不同的归档和单个插件之间无缝重定向?

    时间:2012-06-26 作者:Rarst

    我有一个带slug的CPTfunction (单数)和存档slugfunctions (复数)。

    Permalink结构:

    单数是/function/[postname]/ /functions/[page-x/].(可以在QueryPosts )

    这很有效,看起来也不错,但我记录了一些人们直接操纵URL的情况,如:

    • /functions/[postname] (在存档页后键入名称)
    • /function/ (擦除函数名)
    虽然用一些代码显式更正并不复杂,但会有更多的post类型,而且似乎数据和逻辑对于通用解决方案来说已经足够了(实际上我有点希望WP来处理它,它在更正链接问题方面做了很多)。

    然而,我有很深的WP重写创伤,可以使用一些指针。:)

    总而言之:

    如何捕获和重定向正确的URL,而不是wrongly using archive slug instead of singular and vice versa?

    存档设置的注册方式如下:

    \'has_archive\' => \'functions\',
    \'rewrite\'     => array(
        \'feeds\'      => false,
        \'with_front\' => false,
    ),
    

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

    钩住\'404_template\'. (Example)

  • Fetch all public custom post types 哪里has_archive 不是FALSE.has_archive 字符串并查看它是否是当前请求url的一部分get_page_by_title() 请求的最后一部分
  • wp_redirect() 到找到的帖子的永久链接
  • exit;.
  • SO网友:Rarst

    好吧,我可能想得太多了。根据建议的算法,我的处理程序到目前为止编码为:

    /**
     * Redirect manually edited URLs to proper pages.
     *
     * @param $template
     *
     * @return mixed
     */
    static function if_404_template( $template ) {
    
        $post_types     = get_post_types( array( \'has_archive\' => true, ), \'objects\' );
        $url_path       = @parse_url( $_SERVER[\'REQUEST_URI\'], PHP_URL_PATH );
        $url_path_parts = array_filter( explode( \'/\', $url_path ) );
    
        if ( ! empty( $url_path_parts ) ) {
            $last_url_path_part = end( $url_path_parts );
    
            foreach ( $post_types as $name => $post_type_object ) {
                if ( $name == $last_url_path_part ) {
                    wp_safe_redirect( get_post_type_archive_link( $name ), 301 );
                    die;
                }
    
                if ( count( $url_path_parts ) > 1 && in_array( $post_type_object->has_archive, $url_path_parts ) ) {
                    $post = get_page_by_title( $last_url_path_part, OBJECT, $name );
    
                    if ( ! empty( $post ) ) {
                        wp_safe_redirect( get_permalink( $post ), 301 );
                        die;
                    }
                }
            }
        }
    
        trigger_error( \'Uncaught 404 at \' . esc_html( $_SERVER[\'REQUEST_URI\'] ) );
    
        return $template;
    }
    

    相关推荐

    如何将Page-{slug}.php这样的页面模板文件移到子目录中?

    我想移动页面模板文件,如page-{slug}.php 到我的主题中的子目录,WordPress将自动识别它们。如果所述表单的页面模板在子目录中不存在,那么WordPress应该回到默认的模板加载规则。我如何才能做到这一点?Note-1: This 对于页面模板和this 链接提及template-parts/page, 这不是一回事。Note-2: 我有多个page-{slug}.php 像页面模板文件一样,我想将它们移动到子目录中,以获得更整洁的文件组织。