在 WooCommerce 存档页面上获取和显示产品自定义字段
Get and display product custom field on WooCommerce archive pages
我已成功将自定义 Metabox 添加到管理产品页面。上面的代码在管理区生成一个输入类型的文本,我可以在其中插入城市名称:
add_action( 'save_post_product', 'set_post_metas_city', 10, 3 );
function set_post_metas_city( $post_id, $post, $update ) {
if(isset($_POST['city']))
update_post_meta($post_id, 'city', esc_attr($_POST['city']));
}
add_action( 'add_meta_boxes', 'metas_boxes_city', 50 );
function metas_boxes_city(){
add_meta_box( "options-city", "City Name", 'edit_form_after_title_cidade', 'product', 'normal' );
}
function edit_form_after_title_city($post) { ?>
<div id="mdiv">
<input type="text" style="width: 100%" name="city" value="<?php echo($post ? get_post_meta($post->ID,'city',true) : ''); ?>" id="city" spellcheck="true" autocomplete="off" placeholder="<?php _e('Insert the city'); ?>">
</div>
<?php
}
代码在活动主题的 functions.php 文件中。
现在我使用下面的钩子函数,试图在商店页面上显示自定义字段值(城市名称)如下:
// define the woocommerce_after_shop_loop_item callback
function action_woocommerce_after_shop_loop_item( ) {
// make action magic happen here...
echo($post ? get_post_meta($post->ID,'city',true) : '');
};
// add the action
add_action( 'woocommerce_after_shop_loop_item', 'action_woocommerce_after_shop_loop_item', 10, 0 );
所以我想得到类似的东西:
[Product Picture]
**City**
Category
Cake Ananas
,00
[BUY BUTTON]
但它仍然没有显示任何内容。
如果我在 echo 中使用静态内容,我会在商店页面上获得所需的显示:
// define the woocommerce_after_shop_loop_item callback
function action_woocommerce_after_shop_loop_item( ) {
// make action magic happen here...
echo "Statictest";
};
但是缺少正确的变量..
还有一点,我不知道在这种情况下是在哪个页面运行操作。
// run the action
do_action( 'woocommerce_after_shop_loop_item' );
请问我做错了什么?有人可以帮忙吗?
主要问题出在您使用 $post->ID
的最后一个函数中。从 WooCommerce 3 开始,还有一个比 save_post_product
更好的钩子。请尝试使用以下重新访问的代码:
// Add custom product meta box
add_action( 'add_meta_boxes', 'add_product_metas_box_city', 50 );
function add_product_metas_box_city(){
add_meta_box( "options-city", __("City Name"), 'product_metas_box_city_content_callback', 'product', 'normal', 'high' );
}
// custom product meta box
function product_metas_box_city_content_callback( $post ) {
$value = get_post_meta( $post->ID, 'city', true );
echo '<div id="mdiv">
<input type="text" style="width: 100%" name="city" value="'. $value .'" id="city" spellcheck="true" autocomplete="off" placeholder="'. __('Insert the city') .'">
</div>';
}
// Save city custom field value
add_action( 'woocommerce_admin_process_product_object', 'save_product_city_meta_value' );
function save_product_city_meta_value( $product ) {
if( isset($_POST['city']) ) {
$product->update_meta_data( 'city', sanitize_text_field( $_POST['city'] ) );
}
}
// Display city value on frontend products loop
add_action( 'woocommerce_after_shop_loop_item', 'action_woocommerce_after_shop_loop_item', 10, 0 );
function action_woocommerce_after_shop_loop_item() {
global $product;
$city = $product->get_meta('city');
if ( $city ) {
echo '<p class="city">'. $city .'</p>';
}
}
代码进入您的活动子主题(或活动主题)的 functions.php 文件。已测试并有效。
我已成功将自定义 Metabox 添加到管理产品页面。上面的代码在管理区生成一个输入类型的文本,我可以在其中插入城市名称:
add_action( 'save_post_product', 'set_post_metas_city', 10, 3 );
function set_post_metas_city( $post_id, $post, $update ) {
if(isset($_POST['city']))
update_post_meta($post_id, 'city', esc_attr($_POST['city']));
}
add_action( 'add_meta_boxes', 'metas_boxes_city', 50 );
function metas_boxes_city(){
add_meta_box( "options-city", "City Name", 'edit_form_after_title_cidade', 'product', 'normal' );
}
function edit_form_after_title_city($post) { ?>
<div id="mdiv">
<input type="text" style="width: 100%" name="city" value="<?php echo($post ? get_post_meta($post->ID,'city',true) : ''); ?>" id="city" spellcheck="true" autocomplete="off" placeholder="<?php _e('Insert the city'); ?>">
</div>
<?php
}
代码在活动主题的 functions.php 文件中。
现在我使用下面的钩子函数,试图在商店页面上显示自定义字段值(城市名称)如下:
// define the woocommerce_after_shop_loop_item callback
function action_woocommerce_after_shop_loop_item( ) {
// make action magic happen here...
echo($post ? get_post_meta($post->ID,'city',true) : '');
};
// add the action
add_action( 'woocommerce_after_shop_loop_item', 'action_woocommerce_after_shop_loop_item', 10, 0 );
所以我想得到类似的东西:
[Product Picture]
**City**
Category
Cake Ananas
,00
[BUY BUTTON]
但它仍然没有显示任何内容。
如果我在 echo 中使用静态内容,我会在商店页面上获得所需的显示:
// define the woocommerce_after_shop_loop_item callback
function action_woocommerce_after_shop_loop_item( ) {
// make action magic happen here...
echo "Statictest";
};
但是缺少正确的变量..
还有一点,我不知道在这种情况下是在哪个页面运行操作。
// run the action
do_action( 'woocommerce_after_shop_loop_item' );
请问我做错了什么?有人可以帮忙吗?
主要问题出在您使用 $post->ID
的最后一个函数中。从 WooCommerce 3 开始,还有一个比 save_post_product
更好的钩子。请尝试使用以下重新访问的代码:
// Add custom product meta box
add_action( 'add_meta_boxes', 'add_product_metas_box_city', 50 );
function add_product_metas_box_city(){
add_meta_box( "options-city", __("City Name"), 'product_metas_box_city_content_callback', 'product', 'normal', 'high' );
}
// custom product meta box
function product_metas_box_city_content_callback( $post ) {
$value = get_post_meta( $post->ID, 'city', true );
echo '<div id="mdiv">
<input type="text" style="width: 100%" name="city" value="'. $value .'" id="city" spellcheck="true" autocomplete="off" placeholder="'. __('Insert the city') .'">
</div>';
}
// Save city custom field value
add_action( 'woocommerce_admin_process_product_object', 'save_product_city_meta_value' );
function save_product_city_meta_value( $product ) {
if( isset($_POST['city']) ) {
$product->update_meta_data( 'city', sanitize_text_field( $_POST['city'] ) );
}
}
// Display city value on frontend products loop
add_action( 'woocommerce_after_shop_loop_item', 'action_woocommerce_after_shop_loop_item', 10, 0 );
function action_woocommerce_after_shop_loop_item() {
global $product;
$city = $product->get_meta('city');
if ( $city ) {
echo '<p class="city">'. $city .'</p>';
}
}
代码进入您的活动子主题(或活动主题)的 functions.php 文件。已测试并有效。