добавить выбранное значение woocommerce optgroup, чтобы отправить заказ администратора по электронной почте - PullRequest
0 голосов
/ 29 мая 2020
• 1000

Код получен из: " WooCommerce Select Dropdown With Optgroup On Checkout "

Что мне нужно: я создаю веб-сайт, где мне нужно добавить вручную несколько областей на странице оформления заказа, чтобы пользователь мог выбрать свою область, чтобы я мог использовать ее в качестве проверки и способа ограничить доставку, после выбора области мне нужно иметь возможность видеть это в заказе по электронной почте в том порядке, который в зонах Woocommerce не подходит в моем случае:

    <?php
  add_action('woocommerce_before_order_notes', 'custom_checkout_select_field_with_optgroup', 10, 1 );
function custom_checkout_select_field_with_optgroup( $checkout ) {

$domain  = 'woocommerce';
$title   = __("zona", $domain);
$slug    = zone_limit;
$default = __("Selecione su Zona", $domain);
$value   = $checkout->get_value($slug);

// Region option data array with optgroup
$options = array(
    __("North zone", $domain) => array(
        'region1' => __("Region 1", $domain),
        'region2' => __("Region 2", $domain),
    ),
    __("South zone", $domain) => array(
        'region3' => __("Region 3", $domain),
        'region4' => __("Region 4", $domain),
    )
      __("Middle zone", $domain) => array(
        'region3' => __("Region 5", $domain),
        'region4' => __("Region 6", $domain),
    )
);

// The field
echo '<p class="form-row form-row-wide '.$slug.'-dropdown" id="'.$slug.'_field" data-priority="">
<label for="'.$slug.'" class="">'.$title.'</label>
<span class="woocommerce-input-wrapper">
<select name="'.$slug.'" id="'.$slug.'" class="select " data-placeholder="" autocomplete="'.$slug.'">
<option value="">'.$default.'</option>';

// Loop through "optgroup"
foreach( $options as $optgroup_label => $optgroup_options ) {
    echo '<optgroup label="'.$optgroup_label.'">';
    // Loop through "options" in the "optgroup"
    foreach( $optgroup_options as $key => $label ) {
        $selected = $value === $key ? ' selected="selected"': '';
        echo '<option value="'.$key.'"'.$selected.'>'.$label.'</option>';
    }
    echo '</optgroup>';
}

echo '</select></span></p>';

}

Я пробовал, но не повезло

add_filter( 'woocommerce_email_order_meta_fields', 'custom_woocommerce_email_order_meta_fields', 10, 3 );

 function custom_woocommerce_email_order_meta_fields( $fields, $sent_to_admin, $order ) {
$fields['meta_key'] = array(
    'label' => __( 'Label' ),
    'value' => get_post_meta( $order->id, 'meta_key', true ),
);
return $fields;
 }


  add_filter('woocommerce_email_order_meta_keys', 'my_custom_order_meta_keys');

     function my_custom_order_meta_keys( $keys ) {

    $keys[] = $value ; // This will look for a custom field called 'Tracking Code' and add it to emails
 return $keys;
}


add_action( 'woocommerce_checkout_update_order_meta', 'my_custom_checkout_field_update_order_meta' );

 function my_custom_checkout_field_update_order_meta( $order_id ) {
if ( ! empty( $_POST[$value ] ) ) {
    update_post_meta( $order_id, 'region', sanitize_text_field( $_POST[$value ] ) );
}


}

1 Ответ

0 голосов
/ 29 мая 2020

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

php было в порядке, я просто мог получить его по электронной почте, плюс мне нужна была optgroup.

Я сделал что-то еще, я просто использовал jquery вместо полного php, я создал поле текстового типа и получил его для отправки ответа по электронной почте, затем я создал модальное окно вручную (не хотел использовать bootstrap), затем обычный html для optgroup и используйте jquery, чтобы получить выбранное значение и вставить в текстовое поле. вот мой код.

html - это базовый c, который вы можете найти здесь

И css вы можете использовать это в качестве примера, тогда бот css и html необходимо будет изменить по мере необходимости

php

add_action( 'woocommerce_after_order_notes', 'my_custom_checkout_field' );

 function my_custom_checkout_field( $checkout ) {

echo '<div id="myZoneLimit"><h2>' . __('valida tu zona') . '</h2>';

 woocommerce_form_field( 'my_field_limit', array(
    'type'          => 'text',
    'class'         => array('my-field-class form-row-wide'),
    'label'         => __('Fill in this field'),
    'placeholder'   => __('Enter something'),
    ), $checkout->get_value( 'my_field_limit' ));

echo '</div>';

  }


  add_action('woocommerce_checkout_process', 'my_custom_checkout_field_process');

   function my_custom_checkout_field_process() {
  // Check if set, if its not set add an error.
   if ( ! $_POST['my_field_limit'] )


    wc_add_notice( __( 'Por favor seleccione su zona de envio.' ), 'error' );
   }

  add_filter('woocommerce_email_order_meta_keys', 'my_custom_order_meta_keys');

   function my_custom_order_meta_keys( $keys ) {
 $keys[] = 'valida tu zona'; // This will look for a custom field called 'Tracking Code' and add it to emails
 return $keys;
    }


     add_action( 'woocommerce_checkout_update_order_meta', 
   'my_custom_checkout_field_update_order_meta' );

  function my_custom_checkout_field_update_order_meta( $order_id ) {
if ( ! empty( $_POST['my_field_limit'] ) ) {
    update_post_meta( $order_id, 'valida tu zona', sanitize_text_field( $_POST['my_field_limit'] ) );
}
     }

 add_action( 'woocommerce_admin_order_data_after_billing_address','my_custom_checkout_field_display_admin_order_meta', 10, 1 );

      function my_custom_checkout_field_display_admin_order_meta($order){
      echo '<p><strong>'.__('valida tu zona').':</strong> ' . get_post_meta( $order->id, 'valida tu zona', true ) . '</p>';

My jquery

    /// button that opens the modal that was created the html
  $("#my_field_limit").click(function(){
   $("#myModalarea").show();
    });

       //// get the value from the selected option and place in into the the text field
       $('#coveredareas').change(function(){
        var areazone = $(this).val();
        $("#my_field_limit").val(areazone);
...