Замена alt и title фильтром для каждого изображения в сообщении (WordPress)

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

Кажется, что использование add_filter или чего-то подобного сделает то, что мне нужно, но я не уверен, нужно ли мне вычислять регулярное выражение или я могу просто использовать the_content.

Я придумал способ получить все прикрепленные изображения и отобразить правильные теги alt и title, но я знаю только, как добавить изображения в начало или конец the_content. Мне нужно, чтобы заменить каждое соответствующее изображение, которое уже есть. Есть лучший способ сделать это? Вот функция для помещения нового содержимого изображения в массив:

function replaceimages_get_images($content) {
    global $post;
    $images = array();
    $x = 0;
    $args = array(
        'post_type'   => 'attachment',
        'numberposts' => -1,
        'post_status' => null,
        'post_parent' => $post->ID,
        'exclude'     => get_post_thumbnail_id()
    );

    $attachments = get_posts( $args );
    if ( $attachments ) {
        foreach ( $attachments as $attachment ) {
            $src = wp_get_attachment_image_src( $attachment->ID, 'full' );
            $title = apply_filters( 'the_title', $attachment->post_title );
            $alt = apply_filters( 'alt', get_post_meta($attachment->ID, '_wp_attachment_image_alt', true ));
            $images[$x] = '<img src="'.$src[0].'" title="'.$title.'" alt="'.$alt.'" />';
            $x++;
        }
    }
    return $content;
}
add_filter( 'the_content', 'replaceimages_get_images' );

Теперь мне нужно в псевдокоде сделать следующее:

for each image in $content {
    match src to image in array;
    replace entire image with image from array;
}

person lefty55104    schedule 06.11.2013    source источник


Ответы (1)


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

  1. Сделайте резервную копию базы данных.

  2. Получить все прикрепленные изображения

    $args = array(
            'post_type'       => 'attachment',
            'post_mime_type'  => 'image',
            'numberposts'     => -1
        );
    
  3. Используйте guid или wp_get_attachment_url, чтобы получить URL-адрес изображения.

  4. Поиск URL в базе данных

    // $image_url = your_method_to_get_it();
    $sql_results = $wpdb->get_results(
         $wpdb->prepare( "
            SELECT *
                FROM $wpdb->posts
            WHERE post_content 
                LIKE %s
            AND post_status = 'publish'
             " 
            ,'%' . like_escape( $image_url ) . '%'
        )
    );
    
  5. Разберите HTML из post_content и do_your_magic( $image_attributes, $post_content ).
    Не используйте RegEx, DomDocument выполняет свою работу.

  6. Обновите сообщение с помощью wp_update_post


Вот вспомогательный плагин для этого. Обратите внимание, что

  • мы можем выборочно запускать действия, используя параметр запроса в URL-адресе

    http://example.com/wp-admin/admin.php?page=updating-images&doit
  • вам придется создавать его шаг за шагом, var_dump выполняя все действия, пока вы не будете готовы к шагу 6.

<?php
/* Plugin Name: (SO) Updating Images */

add_action('admin_menu', 'helper_so_19816690' );

function helper_so_19816690() 
{
    add_menu_page(
        'Updating Images',
        'Updating Images',
        'add_users',
        'updating-images',
        'doit_so_19816690',
        null,
        0
    );
}

function doit_so_19816690()
{ 
    echo '<h2>Conversion</h2>';
    $args = array(
            'post_type'      => 'attachment',
            'post_mime_type' => 'image',
            'numberposts'    => -1
        );
    $attachments = get_posts( $args );

    # Our thing
    if( isset( $_GET['doit'] ) )
    {
        var_dump( $attachments );
    }
}
person brasofilo    schedule 06.11.2013
comment
Шаг 7: опубликуйте свой окончательный плагин здесь для всеобщего блага ;) - person brasofilo; 06.11.2013