Cómo hacer que un campo de meta box sea un requisito

2

Estoy creando un plugin que tiene un meta box. Algunos de los campos en el cuadro meta son obligatorios. ¿Es el uso de Jquery el único método para lograr esto? ¿Puedo solicitar que se complete un campo usando php?

Gracias.

    
pregunta mattnewbie 22.04.2013 - 19:18

3 respuestas

5

Puede usar Javascript para crear una advertencia de conveniencia de primera línea, pero esa no es una solución segura. Deberá interrumpir el guardado de la publicación para crear un campo obligatorio.

function req_meta_wpse_96762($data){
  $allow_pending = false;
  if (isset($_POST['meta'])) {
    foreach ($_POST['meta'] as $v) {
      if ('your_required_key' === $v['key'] && !empty($v['value'])) {
        $allow_pending = true;
      }
    }
  }
  if (false === $allow_pending) {
    $data['post_status'] = 'draft';
  }
  return $data;
}
add_action('wp_insert_post_data','req_meta_wpse_96762');

Eso también restablecerá la publicación a 'Borrador' si se elimina el campo meta.

    
respondido por el s_ha_dum 22.04.2013 - 19:50
1

No hay manera de requerir entrada por PHP. Solo el navegador puede hacer eso, y el navegador obtiene el resultado después de que se realiza PHP.

Puedes agregar el atributo required :

<input name=foo required>

Pero no todos los navegadores lo admiten, y debe verificar el valor que aún se encuentra en su controlador de validación.

    
respondido por el fuxia 22.04.2013 - 19:22
0

Sé que esta es una pregunta antigua, pero es el primer resultado en Google ... Aquí mis dos centavos:

Recuerda agregar todas las validaciones de los campos javascript antes.

Gracias a la respuesta de @s_ha_dum, este es mi método de validación de meta box personalizado:

        public static function validateMetaBoxesFields($postData, $postArray) {
        if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) {
            return $postData;
        }
        if (array_key_exists('post_type', $postData) && $postData['post_type'] === 'MY_POST_TYPE') {
            if (array_key_exists('post_status', $postData) && $postData['post_status'] === 'publish') {
                $valid = true;
                // Check meta box fields (in $postArray) if something not valid, set $valid to false;
                if (!$valid) {
                    $postData['post_status'] = 'draft';
                    add_filter('redirect_post_location', array (self::class, 'alterRedirectMessageOnEventSave'));
                }
            }
        }
        return $postData;
    }

Añadir filtro:

add_filter('wp_insert_post_data', array (EventsPostTypeService::class, 'validateMetaBoxesFields'), 99, 2);

Debido a que WordPress está mostrando un mensaje guardado, necesito filtrar la consulta de la ubicación de la publicación. Este es el método:

        public static function alterRedirectMessageOnEventSave($location) {
        $location = remove_query_arg('message', $location);
        // 550 or other number, @see wp-admin/edit-form-advanced.php L:146 - 183
        $location = add_query_arg('message', 550, $location);
        return $location;
    }

Y finalmente añadimos nuestro mensaje personalizado:

        public static function addCustomPostUpdateMessages($messages) {
        $messages['post'][550] = __('Post Type cannot be created due empty required fields: %s', 'my_text_domain');
        return $messages;
    }

% s puede ser reemplazado por un dato transitorio, o de otra manera que quiera guardar campos de meta box no válidos.

Recuerda agregar filtro:

add_filter('post_updated_messages', array (EventsPostTypeService::class, 'addCustomPostUpdateMessages'), 10, 1);
    
respondido por el Santiago Cerro López 19.08.2018 - 16:32

Lea otras preguntas en las etiquetas