0
165
2019-12-11

WP All Import - Заменяем все изображения записей одной галереей

WP All Import отличный плагин, часто при импортировании записей допустим из Joomla нужно переносить ранее созданные галереи изображений. Или просто все изображения в записи переместить в одну галерею Word Press. В данном посте я приведу пример того как можно это реализовать, правда после импорта записей.
Понравилась страница? Поставь свою оценку!
PLUGIN_STAR_RATINGS.SCORE_TEXTPLUGIN_STAR_RATINGS.VOTES_TEXT

В общем это был увлекательный путь страданий скажу я Вам. Но в итоге мне удалось переместить все изображения (в импортированных записях) в одну аккуратную галерею. Галарея будет находится под контентом записи, имея опрятный вид в три колонки:

Внешний вид галереи

На скрине выше я естественно заблюрил фото и текст так как права и все такое.

А теперь по порядку как все таки переместить все изображения в галерею.

В случае парсинга контента со старой версии сайта

В случае если Вы парсите контент со старой версии сайта (для импорта) Вам нужно предусмотреть блок галереи. То есть если на старой версии сайта имеется вот такой блок галереи:

<div class="element element-image element-imagepro last">
    <a href="/cache/com_zoo/images/131019_1_27c77487c871d52d7ed5fe0dd6d527bf.jpg" data-lightbox="group:23a4d5c5-9bee-4158-8072-2489d3b9443c-5df134d9b8528;" title="131019_1"><img src="/cache/com_zoo/images/131019_1_29ef9fe25c7d22bfd4c95711bd6e65f9.jpg" width="200" height="200" alt="131019_1"></a> 
    <a href="/cache/com_zoo/images/131019_2_f6761ba18fe314790bc3b2c191a0d7c0.jpg" data-lightbox="group:23a4d5c5-9bee-4158-8072-2489d3b9443c-5df134d9b8528;" title="131019_2"><img src="/cache/com_zoo/images/131019_2_8306dd702c18281cebcc95aed62d68ce.jpg" width="200" height="200" alt="131019_2"></a>    
</div>

После парсинга и в самом файле CSVимпорта он должен быть таким:

<div class="element element-image element-imagepro last">
    <img src="http://newsite.com/files/131019_1_27c77487c871d52d7ed5fe0dd6d527bf.jpg">
    <img src="http://newsite.com/files/131019_2_f6761ba18fe314790bc3b2c191a0d7c0.jpg">  
</div>

Где http://newsite.com является доменным именем сайта на который будет производиться импорт записей. Это очень важно. Иначе WP All Import не будет импортировать изображения в медиатеку сайта при импорте.

Важно что бы ссылки в теле контента совподали один к одному с ссылками на изображения для загрузки плагином WP All Import.

Я надеюсь сам смысл понятен.

Настройка шаблона импорта

Из всех полей шаблона конечно же очень важным является "Images". Он должен выглядеть так:

Получается что ячейка "gallery_images" состоит из списка сылок на изображения которые разделены |. Обращаю внимание на то что ссылки должны быть полными такого типа http://newsite.com/files/131019_2_f6761ba18fe314790bc3b2c191a0d7c0.jpg | http://newsite.com/files/131019_2_f6761ba18fe314790bc3b2c191a032454325432.jpg

Обязательно нужно проверить как плагин WP All Import отрабатывает загрузки изображений для этого нажмите кнопку "Preview & Test":

В открывшемся окне нажмите "Run Test"

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

Далее импортируем записи как кому удобно. Только не забываем загрузить картинки в папку files в корне сайта (для импорта изображений плагином).

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

Перемещаем все изображения записи в одну галерею

После того как все записи были импортированы, вставьте данную функцию в файл function.php Вашей темы:

add_action('save_post', 'wp_all_import_save_posts');

