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:
¿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:
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:
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!