Dodałem nową stronę pod „Pages” w wordpress admin i dodałem kilka niestandardowych pól. Chciałbym również móc dodać pole do przesłania obrazu do edytora stron - czy jest jakiś sposób to zrobić za pomocą niestandardowych pól?
Czy może muszę obrać inny kierunek, jeśli potrzebuję tej umiejętności?
Odpowiedzi:
Dla każdego, kto chce dowiedzieć się więcej o przesyłaniu plików, oto szybki podkład obejmujący najważniejsze tematy i problemy. Zostało to napisane z myślą o WordPress 3.0 na Linux-ie, a kod jest tylko podstawowym przeglądem do nauczania pojęć. Jestem pewien, że niektórzy ludzie tutaj mogą zaoferować porady dotyczące poprawy wdrażania.
Przedstaw swoje podstawowe podejście
Istnieją co najmniej trzy sposoby kojarzenia obrazów z postami: użycie pola post_meta do przechowywania ścieżki obrazu, użycie pola post_meta do przechowywania identyfikatora biblioteki multimediów obrazu (więcej na ten temat później) lub przypisanie obrazu do postu jako załącznika . W tym przykładzie użyto pola post_meta do przechowywania identyfikatora biblioteki multimediów obrazu. YMMV.
Kodowanie wieloczęściowe
Domyślnie formularze do tworzenia i edycji WordPress nie mają żadnego typu. Jeśli chcesz przesłać plik, musisz dodać „enctype = 'multipart / form-data” do tagu formularza - w przeciwnym razie kolekcja $ _FILES w ogóle nie zostanie przepchnięta. W WordPress 3.0 jest na to haczyk. W niektórych wcześniejszych wersjach (nie jestem pewien szczegółów) musisz ciąg zastąpić tag formularza.
Utwórz Meta Box i prześlij pole
Nie będę się zbytnio zajmował tworzeniem meta-boxów, ponieważ większość z was prawdopodobnie już wie, jak to zrobić, ale powiem tylko, że potrzebujesz tylko prostej meta-boxu z polem pliku. W poniższym przykładzie zawarłem trochę kodu, aby wyszukać istniejący obraz i wyświetlić go, jeśli taki istnieje. Dołączyłem także kilka prostych funkcji błędów / sprzężenia zwrotnego, które przekazują błędy za pomocą pola post_meta. Będziesz chciał to zmienić, aby użyć klasy WP_Error ... to tylko dla celów demonstracyjnych.
Obsługa przesyłania plików
To jest duże - w rzeczywistości obsługuje przesyłanie plików, podpinając się do akcji save_post. Poniżej zamieściłem mocno skomentowaną funkcję, ale chciałbym zwrócić uwagę na dwie kluczowe funkcje WordPress, których używa:
wp_handle_upload () robi całą magię, no cóż, obsługi przesyłania. Po prostu przekazujesz mu odniesienie do swojego pola w tablicy $ _FILES i tablicę opcji (nie przejmuj się zbytnio o nie - jedyną ważną, którą musisz ustawić, jest test_form = false. Zaufaj mi). Ta funkcja nie dodaje jednak przesłanego pliku do biblioteki multimediów. Po prostu wykonuje przesyłanie i zwraca ścieżkę nowego pliku (a także pełny adres URL). Jeśli występuje problem, zwraca błąd.
wp_insert_attachment () dodaje obraz do biblioteki multimediów i generuje wszystkie odpowiednie miniatury. Po prostu przekazujesz mu szereg opcji (tytuł, status postu itp.) Oraz ścieżkę LOKALNĄ (nie URL) do właśnie przesłanego pliku. Wspaniałą rzeczą w umieszczaniu obrazów w bibliotece multimediów jest to, że możesz później łatwo usunąć wszystkie pliki, wywołując wp_delete_attachment i przekazując mu identyfikator biblioteki multimediów elementu (co robię w funkcji poniżej). Dzięki tej funkcji będziesz także musiał użyć wp_generate_attachment_metadata () i wp_update_attachment_metadata (), które robią dokładnie to, czego oczekujesz - generują metadane dla elementu multimedialnego.
Uprawnienia, własność i bezpieczeństwo
Jeśli masz problemy z przesyłaniem, może to mieć związek z uprawnieniami. Nie jestem ekspertem od konfiguracji serwera, więc popraw mnie, jeśli ta część jest niepewna.
Po pierwsze, upewnij się, że twój folder wp-content / uploads istnieje i jest własnością apache: apache. Jeśli tak, powinieneś być w stanie ustawić uprawnienia na 744 i wszystko powinno po prostu działać. Własność jest ważna - nawet ustawienie perms na 777 czasami nie pomoże, jeśli katalog nie jest właściwie własnością.
Należy również rozważyć ograniczenie typów plików przesyłanych i wykonywanych przy użyciu pliku htaccess. Uniemożliwia to przesyłanie plików, które nie są obrazami, oraz wykonywanie skryptów zamaskowanych jako obrazy. Prawdopodobnie powinieneś google uzyskać więcej autorytatywnych informacji, ale możesz zrobić proste ograniczenie typu pliku, takie jak:
źródło
if ( ! function_exists( 'wp_handle_upload' ) ) require_once( ABSPATH . 'wp-admin/includes/file.php' );
Kod podany przez @MathSmath jest poprawny. Jeśli jednak obsługujesz wiele pól przesyłania lub chcesz przesłać wiele plików, musisz je bardzo zmodyfikować.
Poza tym nie wykorzystuje biblioteki multimediów WordPress do przesyłania plików (co powoduje całą brudną robotę za sceną).
Proponuję rzucić okiem na wtyczkę taką jak Meta Box . Wtyczka obsługuje oba sposoby przesyłania plików:
input[type="file"]
, który wykorzystuje podobny kod powyżej (patrz dokumenty ) iPomoże Ci to zredukować wysiłek związany z pisaniem i utrzymywaniem kodu, zwłaszcza gdy chcesz utworzyć wiele przesyłanych plików.
Oświadczenie: Jestem autorem Meta Box.
źródło