固定链接,使一种自定义帖子类型显示为另一种不起作用的子帖子类型

时间:2012-11-20 作者:setterGetter

目前我有两种职位类型,“产品”和“产品数据”,它们是独立的职位类型;然而,出于所有目的,产品数据都是产品的子帖子。该关系是通过产品数据“parent”的元元素建立的,该元素将具有产品帖子的帖子ID。

“产品数据”帖子只有一种创建方式——用户单击产品帖子类型中的产品,并在弹出窗口中输入数据。这使用wp\\u insert\\u post创建产品数据post,并使用“产品”post的ID值添加元元素“parent”。如果用户单击产品类型,则通过模式窗口显示此数据。

我正在尝试让他们的永久链接如下:

“products”帖子的Permalink架构(在本例中,该帖子的ID为123):

http://example.com/products/new-product-1/

元键/父值大于123的“产品数据”帖子的Permalink架构

http://example.com/products/new-product-1/information-product-data/

下面是我用来注册帖子类型和创建重写规则的代码;然而,在添加此代码并刷新我的重写规则(设置>永久链接)后,它对“产品数据”帖子类型很有效,但当我尝试访问“产品”帖子时,它会显示WordPress网站的主页(注意,这不是通过重定向,URL栏会显示“产品”URL)。

我想知道问题是否在于这两个permastructs看起来可能会相互冲突,但是由于permastructs模式,在实践中永远不会出现这种情况。

如果您能帮助解决此问题,我们将不胜感激。

代码:

add_action ( \'init\', \'register_product_post_types\' );
add_action ( \'init\', \'products_add_rewrite_rules\' );
add_filter ( \'post_type_link\', \'products_permalinks\', 10, 3 );

function register_product_post_types() {    
    register_post_type( \'products\',
        array(
                \'supports\' => array( \'title\', \'editor\', \'author\',"custom-fields", "thumbnail", "excerpt", \'comments\' ),
                \'labels\' => array(
                \'name\' => __( \'Products\' ),
                \'singular_name\' => __( \'Products\' )
            ),
        \'public\' => true,
        \'has_archive\' => false,
        \'rewrite\' => FALSE,
        )
    );

    register_post_type( \'products-data\',
        array(
                \'supports\' => array( \'title\', \'editor\', \'author\',"custom-fields" ),
                \'labels\' => array(
                \'name\' => __( \'Products-Data\' ),
                \'singular_name\' => __( \'Products-Data\' )
            ),
        \'show_in_menu\' =>\'edit.php?post_type=products\',
        \'public\' => true,
        \'has_archive\' => false,
        \'rewrite\' => FALSE,
        )
    );
}


function products_add_rewrite_rules() {
    global $wp_rewrite;
    $wp_rewrite->add_rewrite_tag(\'%products%\', \'([^/]+)\', \'products=\');
    $wp_rewrite->add_rewrite_tag(\'%products-data%\', \'([^/]+)\', \'products-data=\');
    $wp_rewrite->add_rewrite_tag(\'%parent%\', \'([^/]+)\', \'parent=\');
    $wp_rewrite->add_permastruct(\'products-data\', \'/products/%parent%/%products-data%\', false);

}

function products_permalinks($permalink, $post, $leavename) {
    $no_data = \'no-data\';
    $post_id = $post->ID;
    if($post->post_type != \'products-data\' || empty($permalink) || in_array($post->post_status, array(\'draft\', \'pending\', \'auto-draft\')))
        return $permalink;
    $data = sanitize_title(get_the_title(get_post_meta($post_id, \'parent\', true)));
    if(!$data) $data = $no_data;
    $permalink = str_replace(\'%parent%\', $data, $permalink);
    return $permalink;
}

1 个回复
SO网友:Matthew Boynes

请参见我的答案:https://wordpress.stackexchange.com/a/100486/12324.

您面临的问题是,permastructs正在向URL添加多个自定义帖子类型,这让WordPress感到困惑。您需要使用添加重写规则add_rewrite_rule().

结束

相关推荐

widgetlogic and permalinks

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