Вопрос или проблема
Когда вы используете стандартное произвольное поле в WP, вам нужно написать название произвольного поля в первый раз.
Во второй раз, когда вы используете произвольное поле, оно добавляется в выпадающий список произвольных полей. Но иногда, когда вы устанавливаете плагины, они используют МНОГО произвольных полей.
Этот список становится довольно длинным, и некоторые из моих произвольных полей могут “выпадать” из списка. Итак, кто-нибудь знает, как я могу удалить произвольные поля из своего выпадающего списка простым способом?
Вы можете отфильтровать запрос для этих ключей на 'query'
. Я бы начал этот фильтр как можно позже, чтобы избежать побочных эффектов.
Пример кода, протестировано:
add_filter( 'postmeta_form_limit', 'wpse_73543_hide_meta_start' );
function wpse_73543_hide_meta_start( $num )
{
add_filter( 'query', 'wpse_73543_hide_meta_filter' );
return $num;
}
function wpse_73543_hide_meta_filter( $query )
{
// Защитить дальнейшие запросы.
remove_filter( current_filter(), __FUNCTION__ );
$forbidden = array ( 'the', 'keys', 'you', 'want', 'to', 'hide' );
$where = "WHERE meta_key NOT IN('" . join( "', '", $forbidden ) . "') ";
$find = "GROUP BY";
$query = str_replace( $find, "$where\n$find", $query );
return $query;
}
Не существует способа отфильтровать то, что там появляется, вы можете увидеть, где он запрашивает ключи и отображает это поле в функции meta_form()
в wp-admin/includes/template.php
, однако вы можете заметить, что он игнорирует любой ключ, начинающийся с подчеркивания:
HAVING meta_key NOT LIKE '\_%'
это то, что плагины должны делать с любыми мета-ключами, которые они создают, чтобы скрыть эти ключи из меню.
Вы также увидите фильтр postmeta_form_limit
, который по умолчанию установлен на 30. Вы можете увеличить это число, чтобы ваши ключи как минимум были включены в список и не выпадали из него.
Другой вариант — создать свой собственный мета-блок для управления конкретными мета-данными, вместо того чтобы использовать мета-блок произвольных полей.
Для WP = 6.6.1 решение, (предложенное выше), требует небольших модификаций. Поскольку запрос по умолчанию, отправляемый в эту функцию в параметре query
, выглядит следующим образом:
SELECT DISTINCT meta_key
FROM wp_postmeta
WHERE meta_key NOT BETWEEN '_' AND '_z'
HAVING meta_key NOT LIKE '\\_%'
ORDER BY meta_key
LIMIT 30
Для того чтобы фильтрация работала, вам нужно изменить функцию следующим образом (параметр $find
и функцию str_replace
):
function wpse_73543_hide_meta_filter( $query )
{
// Защитить дальнейшие запросы.
remove_filter( current_filter(), __FUNCTION__ );
$forbidden = array ( 'the', 'keys', 'you', 'want', 'to', 'hide' );
$where = "WHERE meta_key NOT IN('" . join( "', '", $forbidden ) . "') ";
$find = "WHERE";
$query = str_replace( $find, "$where\n AND", $query );
return $query;
}
И запрос будет выглядеть так:
SELECT DISTINCT meta_key
FROM wp_postmeta
WHERE meta_key NOT IN('the', 'keys', 'you', 'want', 'to', 'hide')
AND meta_key NOT BETWEEN '_' AND '_z'
HAVING meta_key NOT LIKE '\\_%'
ORDER BY meta_key
LIMIT 30
Ответ или решение
Удаление пользовательских полей из выпадающего списка в WordPress
В процессе работы с пользовательскими полями в WordPress иногда возникает необходимость удалить ненужные или устаревшие поля из выпадающего списка. Это может стать проблемой, особенно если в результате установки плагинов появляется множество новых полей, что может сделать существующий список неудобным для использования. В данной статье мы рассмотрим, как удалить пользовательские поля из выпадающего списка в WordPress с помощью кастомного кода.
Шаги для удаления пользовательских полей
-
Добавление фильтра
postmeta_form_limit
: Чтобы скрыть определенные ключи метаданных, можно использовать фильтрpostmeta_form_limit
. Этот фильтр позволяет изменить запрос, который используется для получения значений пользовательских полей. -
Создание функции для фильтрации метаданных: Приведенный ниже код создает функцию, которая будет фильтровать пользовательские поля, исключая заданные ключи из выпадающего списка.
add_filter('postmeta_form_limit', 'custom_hide_meta_fields'); function custom_hide_meta_fields($num) { add_filter('query', 'custom_hide_meta_filter'); return $num; } function custom_hide_meta_filter($query) { remove_filter(current_filter(), __FUNCTION__); $forbidden = array('meta_key_1', 'meta_key_2'); // Замените на ключи, которые нужно скрыть $where = "WHERE meta_key NOT IN('" . join("', '", $forbidden) . "')"; $find = "WHERE"; $query = str_replace($find, "$where\n AND", $query); return $query; }
-
Объяснение работы кода:
add_filter('postmeta_form_limit', ...);
: Этот вызов добавляет фильтр к функции, чтобы мы могли модифицировать процесс запроса полей метаданных.function custom_hide_meta_filter($query)
: Здесь мы определяем функцию, которая изменяет SQL-запрос, исключая заданные поля.$forbidden
: Этот массив содержит ключи метаданных, которые мы хотим скрыть. Замените его значениями, соответствующими полям, которые вы хотите удалить из выпадающего списка.
Дополнительные рекомендации
-
Использование префиксов: Если вы разрабатываете собственные плагины или темы, хорошей практикой является использование подчеркивания перед именами метаданных (например,
_meta_key_1
). Это позволит автоматически скрывать их в выпадающем списке, так как WordPress игнорирует ключи, начинающиеся с подчеркивания. -
Создание собственного метабокса: Если вам необходимо управлять определенными метаданными более качественно, возможно, имеет смысл создать собственный метабокс. Это позволит вам более гибко контролировать отображение и работу с пользовательскими полями.
-
Увеличение лимита: Если вам необходимо, чтобы больше пользовательских полей отображалось в выпадающем списке, можно изменить значение умолчательного лимита в функции
postmeta_form_limit
.
Заключение
Удаление пользовательских полей из выпадающего списка в WordPress — это процесс, который можно реализовать с помощью настройки SQL-запросов в PHP-коде. Задействуя указанные выше шаги и рекомендации, вы сможете эффективно управлять пользовательскими полями и улучшить опыт работы с админкой WordPress. Если у вас возникнут дополнительные вопросы, не стесняйтесь обращаться за помощью на специализированные форумы или сообщество разработчиков.