Скопіюйте всі зображення, що відображаються у [галереї], та запропонуйте як посилання для завантаження


13

Я хотів би запропонувати своїм відвідувачам можливість завантажити всю фотогалерею (відображається на виділених [галереях] сторінках) у вигляді ZIP-файлу, який відображається внизу кожної сторінки галереї. - Повнорозмірне зображення потрібно буде включити.

Девід Уолш дав код в своєму пості тут застібати файли , але у мене виникають проблеми з інтеграцією , що з функціями Wordpress.

Я знаю, що існує плагін для завантаження галереї NextGEN, але я не в змозі використати це, використовуючи функції рідної галереї wordpress.

Подібне запитання з альтернативним (ручним методом) виконанням вищезазначеного можна знайти тут: Плагін для завантаження доданих медіа-файлів?

Будь-яка допомога буде дуже вдячна. Спасибі.


Що ви маєте на увазі під виділеними сторінками галереї?
NoBugs

стандартні публікації, які відображають ТІЛЬКИ короткий код галереї [колонки галереї = "4" посилання = "файл"] і жодного іншого вмісту на сторінці. Я включив, що в описі просто на випадок це допомогло розробникам.
Пол Томсон

Відповіді:


14

Спочатку ви повинні отримати зображення. Як отримати всі зображення галереї описано тут .

WordPress використовує два класи для розпакування файлів. PHP з'явився ZipArchive()(використання див. Девід Уолш). І PclZip , ви можете знайти цей клас у wp-admin/includes/class-pclzip.php. Якщо у вас виникли проблеми із ZipArchive()спробуйте клас PclZip.

Тепер вам просто доведеться склеїти обидва разом. Можливо, я можу опублікувати якийсь зразок коду пізніше, в даний час я не в моєму столі.

Оновлення

Ваше питання можна розділити на дві частини. Перший - це отримання всіх зображень із галереї. Другий - стискає зображення та надсилає поштовий файл.
Я поясню лише першу частину, отримавши всі зображення з галереї, тому що перетягування файлів трохи офтопічне.

Можливо, є й інші рішення, але в цьому прикладі я замінюю оригінальний короткий код галереї на власний, щоб отримати зображення. Причина в тому, що WordPress трохи змінив галереї в v3.5.
До 3,5 зображення для галереї - це додатки до публікації. Після 3,5 зображення передаються в короткий код як атрибут. Оскільки WP3.5 ми не можемо отримувати додані зображення допису, ми повинні отримати список з атрибутів короткого коду. Моя стратегія полягає в заміні оригінального короткого коду на власний короткий код, захоплення атрибутів та виклик оригінального короткого коду, щоб отримати вихід галереї.

Усі речі, пов’язані з галереєю, знаходяться в класі. Для створення zip-файлу ми можемо використовувати інший клас, який приймає як вихід вихід класу галереї. Почнемо з класу та простого конструктора.

class GalleryZip
{
    private static $instance = null;

    public static $images = array();

    public static function get_instance() {
        if ( ! session_id() )
          session_start();

        if ( null === self::$instance )
            self::$instance = new self();

        return self::$instance;
    }

    private final function __construct() {
        remove_shortcode( 'gallery' );
        add_shortcode( 'gallery', array( __CLASS__, 'gallery_zip_shortcode' ) );
    }
}

Ми будемо називати метод get_instance()пізніше у плагіні з гаком plugins_loaded. У конструкторі ми видаляємо оригінальний короткий код і замінюємо його нашим власним шорт-кодом gallery_zip_shortcode(). Тепер нам потрібен зворотний виклик короткого коду

public static function gallery_zip_shortcode( $atts ) {

    $post = get_post();

    if ( ! function_exists( 'gallery_shortcode' ) )
      require_once ABSPATH . 'wp-includes/media.php';

    self::get_gallery_images_from_shortcode( $post->ID, $atts );
    $output = gallery_shortcode( $atts );

    $gallery_id = count( self::$images[$post->ID] ) - 1;

    $link = sprintf( '<div><a href="#" gallery-id="%d" post-id="%d" class="gallery-zip">%s</a></div>', $gallery_id, $post->ID, __( 'Get as Zip' ) );
    $output .= $link;

    return $output;

}

