Я пытаюсь развернуть пару настраиваемых повторяющихся полей, телефона и мобильного телефона. Каждое поле имеет несколько входов (код страны, код города (для телефона), номер и добавочные номера (для телефона)). Эти поля будут идти вместе с некоторыми другими как часть набора «контакты», которые входят в групповые поля. Таким образом, повторяемое пользовательское поле в поле группы.
В существующем классе я использовал для возврата значений из определенных 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 раз настраиваемое поле, и если я заполню строку, оно просто не сохранится только потому, что сеть волшебная и замечательная:
Я не уверен, что я что-то не так делаю или это какая-то ошибка, потому что я вспоминаю, что в CMB2 было несколько исправлений, чтобы сделать его более удобным для повторения полей. Тем не менее, я буду рад, если кто-то может указать мне на то, что происходит.
Задача ещё не решена.
Других решений пока нет …