Вставьте шорткод галереи WP в настраиваемую текстовую область

Вопрос или проблема

Есть ли способ вставить шорткод галереи 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;
  });

Что я хочу получить сейчас:

  • Как установить вкладку “Создать галерею” в качестве вкладки по умолчанию при открытии модального окна
  • Вставить шорткод галереи в пользовательское текстовое поле

Пожалуйста, смотрите скриншот ниже для подробностей

скриншот 1

скриншот 2

Я уверен, что это возможно, но потребуется немного поработать с 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, который позволяет добавлять шорткод галереи через медиабиблиотеку. Если у вас есть дополнительные вопросы или потребности в модификации этого кода, не стесняйтесь спрашивать!

Оцените материал
Добавить комментарий

Капча загружается...