我正在使用woocommerce,并且有一些“产品属性”,它们只是一种分类法。
我有以下分类法:
pa\\U颜色是pa\\U材质,pa\\U样式是产品属性,内置于WooCommerce处理这些分类法,所以我无法更改。
WooCommerce还提供了产品类别(product\\u cat)和产品标签(product\\u tag)分类法。
下面的查询得到了织物产品类别中的所有红色乙烯基产品
?product\\u cat=织物和;pa\\U材料=乙烯基;pa\\U颜色=红色
我想把它变成一个非常永久的链接,比如:
产品类别/面料/材料/乙烯基/颜色/红色
这个答案让我非常接近我想要实现的目标:
URL rewrite rules for multiple taxonomies query
因为我可以获取URL来处理2个分类法(product\\u cat+1 attribute taxonomy),但我一直在研究如何获取3个(或更多)参数。
所以我可以得到:
/产品类别/面料/颜色/红色
或
/产品类别/面料/材料/乙烯基
但不是全部3个加在一起
/产品类别/面料/材料/乙烯基/颜色/红色
编辑/尽管我认为URL最好是
/面料/乙烯基/红色
我不确定这是否可行?
结束编辑/
WooCommerce也有一些修改永久链接的设置(比如在URL前面加上“shop”或更改产品类别slug),所以我最终需要对此做出解释,但现在我需要做第一步。
为了简单起见,这是我的代码的精简版本。我实际上是从内置的woocommerce函数中获得分类法,但问题不限于woocommerce。。。因为它适用于任何有很多分类法的站点。
add_action( \'init\', \'wpa_init\' );
function wpa_init() {
$taxonomies = array(
\'pa_color\' => \'Color\',
\'pa_material\' => \'Material\',
\'pa_style\' => \'Style\',
);
$base = \'product-category\';
foreach ( $taxonomies as $taxonomy => $mask ):
$attribute = strtolower( sanitize_title( $mask ) );
add_rewrite_rule(
$base.\'/(.+?)/\' . $attribute . \'/([^/]+)(/page/(\\d+))?/?$\',
\'index.php?product_cat=$matches[1]&\' . $taxonomy . \'=$matches[2]&paged=$matches[4]\',
\'top\'
);
endforeach;
}
这是我在分类查询permalinks上找到的最好的资源:
http://thereforei.am/2011/10/28/advanced-taxonomy-queries-with-pretty-urls/但它似乎也停留在两种分类法上。
最合适的回答,由SO网友:Tom J Nowell 整理而成
您可以尝试以下方式:
function custom_rewrite( $wp_rewrite ) {
$feed_rules = array(
\'product-category/(.+)/material/(.+)/color/(.+)\' => \'index.php?product_cat=\'. $wp_rewrite->preg_index(1).\'&pa_material=\'. $wp_rewrite->preg_index(2).\'&pa_color=\'. $wp_rewrite->preg_index(3)
\'product-category/(.+)/color/(.+)\' => \'index.php?product_cat=\'. $wp_rewrite->preg_index(1).\'&pa_color=\'. $wp_rewrite->preg_index(2)
\'product-category/(.+)/material/(.+)\' => \'index.php?product_cat=\'. $wp_rewrite->preg_index(1).\'&pa_material=\'. $wp_rewrite->preg_index(2)
);
$wp_rewrite->rules = $feed_rules + $wp_rewrite->rules;
}
// refresh/flush permalinks in the dashboard if this is changed in any way
add_filter( \'generate_rewrite_rules\', \'custom_rewrite\' );
它可能不会完全像广告中所宣传的那样工作,您可能需要对regex进行一些修改,但这是需要完成的工作的一般要点(90%的工作)。
如果添加/编辑/删除此代码,则需要刷新永久链接,并将其放入函数中。php或自定义插件。只需进入管理区域并重新保存永久链接,即可刷新永久链接
作为旁注,如果您开始使用继承人制度,您可能会遇到冲突问题,
e、 g.如果您有一件T恤/小款和一件连衣裙/小款类别,并且您使用了一个URL,例如/products category/small/color/red,那么您可能无法获得预期的结果,例如,小款T恤?还是说小礼服?
所以要小心歧义
SO网友:helgatheviking
作为将来的参考(比如明年我在谷歌上搜索并再次找到我自己的问题时),这可以转换为add_rewrite_rule()
通过转换$new_rules
数组中的$regex参数add_rewrite_rule()
值为$rewrite,“top”为$位置。
add_rewrite_rule($regex,$rewrite, $position);
或者作为我上面的一个请求的示例:
function custom_rewrite() {
add_rewrite_rule(
\'product-category/(.+?)/material/(.+?)/?$\',
\'index.php?product_cat=matches[1]&pa_material=$matches[2]\',
\'top\'
);
}
// refresh/flush permalinks in the dashboard if this is changed in any way
add_action( \'init\', \'custom_rewrite\' );
由于某种原因,我使用
regenerate_rewrite_rules
作为挂钩/过滤器,因此切换到init。