Вопрос или проблема
Я хочу добавить загрузчик медиафайлов на страницу параметров темы. Если я добавлю следующий код на страницу параметров, то загрузчик медиафайлов будет работать нормально, но это создаёт проблемы с изображением миниатюры стандартных сообщений. Он не позволяет мне выбрать любое изображение оттуда.
Может быть, это потому, что я добавляю его неправильно?
if ( ! did_action( 'wp_enqueue_media' ) ){
wp_enqueue_media();
}
Вот функция загрузки, которую я использую:
$('#upload_img').click(function(){
wp.media.editor.send.attachment = function(props, attachment){
$('#theme_options\\[img_url\\]').val(attachment.url);
}
wp.media.editor.open(this);
return false;
});
Недостаточно информации, чтобы реально определить, что происходит, но лучшим вариантом будет убедиться, что ваш код добавляется только на страницу параметров, чтобы он не мешал ничему на странице редактирования. Вы можете использовать get_current_screen
для этого, вот так:
add_action( 'current_screen', 'wpse113256_this_screen' );
function wpse113256_this_screen() {
$current_screen = get_current_screen();
if( $current_screen ->id === "options" ) {
// Запустите ваш код
}
}
Вам нужно будет проверить, действительно ли ID вашей страницы параметров “options”.
Ответ или решение
При добавлении вызова функции wp_enqueue_media()
на странице настроек темы, действительно может возникнуть конфликт с функциональностью выбора изображения в стандартной панели редактирования постов, так как это может привести к тому, что средства работы с медиафайлами, используемые на странице редактирования, будут переопределены или неправильно инициализированы.
Проблема
Ваш код:
if ( ! did_action( 'wp_enqueue_media' ) ){
wp_enqueue_media();
}
Этот фрагмент кода загружает библиотеку медиафайлов, но если он выполняется на всех страницах админ-панели, это может привести к конфликтам. Главная проблема заключается в том, что библиотека медиафайлов может пытаться инициализироваться несколько раз, что в конечном итоге нарушает стандартное поведение функции «Выбор изображения» в WordPress.
Решение
Чтобы избежать конфликтов, необходимо удостовериться, что ваши скрипты загружаются только на нужной странице. Используйте функцию get_current_screen()
для проверки текущей страницы и реализации вашей логики только на странице с настройками темы.
Вот как это можно сделать:
add_action('current_screen', 'wpse113256_this_screen');
function wpse113256_this_screen() {
$current_screen = get_current_screen();
if ($current_screen->id === "settings_page_theme_options") { // Проверьте правильный ID
wp_enqueue_media();
// Остальная логика, включая ваш загрузчик
add_action('admin_footer', 'add_media_uploader_js');
}
}
function add_media_uploader_js() {
?>
<script type="text/javascript">
jQuery(document).ready(function($) {
$('#upload_img').click(function() {
wp.media.editor.send.attachment = function(props, attachment) {
$('#theme_options\\[img_url\\]').val(attachment.url);
}
wp.media.editor.open(this);
return false;
});
});
</script>
<?php
}
Пояснение кода
-
Проверка текущего экрана: Мы используем
get_current_screen()
, чтобы убедиться, что код выполняется только на определенной странице (в этом примере — странице настроек темы). Замените"settings_page_theme_options"
на реальный идентификатор вашей страницы. -
Загрузка медиа: Внутри условия мы добавляем вызов
wp_enqueue_media()
, который загружает необходимые скрипты и стили только для выбранной страницы. -
JavaScript для загрузки изображений: Код для загрузки изображений добавляется через
add_media_uploader_js()
, который регистрирует ваш JavaScript-код только на нужной странице админки, предотвращая возможные конфликты с другими секциями.
Заключение
Используя вышеописанный подход, вы сможете безопасно интегрировать медиа-менеджер в вашу страницу настроек, не влияя негативно на стандартные функции выбора изображений в редакторе постов. Это концентрирует изменения на конкретной странице и минимизирует риск конфликтов, улучшая пользовательский опыт и устойчивость вашего кода.