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

Самый простой способ — добавить валидацию через JavaScript с помощью плагина jQuery Validate. Вот базовое руководство:
Рядом с вызовом add_meta_box подключите плагин jQuery Validate и JS-файл для вашего скрипта:
add_action('admin_enqueue_scripts', 'add_my_js');
function add_my_js(){
wp_enqueue_script('my_validate', 'path/to/jquery.validate.min.js', array('jquery'));
wp_enqueue_script('my_script_js', 'path/to/my_script.js');
}
Затем в файле my_script.js добавьте следующий код:
jQuery().ready(function() {
jQuery("#post").validate();
});
Это включит валидацию для формы записи. Далее, в функции обратного вызова add_meta_box, где вы определяете пользовательские поля, добавьте класс "required" для каждого поля, которое нужно валидировать:
<input type="text" name="my_custom_text_field" class="required"/>
Все поля с классом "required" будут проверяться при сохранении/публикации/обновлении записи. Все остальные параметры валидации (правила, стили ошибок и т. д.) можно настроить в функции document.ready в файле my_script.js — подробности смотрите в документации jQuery Validate.

Спасибо, я попробую это завтра, но не могли бы вы объяснить, как делать различные проверки. Например, проверку корректности email-адреса, проверку на то, что введено не больше или не меньше XX символов, что поле формы заполнено... такие вещи?

Также, происходит ли эта проверка до сохранения/обновления записи? Если нет, то как это можно сделать?

Примеры и документация для плагина jQuery Validation (ссылка в моем ответе) покажут вам, как делать все эти проверки. По умолчанию валидация происходит при отправке формы, но вы можете запускать ее при потере фокуса (blur) или изменении (change) для любых элементов формы в ваших пользовательских полях.

Я реализовал это решение, и оно выглядит очень перспективным, но есть одна проблема: что мне следует указать в 'submitHandler'? После валидации с помощью jquery.validate WordPress ничего не делает (кнопка сохранения остаётся в анимированном состоянии). Как передать управление обратно в WP?

Если вы просто пытаетесь вернуть кнопку "Опубликовать" в нормальное состояние, когда обязательное поле пустое (или другая проверка не пройдена), вам не нужно ничего делать с submitHandler; просто отредактируйте код validate(), чтобы изменить кнопку при неудачной валидации. Это работает: jQuery("#post").validate({ invalidHandler: function() { jQuery('#publish').removeClass('button-primary-disabled'); jQuery('#ajax-loading').css('visibility', 'hidden'); } });

Я нашел этот подход для решения проблемы валидации полей метабоксов с использованием PHP-кода
https://tommcfarlin.com/post-meta-data-error-messages/
Надеюсь, это поможет вам (у меня сработало в похожем сценарии)

Полный базовый код для добавления jQuery Validation:
Подключение скрипта валидации. Предполагается, что jQuery уже подключен.
add_action('admin_enqueue_scripts',function($id){ $validation',$validation_js_url = #ваш источник validation.js; wp_register_script( 'validation',$validation_js_url,array(),'',true ); wp_enqueue_script( 'validation' ); });
В js файле или теге script:
jQuery(document).ready(function($){ var form = $("form[name='post']"); $(form).find("input[type='submit']").click(function(e){ e.preventDefault(); $(form).validate(); if($(form).valid()) { $("#ajax-loading").show(); $(form).submit(); }else{ $("#publish").removeClass().addClass("button-primary"); $("#ajax-loading").hide(); } }); });
Готово :)

Я использовал этот код, он очень полезен, только изменил:
$(form).find("input[type='submit']").click(function(e){
На:
$(form).find("#publish").click(function(e){
Потому что если у вас есть другая форма внутри основной, это запускает скрипт.
И:
$(form).submit();
На:
$(this).submit();
Потому что первая строка сохраняет пост только как черновик, и вы больше не можете его опубликовать.
Все описано здесь: http://allgraphics.it/blog/2012/10/jquery-validation-sui-campi-di-input-postcustom-post-di-wordpress/

Если вам нужна возможность серверной валидации, самый простой вариант — использовать плагин Advanced Custom Fields для определения макетов пользовательских полей. Затем можно применить дополнение Validated Field, чтобы настроить валидацию для каждого поля прямо в админке WordPress.
