Сохранение разрывов пользовательских строк в пользовательской текстовой области в woocommerce - PullRequest
1 голос
/ 16 января 2020

Мне удалось добавить настраиваемую текстовую область к данным продукта woocommerce, где мой клиент может добавить в список комплектов, который выводится в список упаковки для цеха, но разрывы строк не сохраняются, а вывод поток текста, который облегчает восприятие парней. Это то, что у меня есть, но где и как я могу сохранить разрывы строк, добавленные в наборе администратора, для вывода на упаковочном листе:

//General Fields
add_action( 'woocommerce_product_options_general_product_data', 'woo_add_custom_general_fields',10,3 
);
add_action( 'woocommerce_process_product_meta', 'woo_add_custom_general_fields_save',10,2 );
//variable data
add_action('woocommerce_product_after_variable_attributes', 'variation_settings_fields', 10, 3);
add_action('woocommerce_save_product_variation','save_variation_settings_fields',10, 2);

//data tab

add_action( 'woocommerce_product_data_panels', 'add_my_custom_product_data_fields',10,3 );
add_action( 'woocommerce_process_product_meta','woocommerce_process_product_meta_fields_save',10,2 );
function woo_add_custom_general_fields() {

global $woocommerce, $post;

// Textarea
woocommerce_wp_textarea_input(
  array(
    'id'          => '_textarea[' . $post->ID . ']',
    'label'       => __( 'Kit List', 'woocommerce' ),
    'placeholder' => '',
    'description' => __( 'Enter the kit list here.', 'woocommerce' ),
    'value'       => get_post_meta( $post->ID, '_textarea', true ),
  )
);
 }

function woo_add_custom_general_fields_save( $post_id ){


// Textarea
$textarea = $_POST['_textarea'][ $post_id ];
if( ! empty( $textarea ) ) {
update_post_meta( $post_id, '_textarea', esc_attr( $textarea ) );
}

}



function variation_settings_fields($loop, $variation_data, $variation){

// Textarea
woocommerce_wp_textarea_input(
  array(
    'id'          => '_textarea[' . $variation->ID . ']',
    'label'       => __( 'Kit List', 'woocommerce' ),
    'placeholder' => '',
    'description' => __( 'Enter the kit list here.', 'woocommerce' ),
    'value'       => get_post_meta( $variation->ID, '_textarea', true ),
  )
);
}
function save_variation_settings_fields($post_id){

// Textarea
 $textarea = $_POST['_textarea'][ $post_id ];
if( ! empty( $textarea ) ) {
update_post_meta( $post_id, '_textarea', esc_attr( $textarea ) );
}


}
add_action( 'wpo_wcpdf_after_item_meta', 'wpo_wcpdf_product_custom_field', 10, 3 );
function wpo_wcpdf_product_custom_field ( $template_type, $item, $order ) {
if ( $template_type == 'packing-slip' ) {
   // check if product exists first
    if (empty($item['product'])) return;

    // replace 'Location' with your custom field name!
    $field_name = '_textarea';
    $textarea = method_exists($item['product'], 'get_meta') ? $item['product']
    ->get_meta($field_name,true,'edit') : get_post_meta( $item['product']->id, $field_name, true );
    if (!empty($textarea)) {
        echo nl2br('Kit List: '.$textarea.'');  
    }
     }
    }

1 Ответ

0 голосов
/ 04 марта 2020

Эта проблема в функции wc_clean - она ​​использовалась для получения значения и всегда использовала _sanitize_text_fields( $str, false ), поэтому независимо от типа поля woo удаляет завершающие символы :( См. Трассировку ниже:

В любой ситуации ( Нужно дополнительное поле в адресе ), я нашел его в адресе редактирования формы.

#/wp-content/plugins/woocommerce/templates/myaccount/form-edit-address.php:38

woocommerce_form_field( $key, $field, wc_get_post_data_by_key( $key, $field['value'] ) );

, где wc_get_post_data_by_key функция возвращает очищенные данные wc_clean

#/wp-content/plugins/woocommerce/includes/wc-core-functions.php:2005

return wc_clean( wp_unslash( wc_get_var( $_POST[ $key ], $default ) ) ); // @codingStandardsIgnoreLine

которые используют сатинированный текст

#/wp-content/plugins/woocommerce/includes/wc-formatting-functions.php:392

return is_scalar( $var ) ? sanitize_text_field( $var ) : $var;

, где не установлено keep_newlines (по умолчанию это false):

#WordPress/wp-includes/formatting.php:5244

$filtered = _sanitize_text_fields( $str, false );

Таким образом, нет разрывов строк во всех полученных данных любого типа с помощью функции wc_get_post_data_by_key()

#WordPress/wp-includes/formatting.php:5317

if ( ! $keep_newlines ) {
    $filtered = preg_replace( '/[\r\n\t ]+/', ' ', $filtered );
}

Решение (?)

решение является кардинальным - оставьте разрывы строк для всех текстовых полей, подобных sanitize_textarea_field ():


add_filter( 'sanitize_text_field',  function ( $filtered, $str ) {
        return _sanitize_text_fields( $str, true );
    }
, 10, 2 );


...