Показывать пользовательские поля под кнопкой "Добавить в корзину"

Я использую этот код функции для создания новой пользовательской текстовой области, но у меня есть проблема, чтобы показать его на странице продукта.

// Custom Field Product
add_action( 'woocommerce_product_options_general_product_data', 
'woo_add_custom_general_fields' );
add_action( 'woocommerce_process_product_meta', 
'woo_add_custom_general_fields_save' );

function woo_add_custom_general_fields() {

  global $woocommerce, $post;

  echo '<div class="options_group">';

  woocommerce_wp_textarea_input( 
    array( 
    'id'          => '_textarea', 
    'label'       => __( 'Custom Text:', 'woocommerce' ), 
    'placeholder' => '', 
    'description' => __( 'Enter the custom value here.', 'woocommerce' ) 
)
);

echo '</div>';

}

// Save Changes to DB

function woo_add_custom_general_fields_save( $post_id ){
 // Textarea
$woocommerce_textarea = $_POST['_textarea'];
if( !empty( $woocommerce_textarea ) )
    update_post_meta( $post_id, '_textarea', esc_html( $woocommerce_textarea 
) );
}

// Show data to product
add_action( 'woocommerce_after_add_to_cart_button', 
'custom_content_after_addtocart_button', 100 );
function custom_content_after_addtocart_button() {
// custom content.
echo get_post_meta( $post->ID, '_textarea', true );
}

Похоже, при нажатии сохранить, его данные хранятся в БД, но не отображаются на одной странице продукта. Может кто-нибудь сказать мне, где проблема в этой функции?

1 ответ

Решение

Проблема в том, что в следующем function, $post не определено. (Код был с отступом для ясности.)

// Show data to product
add_action( 'woocommerce_after_add_to_cart_button', 
'custom_content_after_addtocart_button', 100 );
function custom_content_after_addtocart_button() {
    // custom content.
    echo get_post_meta( $post->ID, '_textarea', true );
}

Таким образом, простое исправление было бы добавить global $post; к function:

// Show data to product
add_action( 'woocommerce_after_add_to_cart_button', 
'custom_content_after_addtocart_button', 100 );
function custom_content_after_addtocart_button() {
    global $post;

    // custom content.
    if ( $post ) {
        echo get_post_meta( $post->ID, '_textarea', true );
    }
}

Кроме того, вы можете использовать глобальный $product объект:

// Show data to product
add_action( 'woocommerce_after_add_to_cart_button', 
'custom_content_after_addtocart_button', 100 );
function custom_content_after_addtocart_button() {
    global $product;

    // custom content.
    if ( $product ) {
        echo get_post_meta( $product->get_id(), '_textarea', true );
    }
}
Другие вопросы по тегам