WordPress как на ладони
wordpress jino

Как полностью запретить создание одинаковых метаполей для типов постов?

Как можно запретить дублирование названия произвольных полей для определенных типов постов? И так же выводить сообщения о том что такое имя уже существует, задайте другое..

То есть, есть тип поста: 'mypost', необходимо для этого типа поста запретить создание одинаковых имён произвольных полей, и уведомлять об этом при создании в админке.

1
avense5 1.5 года назад
  • 0
    Kama4464

    Чтобы проверять и если надо блокировать создание одинакового метаполя, нужно использовать хук "add_{$meta_type}_metadata" из функции add_metadata():

    $check = apply_filters( "add_{$meta_type}_metadata", null, $object_id, $meta_key, $meta_value, $unique );

    Вот написал код и даже проверил. Добавьте его в functions.php:

    // блокируем создание одинаковых метаполей для указанных типов записей
    add_filter('add_post_metadata', 'just_unique_postmeta', 10, 5);
    function just_unique_postmeta( $null, $object_id, $meta_key, $meta_value, $unique ){
    	if( $unique ) return null; // уже указано уникальное поле
    	// ничего не делаем, если это не нужный нам тип записи: ('post','page')
    	if( ! in_array( get_post($object_id)->post_type, array('post','page') ) ) return null;
    
    	global $wpdb;
    	$_sql = $wpdb->prepare("SELECT COUNT(*) FROM $wpdb->postmeta WHERE meta_key = %s AND post_id = %d", $meta_key, $object_id );
    
    	// если создаваемое метаполе уже есть, обрываем создание...
    	if( $wpdb->get_var($_sql) )
    		return false;
    }

    Для каких типов записей блокировать дублирование метаполя, укажите в массиве array('post','page'). Этот код блокирует для постов (post) и страниц (page)...

    Этот код никак не уведомляет, просто не дает создать одинаковые произвольные поля, через add_post_meta() или update_post_meta(). Универсально создать уведомления не получится. Это нужно сделать вручную при создании метаполя, проверяете, если не создалось, то наверное оно уже есть...

    avense 1.5 года назад

    У меня пишет ошибку, вверху блока произвольных полей, при попытке создать такое же имя поля:
    После обновления страницы, создание имена произвольных полей все же появляются..

    Warning: Missing argument 5 for just_unique_postmeta() in ...theme\functions.php on line 627
    Пожалуйста, укажите значение произвольного поля.
    
    Warning: Cannot modify header information - headers already sent by (...theme\functions.php:628) in ...\class-wp-ajax-response.php on line 135

    И в других типах постов отличных от array('post','page') та же ситуация.

    Kama 1.5 года назад

    Да, ошибка в коде, замени 4 на 5 в первой строке:

    add_filter('add_post_metadata', 'just_unique_postmeta', 10, 5);

    Ошибка при создании

    Пожалуйста, укажите значение произвольного поля.

    это побочный эффект, на самом деле - так срабатывает данный хук.

    avense 1.5 года назад

    Благодарю, теперь работает отлично!

    Указанная надпись появляется...

    А можно как то вывести в этом блоке произвольных полей в админке надпись о том что нельзя создавать одинаковые имя полей?

    Что бы пользователь видел в чем дело и не воспринимал это как ошибку.

    Например где то возле надписи: "Добавить новое поле:" или "Произвольные поля позволяют добавлять к записям метаданные, которые вы можете использовать в своей теме." в самом низу блока произвольных полей?

    И еще, при обновлении уже существующего дубля можно выполнить како ето действие с ним, например удалить обновляемый дубль?
    Это не катит?

    add_filter('updated_post_meta', 'just_unique_postmeta', 10 ,5);

    В данном примере ничего не происходит.

    Kama 1.5 года назад

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

    Так не делается, есть плагин ACF и еще другие для создания метаполей. Прочитайте статью: http://wp-kama.ru/id_740/blok-proizvolnyih-poley-v-adminke-wordpress-svoimi-rukami.html

    avense 1.5 года назад

    Имел ввиду именно в стандартном метабоксе произвольных полей вывести предупреждающую надпись, именно где то там где создается произвольное поле. Но если нету там возможности, то попробую вставить эту надпись jQuery скриптом.

    Мне стандартный блок произвольных полей удобный, там можно добавлять с помощью ajax, без перезагрузки всей страницы.

    Комментировать
На вопросы могут отвечать только зарегистрированные пользователи. Регистрация. Вход.