Вопрос или проблема
Есть ли способ вставить шорткод галереи wp в текстовое поле пользовательского метабокса?
Я хотел бы иметь что-то вроде этого:
Новый метабокс в посте/странице с текстовым полем, а под текстовым полем кнопка для открытия медиабиблиотеки wp. Затем, когда мы выберем несколько изображений для галереи и нажмем кнопку “вставить галерею”, шорткод будет вставлен в текущее текстовое поле.
Это возможно?
Спасибо
====== Обновление: ======
Я смог показать библиотеку медиа, теперь у меня нет идеи, как вставить шорткод в пользовательское текстовое поле при нажатии кнопки “вставить галерею”.
Вот мой код на данный момент:
HTML
<div class="uploader">
<textarea name="settings[_cs_shortcode_gallery]" id="_cs_shortcode_gallery"></textarea>
<input class="button tf-browse-btn" name="_cs_shortcode_gallery_button" id="_cs_shortcode_gallery_button" value="Просмотреть галерею"/>
</div>
JS
var _custom_media = true,
_orig_send_attachment = wp.media.editor.send.attachment;
$('.tf-browse-btn').live('click', function(e) {
var send_attachment_bkp = wp.media.editor.send.attachment;
var button = $(this);
var id = button.attr('id').replace('_button', '');
_custom_media = true;
wp.media.editor.send.attachment = function(props, attachment){
if ( _custom_media ) {
$("#"+id).val(attachment.url);
} else {
return _orig_send_attachment.apply( this, [props, attachment] );
};
}
wp.media.editor.open(button);
return false;
});
$('.add_media').on('click', function(){
_custom_media = false;
});
Что я хочу получить сейчас:
- Как установить вкладку “Создать галерею” в качестве вкладки по умолчанию при открытии модального окна
- Вставить шорткод галереи в пользовательское текстовое поле
Пожалуйста, смотрите скриншот ниже для подробностей
Я уверен, что это возможно, но потребуется немного поработать с PHP и jQuery. Этот плагин от Томаса Гриффина для вставки изображения в метабокс был бы очень хорошей отправной точкой.
Вам нужно будет немного покопаться в js файлах в wp-admin/js
и в wp-admin/includes/media.php
.
Да, это возможно 🙂 Мне просто нужно было реализовать эту функциональность и написать этот пост.
Допустим, у вас есть этот HTML:
<input type="hidden" name="shortcode" value="{{ options.shortcode }}"/>
<br />
<a href="#" class="btn gallery-configure">
Настроить галерею
</a>
Соответствующий JS, чтобы вызвать модальное окно редактирования галереи и сохранить шорткод в нужное поле, будет таким:
/**
* Получает начальные изображения для редактирования галереи. Функция изменена из wp.media.gallery.edit
* в wp-includes/js/media-editor.js.source.html
*
* @params {*} shortcode
* @return {*}
*/
function select(shortcode) {
var shortcode = wp.shortcode.next('gallery', shortcode);
var defaultPostId = wp.media.gallery.defaults.id;
var attachments;
var selection;
// Прекращаем работу, если шорткод не совпадает или если весь контент.
if (!shortcode) {
return;
}
shortcode = shortcode.shortcode;
if (typeof shortcode.get('id') != 'undefined' && typeof defaultPostId != 'undefined') {
shortcode.set('id', defaultPostId);
}
attachments = wp.media.gallery.attachments(shortcode);
selection = new wp.media.model.Selection(attachments.models, {
props : attachments.props.toJSON(),
multiple: true
});
selection.gallery = attachments.gallery;
/*
* Получаем вложения запросов, а затем разрываем связи с запросом, чтобы позволить сортировку.
*/
selection.more().done(function () {
// Разрываем связи с запросом.
selection.props.set({
query: false
});
selection.unmirror();
selection.props.unset('orderby');
});
return selection;
}
var $body = jQuery('body');
// Загрузчики медиа.
$body.on('click', '.gallery-configure', function () {
var $this_button = jQuery(this);
jQuery('.media-modal-close').trigger('click');
var selection = select($this_button.parent().find('[name="shortcode"]').val()); // Получаем сохраненный выбор здесь.
var frame = wp.media({
frame : 'post',
title : wp.media.view.l10n.editGalleryTitle,
multiple: false,
state : 'gallery-edit',
editing : true,
selection: selection
});
frame.on('update', function () {
var controller = frame.states.get('gallery-edit');
var library = controller.get('library');
var new_shortcode = wp.media.gallery.shortcode(library).string(); // Получаем новый/обновленный шорткод здесь.
$this_button.parent().find('[name="shortcode"]').val(new_shortcode);
});
frame.open();
return false;
});
Надеюсь, это поможет вам, мне понадобилось некоторое время, чтобы разобраться в этом 🙂
Ответ или решение
Конечно, возможно вставить шорткод галереи WordPress в настраиваемую текстовую область метабокса. Я представлю вам полное решение по шагам, включая добавление HTML, JavaScript и PHP-кода. Мы будем использовать стили и методы WordPress для открытия медиабиблиотеки и вставки шорткода в текстовую область.
Шаг 1: Добавление метабокса в админке
Сначала, вам нужно зарегистрировать новый метабокс, добавив следующий код в файл вашего плагина или в файл functions.php
вашей темы.
function my_custom_meta_box() {
add_meta_box(
'my_meta_box_id',
'Галерея',
'my_meta_box_callback',
'post', // или 'page', если нужно добавить на страницы
'normal',
'high'
);
}
add_action('add_meta_boxes', 'my_custom_meta_box');
function my_meta_box_callback($post) {
$shortcode = get_post_meta($post->ID, '_cs_shortcode_gallery', true);
?>
<div class="uploader">
<textarea name="settings[_cs_shortcode_gallery]" id="_cs_shortcode_gallery" rows="5" style="width:100%;"><?php echo esc_textarea($shortcode); ?></textarea>
<input class="button tf-browse-btn" name="_cs_shortcode_gallery_button" id="_cs_shortcode_gallery_button" value="Выбрать Галерею" />
</div>
<?php
}
Шаг 2: Сохранение шорткода в БД
Теперь добавим функциональность для сохранения шорткода в метабокс:
function my_save_meta_box_data($post_id) {
if (array_key_exists('settings', $_POST)) {
update_post_meta($post_id, '_cs_shortcode_gallery', sanitize_text_field($_POST['settings']['_cs_shortcode_gallery']));
}
}
add_action('save_post', 'my_save_meta_box_data');
Шаг 3: JavaScript для медиабиблиотеки
Затем добавьте JavaScript для открытия медиабиблиотеки и вставки шорткода. Сначала загрузим необходимые скрипты:
function my_enqueue_media() {
wp_enqueue_media();
wp_enqueue_script('my-custom-script', get_template_directory_uri() . '/js/my-custom-script.js', array('jquery'), null, true);
}
add_action('admin_enqueue_scripts', 'my_enqueue_media');
Создайте файл my-custom-script.js
, где будет следующий код:
jQuery(document).ready(function($) {
var _custom_media = true,
_orig_send_attachment = wp.media.editor.send.attachment;
$('.tf-browse-btn').on('click', function(e) {
var button = $(this);
var id = button.attr('id').replace('_button', '');
_custom_media = true;
wp.media.editor.send.attachment = function(props, attachment) {
if (_custom_media) {
var ids = attachment.ids || attachment.id;
var shortcode = ''; // Формируем шорткод
$("#" + id).val(shortcode);
} else {
return _orig_send_attachment.apply(this, [props, attachment]);
}
};
wp.media.editor.open(button);
return false;
});
$('.add_media').on('click', function() {
_custom_media = false;
});
});
Шаг 4: Открытие вкладки «Создать галерею» по умолчанию
Чтобы открыть вкладку «Создать галерею» по умолчанию, нужно немного изменить вызов wp.media
в вашем JavaScript.
Измените этот фрагмент кода:
var frame = wp.media({
frame: 'post',
title: wp.media.view.l10n.editGalleryTitle,
multiple: false,
state: 'gallery-edit', // может поменять на 'gallery' если хотите создать новую
editing: true,
selection: selection
});
На это:
var frame = wp.media({
frame: 'post',
title: wp.media.view.l10n.editGalleryTitle,
library: { type: 'image' },
multiple: true // Убедитесь, что это true для выбора нескольких изображений
});
Теперь при открытии медиабиблиотеки вы будете иметь возможность выбрать изображения и создать галерею.
Заключение
Теперь у вас есть полностью функционирующий метабокс в админке WordPress, который позволяет добавлять шорткод галереи через медиабиблиотеку. Если у вас есть дополнительные вопросы или потребности в модификации этого кода, не стесняйтесь спрашивать!