Настройка подписи к изображению в визуальном редакторе

16 мар. 2017 г., 15:30:56
Просмотры: 77
Голосов: 0

Еще раз хочу обратиться к вам за помощью.

Мне нужно изменить подпись под изображениями в записях. Вместо стандартной подписи (post_excerpt) я хочу выводить заголовок изображения (post_title) (жирным) и описание изображения (post_content), примерно так:
Пример решения

С помощью @birgire мне удалось добиться этого, используя фильтр img_caption_shortcode (Ссылка). Однако это решение оказалось неидеальным.

По умолчанию, при вставке изображения через визуальный редактор WordPress, подпись добавляется под изображением. При редактировании изображения эту подпись можно изменить индивидуально (для конкретного экземпляра), как показано здесь: Изменение подписи

Проблема использования фильтра img_caption_shortcode в том, что он полностью заменяет возвращаемое содержимое, делая невозможными индивидуальные корректировки подписи. Мне хотелось бы сохранить стандартное поведение WordPress, но при этом заменить стандартную подпись на заголовок и описание изображения.

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

РЕДАКТИРОВАНО: Вот код, который я использую сейчас:

<?php
/**
 * Название плагина: Модифицированная подпись изображения
 * Описание: Заменяет стандартную подпись на заголовок и описание изображения
 * Ссылка на плагин:  https://wordpress.stackexchange.com/a/258612/26350
 */

namespace WPSE\Q258586;

add_action( 'init', [ new Caption, 'init' ] );

class Caption
{
    private $attachment_id ;

    public function init()
    {
        add_filter( 'img_caption_shortcode',    [ $this, 'shortcode' ], 999, 3 );
        add_filter( 'shortcode_atts_caption',   [ $this, 'atts' ],      999, 3 );
    }
    public function shortcode( $output, $attr, $content )
    {
        if( isset( $attr['id'] ) && preg_match( '/attachment_\d+/i', $attr['id' ] ) )
            $this->attachment_id = str_replace( 'attachment_', '', $attr['id'] );

        return $output;
    }

    public function atts( $atts, $pair )
    {
        if( ! $this->attachment_id  )
            return $atts;

        $img = get_post( $this->attachment_id );

        if( is_a( $img, '\WP_Post' ) )
        {
            $atts['caption'] = sprintf( 
                '<span class="title-css">%s</span>
                 <br><span class="description-css">%s</span>',
                esc_html( $img->post_title ),
                esc_html( $img->post_content )
            );
        }

        $this->id = null;

        return $atts;
    }
}
Комментарии

Пожалуйста, опубликуйте код, который вы используете в данный момент, чтобы нам не приходилось просматривать все комментарии в предыдущей ветке.

WebElaine WebElaine
16 мар. 2017 г. 18:46:04

Спасибо за ваш комментарий. Я добавил код в своем исходном сообщении.

Hans Wernersen Hans Wernersen
16 мар. 2017 г. 19:59:32

Спасибо, это помогает. Похоже, вам просто нужно добавить еще одно условие внутри if( is_a( $img, '\WP_Post' ) ): что-то вроде, if для этого конкретного изображения установлена подпись, выводить эту переопределенную подпись; else (ваш оригинальный код, который выводит заголовок и содержимое).

WebElaine WebElaine
16 мар. 2017 г. 22:05:54

Вы можете ознакомиться с моим альтернативным решением для новых загружаемых изображений здесь. @HansWernersen

birgire birgire
28 мар. 2017 г. 13:57:16

Спасибо за ваш ответ. Я могу изменить вывод с помощью вашего быстрого и грязного метода, обращаясь к конкретному ID изображения, правильно ли я понимаю? К сожалению, это было бы не совсем удобно, так как требует добавления нового кода для каждого изображения, для которого я хочу изменить подпись. Кроме того, это было бы невозможно сделать, когда задействованы несколько пользователей/авторов (с ещё меньшими знаниями в программировании, чем у меня). @birgire

Hans Wernersen Hans Wernersen
28 мар. 2017 г. 16:49:59

Как WordPress это делает? При добавлении изображения в запись/страницу подпись вставляется автоматически. Если я редактирую подпись изображения внутри записи/страницы, автоматически вставленная подпись изменяется только для этого конкретного случая. Могу ли я эмулировать такое поведение в своём плагине? Что-то вроде того, что предложила @WebElaine: если введена альтернативная подпись, отображать её, иначе отображать (жирным) название изображения и его описание. Я не представляю, как я могу обращаться ко всем изменённым вводам, как показано на втором изображении. Любая помощь будет очень ценной, спасибо!

Hans Wernersen Hans Wernersen
28 мар. 2017 г. 16:56:28

Я имел в виду часть с фильтром из этого ответа, а не часть с SQL обновлением ;-) Это должно работать для новых изображений. @HansWernersen

birgire birgire
28 мар. 2017 г. 18:03:53
Показать остальные 2 комментариев