Organización física de la biblioteca multimedia de wordpress (complemento Real Media Library)

22

Estructura de carpetas de Real Media Library

Introducción.

En la captura de pantalla anterior, puede ver una estructura de carpetas creada con el complemento premium Real Media Library . Ahora quiero crear un complemento de extensión que pueda organizar la estructura de la carpeta en una estructura de carpeta física : RML es solo una estructura visual.

Actualización n. ° 2 (2017-01-27): ¡Mira la respuesta!

Eche un vistazo a la organización física de la biblioteca de medios de WordPress (complemento Real Media Library) donde he creado un complemento de extensión gratuito.

Actualización n. ° 1 (2016-12-14): primer éxito: carpeta de carga de miniaturas personalizada

Ahora, he creado otro complemento Real Thumbnail Generator , que le permite crear una carpeta de carga de miniaturas personalizada. Solo eche un vistazo a esta captura de pantalla:

Carpeta real de carga de generador de miniaturas

¿Por qué carpetas de miniaturas personalizadas? Las carpetas de miniaturas personalizadas son más fáciles de mantener, porque aquí, no necesitamos mantener las URL de actualización de la base de datos porque las miniaturas todavía están en la misma ubicación (que la extensión RML todavía no cambia).

Si desea obtener más información sobre el generador de miniaturas personalizado, puede echar un vistazo a este hilo, donde he explicado un enfoque técnico ¿ Cada tamaño de imagen personalizada en el directorio de carga personalizado? .

Siga este hilo, porque a principios de 2017 continuaré el desarrollo de la extensión RML que permite la sincronización entre RML y la carpeta de carga del servidor. La extensión también es compatible con el complemento Real Thumbnail Generator, por lo que debería haber una actualización de la base de datos.

Publicación original

Mi objetivo de extensión.

En este momento estoy en la carpeta "/ Unorganized", eso significa que es la carpeta / wp-content / uploads /. Cuando muevo el archivo (como puede ver en la captura de pantalla) a la carpeta PDF / SubDir, el archivo está en la carpeta visual. Ahora mi extensión detecta la carpeta diferente a la física y muestra un pequeño "botón" que también permite al usuario moverlo físicamente:

Botón para fisixizarlo

El usuario ahora hace clic en el botón "Physix it!" y el archivo debe moverse a /wp-content/uploads/pdfs/subdir/Another-Doc.pdf . Ya he creado el proceso de movimiento: leí todos los archivos multimedia para este archivo adjunto (miniaturas incluidas para las imágenes) y utilizo el cambio de nombre de la función php ($ old_file, $ new_file) junto con la función WP wp_mkdir_p () . El GUID en la tabla wp_posts y los metadatos en wp_postmeta también cambian. Cuando se mueven todos los archivos, llamo a la acción:

<?php
do_action('RML/Physix/Moved', $meta, $id);
// $meta = Infos about the move process, see above screenshot
// $id = The attachment ID
?>

$ meta es una matriz:

ingrese la descripción de la imagen aquí

La clave "renombrar" contiene todos los procesos de renombrar (por ejemplo, aquí pueden estar los archivos de miniaturas para imágenes).

El problema: garantizar la compatibilidad del complemento.

El principal problema (si lo es) de la biblioteca de medios de WordPress es que muchos complementos guardan las referencias a imágenes con URL completas en lugar de la ID de archivo adjunto. Eso significa que hay tablas MySQL con columnas que contienen una URL para el archivo dado. ¿Cómo puedo garantizar que TODAS las referencias estén actualizadas con las carpetas físicas? Creo que es imposible

Un posible enfoque.

Me engancho a la acción y actualizo las tablas estándar como wp_post-> post_content , ... con una instrucción REPLACE recursiva en SQL.

<?php    
/**
 * When a attachment is moved.
 * 
 * @hooked RML/Physix/Moved
 */
function physix_moved($meta, $id) {
    $rename = $meta["rename"];

    // Prepare array for recursive REPLACE
    $arr = array();
    foreach ($rename as $value) {
        $arr[] = array($value["old_url"], $value["new_url"]);
    }
    $rec = $this->recReplace($arr, "post_content"); // function is already finished
}
?>

La variable $ rec ahora es una instrucción REPLACE:

REPLACE(post_content, 'https://example.io/wp-content/uploads/Another-Doc.pdf', 'https://example.io/wp-content/uploads/pdfs/subdir/Another-Doc.pdf')

Por cierto: para una imagen (testimage.jpg) con todos los archivos de miniaturas puede verse así:

REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(post_content, 'https://example.io/wp-content/uploads/testimage-750x350.jpg', 'https://example.io/wp-content/uploads/pdfs/subdir/testimage-750x350.jpg'), 'https://example.io/wp-content/uploads/testimage-1170x855.jpg', 'https://example.io/wp-content/uploads/pdfs/subdir/testimage-1170x855.jpg'), 'https://example.io/wp-content/uploads/testimage-256x187.jpg', 'https://example.io/wp-content/uploads/pdfs/subdir/testimage-256x187.jpg'), 'https://example.io/wp-content/uploads/testimage-1024x748.jpg', 'https://example.io/wp-content/uploads/pdfs/subdir/testimage-1024x748.jpg'), 'https://example.io/wp-content/uploads/testimage-300x219.jpg', 'https://example.io/wp-content/uploads/pdfs/subdir/testimage-300x219.jpg'), 'https://example.io/wp-content/uploads/testimage-150x150.jpg', 'https://example.io/wp-content/uploads/pdfs/subdir/testimage-150x150.jpg'), 'https://example.io/wp-content/uploads/testimage.jpg', 'https://example.io/wp-content/uploads/pdfs/subdir/testimage.jpg')

Pero, ¿qué sucede si se trata de una cadena serializada (JSON) en la tabla de la base de datos? Así parece { "image": "http:\/\/example.io\/wp-content\/uploads\/Another-Doc.pdf" }. ¿Qué debo agregar a la REPLACE-Statement?

La instrucción REPLACE ahora se puede usar a través de todas las tablas MySQL que contienen URL de imágenes. Pensé en crear una matriz de filtros donde los complementos pueden agregar sus tablas y mi extensión hace el resto:

<?php
$tables = apply_filters("RML/Physix/Moved/Tables", array( // TODO: use $wpdb->prefix
    "wp_posts" => array("post_excerpt", "post_content"),
    "wp_postmeta" => array("meta_value")
    //...
));
?>

El registro "mover"

Quiero crear un "registro" donde los usuarios puedan deshacer movimientos. Si un usuario ve, una imagen está rota (por ejemplo, en el complemento Slider Revolution), puede deshacer el movimiento a la carpeta original.

¿Qué opinas de esa idea? ¿Hay una mejor solución? ¡Espero haberlo explicado todo de una manera agradable!

Matthias Günter
fuente
99
No debe ver la estructura de carpetas subyacente a los archivos adjuntos, en muchos casos no hay ninguno (¿quizás los archivos ni siquiera están en el servidor? S3 AWS CDN, etc.), WordPress se ocupa de publicaciones adjuntas, no archivos adjuntos, y moverlos en un servidor es contraproducente. Sería mejor hacerlo con una taxonomía personalizada y reglas de reescritura que desencadenan una redirección
Tom J Nowell
55
Si bien esta es una excelente pregunta en términos de claridad / calidad (+1 por esfuerzo), en última instancia, estamos tratando con un complemento de terceros aquí, que se considera fuera de tema, no creo que nadie pueda Ayuda "rápida" sin invertir seriamente en RML.
TheDeadMedic
@TheDeadMedic Sí, eso es cierto. Pero hice la pregunta de la manera, que sabes cómo funciona con las acciones en RML. Esta pregunta no es específica de RML, es más específica de la base de datos: cómo resolver el problema con el reemplazo de la URL.
Matthias Günter
2
Y otro +1 por esfuerzo: desearía tener más de esas preguntas ... como las tuvimos en los primeros días. De todos modos, los principales problemas se describen anteriormente. Para aclarar su punto: ¿Podría presentar una edición y explicar el razonamiento de lo que está intentando? Hasta ahora no tiene ningún sentido realizar esas tareas del sistema de archivos.
Kaiser
¿Cómo te fue con este @ MatthiasGünter? ¿Has logrado encontrar una solución?
Tim Malone

Respuestas:

1

Extensión de solución gratuita "Carpeta de carga física personalizada"

Hace mucho tiempo comencé a abrir este hilo y ahora hay un complemento de extensión utilizable para Real Media Library que le permite administrar físicamente su carpeta de cargas .

ingrese la descripción de la imagen aquí

Echa un vistazo a este complemento: https://wordpress.org/plugins/physical-custom-upload-folder/

¿Conoces la carpeta wp-content / uploads? Allí, los archivos se almacenan en carpetas basadas en año / mes. Este puede ser un proceso muy complicado y masivo, especialmente cuando está trabajando con un cliente FTP como FileZilla.

Mover archivos ya cargados: este complemento no permite mover los archivos físicamente cuando mueve un archivo en la Biblioteca Real Media porque WordPress usa las URL en diferentes lugares. Es muy difícil mantener ese proceso. Entonces esto solo funciona para nuevas cargas.

Matthias Günter
fuente