Intereting Posts
Плагины не отображаются после переименования плагинов Как изменить wp.media для получения и отображения нескольких изображений Плагины, которые ограничивают доступ на основе группы пользователей / ролей Какой код писать в моем плагине, чтобы исключить мои плагины сгенерированных страниц из главного навигатора? Функция списка подписки Есть ли плагин для отображения определенных сообщений на определенных страницах? почему таблица стилей детской темы в редакторе wordpress пуста? Мне нужно сгенерировать CSS для моего плагина из функции, как мне сопоставить запрос функции в интерфейсе? Импорт базы данных WordPress: размер строки слишком большой Постоянная ссылка на местоположение Как удалить текст над заголовком? Ссылка на автора сообщения, но исключить администратора (на single.php) Как избежать дублирования одного и того же meta_value? Использование идентификатора и идентификатора страницы в той же функции Может ли WordPress хранить куки-файлы комментариев на двух разных компьютерах?

Разрешить только 1 экземпляр каждого термина в каждой пользовательской таксономии

Я ищу функцию, которая ограничивает создание каждого термина только одним экземпляром в каждой пользовательской таксономии. Каждая пользовательская таксономия может иметь один и тот же термин, но этот термин может возникать только один раз в каждой отдельной пользовательской таксономии. Я предполагаю, что для каждой пользовательской таксономии потребуется функция.

Довольно интересный вопрос. Я не могу найти ничего легкого. Создание термина обрабатывается wp_insert_term() . Если вы посмотрите на исходный код, вы увидите, что на самом деле не так много фильтров или действий, которые мы можем использовать до начала ввода. pre_insert_term – это единственный фильтр, который происходит до проверки и вставки термина.

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

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

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

Поэтому нам действительно остается только фильтр pre_insert_term . Давайте посмотрим на возможное решение

 add_filter( 'pre_insert_term', function ( $term, $taxonomy ) { /** * Start by validating the term. The taxonomy is already validated * * If the term is a numeric or int value, we will bail. We will let wp_insert_term * handle the process from here on. This is just a very loose check on our side */ if ( is_numeric( $term ) ) return $term; /** * $term is a valid non numeric string, so we most probably have a term name * * We will now basically use the same logic as `wp_insert_term` to validate the $term * name. */ $term_name = strtolower( filter_var( $term, FILTER_SANITIZE_STRING ) ); /** * Get all terms which matchings names like $term_name * * Getting terms by name is not an exact match, but a LIKE comparison, so * if you have names like 'Term A', 'term a' and 'term A', they all will match. * We will need to do an exact match later on */ $name_matches = get_terms( $taxonomy, [ 'name' => $term_name, 'hide_empty' => false, 'fields' => 'names', // Only get term names ] ); // If $name_matches is empty, we do not have duplicates, bail if ( !$name_matches ) return $term; // Convert all names into lowercase $names_array = array_map( 'strtolower', $name_matches ); // Test to see if we have an exact term name match, if so, return WP_Error if ( in_array( $term_name, $names_array ) ) return new WP_Error( 'term_exists', __( 'You cannot have a term with the same name, choose a unique name.' ), $term ); // OK we have a unique term name, let 'wp_insert_term' continue the rest of the process return $term; }, 10, 2 ); 

То, что мы сделали, состоит в том, чтобы получить все термины с именами, такими как термин, который мы хотели бы вставить, преобразовать их все в нижний регистр и затем проверить, содержится ли наше имя в массиве имен терминов. Если это так, мы WP_Error объект WP_Error , чтобы остановить весь процесс вставки слова

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