#wordpress #woocommerce
#wordpress #woocommerce
Вопрос:
Я пытаюсь создать функцию для woocommerce и хочу сохранить эти данные в моем wp_option.
function custom_before_price() {
$args = array(
'id' => 'custom_before_price_table1',
'label' => __( 'Before Price', 'cbp1' ),
'class' => 'cbp-custom-field',
'desc_tip' => true,
'description' => __( 'Enter the text before price.', 'cbpdes' ),
);
woocommerce_wp_text_input( $args );
}
add_action( 'woocommerce_product_options_general_product_data', 'custom_before_price' );
Ответ №1:
Вы должны использовать add_option().что-то вроде этого
add_option( string $option, mixed $value = '', string $deprecated = '', string|bool $autoload = 'yes' )
Ответ №2:
function custom_before_price() {
$args = array(
'id' => 'custom_price',
'label' => __( 'Custom Price', 'cprice' ),
'data_type' => 'text', // Let WooCommerce formats our field as price field
'description' => __( 'Enter the text before price.', 'cprice' ),
);
woocommerce_wp_text_input( $args );
}
add_action( 'woocommerce_product_options_general_product_data', 'custom_before_price' );
/**
* Save custom meta
**/
add_action( 'woocommerce_process_product_meta', 'save_custom_field' );
function save_custom_field( $post_id ) {
/* Get Value */
$custom_field_value = isset( $_POST['custom_price'] ) ? $_POST['custom_price'] : '';
/* Save to _options table (requested answer) */
$option_name = $post_id.'-custom-price';
add_option( $option_name, $custom_field_value );
/* its updates in wp_option also*/
update_option( $option_name ,$custom_field_value );
/* Save to postmeta table (normal for woocommerce) */
$product = wc_get_product( $post_id );
$product->update_meta_data( 'custom_price', $custom_field_value );
$product->save();
}
Комментарии:
1. Соглашение stackoverflow заключается в том, чтобы уточнить предложенный ответ, предложив отредактировать или предложить обратную связь в комментариях, а затем принять ответ и не создавать несколько почти идентичных ответов.
Ответ №3:
Сохранение значений в таблицу wp_options не является обычным поведением WooCommerce. WooCommerce сохраняет мету продукта в wp_postmeta. Существует множество возможных недостатков хранения данных о конкретных продуктах в wp_options. В частности, если вам нужно вернуть данные в редактор администратора продукта из wp_options, вам нужно будет поработать над методом для этого, поскольку WooCommerce обращается к wp_postmeta за пользовательской метой.
Следующий набор функций создаст ваш пользовательский ввод и сохранит значение при обновлении продукта с помощью WP Admin.
/**
* Create custom meta
**/
function custom_before_price() {
$args = array(
'id' => 'custom_price',
'label' => __( 'Custom Price', 'cprice' ),
'data_type' => 'text', // Let WooCommerce formats our field as price field
'description' => __( 'Enter the text before price.', 'cprice' ),
);
woocommerce_wp_text_input( $args );
}
add_action( 'woocommerce_product_options_general_product_data', 'custom_before_price' );
/**
* Save custom meta
**/
add_action( 'woocommerce_process_product_meta', 'save_custom_field' );
function save_custom_field( $post_id ) {
global $wpdb;
/* Get Value */
$custom_field_value = isset( $_POST['custom_price'] ) ? $_POST['custom_price'] : '';
/* Save to _options table (requested answer) */
$option_name = $post_id.'-custom-price';
$wpdb->replace(
'wp_options',
array(
'option_name' => $option_name,
'option_value' => $custom_field_value,
),
array(
'%s',
'%s',
)
);
/* Save to postmeta table (normal for woocommerce) */
$product = wc_get_product( $post_id );
$product->update_meta_data( 'custom_price', $custom_field_value );
$product->save();
}
Комментарии:
1. вы правы, Джеймс, он работает нормально, но только один раз, когда wp_option не обновляется, он просто сохраняет только первое значение, и после этого он никогда не обновляется, но когда я увидел, что wp_postmeta хранит и обновляет его там.
2. Функция add_option() не обновляет существующие строки. Я отредактировал вышесказанное, чтобы использовать $wpdb-> replace(), который заменит значение или вставит значение. Я не тестировал правку, дайте мне знать, если у вас возникнут проблемы!