CMB2: пользовательские повторяемые поля появляются шесть раз каждое и не сохраняются - PullRequest
0 голосов
/ 31 октября 2018

Я пытаюсь развернуть несколько настраиваемых повторяющихся полей, телефона и мобильного телефона. Каждое поле имеет несколько входов (код страны, код города (для телефона), номер и добавочные номера (для телефона)). Эти поля будут идти вместе с некоторыми другими как часть набора «контакты», которые входят в групповые поля. Итак, повторяемое пользовательское поле в поле группы.

В существующем классе, который я использовал для возврата значений из определенных CPT, и на основе примера типа поля адреса в США, предоставленного разработчиками CMB2 (что, честно говоря, я не смог добраться до работы - он не смог сказать, что не может найти класс CMB2_Type_Base) Я включил следующее для рендеринга, очистки и экранирования таких полей:

class cmb2Opciones
{
    public function __construct()
    {
        add_action( 'cmb2_sanitize_fijos', array( $this, 'cmb2_sanitize_telefonos_callback' ), 10, 5 );
        add_action( 'cmb2_sanitize_celulares', array( $this, 'cmb2_sanitize_telefonos_callback' ), 10, 5 );
        add_action( 'cmb2_types_esc_fijos', array( $this, 'cmb2_escape_telefonos_callback' ), 10, 4 );
        add_action( 'cmb2_types_esc_celulares', array( $this, 'cmb2_escape_telefonos_callback' ), 10, 4 );
        add_action( 'cmb2_render_fijos', array( $this, 'cmb2_render_fijos_callback' ), 10, 5 );
        add_action( 'cmb2_render_celulares', array( $this, 'cmb2_render_celulares_callback' ), 10, 5 );
    }

    public function cmb2_escape_telefonos_callback( $check, $meta_value, $field_args, $field_object )
    {
        if ( ! is_array( $meta_value ) || ! $field_args['repeatable'] )
        {
            return $check;
        }

        foreach ( $meta_value as $key => $val )
        {
            if ( empty ( implode ( '', $val )))
            {
                unset ( $meta_value[$key] );
            }

            else
            {
                $meta_value[ $key ] = esc_attr ( $val );
            }
        }

        return array_filter( $meta_value );
    }

    public function cmb2_sanitize_telefonos_callback( $check, $meta_value, $object_id, $field_args, $sanitize_object )
    {
        if ( ! is_array( $meta_value ) || ! $field_args['repeatable'] )
        {
            return $check;
        }

        foreach ( $meta_value as $key => $val )
        {
            $meta_value[ $key ] = array_filter( array_map( 'sanitize_text_field', $val ) );
            }

        return array_filter( $meta_value );
    }

    public function cmb2_render_fijos_callback( $field, $escaped_value, $object_id, $object_type, $field_type )
    {
        $escaped_value = wp_parse_args( $escaped_value, array(
            'fijo_pais' => '',
            'fijo_area' => '',
            'fijo_numero' => '',
            'fijo_extension' => '',
        ));

        $output  = '<div style="overflow:hidden">';
        $output .= '<div class="alignleft" style="width:4em">';
        $output .= $field_type->input( array(
            'name'  => $field_type->_name( '[fijo_pais]' ),
            'id'  => $field_type->_id( '_fijo_pais' ),
            'value'  => $escaped_value['fijo_pais'],
            'type' => 'number',
        ));
        $output .= '</div>';
        $output .= '<div class="alignleft" style="width:3em">';
        $output .= $field_type->input( array(
            'name'  => $field_type->_name( '[fijo_area]' ),
            'id'  => $field_type->_id( '_fijo_area' ),
            'value'  => $escaped_value['fijo_area'],
            'type' => 'number',
        ));
        $output .= '</div>';
        $output .= '<div class="alignleft" style="width:calc(100% - 25em)">';
        $output .= $field_type->input( array(
            'name'  => $field_type->_name( '[fijo_numero]' ),
            'id'  => $field_type->_id( '_fijo_numero' ),
            'value'  => $escaped_value['fijo_numero'],
            'type' => 'number',
        ));
        $output .= '</div>';
        $output .= '<div class="alignleft" style="width:15em">';
        $output .= $field_type->input( array(
            'name'  => $field_type->_name( '[fijo_extension]' ),
            'id'  => $field_type->_id( '_fijo_extension' ),
            'value'  => $escaped_value['fijo_extension'],
            'type' => 'text',
        ));
        $output .= '</div></div>';

        echo $output;
        echo $field_type->_desc( true );
    }

    public function cmb2_render_celulares_callback( $field, $escaped_value, $object_id, $object_type, $field_type )
    {
        $escaped_value = wp_parse_args( $escaped_value, array(
            'celular_pais' => '',
            'celular_numero' => '',
        ));

        $output  = '<div style="overflow:hidden">';
        $output .= '<div class="alignleft" style="width:4em">';
        $output .= $field_type->input( array(
            'name'  => $field_type->_name( '[celular_pais]' ),
            'id'  => $field_type->_id( '_celular_pais' ),
            'value'  => $escaped_value['celular_pais'],
            'type' => 'number',
        ));
        $output .= '</div>';
        $output .= '<div class="alignleft" style="width:calc(100% - 5em)">';
        $output .= $field_type->input( array(
            'name'  => $field_type->_name( '[celular_numero]' ),
            'id'  => $field_type->_id( '_celular_numero' ),
            'value'  => $escaped_value['celular_numero'],
            'type' => 'number',
        ));
        $output .= '</div></div>';

        echo $output;
        echo $field_type->_desc( true );
    }

// Other non-related CMB2 functions...
}

И для инициализации я сделал следующее:

global $cmb2; // This is calling an instance of "cmb2Opciones", created at init

$box->add_group_field( $group, array(
    'name' => __('Teléfono fijo', 'uniagraria'),
    'id' => $prefix . 'contactos_fijos',
    'type' => 'fijos',
    'repeatable' => true,
    'sanitization_cb' => array( $cmb2, 'cmb2_sanitize_telefonos' ),
    'escape_cb' => array( $cmb2, 'cmb2_escape_telefonos' ),
    'text' => array(
        'add_row_text' => __('Agregar otro teléfono fijo', 'uniagraria'),
    ),
));

$box->add_group_field( $group, array(
    'name' => __('Celular', 'uniagraria'),
    'id' => $prefix . 'contactos_celulares',
    'type' => 'celulares',
    'repeatable' => true,
    'sanitization_cb' => array( $cmb2, 'cmb2_sanitize_telefonos' ),
    'escape_cb' => array( $cmb2, 'cmb2_escape_telefonos' ),
    'text' => array(
        'add_row_text' => __('Agregar otro celular', 'uniagraria'),
    ),
));

Проблема в том, что для каждого повторяемого поля оно показывает 6 раз пользовательское поле, и если я заполню строку, оно просто не сохранится только потому, что сеть волшебна и чудесна:

Fields shown on Wordpress backend

Я не уверен, что я что-то не так делаю или это какая-то ошибка, потому что я помню, что в CMB2 было несколько исправлений, чтобы сделать его более удобным для повторения в поле. Тем не менее, я буду рад, если кто-то может указать мне на то, что происходит.

...