php - producto - woocommerce custom product data fields
Agregar programáticamente una pestaña de configuración personalizada para administrar datos de productos en WooCommerce (1)
Actualizado en noviembre de 2017:
- Corregí algunos errores, limpié y agregué las opciones disponibles
- Se agregaron ''Usage'' y ''naming conventions'' para los slugs de campos personalizados, al final.
1) Usted crea una pestaña personalizada en la publicación personalizada tipo Metabox (aquí para "producto"),
2) a continuación, puede agregar campos para llenar esta pestaña, con diferentes tipos de campos (encontrará uno de cada tipo, por lo que este es un ejemplo muy completo).
Y finalmente encontrará una función que guarda los datos cuando se envía.
Aquí es lo que obtendrá visualmente (para los 6 tipos de campos personalizados diferentes):
Aquí está el código relacionado:
// Step 1 - Adding a custom tab to the Products Metabox
add_filter( ''woocommerce_product_data_tabs'', ''add_shipping_costs_product_data_tab'', 99 , 1 );
function add_shipping_costs_product_data_tab( $product_data_tabs ) {
$product_data_tabs[''shipping-costs''] = array(
''label'' => __( ''Shipping costs'', ''my_theme_domain'' ), // translatable
''target'' => ''shipping_costs_product_data'', // translatable
);
return $product_data_tabs;
}
// Step 2 - Adding and POPULATING (with data) custom fields in custom tab for Product Metabox
add_action( ''woocommerce_product_data_panels'', ''add_shipping_costs_product_data_fields'' );
function add_shipping_costs_product_data_fields() {
global $post;
$post_id = $post->ID;
echo ''<div id="shipping_costs_product_data" class="panel woocommerce_options_panel">'';
## THE 6 DIFFERENT FIELD TYPES
// Text imput field
// Text imput field
woocommerce_wp_text_input( array(
''id'' => ''_imput_text'',
// ''name'' => ''_imput_text'', // (optional) for different ID attribute than name attribute
// ''class'' => ''some-class'', // (optional)
// ''wrapper_class'' => ''show_if_simple'', // (optional) example here for simple products type only
''placeholder'' => __( ''Enter some data'', ''theme_domain'' ), // (optional)
''label'' => __( ''Imput text Label'', ''theme_domain'' ), // (optional)
''description'' => __( ''Imput text Description'', ''theme_domain'' ), // (optional)
''desc_tip'' => true, // (optional) To show the description as a tip
// ''data_type'' => '''', // (optional formatting options) can be ''price'', ''decimal'', ''stock'' or ''url''
// ''type'' => '''', // (optional additional custom attribute)
// ''value'' => $value, // (optional) for a static value (can be conditionally set for $value variable)
) );
// Textarea imput field
woocommerce_wp_textarea_input( array(
''id'' => ''_input_textarea'',
// ''name'' => ''input_textarea'', // (optional) for different ID attribute than name attribute
''class'' => ''widefat'', // (optional)
// ''style'' => '''' // (optional)
// ''wrapper_class'' => ''show_if_simple'', // (optional) example here for simple products type only
''placeholder'' => __( ''Enter some data'', ''theme_domain'' ), // (optional)
''label'' => __( ''Imput textarea Label'', ''theme_domain'' ),
''description'' => __( ''Imput textarea Description'', ''theme_domain'' ),
''desc_tip'' => true, // (optional) To show the description as a tip
// ''rows'' => 2, // (optional) defining number of rows
// ''cols'' => 20, // (optional) defining number of columns
// ''value'' => $value, // (optional) for a static value (can be conditionally set for $value variable)
) );
// Checkbox field
woocommerce_wp_checkbox( array(
''id'' => ''_input_checkbox'',
// ''name'' => ''input_checkbox'', // (optional) for different ID attribute than name attribute
// ''class'' => ''some-class'', // (optional)
// ''wrapper_class'' => ''show_if_simple'', // (optional) example here for simple products type only
''label'' => __( ''Imput checkbox Label'', ''theme_domain'' ),
''description'' => __( ''Imput checkbox Description'', ''theme_domain'' ),
''desc_tip'' => true, // (optional) To show the description as a tip
// ''cbvalue'' => ''yes'', // to make it selected by default
// ''value'' => $value, // (optional) for a static value (can be conditionally set for $value variable)
) );
// Radio Buttons field
woocommerce_wp_radio( array(
''id'' => ''_imput_radio'',
// ''name'' => ''input_radio'', // (optional) for different ID attribute than name attribute
// ''class'' => ''some-class'', // (optional)
// ''wrapper_class'' => ''show_if_simple'', // (optional) example here for simple products type only
''label'' => __('' '', ''my_theme_domain''),
''description'' => __( ''Imput Radio Description'', ''my_theme_domain'' ),
''desc_tip'' => true
''options'' => array(
''option_value_1'' => __(''Displayed option 1''),
''option_value_2'' => __(''Displayed option 2''),
''option_value_3'' => __(''Displayed option 3''),
),
// ''value'' => $value, // (optional) for a static value (can be conditionally set for $value variable)
) );
// Select field
woocommerce_wp_select( array(
''id'' => ''_select_field'',
// ''name'' => ''_select_field'', // (optional) for different ID attribute than name attribute
// ''wrapper_class'' => ''show_if_simple'', // (optional) example here for simple products type only
''label'' => __('' '', ''my_theme_domain''),
''description'' => __( ''Imput Radio Description'', ''my_theme_domain'' ),
''desc_tip'' => true
''options'' => array(
'''' => __(''Chose an option''), // Default empty value
''option_value_1'' => __(''Displayed option 1''),
''option_value_2'' => __(''Displayed option 2''),
''option_value_3'' => __(''Displayed option 3'')
),
// ''value'' => $value, // (optional) for a static value (can be conditionally set for $value variable)
) );
// Hidden imput field
woocommerce_wp_hidden_input( array(
''id'' => ''_hidden_input'',
// ''name'' => ''_hidden_input'', // (optional) for different ID attribute than name attribute
''class'' => ''some_class'',
// ''value'' => $value, // (optional) for a static value (can be conditionally set for $value variable)
) );
echo ''</div>'';
}
// Step 3 - Saving custom fields data of custom products tab metabox
add_action( ''woocommerce_process_product_meta'', ''shipping_costs_process_product_meta_fields_save'' );
function shipping_costs_process_product_meta_fields_save( $post_id ){
// save the text field data
if( isset( $_POST[''_imput_text''] ) )
update_post_meta( $post_id, ''_imput_text'', esc_attr( $_POST[''_imput_text''] ) ) );
// save the textarea field data
if( isset( $_POST[''_imput_textarea''] ) )
update_post_meta( $post_id, ''_imput_textarea'', esc_attr( $_POST[''_imput_textarea''] ) ) );
// save the checkbox field data
if( isset( $_POST[''_imput_checkbox''] ) )
update_post_meta( $post_id, ''_imput_checkbox'', esc_attr( $_POST[''_imput_checkbox''] ) ) );
// save the radio button field data
if( isset( $_POST[''_input_radio''] ) )
update_post_meta( $post_id, ''_input_radio'', esc_attr( $_POST[''_input_radio''] ) ) );
// save the selector field data
if( isset( $_POST[''_select_field''] ) )
update_post_meta( $post_id, ''_select_field'', esc_attr( $_POST[''_select_field''] ) ) );
// save the hidden imput data
if( isset( $_POST[''_hidden_input''] ) )
update_post_meta( $post_id, ''_hidden_input'', esc_attr( $_POST[''_hidden_input''] ) );
}
Naturalmente, esto va en el archivo function.php de su tema (o tema) hijo activo o en cualquier archivo de complemento.
Debe usar la misma ID de campo personalizada (nombres de slug) en los pasos 2 y 3.
Este código está probado y es completamente funcional
Puede agregar opciones personalizadas con CUALQUIER DATO, usando código personalizado, variables personalizadas o cualquier tipo de funciones en el Paso 2 .
Uso
Para obtener o recuperar los datos, utilizará la función
get_post_meta()
para una ID de publicación definida:
$custom_field_data = get_post_meta( $post_id, ''_custom_field_slug'', true );
Dónde:
$post_id
es la ID de publicación actual (del producto, orden, cupón ... post-tipos).custom_field_slug
es la ID (la babosa) de tu campo personalizado.true
ofalse
: si se devuelve un valor único (cadena de datos o matrices)Es el mismo proceso cada tipo de campo
Consejo: nombres de slug de campo personalizados (ID de campo personalizado)
Si no utiliza un carácter de subrayado (
_slug_name
) al comienzo de los nombres de slug de sus campos personalizados , estos aparecerán y serán accesibles para los usuarios autorizados en los campos personalizados Metabox, después de enviar los datos (botón Actualizar) .Vea esta captura de pantalla (aquí obtenemos
input_text
campo personalizado slug) :
Referencias
Quiero agregar mediante programación una pestaña de configuración al metabox de datos del producto de esta manera:
La pestaña "Verzendkosten" se agregó con Firebug (lo que significa "Costos de envío") .
¿Cómo agregaría programáticamente la pestaña personalizada "Verzendkosten" en la configuración de woocommerce edit-product pages?
(y ¿cómo podría llenarlo con datos?)