Перше, що в цьому методі - отримати посаду, оскільки нам потрібен ідентифікатор публікації. Окрім того, що ми включаємо wp-includes/media.php, цей файл містить функцію зворотного дзвінка для оригінального короткого коду галереї. Тепер ми називаємо метод отримання масиву з усіма зображеннями, створюємо вихід галереї, викликаючи вихідний зворотний виклик галереї, створюємо посилання та додаючи посилання до виходу галереї. Самі зображення, відповідно пати до зображень, зберігаються у змінній класу $images, цей масив нам знадобиться пізніше.
Змінна класу $imageмістить запис для кожної публікації з галереєю, тому ми можемо використовувати функцію або на передній сторінці, або в одному перегляді. Кожен запис містить масив для кожної галереї, оскільки в кожній публікації може бути більше однієї галереї.

Основою плагіна є метод отримання зображень із шорт-коду.

protected static function get_gallery_images_from_shortcode( $id, $atts ) {

    // use the post ID if the attribute 'ids' is not set or empty
    $id = ( ! isset( $atts['ids'] ) || empty( $atts['ids'] ) ) ?
        (int) $id : $atts['ids'];

    $exclude = ( isset( $atts['exclude'] ) && ! empty( $atts['exclude'] ) ) ?
        $atts['exclude'] : '';

    if ( ! isset( self::$images[$id] ) || ! is_array( self::$images[$id] ) )
        self::$images[$id] = array();

    $images = self::get_gallery_images( $id, $exclude );

    array_push( self::$images[$id], $images );

    return $images;

}

Спочатку ми вирішуємо, чи це одна публікація чи список ідентифікаторів публікації. Якщо це список ідентифікаторів публікацій, ми обробляємо галерею з WP3.5 +. Після цього ми маємо обробити excludeатрибут. Після налаштування всіх змінних, ми можемо нарешті отримати зображення з галереї. Отримані зображення будуть висунуті в клас класу $imagesдля подальшого використання.

protected static function get_gallery_images( $id, $exclude ) {
    $images     = array();
    $query_args = array(
            'post_status'    => 'inherit',
            'post_type'      => 'attachment',
            'post_mime_type' => 'image',
    );

    // handle gallery WP3.5+
    // if $id contains an comma, it is a list of post IDs
    if ( false !== strpos( $id, ',' ) ) {
        $query_args['include'] = $id;
    } elseif ( ! empty( $exclude ) ) {
        // handle excluding posts
        $query_args['post_parent'] = $id;
        $query_args['exclude']     = $exclude;
    } else {
        // handle gallery before WP3.5
        $query_args['post_parent'] = $id;
    }

    $attachments = get_posts( $query_args );

    $img_sizes = array_merge( array( 'full' ), get_intermediate_image_sizes() );

    $img_size = ( in_array( self::IMAGE_SIZE, $img_sizes ) ) ?
            self::IMAGE_SIZE : 'full';

    foreach ( $attachments as $key => $post ) {
        $img = wp_get_attachment_image_src( $post->ID, $img_size, false, false );
        $images[] = sprintf( '%s/%s', dirname( get_attached_file( $post->ID ) ), basename( $img[0] ) );
    }

    return $images;
}

Це золото плагіна. Просто встановіть масив із аргументами запитів, отримайте вкладені файли get_posts()та перейдіть до отриманих вкладень. Для обробки різних розмірів ми отримуємо зображення вкладення та смужку URL-адреси. Із вкладеного файлу ми беремо шлях і складаємо його разом з назвою файлу. У масиві $imagesтепер усі зображення та їхні патьоки з галереї.

В основному, на ваше запитання дано відповідь. Але ви також хочете створити ZIP-файл із зображень. Ви можете створити zip-файл із масиву $imagesостаннім методом. Але цей метод називається щоразу, коли відображається галерея, і створення zip-файлу може зайняти деякий час. Можливо, ніхто не запитає створений тут zip-файл, це марна трата ресурсів.

Як ми можемо це зробити краще? Ви пам’ятаєте, що я помістив усі зображення у змінну класу $images? Ми можемо використовувати цей клас var для запиту на ajax. Але запит ajax - це лише чергове завантаження сторінки, і ми можемо отримати доступ до зображень лише тоді, коли буде створено вихід з галереї. Ми повинні зберігати наші зображення в місці, де ми можемо отримати доступ до них навіть після чергового запиту на сторінку.
У цьому прикладі я використовую змінну сеансу для зберігання масиву із зображеннями. До змінної сеансу можна отримати доступ навіть після перезавантаження іншої сторінки. Для зберігання зображень я реєструю метод за допомогою shutdownгачка. Після завершення візуалізації сторінки WordPress shutdownбуде викликано гачок. На даний момент ми повинні були зібрати всі зображення з усіх відображених галерей. Ми просто зберігаємо зображення та отримуємо доступ до них у запиті на ajax.

