Я добавил новую страницу в разделе «Страницы» в админке WordPress и добавил несколько настраиваемых полей. Я также хотел бы иметь возможность добавить поле загрузки изображения в редактор страниц - есть ли способ сделать это через пользовательские поля?
Или мне нужно выбрать другое направление, если мне нужна эта способность?
Ответы:
Для тех, кто хочет узнать больше о загрузке файлов, вот краткое руководство, охватывающее основные темы и основные моменты. Это написано с учетом WordPress 3.0 для Linux, и этот код является лишь базовым обзором для изучения концепций. Я уверен, что некоторые люди здесь могли бы дать совет по улучшению реализации.
Опишите ваш основной подход
Существует по крайней мере три способа связать изображения с записями: использование поля post_meta для хранения пути к изображению, использование поля post_meta для хранения идентификатора медиатеки изображения (подробнее об этом позже) или назначение изображения для публикации в качестве вложения , В этом примере будет использоваться поле post_meta для хранения идентификатора медиа библиотеки изображений. YMMV.
Многочастное кодирование
По умолчанию формы создания и редактирования WordPress не имеют энтипа. Если вы хотите загрузить файл, вам нужно добавить "enctype = 'multipart / form-data'" в тег формы - иначе коллекция $ _FILES вообще не будет проталкиваться. В WordPress 3.0 для этого есть хук. В некоторых предыдущих версиях (не уверен в специфике) вы должны заменить строку тегом строки.
Создайте мета-поле и поле загрузки
Я не буду углубляться в создание мета-блоков, так как большинство из вас, вероятно, уже знают, как это сделать, но я просто скажу, что вам нужен только простой мета-блок с полем в нем. В приведенном ниже примере я включил некоторый код для поиска существующего изображения и отображения его, если оно существует. Я также включил некоторые простые функции ошибок / обратной связи, которые передают ошибки, используя поле post_meta. Вы можете изменить это, чтобы использовать класс WP_Error ... это просто для демонстрации.
Обработка загрузки файла
Это большая проблема - фактически обрабатывать загрузку файла, подключившись к действию save_post. Ниже я включил функцию с сильными комментариями, но я хотел бы отметить две ключевые функции WordPress, которые он использует:
wp_handle_upload () делает всю магию по обработке загрузки. Вы просто передаете ему ссылку на свое поле в массиве $ _FILES и массиве опций (не беспокойтесь об этом - единственное, что вам нужно установить, это test_form = false. Поверьте мне). Однако эта функция не добавляет загруженный файл в медиатеку. Он просто выполняет загрузку и возвращает путь к новому файлу (а также удобный URL-адрес). Если есть проблема, она возвращает ошибку.
wp_insert_attachment () добавляет изображение в медиа-библиотеку и генерирует все соответствующие миниатюры. Вы просто передаете ему массив опций (заголовок, статус сообщения и т. Д.) И локальный путь (не URL) к файлу, который вы только что загрузили. Самое замечательное в размещении ваших изображений в библиотеке мультимедиа состоит в том, что вы можете легко удалить все файлы позже, вызвав wp_delete_attachment и передав ему идентификатор библиотеки мультимедиа элемента (что я и делаю в функции ниже). С этой функцией вам также необходимо использовать wp_generate_attachment_metadata () и wp_update_attachment_metadata (), которые делают именно то, что вы ожидаете, - генерируют метаданные для элемента мультимедиа.
Разрешения, Владение и Безопасность
Если у вас есть проблемы с загрузкой, это может быть связано с разрешениями. Я не эксперт по настройке сервера, поэтому, пожалуйста, исправьте меня, если эта часть не работает.
Во-первых, убедитесь, что ваша папка wp-content / uploads существует и принадлежит apache: apache. Если это так, вы должны иметь возможность установить разрешения на 744, и все должно просто работать. Владение важно - даже установка perms на 777 иногда не поможет, если каталог не принадлежит должным образом.
Вам также следует рассмотреть возможность ограничения типов файлов, загружаемых и исполняемых с использованием файла htaccess. Это не позволяет людям загружать файлы, которые не являются изображениями, и выполнять сценарии, замаскированные под изображения. Вероятно, вам следует зайти в Google для получения более достоверной информации, но вы можете сделать простое ограничение типа файла, например:
источник
if ( ! function_exists( 'wp_handle_upload' ) ) require_once( ABSPATH . 'wp-admin/includes/file.php' );
Код, предоставленный @MathSmath, верен. Однако, если вы обрабатываете много полей для загрузки или хотите загрузить несколько файлов, вам придется его сильно изменить.
Кроме того, он не использует медиа-библиотеку WordPress для загрузки файлов (которая выполняет всю грязную работу за кулисами).
Я бы посоветовал вам взглянуть на такой плагин, как Meta Box . Плагин поддерживает оба способа загрузки файлов:
input[type="file"]
, который использует подобный код выше (см. Документы ) иЭто может помочь вам сократить затраты на написание и поддержку кода, особенно если вы хотите создать несколько загрузок.
Отказ от ответственности: я автор Meta Box.
источник