我被重写规则弄糊涂了,需要帮助。
我创建了一个带有自定义元“brand”的自定义帖子类型“products”。
名为milk的产品的URL将为mysite.com/products/milk
, 我需要URL包括这样的品牌,mysite.com/brand-brandname/milk
Some examples:mysite.com/brand-supermilk/milk
其中“supermilk”是牛奶定制元数据中的品牌
mysite.com/brand-goodproducts/coffe
好产品就是品牌
我有这个规则并重写:
$args = array(
\'rewrite\' => array(\'slug\' => \'brand-%brand_name%\', \'with_front\' => false),
);
register_post_type(\'products\', $args);
function wptuts_custom_tags() {
add_rewrite_rule("^brand-([^/]+)?",\'index.php?post_type=products&brand_name=$matches[1]\',\'top\');
flush_rewrite_rules();
}
add_action(\'init\',\'wptuts_custom_tags\');
function my_post_type_link_filter_function($post_link, $id = 0, $leavename = FALSE) {
if (strpos(\'%brand_name%\', $post_link) === FALSE) {
$post = &get_post($id);
$brand_name =get_post_meta($post->ID,\'brand\',true);
if(empty($brand_name)){$brand_name = \'default\';}
$post_link = str_replace(\'%brand_name%\',$brand_name, $post_link);
return $post_link;
}
}
add_filter(\'post_type_link\', \'my_post_type_link_filter_function\', 1, 3);
当我添加新产品帖子时,所有这些都会在管理员中显示正确的URL,但会显示404或帖子的产品列表,但不会显示产品页面。
SO网友:Milo
当您使用更复杂的格式来slug
中的参数register_post_type
. 在这种情况下,我们必须使用add_permastruct
.
此示例添加了post类型和额外规则,以使用正确的URL启用单一产品和品牌存档:
function wpd_products_post_type() {
// post type args
// rewrite and has_archive must be true!
$args = array(
\'public\' => true,
\'rewrite\' => true,
\'has_archive\' => true,
\'supports\' => array( \'title\', \'custom-fields\' ),
);
register_post_type(
\'products\',
$args
);
// so WP will parse brand_name into query vars
add_rewrite_tag(
\'%brand_name%\',
\'([^&]+)\'
);
// this sets the actual structure the post type will use
add_permastruct(
\'products\',
\'brand-%brand_name%/%products%\',
array( \'with_front\' => false )
);
// to enable product archives by brand
add_rewrite_rule(
"^brand-([^/]+)?",
\'index.php?post_type=products&brand_name=$matches[1]\',
\'top\'
);
}
add_action( \'init\',\'wpd_products_post_type\' );
您仍然需要
post_type_link
筛选以将元值插入到单个产品URL中。
您还需要添加pre_get_posts
filter 对于产品归档,为您的brand_name
.
您还可以添加其他pre_get_posts
过滤要添加到元查询中的单一产品,因为您可能会发现,您当前可以将任何想要的值作为品牌名称放在URL中,查询将成功,因为WordPress默认只查询slug。