Wprowadzenie.
Na powyższym zrzucie ekranu widać strukturę folderów zbudowaną z wtyczki premium Real Media Library . Teraz chcę utworzyć wtyczkę rozszerzenia, która może uporządkować strukturę folderów w fizyczną strukturę folderów - RML jest tylko strukturą wizualną.
Aktualizacja nr 2 (27.01.2017): Sprawdź odpowiedź!
Zobacz fizyczną organizację biblioteki multimediów wordpress (wtyczka Real Media Library), w której stworzyłem darmową wtyczkę rozszerzenia.
Aktualizacja nr 1 (14.12.2016): Pierwszy sukces: niestandardowy folder przesyłania miniatur
Teraz stworzyłem kolejną wtyczkę Real Thumbnail Generator , która pozwala na utworzenie niestandardowego folderu przesyłania miniatur. Wystarczy spojrzeć na ten zrzut ekranu:
Dlaczego niestandardowe foldery miniatur? Niestandardowe foldery miniatur są łatwiejsze w utrzymaniu, ponieważ tutaj nie musimy utrzymywać adresów URL aktualizacji bazy danych, ponieważ miniatury nadal znajdują się w tej samej lokalizacji (która nie jest zmieniana przez rozszerzenie RML).
Jeśli chcesz dowiedzieć się więcej o niestandardowym generatorze miniatur, zapoznaj się z tym wątkiem, w którym wyjaśniłem podejście techniczne. Każdy niestandardowy rozmiar obrazu w niestandardowym katalogu przesyłania? .
Proszę o kontynuowanie tego wątku, ponieważ na początku 2017 roku będę kontynuować rozwój rozszerzenia RML, który umożliwia synchronizację między RML a folderem przesyłania serwera. Rozszerzenie jest również kompatybilne z wtyczką Real Thumbnail Generator, dlatego należy zaktualizować bazę danych.
Oryginalny post
Mój cel rozszerzenia.
W tej chwili jestem w folderze „/ Unorganized”, co oznacza, że jest to folder / wp-content / uploads /. Kiedy przenoszę plik (jak widać na zrzucie ekranu) do folderu PDFs / SubDir, plik znajduje się w folderze wizualnym. Teraz moje rozszerzenie wykrywa inny folder niż fizyczny i pokazuje mały „przycisk”, który pozwala również użytkownikowi przenieść go fizycznie:
Użytkownik klika teraz przycisk „Physix it!” i plik powinien zostać przeniesiony do /wp-content/uploads/pdfs/subdir/Another-Doc.pdf . Już utworzyłem proces przenoszenia: odczytałem wszystkie pliki multimedialne dla tego załącznika (w tym miniatury obrazów) i używam zmiany nazwy funkcji php ($ stary_plik, $ nowy_plik) wraz z funkcją WP wp_mkdir_p () . Identyfikator GUID w tabeli wp_posts i metadane w wp_postmeta również ulegają zmianie. Po przeniesieniu wszystkich plików wywołuję akcję:
<?php
do_action('RML/Physix/Moved', $meta, $id);
// $meta = Infos about the move process, see above screenshot
// $id = The attachment ID
?>
$ meta to tablica:
Klucz „zmiana nazwy” zawiera wszystkie procesy zmiany nazwy (na przykład tutaj mogą być pliki miniaturek obrazów).
Problem: Gwarancja zgodności wtyczek.
Głównym problemem (jeśli jest) biblioteki multimediów WordPress jest to, że wiele wtyczek zapisuje odniesienia do obrazów z pełnymi adresami URL zamiast identyfikatora załącznika. Oznacza to, że istnieją tabele MySQL z kolumnami zawierającymi adres URL do podanego pliku. Jak mogę zagwarantować, że WSZYSTKIE referencje są aktualne w folderach fizycznych? Myślę, że to niemożliwe.
Jedno możliwe podejście.
Wchodzę w akcję i aktualizuję standardowe tabele, takie jak wp_post-> post_content , ... za pomocą rekurencyjnej instrukcji REPLACE w 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
}
?>
Zmienna $ rec jest teraz instrukcją REPLACE:
REPLACE(post_content, 'https://example.io/wp-content/uploads/Another-Doc.pdf', 'https://example.io/wp-content/uploads/pdfs/subdir/Another-Doc.pdf')
Nawiasem mówiąc: obraz (testimage.jpg) ze wszystkimi plikami miniatur może wyglądać następująco:
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')
Ale co się stanie, jeśli jest to szeregowany ciąg (JSON) w tabeli bazy danych? Tak to wygląda { "image": "http:\/\/example.io\/wp-content\/uploads\/Another-Doc.pdf" }
. Co muszę dodać do instrukcji REPLACE?
Z instrukcji REPLACE można teraz korzystać we wszystkich tabelach MySQL, które zawierają adresy URL obrazów. Myślałem o stworzeniu tablicy filtrów, w której wtyczki mogą dodawać swoje tabele, a moje rozszerzenie zajmie się resztą:
<?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")
//...
));
?>
Dziennik „przenoszenia”
Chcę utworzyć „dziennik”, w którym użytkownicy mogą cofać ruchy. Jeśli użytkownik zobaczy, obraz jest uszkodzony (na przykład we wtyczce Slider Revolution), może cofnąć przeniesienie do oryginalnego folderu.
Co sądzisz o tym pomyśle? Czy jest lepsze rozwiązanie? Mam nadzieję, że wszystko wyjaśniłem w przyjemny sposób!