Как получить только прикрепленные изображения со страницы редактирования поста

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

Я недавно разработал пользовательскую панель для WordPress с пользовательским интерфейсом. На страницах одиночных постов есть слайдер. Я отображаю результаты функции get_attached_media(‘image’) в качестве изображений слайдера.

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

Как я могу предотвратить это? Или есть ли способ показать изображения, загруженные со страницы редактирования поста?

Я использую этот код, чтобы загрузить все изображения, которые я загружал через страницу редактирования поста:

function get_gallery_images(){
    global $wpdb,$post;
        $ids = "";
        $counter = 0;
        $number_of_posts = 12;
        $args = array(
        'post_type' => 'attachment',
        'numberposts' => 12,
        'post_status' => null,
        'orderby' => 'rand',
        'post_parent' => $post->ID
        );
        $attachments = get_posts($args);
        if ($attachments) {
            foreach ($attachments as $attachment) {

                if ($counter != 0) {
                    $ids .= ','.$attachment->ID;
                }
                else {
                    $ids .= $attachment->ID;
                }
                $counter++;
            }
        }
        return $ids;
}

Также эта строка:

$attachment_ids = get_gallery_images();

А также это внутри контентных строк:

echo do_shortcode(''); 

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

Следующий код предоставит очень простой интерфейс. Идея заключается в следующем. На странице редактирования вы получаете еще одну мета-бокс “Слайдер”, где вы можете выбрать, какие прикрепленные медиа будут использоваться для слайдера. Здесь, конечно, можно сделать больше работ по пользовательскому опыту. В данный момент он только показывает уже прикрепленные медиа. Таким образом, редактору нужно добавить медиа, сохранить пост и затем выбрать. Можно сделать некоторые улучшения.

Как только редактор определяет некоторые прикрепленные медиа для слайдера, вы больше не будете использовать get_attached_media('image'), а вместо этого get_attached_slider(). В основном, эта функция также выводит объекты постов, но только прикрепленные медиа, которые должны отображаться в слайдере.

Надеюсь, это даст вам старт для того, что вам нужно.

<?php 
    add_action( 'add_meta_boxes', 'slider_metabox' );
    function slider_metabox(){
        add_meta_box(
                'slider-metabox',
                __( 'Slider Pictures', 'sl' ),
                'slider_metabox_render',
                'post'      //Используйте 'post', чтобы отображать на постах, 'page' чтобы отображать на страницах
        );
    }

    /**
     * Эта функция отображает мета-бокс
     **/
    function slider_metabox_render( $post ){
        $slider_attachments = get_post_meta( $post->ID, 'slider_attachments', true );
        $all_attachments = get_attached_media( 'image', $post->ID );
        if( empty( $slider_attachments ) )
            $slider_attachments = array();

        /*
         * Мы получаем наши прикрепленные медиа и медиа, которые уже должны
         * быть в слайдере. Мы проходим через все прикрепленные медиа
         * выводим чекбокс и если отдельные медиа
         * уже для слайдера, мы отмечаем чекбокс
         **/

        ?>
        <ul>
        <?php foreach( $all_attachments as $s ): ?>
        <li data-attachment="<?php echo $s->ID; ?>">
            <label for="attachment-<?php echo $s->ID; ?>">
                <?php echo wp_get_attachment_image( $s->ID, 'post-thumbnail' ); ?>
            </label>
            <input id="attachment-<?php echo $s->ID; ?>" type="checkbox" <?php 
                if( in_array( $s->ID, $slider_attachments ) ): 
                    echo 'checked="checked" '; 
                endif;
            ?>name="slider_attachments[]" value="<?php echo $s->ID; ?>" />
        </li>
        <?php endforeach; ?>
        </ul>
        <?php
    }

    /**
     * Давайте сохраним нашу медиа для слайдера
     **/
    add_action( 'save_post', 'slider_attachment_save' );
    function slider_attachment_save( $post_id ){
        if ( wp_is_post_revision( $post_id ) )
            return;

        if( isset( $_POST['slider_attachments'] ) )
            update_post_meta( 
                $post_id, 
                'slider_attachments', 
                $_POST['slider_attachments'] 
            );

    }

    /**
     * get_attached_slider
     * Используйте это вместо get_attached_media(), чтобы получить только изображения слайдера
     **/
    function get_attached_slider( $post_id = null ){
        if( $post_id == null )
            $post_id = get_the_ID();

        if( !is_numeric( $post_id ) ){
            $error = new WP_Error();
            $error->add( 'post-id', 'Нет действительного ID поста' );
            return $error;
        }

        $attachment_ids = get_post_meta( $post_id, 'slider_attachments', true );
        if( empty( $attachment_ids ) || ! is_array( $attachment_ids ) )
            return false;

        $args = array(
            'post_type' => 'attachment',
            'post__in' => $attachment_ids,
            'post_status' => 'any',
            'posts_per_page' => count( $attachment_ids )
        );
        $query = new WP_Query( $args );
        $attachments = $query->posts;
        return $attachments;
    }
