为什么TEMPLATE_INCLUDE筛选器不适用于WPML插件?

时间:2022-02-10 作者:Victor Sokoliuk

我对WPML有一些问题。我使用了两种不同的产品页面,用于物理产品和视频课程。现在,我为项目ussin WPML插件添加了另一种语言。没关系,但我用于更改模板的代码块不起作用。我使用此代码更改模板:

add_filter( \'template_include\', \'bsl_single_product_template_include\', 50, 1 );
function bsl_single_product_template_include( $template ) {
if ( is_singular(\'product\') && (has_term( \'cosmetics\', \'product_cat\')) ) {
    $template = get_stylesheet_directory() . \'/woocommerce/single-product-cosmetics.php\';
}
   return $template;
}
工作原理:有一个产品页面和一个视频教程页面。这些页面有不同的模板。要更改模板,我使用上面显示的代码。但在安装和配置第二语言后,切换到模板时不会发生。例如,我在一个物理产品页面上,我切换语言,页面更改为默认语言,尽管产品页面应该保留。

1 个回复
最合适的回答,由SO网友:Victor Sokoliuk 整理而成

大家好,我找到了解决方案。我认为@JacobPeattie的评论有助于我做到这一点。谢谢你@JacobPeattie!解决方案如下:在我的代码中,我使用if语句来检查产品类别:

if ( is_singular(\'product\') && (has_term( \'cosmetics\', \'product_cat\')) )
但我没有考虑到WPML改变了额外语言的类别这一事实。那是我的错。现在我知道了。下面是正确的代码:

add_filter( \'template_include\', \'alexandra_template_include\', 15, 1 );
function alexandra_template_include( $template ) {
global $post;
$terms = wp_get_post_terms( $post->ID, \'product_cat\' );
foreach ( $terms as $term ) $categories[] = $term->slug;

if(is_product() &&  in_array( \'cosmetics\', $categories) || in_array( \'cosmetics- 
en\', $categories)){
    $template = get_stylesheet_directory() . \'/woocommerce/single-product- 
cosmetics.php\';
 }
   return $template;
  }
我需要它的具体目的。但也许它对其他人有用。

相关推荐

Apply_Filters()对所需的参数进行切片

我正在尝试向WooCommerce订单中的每个退款行添加一个按钮(其功能超出了这个问题的范围,足以说明它需要退款id作为参数)。我发现这些行是在woocommerce\\includes\\admin\\meta Box\\views\\html订单退款中创建的。无法重写的php。然而,有一项行动:do_action( \'woocommerce_admin_order_item_values\', null, $refund, $refund->get_id() ); 这似乎非常适合我的