根据WP 3.4中的分类定义自定义帖子类型的固定链接

时间:2012-11-25 作者:rgdigi

我想为产品和产品类型创建规范的永久链接。我已经找到了自定义帖子类型和自定义分类法,但我不知道是否可以用分类法定义永久链接。例如,我的工作流程是这样的。。。

我创建了一个名为products.product types.\'Chairs\' 并添加一个名为\'Red Chair\' 属于此类别创建此产品后desired permalink structure 查看此产品的格式如下->

http://shop.com/products/chairs/red-chair
这在wordpress 3.4中是否可行?自定义帖子类型中的元框允许选择为自定义分类法定义的产品类型,并且每个产品只有一种类型。

如果可能,我还希望尽可能包括所选产品类别的任何父级(例如\'chairs\' 类别是\'lounge\' 类别,permalink结构如下->

http://shop.com/products/lounge/chairs/red-chair
下面是我如何创建自定义帖子类型和自定义分类法,我只需要帮助定义重写/段塞规则,以便在永久链接中包含产品类型。

/* Custom Post Type - Products ------- */
function products_init() {
    $args = array(
        \'public\' => true,
        \'label\' => \'Products\'
    );
    register_post_type( \'products\', $args );
}
add_action( \'init\', \'products_init\' );

/* Custom Taxonomy - Product Type ------- */
add_action( \'init\', \'create_prodtype\' );
function create_prodtype() {
    $labels = array(
        \'name\' => _x( \'Product Type\', \'products\' ),
        \'singular_name\' => _x( \'Product Category\', \'product\' ),
        \'search_items\' =>  __( \'Search Product Types\' ),
        \'all_items\' => __( \'All Product Types\' ),
        \'parent_item\' => __( \'Products\' ),
        \'parent_item_colon\' => __( \'Products:\' ),
        \'edit_item\' => __( \'Edit Product Type\' ),
        \'update_item\' => __( \'Update Product Type\' ),
        \'add_new_item\' => __( \'Add New Product Type\' ),
        \'new_item_name\' => __( \'New Product Type\' ),
    );
    register_taxonomy(
        \'products\',
        array(\'products\'),
        array(
            \'rewrite\' => array(
                \'slug\' => \'products\',
                \'hierarchical\' => true
            ), 
            \'with_front\' => false,
            \'labels\' => $labels
    ));
}

1 个回复
SO网友:rgdigi

Solution

在Jan Fabry的这些帖子的帮助下,我找到了答案->

https://wordpress.stackexchange.com/a/5478/10350 https://wordpress.stackexchange.com/a/22490/10350

我已经设置了如下自定义帖子类型->

自定义帖子类型(register\\u post\\u type)->"product""product-type"


Back-end function

我重写了保存在后端的permalink结构,以便保存permalink以包括自定义分类类型-“product type”

add_filter(\'post_type_link\', \'product_type_permalink\', 10, 4);
function product_type_permalink($post_link, $post, $leavename, $sample) {
    //If is custom post type "product"
    if ($post->post_type == \'product\') {
        // Get current post object
        global $post;
        // Get current value from custom taxonomy "product-type"
        $terms = get_the_terms($post->id, \'product-type\');
        // Define category from "slug" of taxonomy object
        $term = $terms[0]->slug;
        // Re-structure permalink with string replace to include taxonomy value and post name
        $permalink = str_replace(\'product/\', \'product/\' . $term . \'/\', $post_link);
    }
    return $permalink;
}
设置permalink setting “发布名称”并保存。如果将产品添加到类别并保存,则应重新写入永久链接以包含自定义分类定义,在本例中为“产品类型”。因此,如果将“红色椅子”添加到“椅子”类别中,URL的格式如下->

http://website.com/product/chairs/red-chair/
但是,如果您尝试转到此页面,将出现404错误。这是因为wordpress还不知道如何使用此URL查询数据库,所以您必须编写它。

Front-end function

我们需要添加重写规则,以便wordpress可以获取我们的url并查询数据库。我们使用wordpress函数add_rewrite_rule 将给定的永久链接转换为查询字符串。

add_rewrite_rule(
    // The regex to match the incoming URL
    \'product/([^/]+)/([^/]+)/?\',
    // The resulting internal URL: `index.php` because we still use WordPress
    // `pagename` because we use this WordPress page
    // `designer_slug` because we assign the first captured regex part to this variable
    \'index.php?product-type=$matches[1]&product=$matches[2]\',
    // This is a rather specific URL, so we add it to the top of the list
    // Otherwise, the "catch-all" rules at the bottom (for pages and attachments) will "win"
    \'top\'
);
在这个函数中,匹配数组是通过Wordpress在每个斜杠处分解给定字符串来定义的。在这个例子中,正则表达式([^/]+) 用于匹配每个斜杠之间的任何内容。在本例中,有两个级别,因此它匹配产品类型,然后匹配产品,并将它们添加到matches数组中,其中product type=$matches1, and product=$匹配项2.

此重写规则转换为->

product/chairs/red-chair/
进入此->

index.php?product-type=chair&product=red-chair
我们的数据库可以使用它来查询数据库并返回正确的产品页面和格式化的永久链接。

这会丢弃产品类型页面,因为url中只有一个级别,即产品类型。这意味着重写规则当前将始终尝试标识查询字符串中定义的产品名称。为此,我们还编写了一个单级重写规则:

add_rewrite_rule(\'^product/([^/]*)?$\',\'index.php?product-type=$matches[1]\',\'top\');
现在,这还将查询产品类型页面,这样,如果我们想显示各种产品类型,就可以像平常一样循环分类法,而不会在尝试链接到它们时抛出404个错误。

Downside

目前,这将只采用单一级别的分类法,因此自定义分类法结构不能是分层的。如果指定多个分类法,它将使用第一个ID最多的分类法来定义永久链接。一种潜在的解决方法是隐藏出现在自定义帖子类型侧栏中的自定义分类菜单,并为分类添加一个只能使用选择框的元框。我使用Meta Box plugin 为了这个。(注意,这个插件没有任何管理菜单,它允许您通过创建数组在functions.php中为自定义帖子类型编写元框-强烈建议!)

结束

相关推荐

widgetlogic and permalinks

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