Добавляйте настраиваемые текстовые поля, сохраняйте их значения и отображайте их на страницах продуктов Woocommerce. - PullRequest
0 голосов
/ 05 сентября 2018

Я пытаюсь сделать следующее: добавить как минимум 3 пользовательских текстовых поля на странице продукта, чтобы показать их все вместе или только одно или два при сохранении. Я безуспешно пытался следующий кусок кода. Данные не будут сохранены и не показаны, конечно. :(

Где я не прав?

Я попытался достичь своей цели, смешав несколько фрагментов:

// Display Fields
add_action( 'woocommerce_product_options_general_product_data', 'woo_add_custom_general_fields' );

// Save 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">';

    // Text Field #1
    woocommerce_wp_text_input( 
        array( 
            'id'          => '_text_field_1', 
            'label'       => __( 'Campo aggiuntivo #1', 'woocommerce' ), 
        )
    );

    // Text Field #2
    woocommerce_wp_text_input( 
        array( 
            'id'          => '_text_field_2', 
            'label'       => __( 'Campo aggiuntivo #2', 'woocommerce' ), 
        )
    );

    // Text Field #3
    woocommerce_wp_text_input( 
        array( 
            'id'          => '_text_field_3', 
            'label'       => __( 'Campo aggiuntivo #3', 'woocommerce' ), 
        )
    );

    echo '</div>';

}

///

function woocommerce_product_custom_fields_save($post_id){

    $woocommerce_custom_product_text_field_1 = $_POST['_text_field_1'];
    if (!empty($woocommerce_custom_product_text_field))
        update_post_meta($post_id, '_custom_product_text_field_1', esc_attr($woocommerce_custom_product_text_field_1));

    $woocommerce_custom_product_text_field_2 = $_POST['_text_field_2'];
    if (!empty($woocommerce_custom_product_number_field))
        update_post_meta($post_id, '_custom_product_text_field_2', esc_attr($woocommerce_custom_product_text_field_2));

    $woocommerce_custom_product_text_field_3 = $_POST['_text_field_3'];
    if (!empty($woocommerce_custom_procut_textarea))
        update_post_meta($post_id, '_custom_product_text_field_3', esc_html($woocommerce_custom_product_text_field_3));
 }

///

add_action( 'woocommerce_before_single_product', 'custom_action', 15 );

function custom_action() {
    // Display Custom Field Value
    echo get_post_meta($post->ID, '_custom_product_text_field_1', true);
    echo get_post_meta($post->ID, '_custom_product_text_field_2', true);
    echo get_post_meta($post->ID, '_custom_product_text_field_3', true);
}

1 Ответ

0 голосов
/ 05 сентября 2018

Я немного пересмотрел ваш код ... Попробуйте следующее:

// Admin: Add product custom text fields
add_action( 'woocommerce_product_options_general_product_data', 'add_custom_general_settings_fields' );
function add_custom_general_settings_fields() {

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

    woocommerce_wp_text_input( array(
        'id'          => '_text_field_1',
        'label'       => __( 'Campo aggiuntivo #1', 'woocommerce' ),
    ) );

    woocommerce_wp_text_input( array(
        'id'          => '_text_field_2',
        'label'       => __( 'Campo aggiuntivo #2', 'woocommerce' ),
    ) );

    woocommerce_wp_text_input( array(
        'id'          => '_text_field_3',
        'label'       => __( 'Campo aggiuntivo #3', 'woocommerce' ),
    ) );

    echo '</div>';
}

// Admin: Save product custom text fields values
add_action( 'woocommerce_process_product_meta', 'save_custom_general_settings_fields_values', 20, 1 );
function save_custom_general_settings_fields_values($post_id){
    if ( isset($_POST['_text_field_1']) )
        update_post_meta( $post_id, '_text_field_1', sanitize_text_field($_POST['_text_field_1']) );

    if ( isset($_POST['_text_field_2']) )
        update_post_meta( $post_id, '_text_field_2', sanitize_text_field($_POST['_text_field_2']) );

    if ( isset($_POST['_text_field_3']) )
        update_post_meta( $post_id, '_text_field_3', sanitize_text_field($_POST['_text_field_3']) );
 }


// Frontend: Display custom fields values in single product pages
add_action( 'woocommerce_before_single_product', 'display_custom_fields', 15 );
function display_custom_fields() {
    global $product;

    $fields_values = array(); // Initializing

    if( $text_field_1 = $product->get_meta('_text_field_1') )
        $fields_values[] = $text_field_1; // Set the value in the array

    if( $text_field_2 = $product->get_meta('_text_field_2') )
        $fields_values[] = $text_field_2; // Set the value in the array

    if( $text_field_3 = $product->get_meta('_text_field_3') )
        $fields_values[] = $text_field_3; // Set the value in the array

    // If the array of values is not empty
    if( sizeof( $fields_values ) > 0 ){

        echo '<div>';

        // Loop through each existing custom field value
        foreach( $fields_values as $key => $value ) {
            echo '<p>' . $value . '</p>';
        }

        echo '</div>';

    }
}

Код помещается в файл function.php вашей активной дочерней темы (или активной темы). Проверено и работает.

Но использование woocommerce_before_single_product крюка не кажется лучшим, так как эти значения настраиваемых полей отображаются над изображением продукта.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...