我正在尝试更改woocommerce产品url的默认结构,以包含作者用户名。在我的安装中,woocommerce产品的默认url如下所示:
https://<site_url>/product/<product-name>
我想把它改成这样:
https://<site_url>/product/<author-username>/<product-name>
这是我目前掌握的代码:
function so_pre_get_posts( $query ) {
// check if the user is requesting an admin page
// or current query is not the main query
if ( is_admin() || ! $query->is_main_query() ){
return;
}
//since the author is not included in woocommerce query vars add author username to query_vars
$post_type = get_query_var( \'post_type\' );
if($post_type === \'product\'){
$post_name = get_query_var( \'name\');
if ( $post = get_page_by_path($post_name,OBJECT,\'product\') ){
$id = $post->ID;
$author_id = get_post_field( \'post_author\', $id );
$author = get_userdata($author_id);
$author_username = $author->user_login;
$query->set( \'seller\',$author_username);
}else{
return;
}
}
}
//add rewrite rules
function so_rewrite_tag_rule() {
add_rewrite_tag( \'%seller%\', \'([^&]+)\' );
add_rewrite_rule(\'^product/([^/]+)/([^/]+)/?$\', \'index.php?seller=$matches[1]&name=$matches[2]\',\'top\');
flush_rewrite_rules();
}
add_action( \'pre_get_posts\', \'so_pre_get_posts\', 1 );
add_action(\'init\', \'so_rewrite_tag_rule\', 10, 0);
然而,当我访问任何产品的产品页面时,它仍然解析为默认的woocommercepermalink结构。我确保刷新代码中的永久链接,所以我不知道问题出在哪里。
最合适的回答,由SO网友:Shazzad 整理而成
无需为此添加额外的重写规则,WooCommerce已经提供了一种处理产品permalink的方法。参观Wp Admin > General > Permalink
第页,并使用/product/%author%/
像Product permalinks 价值这将根据需要组织产品url。
然而,WooCommerce不会取代%author%
使用产品的作者标记,就像我们在post permalink中看到的一样,因此您必须使用post_type_link
滤器
// replace %author%
add_filter( \'post_type_link\', \'wpse_post_type_link\', 20, 2 );
function wpse_post_type_link( $permalink, $post ) {
if ( \'product\' === $post->post_type && false !== strpos( $permalink, \'%author%\' ) ) {
$author = get_the_author_meta( \'user_nicename\', $post->post_author );
$permalink = str_replace( \'%author%\', $author, $permalink );
}
return $permalink;
}