即使在重置固定链接后仍可重写的自定义POST类型404s

时间:2013-01-28 作者:Jonathan

我创建了一个自定义post类型,其中(简化)参数为:

register_post_type(
    \'Event\',
    \'public\' => true,
    \'rewrite\' => array( \'slug\' => \'eventy\'),
    \'has_archive\' => false,
    \'hierarchical\' => false
)
总的来说效果很好。但是,如果我尝试在中重写URLfunctions.php, 例如:

function my_post_type_link_filter_function( $post_link, $id = 0, $leavename = FALSE ) {
   return str_replace(\'eventy\', \'eventx\', $post_link);
}
add_filter(\'post_type_link\', \'my_post_type_link_filter_function\', 1, 3);
结果是,新的“eventx”URL在WordPress生成的链接、列表等中正确显示。但当我访问那些“eventx”URL时,我会得到一个404。转到“eventy”URL仍然有效。

我已经多次尝试将permalinks设置更改为默认设置并返回到帖子名称。这应该可以重置永久链接并修复我在网上见过的许多人的问题。不适合我。

有人知道原因是什么吗?如何对此进行故障排除?我对URL重写的理论很薄弱。

如果你感兴趣,我的目的不是为了琐碎的事件→上述eventx替换。实际上,我想将事件开始的年份/月份(而不是发布的时间)滑入其URL。调试让我意识到,即使是这个微不足道的x→y重写仍然抛出404。

感谢阅读!

【新增澄清】

目前,我说了三个事件(我的自定义帖子类型中的帖子),称为“钓鱼之旅”。默认情况下,这些将被分配永久链接,如下所示

我的网站。com/活动/钓鱼之旅。com/events/fishing-trip-2我的网站。com/events/fishing-trip-3很无聊也很不雅观。

我想要取而代之

我的网站。com/events/2013/1月/钓鱼之旅。com/events/2013/5/fishing-trip/mysite。com/events/2013/may/fishing-trip-2我的网站。com/events/2014/march/fishing trip(钓鱼之旅)更漂亮,信息更丰富。

我对分类样式的页面不感兴趣,比如

我的网站。com/events/2013在URL中,年和月只是一种修饰。

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

步骤1,为自定义事件年和月查询变量添加重写标记,然后在重写参数的slug参数中使用这些标记注册事件post类型:

function wpa83531_register_event_post_type(){

    add_rewrite_tag(\'%event_year%\',\'(\\d+)\');
    add_rewrite_tag(\'%event_month%\',\'(.+)\');

    register_post_type( \'event\',
        array(
            \'public\' => true,
            \'rewrite\' => array( \'slug\' => \'events/%event_year%/%event_month%\' ),
            \'has_archive\' => false,
            \'hierarchical\' => false,
            \'supports\' => array(\'custom-fields\', \'title\', \'editor\')
        )
    );

}
add_action( \'init\', \'wpa83531_register_event_post_type\' );
步骤2,过滤帖子类型链接,用自定义字段中的值替换这些标记event_yearevent_month. 如果自定义字段不存在,则会插入一些默认值,以便您至少可以预览帖子而不会出错:

function wpa83531_event_post_link( $permalink, $post, $leavename ) {
    if ( stripos( $permalink, \'%event_year%\' ) == false )
        return $permalink;

    if ( is_object( $post ) && \'event\' == $post->post_type ) {

        $default_year = \'1970\';
        $default_month = \'january\';

        if( $event_year = get_post_meta( $post->ID, \'event_year\', true ) ){
            $permalink = str_replace( \'%event_year%\', $event_year, $permalink );
        } else {
            $permalink = str_replace( \'%event_year%\', $default_year, $permalink );
        }

        if( $event_month = get_post_meta( $post->ID, \'event_month\', true ) ){
            $permalink = str_replace( \'%event_month%\', $event_month, $permalink );
        } else {
            $permalink = str_replace( \'%event_month%\', $default_month, $permalink );
        }

    }

    return $permalink;
}

add_filter( \'post_type_link\', \'wpa83531_event_post_link\', 10, 3 );

SO网友:Alex

您必须在register\\u post\\u type()中设置“rewrite”=>false;并在关闭register\\u post\\u type()后添加:

// 404 CPT WP bug...

global $wp_rewrite;
$projet_structure = \'/projets/%projet%\';
$wp_rewrite->add_rewrite_tag("%projet%", \'([^/]+)\', "projet=");
$wp_rewrite->add_permastruct(\'projet\', $projet_structure, false);
在哪里projet 是我的CPT。

你可以check here 更多信息。

结束

相关推荐

widgetlogic and permalinks

我试图使用widgetlogic在某些页面上有条件地显示菜单。每个菜单都使用如下标记is_page(array(\"Page Name\", \"Page Name 2\" ...)), 在我尝试更改permalinks之前,它一直工作得很好(因此所有菜单都会从各自的页面中消失)。我做错什么了吗?是否有解决方法?