Comprimir imágenes adjuntas de taxonomía y fecha

5 minutos de lectura

Estoy trabajando en un script que le permite a un cliente descargar todas las imágenes adjuntas a las publicaciones dentro de una taxonomía personalizada específica, publicada en una fecha específica.

He creado la nueva página de administración que incluye un formpueden seleccionar la taxonomía y la fecha, luego enviar el formulario.

Luego, el formulario se envía a un script que intenta obtener todos los url‘s para un tamaño de imagen específico (1920px). Hasta ahora, estoy ejecutando un ciclo para obtener las publicaciones, luego un db llame para obtener los archivos adjuntos que coincidan ID‘s.

Pero estoy un poco atascado en cuanto a cómo voy a obtener el urlde estas imágenes dentro de una matriz para que el usuario pueda comprimirlas y descargarlas.

Aquí está el código para el script hasta ahora:

(create_zip función de: http://davidwalsh.name/create-zip-php)

/* creates a compressed zip file */
function create_zip($files = array(),$destination = '',$overwrite = false) {

    //if the zip file already exists and overwrite is false, return false
    if(file_exists($destination) && !$overwrite) { return false; }
    //vars
    $valid_files = array();
    //if files were passed in...
    if(is_array($files)) {
        //cycle through each file
        foreach($files as $file) {
            //make sure the file exists
            if(file_exists($file)) {
                $valid_files[] = $file;
            }
        }
    }

    //if we have good files...
    if(count($valid_files)) {
        //create the archive
        $zip = new ZipArchive();
        if($zip->open($destination,$overwrite ? ZIPARCHIVE::OVERWRITE : ZIPARCHIVE::CREATE) !== true) {
            return false;
        }
        //add the files
        foreach($valid_files as $file) {
            $zip->addFile($file,$file);
        }
        //debug
        //echo 'The zip archive contains ',$zip->numFiles,' files with a status of ',$zip->status;

        //close the zip -- done!
        $zip->close();

        //check to make sure the file exists
        return file_exists($destination);

    } else {

        return false;
    }

}

?>

(código para obtener las imágenes)

<?php

    // get things from the form
    $club = $_POST['club'];
    $day = $_POST['day'];
    $month = $_POST['month'];
    $year = $_POST['year']; 


    // run the loop 
    $loop = new WP_Query( array( 
        'post_type' => 'sell_media_item',
        'collection' => $club,
        'include_children' => false,
        'year' => $year,
        'monthnum' => $month,
        'day' => $day,
        'fields' => 'ids',
    ) );

    if ( $post_ids = $loop->get_posts() ) {

        $post_ids = implode( ',', $post_ids );
        $atts_ids = $wpdb->get_col( "SELECT ID FROM $wpdb->posts WHERE post_parent IN($post_ids) AND post_type="attachment"" );   

        $images->query( array(
            'post_mime_type' =>'image',
            'post_status' => 'published',
            'post_type' => 'attachment',
            'post__in' => $atts_ids,
        ));

    }


    //////////////////////////////////////////////
    // something here to get the image url's?
    /////////////////////////////////////////////


    // prep the files to zip
    $files_to_zip = array(
        'src/to/files.jpg'
    );

    // zip 'em!
    $result = create_zip($files_to_zip,'vip-download.zip');


?>

¿Alguna idea sobre cómo obtendría la URL con el tamaño de miniatura de imagen específico de 1920px en la matriz de archivos zip?

  • Eche un vistazo aquí: stackoverflow.com/questions/9906403/… Esto podría ayudar. Si el tamaño de la imagen es otro problema, puede usar etiquetas para los diferentes tamaños, usar convenciones de nombre de archivo o usar gdlib/imagick para recuperar el tamaño de la imagen.

    –Sven Schneider

    2 de septiembre de 2013 a las 9:19

  • Gracias, revisare esto. Estaba pensando, tal vez podría hacer una $wpdb llame para obtener las imágenes de la base de datos en sí, ya que puedo encontrar cada archivo adjunto de la identificación de la publicación. Pero, mirando ese hilo, necesito obtener la ruta real al archivo, en lugar del enlace. ¿Es esto posible en alojamiento compartido?

    – lukeseager

    3 de septiembre de 2013 a las 10:24


  • Sí. Siempre tendrás un camino completo. Si esto es algo “virtual” o no, no importa.

    –Sven Schneider

    3 de septiembre de 2013 a las 13:11

  • @lucas572 Hola. Por favor, revise mi respuesta y avíseme si funciona;) He agregado información sobre el tamaño de la imagen.

    – Comunidad

    7 sep 2013 a las 10:14

avatar de usuario
Comunidad

WordPress devolverá la URL completa de cada imagen, por lo tanto, tendrá que convertir esas URL en RUTAS internas para agregarlas a su archivo ZIP.

Así es como convertiría las URL de WordPress en rutas internas del servidor:

function convert_upload_url_to_path($url) {

    $path = $url;

    $upload_dir_infos = wp_upload_dir();
    $upload_url = $upload_dir_infos['baseurl']; // http://example.com/wp-content/uploads 
    $upload_path = $upload_dir_infos['basedir']; // C:\path\to\wordpress\wp-content\uploads 

    // Step 1: remove $upload_url
    $path = str_replace($upload_url, '', $path);

    // Step 2: prepend $upload_path
    $path = $upload_path.$path;

    return $path;
}

Ahora, para obtener la URL real de cada imagen adjunta, use el wp_get_attachment_image_src($attachment_id, $size); función.

El primer parámetro es el ID del archivo adjunto y el segundo (opcional) es el tamaño de imagen deseado. Devolverá la URL de la imagen.

Aquí hay un ejemplo usando su $atts_ids variable:

$files_to_zip = array();
foreach ($atts_ids as $attachement_id) {

    $image_info = wp_get_attachment_image_src($attachement_id, 'full');
    $image_url = $image_info[0];
    $image_path = convert_upload_url_to_path($image_url);

    $files_to_zip[] = $image_path;
}

// zip 'em!
$result = create_zip($files_to_zip,'vip-download.zip');

Tenga en cuenta que al especificar el $size El parámetro no cambiará el tamaño de la imagen por usted. En su lugar, devolverá el tamaño más cercano ya disponible. Si desea recuperar la imagen original cargada en su tamaño más grande, solo especifique 'full'. Puede configurar WordPress para cambiar el tamaño de las imágenes cargadas (hecho cuando se completa la carga) configurando el tamaño personalizado deseado en el Panel de WordPress > Configuración > Medios.

  • consideraría usar wp_upload_dir(). Como /wp-content/ no siempre será cierto: WP_CONTENT_DIR y WP_CONTENT_URL puede ser establecer en cualquier otro directorio/url.

    – brasofilo

    06/09/2013 a las 18:55

  • @brasofilo gracias tienes razon! He actualizado mi respuesta 😉

    – Comunidad

    7 sep 2013 a las 10:03

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad