Создание пользовательского метода доставки Woocommerce в качестве поля выбора - PullRequest
0 голосов
/ 07 февраля 2020

Я работаю с плагином WooCommerce для WordPress. Моя главная цель сейчас - создать собственный способ доставки. До сих пор мне удалось создать этот метод и отобразить его в моей платежной форме. Проблема в том, что эти методы доставки по умолчанию установлены, и мне нужна дополнительная функциональность: отобразить выбор с рядом опций, как только я выберу этот пользовательский метод доставки в форме заказа на оплату.

Этот следующий класс обрабатывает пользовательский метод доставки:

/**
 * WC_Shipping_Pickup class.
 *
 * @class       WC_Shipping_Pickup
 * @version     1.0.0
 * @package     Shipping-for-WooCommerce/Classes
 * @category    Class
 * @author      Pickup Softwares
 */
class WC_Shipping_Pickup extends WC_Shipping_Method
{
    public function __construct($instance_id = 0)
    {
        $this->id                    = 'pickup_method';
        $this->instance_id           = absint($instance_id);
        $this->method_title          = __('Pickup');
        $this->method_description    = __('Método de envío: punto de pickup');
        $this->supports              = array(
            'shipping-zones',
            'instance-settings',
        );

        $this->instance_form_fields = array(
            'enabled' => array(
                'title'         => __('Habilitar/Deshabilitar'),
                'type'          => 'checkbox',
                'label'         => __('Habilitar este método de envío'),
                'default'       => 'yes',
            ),
            'title' => array(
                'title'         => __('Título'),
                'type'          => 'text',
                'description'   => __('Título que se visualizará en el formulario de facturación'),
                'default'       => __('Pickup'),
                'desc_tip'      => true
            )
        );

        $this->enabled              = $this->get_option('enabled');
        $this->title                = $this->get_option('title');

        add_action('woocommerce_update_options_shipping_' . $this->id, array( $this, 'process_admin_options' ));
    }

    public function calculate_shipping($package = array())
    {
        $this->add_rate(array(
            'id'    => $this->id . $this->instance_id,
            'label' => $this->title,
            'cost'  => 0,
        ));
    }

    /**
     * Generate Select HTML.
     *
     * @param string $key Field key.
     * @param array  $data Field data.
     * @since  1.0.0
     * @return string
     */
    public function generate_select_html()
    {
        $token = null;
        $expire = null;
        $token = qk_login($token, $expire);

        $agencies = qk_agencies($token);

        $field_key = $this->get_field_key('_pickups');

        $options = [];
        foreach ($agencies as $agency) {
            $options[$agency->id] = $agency->detalle;
        }

        $defaults  = array(
            'title'             => 'Pickups',
            'disabled'          => false,
            'class'             => '',
            'css'               => '',
            'placeholder'       => 'Seleccionar punto de recogida',
            'type'              => 'text',
            'desc_tip'          => false,
            'description'       => '',
            'custom_attributes' => array(),
            'options'           => $options,
        );

        $data = wp_parse_args($data, $defaults);

        ob_start(); ?>
        <tr valign="top">
            <th scope="row" class="titledesc">
                <label for="<?php echo esc_attr($field_key); ?>"><?php echo wp_kses_post($data['title']); ?> <?php echo $this->get_tooltip_html($data); // WPCS: XSS ok.?></label>
            </th>
            <td class="forminp">
                <fieldset>
                    <legend class="screen-reader-text"><span><?php echo wp_kses_post($data['title']); ?></span></legend>
                    <select class="select <?php echo esc_attr($data['class']); ?>" name="<?php echo esc_attr($field_key); ?>" id="<?php echo esc_attr($field_key); ?>" style="<?php echo esc_attr($data['css']); ?>" <?php disabled($data['disabled'], true); ?> <?php echo $this->get_custom_attribute_html($data); // WPCS: XSS ok.?>>
                        <?php foreach ((array) $data['options'] as $option_key => $option_value) : ?>
                            <option value="<?php echo esc_attr($option_key); ?>" <?php selected((string) $option_key, esc_attr($this->get_option($key))); ?>><?php echo esc_attr($option_value); ?></option>
                        <?php endforeach; ?>
                    </select>
                    <?php echo $this->get_description_html($data); // WPCS: XSS ok.?>
                </fieldset>
            </td>
        </tr>
        <?php

        return ob_get_clean();
    }
}

Я пытался использовать эту функцию generate_select_html для генерации этого выбора, но на самом деле я бегу с закрытыми глазами, потому что я не знаю, если это это правильный способ делать вещи. Этот фрагмент кода вызывает бесконечную загрузку страницы в форме биллинга, поэтому он ошибочен (явно). Есть ли способ добиться того, чего я хочу?

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