Коли спрацьовує запит ajax, ми згадуємо var сесії та створюємо zip-файл із даних. Але це трохи поза темою для цього питання.

Я створив сховище на GitHub з повним кодом плагіна. Я сподіваюся, що це вказує на вас у правильному напрямку.


зауважте, що якщо ви маєте справу з новими галереями у стилі 3.5, то цей спосіб отримання зображень із галереї може не працювати для вас.
Міло

Для уточнення я використовую останню версію Wordpress 3.5.1. Йоганне, я був би дуже вдячний, якби ти зміг надати якийсь зразок коду, коли ти наступний за робочим столом. Спасибі, Пол
Пол Томсон

Гей, Ральфе, це якась фантастична робота! Дякую, що поділились. Для того, щоб зображення моєї галереї відображалися належним чином, я повинен включати в короткий код link = "файл", тобто: [link link = "файл"], оскільки короткий код переписується через ваш код, я думаю, що його не вистачає і як в результаті мої галереї відображаються неправильно. Чи є спосіб зафіксувати цей аргумент у вашому коді?
Пол Томсон

Зазвичай атрибути просто передаються до початкового короткого коду і не змінюються. Галереї відображаються як звичайні, але з доданим деяким HTML-кодом. У моїх тестах (з темою двадцятитонних стендрадів) галереї відображаються правильно.
Ralf912

@PaulThomson Я вирішив деякі проблеми у сховищі github. Код не був чистим.
Ralf912

0

Мені подобається ідея плагіна Ральфа, щоб можна було завантажити цілу галерею за один раз, але мені не вдалося змусити її працювати. Я придумав рішення, яке працює для наших цілей. Метод полягає в заміні рідної галереї WP на власну, яку ви розміщуєте в кінці functions.phpфайлу вашої теми, і додайте наступний файл, названий download.phpу папці активних тем. У користувацькій галереї посилання під файлом викликає файл download.php, який автоматично змушує завантажувати файл на жорсткий диск. Я перевірив це на останніх версіях Chrome, Firefox та Safari, і це працює чудово. Використовували тему двадцять дванадцять, але немає причин, чому вона не повинна працювати і над іншими.

а) До кінця додайте наступне functions.php. Це просто взято з media.php

