Introduzione.
Nella schermata sopra puoi vedere una struttura di cartelle creata con il plugin premium Real Media Library . Ora voglio creare un plug-in di estensione in grado di organizzare la struttura delle cartelle in una struttura di cartelle fisica - RML è solo una struttura visiva.
Aggiornamento n. 2 (27-01-2017): controlla la risposta!
Dai un'occhiata all'organizzazione fisica della libreria multimediale wordpress (plug-in Real Media Library) in cui ho creato un plug-in di estensione gratuito.
Aggiornamento n. 1 (14-12-2016): il primo successo: cartella di caricamento miniature personalizzata
Ora, ho creato un altro plugin Real Thumbnail Generator , che ti consente di creare una cartella di caricamento delle miniature personalizzata. Dai un'occhiata a questo screenshot:
Perché cartelle di miniature personalizzate? Le cartelle di miniature personalizzate sono più facili da mantenere, perché qui non è necessario conservare gli URL di aggiornamento del database perché le miniature sono ancora nella stessa posizione (che non è ancora stata modificata dall'estensione RML).
Se vuoi saperne di più sul generatore di miniature personalizzato, puoi dare un'occhiata a questo thread, dove ho spiegato un approccio tecnico Ogni dimensione dell'immagine personalizzata nella directory di caricamento personalizzata? .
Continua su questo thread, perché all'inizio del 2017 continuerò lo sviluppo dell'estensione RML che consente la sincronizzazione tra RML e la cartella dei caricamenti del server. L'estensione è anche compatibile con il plugin Real Thumbnail Generator, quindi dovrebbe esserci l'aggiornamento del database.
Posta originale
Il mio obiettivo di estensione.
Al momento sono nella cartella "/ Unorganized", ciò significa che è la cartella / wp-content / uploads /. Quando sposto il file (come puoi vedere nello screenshot) nella cartella PDF / SubDir, il file si trova nella cartella visiva. Ora la mia estensione rileva la cartella diversa da quella fisica e mostra un piccolo "pulsante" che consente all'utente di spostarlo anche fisicamente:
L'utente ora fa clic sul pulsante "Physix it!" e il file dovrebbe essere spostato in /wp-content/uploads/pdfs/subdir/Another-Doc.pdf . Ho già creato il processo di spostamento: ho letto tutti i file multimediali per questo allegato (miniature incluse per le immagini) e utilizzo la rinomina della funzione php ($ old_file, $ new_file) insieme alla funzione WP wp_mkdir_p () . Anche il GUID nella tabella wp_posts e i metadati in wp_postmeta sono cambiati. Quando tutti i file vengono spostati, chiamo l'azione:
<?php
do_action('RML/Physix/Moved', $meta, $id);
// $meta = Infos about the move process, see above screenshot
// $id = The attachment ID
?>
$ meta è un array:
La chiave "rinomina" contiene tutti i processi di ridenominazione (ad esempio qui possono essere i file di anteprima per le immagini).
Il problema: garantire la compatibilità dei plug-in.
Il problema principale (se presente) della libreria multimediale di WordPress è che molti plugin salvano i riferimenti alle immagini con URL completi anziché l'ID allegato. Ciò significa che ci sono tabelle MySQL con colonne che contengono un URL per il file specificato. Come posso garantire che TUTTI i riferimenti siano aggiornati con le cartelle fisiche? Penso che sia impossibile.
Un possibile approccio.
Mi aggancio all'azione e aggiorno le tabelle standard come wp_post-> post_content , ... con un'istruzione ricorsiva REPLACE in 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 variabile $ rec ora è un'istruzione REPLACE:
REPLACE(post_content, 'https://example.io/wp-content/uploads/Another-Doc.pdf', 'https://example.io/wp-content/uploads/pdfs/subdir/Another-Doc.pdf')
A proposito: per un'immagine (testimage.jpg) con tutti i file di anteprima può apparire così:
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')
Ma cosa succede se si tratta di una stringa serializzata (JSON) nella tabella del database? Quindi sembra { "image": "http:\/\/example.io\/wp-content\/uploads\/Another-Doc.pdf" }
. Cosa devo aggiungere all'istruzione REPLACE?
L'istruzione REPLACE può ora essere utilizzata in tutte le tabelle MySQL che contengono URL di immagini. Ho pensato di creare un array di filtri in cui i plugin possono aggiungere le loro tabelle e la mia estensione fa il 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")
//...
));
?>
Il registro "sposta"
Voglio creare un "registro" in cui gli utenti possano annullare le mosse. Se un utente vede, un'immagine è rotta (ad esempio nel plugin Slider Revolution), può annullare il passaggio alla cartella originale.
Cosa ne pensi di quell'idea? C'è una soluzione migliore? Spero di aver spiegato tutto in modo carino!