?>

Дополнительная информация о том, как это реализовать:

Ответ или решение

Как получить только изображения, прикрепленные на странице редактирования поста в WordPress

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

Проблема

Проблема, с которой вы столкнулись, заключается в том, что когда редакторы загружают изображения через экран медиасодержимого и вставляют их в контент поста, эти изображения становятся прикрепленными к этому посту. В результате, когда вы используете функцию get_attached_media('image'), вы получаете все изображения, прикрепленные к посту, включая те, что не предназначены для слайдера.

Решение

Для решения данной проблемы можно использовать кастомные мета-поля для хранения ID изображений, которые предназначены для слайдера. Это позволит вам управлять выбором изображений более эффективно. Вам потребуется создать метабокс для добавления и выбора изображений, которые должны отображаться в слайдере.

Шаги реализации:

  1. Создание метабокса для слайдера:

Добавьте следующий код в файл вашей темы functions.php или в файл вашего плагина:

add_action('add_meta_boxes', 'slider_metabox');
function slider_metabox() {
    add_meta_box(
        'slider-metabox',
        __('Изображения для слайдера', 'sl'),
        'slider_metabox_render',
        'post'
    );
}

function slider_metabox_render($post) {
    $slider_attachments = get_post_meta($post->ID, 'slider_attachments', true);
    $all_attachments = get_attached_media('image', $post->ID);
    if (empty($slider_attachments)) {
        $slider_attachments = array();
    }
    ?>
    <ul>
    <?php foreach ($all_attachments as $s): ?>
        <li data-attachment="<?php echo $s->ID; ?>">
            <label for="attachment-<?php echo $s->ID; ?>">
                <?php echo wp_get_attachment_image($s->ID, 'thumbnail'); ?>
            </label>
            <input id="attachment-<?php echo $s->ID; ?>" type="checkbox" <?php echo in_array($s->ID, $slider_attachments) ? 'checked="checked"' : ''; ?> name="slider_attachments[]" value="<?php echo $s->ID; ?>" />
        </li>
    <?php endforeach; ?>
    </ul>
    <?php
}
  1. Сохранение выбранных изображений:

Добавьте код для сохранения мета-данных при сохранении поста:

add_action('save_post', 'slider_attachment_save');
function slider_attachment_save($post_id) {
    if (wp_is_post_revision($post_id)) {
        return;
    }

    if (isset($_POST['slider_attachments'])) {
        update_post_meta($post_id, 'slider_attachments', $_POST['slider_attachments']);
    }
}
  1. Создание функции для получения изображений слайдера:

Создайте функцию, которая будет возвращать только выбранные изображения для слайдера:

function get_attached_slider($post_id = null) {
    if ($post_id == null) {
        $post_id = get_the_ID();
    }

    if (!is_numeric($post_id)) {
        $error = new WP_Error();
        $error->add('post-id', 'Нет действительного идентификатора поста');
        return $error;
    }

    $attachment_ids = get_post_meta($post_id, 'slider_attachments', true);
    if (empty($attachment_ids) || !is_array($attachment_ids)) {
        return false;
    }

    $args = array(
        'post_type' => 'attachment',
        'post__in' => $attachment_ids,
        'post_status' => 'any',
        'posts_per_page' => count($attachment_ids)
    );
    $query = new WP_Query($args);
    return $query->posts;
}

Как использовать

Замените вызов get_attached_media('image') на вызов вашей новой функции get_attached_slider(), чтобы получить только те изображения, которые были выбраны для слайдера.

$attachment_ids = get_attached_slider($post->ID);

Заключение

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

Для дальнейшего изучения, обратитесь к официальной документации WordPress по следующим темам:

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

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

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