remove_shortcode('gallery');
function gallery_with_download_links($attr) {
    $post = get_post();
    static $instance = 0;
    $instance++;
    if ( ! empty( $attr['ids'] ) ) {
        // 'ids' is explicitly ordered, unless you specify otherwise.
        if ( empty( $attr['orderby'] ) )
            $attr['orderby'] = 'post__in';
        $attr['include'] = $attr['ids'];
    }
    // Allow plugins/themes to override the default gallery template.
    $output = apply_filters('post_gallery', '', $attr);
    if ( $output != '' )
        return $output;
    // We're trusting author input, so let's at least make sure it looks like a valid orderby statement
    if ( isset( $attr['orderby'] ) ) {
        $attr['orderby'] = sanitize_sql_orderby( $attr['orderby'] );
        if ( !$attr['orderby'] )
            unset( $attr['orderby'] );
    }

    extract(shortcode_atts(array(
        'order'      => 'ASC',
        'orderby'    => 'menu_order ID',
        'id'         => $post->ID,
        'itemtag'    => 'dl',
        'icontag'    => 'dt',
        'captiontag' => 'dd',
        'columns'    => 3,
        'size'       => 'thumbnail',
        'include'    => '',
        'exclude'    => ''
    ), $attr));

    $id = intval($id);
    if ( 'RAND' == $order )
        $orderby = 'none';

    if ( !empty($include) ) {
        $_attachments = get_posts( array('include' => $include, 'post_status' => 'inherit', 'post_type' => 'attachment', 'post_mime_type' => 'image', 'order' => $order, 'orderby' => $orderby) );

        $attachments = array();
        foreach ( $_attachments as $key => $val ) {
            $attachments[$val->ID] = $_attachments[$key];
        }
    } elseif ( !empty($exclude) ) {
        $attachments = get_children( array('post_parent' => $id, 'exclude' => $exclude, 'post_status' => 'inherit', 'post_type' => 'attachment', 'post_mime_type' => 'image', 'order' => $order, 'orderby' => $orderby) );
    } else {
        $attachments = get_children( array('post_parent' => $id, 'post_status' => 'inherit', 'post_type' => 'attachment', 'post_mime_type' => 'image', 'order' => $order, 'orderby' => $orderby) );
    }

    if ( empty($attachments) )
        return '';

    if ( is_feed() ) {
        $output = "\n";
        foreach ( $attachments as $att_id => $attachment )
            $output .= wp_get_attachment_link($att_id, $size, true) . "\n";
        return $output;
    }

    $itemtag = tag_escape($itemtag);
    $captiontag = tag_escape($captiontag);
    $icontag = tag_escape($icontag);
    $valid_tags = wp_kses_allowed_html( 'post' );
    if ( ! isset( $valid_tags[ $itemtag ] ) )
        $itemtag = 'dl';
    if ( ! isset( $valid_tags[ $captiontag ] ) )
        $captiontag = 'dd';
    if ( ! isset( $valid_tags[ $icontag ] ) )
        $icontag = 'dt';

    $columns = intval($columns);
    $itemwidth = $columns > 0 ? floor(100/$columns) : 100;
    $float = is_rtl() ? 'right' : 'left';

    $selector = "gallery-{$instance}";

    $gallery_style = $gallery_div = '';
    if ( apply_filters( 'use_default_gallery_style', true ) )
        $gallery_style = "
        <style type='text/css'>
            #{$selector} {
                margin: auto;
            }
            #{$selector} .gallery-item {
                float: {$float};
                margin-top: 10px;
                text-align: center;
                width: {$itemwidth}%;
            }
            #{$selector} img {
                border: 2px solid #cfcfcf;
            }
            #{$selector} .gallery-caption {
                margin-left: 0;
            }
        </style>
        <!-- see gallery_shortcode() in wp-includes/media.php -->";
    $size_class = sanitize_html_class( $size );
    $gallery_div = "<div id='$selector' class='gallery galleryid-{$id} gallery-columns-{$columns} gallery-size-{$size_class}'>";
    $output = apply_filters( 'gallery_style', $gallery_style . "\n\t\t" . $gallery_div );

    $i = 0;
    foreach ( $attachments as $id => $attachment ) {
        $link = isset($attr['link']) && 'file' == $attr['link'] ? wp_get_attachment_link($id, $size, false, false) : wp_get_attachment_link($id, $size, true, false);

        $output .= "<{$itemtag} class='gallery-item'>";
        $output .= "
            <{$icontag} class='gallery-icon'>
                $link
            </{$icontag}>";
        if ( $captiontag && trim($attachment->post_excerpt) ) {
            $output .= "
                <{$captiontag} class='wp-caption-text gallery-caption'>
                " . wptexturize($attachment->post_excerpt) . "
                </{$captiontag}>";
        }
// This is my addon which outputs a link to download the file through download.php . NB your file uri will be public! 
        $output .= '<br/ ><a href="'.get_template_directory_uri().'/download.php?file='.get_attached_file( $id ).'">Download image</a>';
        $output .= "</{$itemtag}>";
        if ( $columns > 0 && ++$i % $columns == 0 )
            $output .= '<br style="clear: both" />';
    }

    $output .= "
            <br style='clear: both;' />
        </div>\n";

    return $output;
}
add_shortcode( 'gallery' , 'gallery_with_download_links' );

b) Скопіюйте та вставте наступне у файл, названий download.phpу базовому каталозі теми.

<?php
$file = $_GET['file'];
if (file_exists($file)) {
header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename='.basename($file));
header('Content-Transfer-Encoding: binary');
header('Expires: 0');
header('Cache-Control: must-revalidate');
header('Pragma: public');
header('Content-Length: ' . filesize($file));
ob_clean();
flush();
readfile($file);
exit;
}
?>

в). Не забудьте посилання на файл у галереї !! Важливо!


Я не думаю, що це гарна ідея, використовуючи download.phpі за допомогою $_GETпараметра, я можу завантажувати всі файли, які я хочу, з вашої веб-папки (також на мережевих спільних ресурсах), наприкладwp-config.php
Diego Betto,
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.