如何在Woocommerce单品短描述下方显示预购可用日期
WooCommerce 预购日期移至单品短描述下方的解决方案
问题背景
需要将WooCommerce预购商品的可用日期移至单品短描述下方,尝试调用元数据的代码未生效;后续找到插件自带的显示函数,但替换hook后覆盖了短描述内容,需实现正确调整位置且保留原有短描述的效果。
方案一:修复元数据调用代码
原代码未生效可能是元数据键名不匹配、日期格式验证缺失或产品对象调用问题,以下是修正后的代码:
// 调整WooCommerce预购日期至短描述下方 add_filter( 'woocommerce_short_description', 'woo_add_preorder_date_after_excerpt', 20, 1 ); function woo_add_preorder_date_after_excerpt( $post_excerpt ) { // 仅在单品页且属于指定预购分类时执行 if ( is_product() && has_term( array( 'Comic Book Pre-orders', 'DC Comics Pre-orders', 'Marvel Comics Pre-orders', 'Other Publisher Pre-orders' ), 'product_cat' ) ) { global $product; // 获取预购日期元数据,若插件使用其他键名需自行替换 $preorder_datetime = $product->get_meta( '_wc_pre_orders_availability_datetime', true ); // 验证日期有效性后格式化追加 if ( ! empty( $preorder_datetime ) && strtotime( $preorder_datetime ) ) { $formatted_date = date( 'F d, Y', strtotime( $preorder_datetime ) ); $post_excerpt .= '<p class="pre-order-date"><strong>Release date: </strong>' . $formatted_date . '</p>'; } } return $post_excerpt; }
注意事项
如果仍未生效,需确认插件存储预购日期的元数据键名:可通过查看WordPress数据库的wp_postmeta表,找到对应预购产品的日期字段,替换代码中的_wc_pre_orders_availability_datetime。
方案二:利用插件自带显示函数调整位置
插件默认通过woocommerce_single_product_summary action显示预购信息,直接替换为woocommerce_short_description会覆盖内容,正确做法是先移除默认action,再将显示函数挂到合适位置:
步骤1:移除插件默认的预购信息显示
// 移除插件默认的预购日期显示 add_action( 'init', 'remove_default_preorder_message' ); function remove_default_preorder_message() { // 获取预购插件实例,不同插件实例名可能不同,需根据插件调整 global $wc_pre_orders; if ( isset( $wc_pre_orders ) ) { remove_action( 'woocommerce_single_product_summary', array( $wc_pre_orders, 'add_pre_order_product_message' ), 11 ); } }
步骤2:将预购信息挂到短描述之后
方式A:挂到产品摘要的对应优先级(推荐)
woocommerce_single_product_summary中短描述的优先级为20,因此设置更高优先级(如25)即可在短描述后显示:
// 将预购日期挂到短描述之后的位置 add_action( 'woocommerce_single_product_summary', 'add_preorder_after_short_description', 25 ); function add_preorder_after_short_description() { global $wc_pre_orders, $product; // 仅在预购产品且属于指定分类时显示 if ( isset( $wc_pre_orders ) && $product->is_pre_order() && has_term( array( 'Comic Book Pre-orders', 'DC Comics Pre-orders', 'Marvel Comics Pre-orders', 'Other Publisher Pre-orders' ), 'product_cat' ) ) { $wc_pre_orders->add_pre_order_product_message(); } }
方式B:直接追加到短描述末尾
通过输出缓冲捕获插件函数的内容,追加到短描述后:
// 将预购日期追加到短描述末尾 add_filter( 'woocommerce_short_description', 'append_preorder_message_to_excerpt', 20, 1 ); function append_preorder_message_to_excerpt( $post_excerpt ) { global $wc_pre_orders, $product; if ( is_product() && isset( $wc_pre_orders ) && $product->is_pre_order() && has_term( array( 'Comic Book Pre-orders', 'DC Comics Pre-orders', 'Marvel Comics Pre-orders', 'Other Publisher Pre-orders' ), 'product_cat' ) ) { // 捕获插件函数输出 ob_start(); $wc_pre_orders->add_pre_order_product_message(); $preorder_message = ob_get_clean(); $post_excerpt .= $preorder_message; } return $post_excerpt; }
注意事项
若无法获取插件实例,可查看插件代码中的实例获取方式,例如部分插件使用WC_Pre_Orders::instance(),此时需将代码中的global $wc_pre_orders替换为$wc_pre_orders = WC_Pre_Orders::instance();。
内容的提问来源于stack exchange,提问作者JapeNZ
相关产品推荐
相关产品推荐