function wp_all_import_save_posts( $post_id ){

    if ( !wp_is_post_revision( $post_id ) ){
        // unhook this function so it doesn't loop infinitely
        remove_action('save_post', 'wp_all_import_save_posts');

// =======================
// START    
// =======================
        // Указываем тип записи для которой необходимо применить правки
        $post_type = "post";

        $get_post = get_post($post_id);

        //текущий тип поста
        $get_post_type = $get_post->post_type;

        if ($get_post_type == $post_type  ){

            $get_post_content = $get_post->post_content;
            // Удаляем все изображения
//          $get_post_content_NOT_img = preg_replace('/<img[^>]+./','',$get_post_content);
            // Удаляем блок обвертку изображений
//          if (strpos($get_post_content_NOT_img, 'sigplus-gallery')){
//              $get_post_content_NOT_img = preg_replace('/<div id=\".*\" class=\"sigplus-gallery.*>.*<\/div>/','',$get_post_content_NOT_img);
//          }
//          if (strpos($get_post_content_NOT_img, '<p></p>')){
//              $get_post_content_NOT_img = preg_replace("/<p[^>]*><\\/p[^>]*>/",'',$get_post_content_NOT_img);
//          }
            //====================================
            // Получаем вложенные изображения через URL
            // START
            //====================================
            $doc=new DOMDocument();
            //$doc->loadHTML("<html><body>Test<br><img src=\"myimage.jpg\" title=\"title\" alt=\"alt\"></body></html>");
            $doc->loadHTML($get_post_content);
            $xml=simplexml_import_dom($doc); // just to make xpath more simple
            $images=$xml->xpath('//img');
            $IMGs_URLs;
            $IMGs_IDs;
            foreach ($images as $img) {
                // Получаем имена файлов изображений
                $IMGs_NAMEs .= basename($img['src']) . ",";
                // добавляем имена в строку
                $IMGs_URLs .= $img['src'] . ",";

                    global $wpdb;

                    // таблица постов, там же перечисленны и медиафайлы
                    $table  = $wpdb->prefix . 'posts';
                    $attachment_id = $wpdb->get_var( 
                        $wpdb->prepare( "SELECT ID FROM $table WHERE guid RLIKE %s", $img['src'] ) 
                    );
                    // Returns id
                    $IMGs_IDs .= $attachment_id.',';

                    // Добавляем изображения к посту (attachment)
                    wp_update_post( array(
                            'ID' => $attachment_id,
                            'post_parent' => $post_id
                        )
                    );

            }
                // Удаляем последний символ из конца строки
                $IMGs_URLs = preg_replace("/,$/", "", $IMGs_URLs );
                $IMGs_NAMEs = preg_replace("/,$/", "", $IMGs_NAMEs );
                $IMGs_IDs = preg_replace("/,$/", "", $IMGs_IDs );
                //dd($IMGs_IDs);

            //s($IMGs_URLs);
            //====================================
            // END
            // Получаем вложенные изображения через URL
            //====================================
            // Создаем массив данных
//          vdd($get_post_content_NOT_img);
            $my_post = array();
            $my_post['ID'] = $post_id;

             // https://www.kvcodes.com/2015/12/get-attachments-wordpress/
             // Получаем все прикрепленные изображения к записи
             // START
             $attachments_ID = '';

             $args = array('post_type'=>'attachment','numberposts'=>null,'post_status'=>null, 'post_parent' => $post_id);

               $attachments = get_posts($args);
                if($attachments){
                      foreach($attachments as $attachment){
                         // here your code 
                          // echo $attachment->ID; 
                          $attachments_ID .= $attachment->ID.",";
                       }
                  }

            // Удаляем последний символ из конца строки
            $attachments_ID = preg_replace("/,$/", "", $attachments_ID );

             // END
             // Получаем все прикрепленные изображения к записи

            // $my_post['post_content'] .= '[url-gallery imgs="'.$IMGs_URLs.'"]';

            // Обновляем данные в БД
            if ($attachments_ID != ''){
                $gallery_of_images_from_all = "[gallery ids=\"".$attachments_ID."\" columns=\"3\" link=\"file\"]";
                $get_post_content_NOT_img = preg_replace('/<img[^>]+./','',$get_post_content);
                $my_post['post_content'] = $get_post_content_NOT_img.$gallery_of_images_from_all;
                wp_update_post( $my_post );

            } else if ($IMGs_IDs != '') {

                $gallery_of_images_from_all = "[gallery ids=\"".$IMGs_IDs."\" columns=\"3\" link=\"file\"]";
                $get_post_content_NOT_img = preg_replace('/<img[^>]+./','',$get_post_content);
                // $my_post['post_content'] = $get_post_content_NOT_img.$gallery_of_images_from_all;
                $my_post['post_content'] = $get_post_content.$gallery_of_images_from_all;
                wp_update_post( $my_post );

            }

        }

// =======================
// END
// =======================

        // re-hook this function
        add_action('save_post', 'wp_all_import_save_posts');
    }
}

Обновление записей

Теперь переходим к списку всех записей то есть сюда:

Далее в настройках экрана, в опции "Количество элементов на странице:" устанавливаем 50 (я думаю должно хватить).

И применяем групповое обновление всех записей:

Заключение

После того как все записи будут обновлены не забудьте удалить ранее скопированный код из function.php.

Полезные ссылки

Для начала советую почитать данный пост от разработчиков плагина: http://www.wpallimport.com/tour/execute-php-on-data/

Далее читаем расширение возможностей при помощи php http://www.wpallimport.com/documentation/advanced/action-reference/

Далее можно глянуть примеры кода php на гитхабе https://github.com/soflyy/wp-all-import-action-reference