WordPress-将产品类别添加到标题的更好方法(Woocommerce / Astra)

时间:2019-05-17 09:56:17

标签: php wordpress woocommerce

我正在尝试在Woocommerce单一产品页面标题(在标题中)前面加上类别,这样

类别

产品标题

这是我到目前为止所拥有的:

function prepend_category_to_title($title, $id) {
    $terms = get_the_terms( $post->ID, 'product_cat' );
    foreach ($terms as $term) {
        $product_cat = $term->name;
        break;
    }
    if( is_product() ) {
        $title = $product_cat . $title;
    }
    return $title;
}
add_filter('the_title', 'prepend_category_to_title', 10, 2);

我可以很好地在标题前加上标题,但是使用the_title会将类别名称输出到每个菜单项以及每个面包屑。

我从以下内容中看到:https://wordpress.stackexchange.com/questions/309151/apply-the-title-filter-in-post-page-title-but-not-in-menu-title,这是预期的行为,我可以添加其他过滤器以删除这些多余的输出。例如add_filter( 'pre_wp_nav_menu'...

但这似乎效率极低且混乱。另外,以这种方式在标题之前加上前缀,这意味着类别文本也被包裹在标题<h1>标签中,这是我所不希望的,因为类别名称必须在较小的<h5>标签中位于产品标题上方(和不同的字体)。

由于我正在使用(Astra)的主题,因此要稍微复杂一点,产品标题位于Woocommerce的 woocommerce_single_product_summary挂钩外部的标题中。

如何以更优雅的方式在产品标题之前添加产品类别? TIA!

1 个答案:

答案 0 :(得分:0)

是的,它是基于挂钩的,因此不会造成问题。但是,如果您需要基于WooCommerce方式进行操作,则需要跳过WordPress钩子the_title,而需要使用WooCommerce钩子。

woocommerce_single_product_summary挂钩与单个产品页面上的标题,价格,专家等有关。请参见下面显示钩子和相关功能的代码行。

add_action( 'woocommerce_single_product_summary', 'woocommerce_template_single_rating', 10 );
add_action( 'woocommerce_single_product_summary', 'woocommerce_template_single_price', 10 );
add_action( 'woocommerce_single_product_summary', 'woocommerce_template_single_excerpt', 20 );
add_action( 'woocommerce_single_product_summary', 'woocommerce_template_single_meta', 40 );
add_action( 'woocommerce_single_product_summary', 'woocommerce_template_single_sharing', 50 );

要使用Woocommerce,您需要删除实际的钩子并重新初始化以下功能。希望下面的代码能解决您的问题。您可以将此代码段放入主题的functions.php文件中

remove_action('woocommerce_single_product_summary','woocommerce_template_single_title',5);
add_action('woocommerce_single_product_summary', 'woocommerce_my_single_title',5);

if ( ! function_exists( 'woocommerce_my_single_title' ) ) {
   function woocommerce_my_single_title() {
?>
            /*
             your logic goes here
             No need to return data, just echo/print
            */
<?php
   }

}