我有一个带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,
),
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;
}