Intereting Posts
Как отображать сообщение в пользовательском файле не в архиве? Аутентификация с запросом на отправку удаленного сервера Санизировать введенный пользователем CSS Как отключить Photon на сайте без премиум-сайта WordPress? Заказать get_terms с помощью настраиваемого поля wordpress query_posts всегда показывалась на странице WP_Query с одной категорией в args показывает другие категории Добавить пользовательское поле во все сообщения определенной категории Фиксирование репозитория плагина не отображается в действии Несколько значений, хранящихся в массиве в мета-запросе Loop возвращает постоянную ссылку текущей страницы и guid вместо столбца в цикле Как использовать esc_attr__ с функцией пользовательского перевода? Использование jquery migrate для плагинов, несовместимых с jquery 1.10.2 wp_redirect не работает Как проверить, является ли сообщение приватным?

Как я могу добавить поле для загрузки изображения непосредственно в пользовательскую панель записи?

Я добавил новую страницу в разделе «Страницы» в wordpress admin и добавил несколько настраиваемых полей. Я также хотел бы иметь возможность добавлять поле для загрузки в редактор страниц – есть ли способ сделать это с помощью настраиваемых полей?

Или есть другое направление, которое мне нужно предпринять, если мне нужна эта способность?

Solutions Collecting From Web of "Как я могу добавить поле для загрузки изображения непосредственно в пользовательскую панель записи?"

Для тех, кто хочет узнать больше о загрузке файлов, вот краткий учебник, посвященный основным темам и болям. Это написано с помощью WordPress 3.0 в Linux-блоке, и код является всего лишь базовым обзором для обучения концепциям. Я уверен, что некоторые люди здесь могут предложить советы по улучшению реализации.

Опишите свой основной подход

Существует три способа связывания изображений с сообщениями: использование поля post_meta для сохранения пути изображения, используя поле post_meta для хранения идентификатора медиа-библиотеки изображения (подробнее об этом позже) или назначение изображения для сообщения в виде вложения , В этом примере будет использоваться поле post_meta для хранения идентификатора медиа-библиотеки изображения. YMMV.

Многостороннее кодирование

По умолчанию в WordPress «create & edit forms» нет enctype. Если вы хотите загрузить файл, вам нужно добавить в тег формы «enctype = 'multipart / form-data», иначе коллекция $ _FILES вообще не будет пропущена. В WordPress 3.0 для этого есть крючок. В некоторых предыдущих версиях (не уверенных в специфике) вы должны заменить строку тега формы.

function xxxx_add_edit_form_multipart_encoding() { echo ' enctype="multipart/form-data"'; } add_action('post_edit_form_tag', 'xxxx_add_edit_form_multipart_encoding'); 

Создание метабокса и поля загрузки

Я не буду далеко ходить в создании мета-боксов, поскольку большинство из вас, вероятно, уже знают, как это сделать, но я просто скажу, что вам нужен только простой мета-ящик с файловым полем в нем. В приведенном ниже примере я включил некоторый код для поиска существующего изображения и его отображение, если оно существует. Я также включил некоторые простые функции ошибок / обратной связи, которые пропускают ошибки, используя поле post_meta. Вы захотите изменить это, чтобы использовать класс WP_Error … это просто для демонстрации.

 function xxxx_render_image_attachment_box($post) { // See if there's an existing image. (We're associating images with posts by saving the image's 'attachment id' as a post meta value) // Incidentally, this is also how you'd find any uploaded files for display on the frontend. $existing_image_id = get_post_meta($post->ID,'_xxxx_attached_image', true); if(is_numeric($existing_image_id)) { echo '<div>'; $arr_existing_image = wp_get_attachment_image_src($existing_image_id, 'large'); $existing_image_url = $arr_existing_image[0]; echo '<img src="' . $existing_image_url . '" />'; echo '</div>'; } // If there is an existing image, show it if($existing_image_id) { echo '<div>Attached Image ID: ' . $existing_image_id . '</div>'; } echo 'Upload an image: <input type="file" name="xxxx_image" id="xxxx_image" />'; // See if there's a status message to display (we're using this to show errors during the upload process, though we should probably be using the WP_error class) $status_message = get_post_meta($post->ID,'_xxxx_attached_image_upload_feedback', true); // Show an error message if there is one if($status_message) { echo '<div class="upload_status_message">'; echo $status_message; echo '</div>'; } // Put in a hidden flag. This helps differentiate between manual saves and auto-saves (in auto-saves, the file wouldn't be passed). echo '<input type="hidden" name="xxxx_manual_save_flag" value="true" />'; } function xxxx_setup_meta_boxes() { // Add the box to a particular custom content type page add_meta_box('xxxx_image_box', 'Upload Image', 'xxxx_render_image_attachment_box', 'post', 'normal', 'high'); } add_action('admin_init','xxxx_setup_meta_boxes'); 

Обработка загрузки файла

Это большой – фактически обрабатывать загрузку файла, подключаясь к действию 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 (), которые делают именно то, что вы ожидаете от них – сгенерируйте метаданные для элемента мультимедиа.

 function xxxx_update_post($post_id, $post) { // Get the post type. Since this function will run for ALL post saves (no matter what post type), we need to know this. // It's also important to note that the save_post action can runs multiple times on every post save, so you need to check and make sure the // post type in the passed object isn't "revision" $post_type = $post->post_type; // Make sure our flag is in there, otherwise it's an autosave and we should bail. if($post_id && isset($_POST['xxxx_manual_save_flag'])) { // Logic to handle specific post types switch($post_type) { // If this is a post. You can change this case to reflect your custom post slug case 'post': // HANDLE THE FILE UPLOAD // If the upload field has a file in it if(isset($_FILES['xxxx_image']) && ($_FILES['xxxx_image']['size'] > 0)) { // Get the type of the uploaded file. This is returned as "type/extension" $arr_file_type = wp_check_filetype(basename($_FILES['xxxx_image']['name'])); $uploaded_file_type = $arr_file_type['type']; // Set an array containing a list of acceptable formats $allowed_file_types = array('image/jpg','image/jpeg','image/gif','image/png'); // If the uploaded file is the right format if(in_array($uploaded_file_type, $allowed_file_types)) { // Options array for the wp_handle_upload function. 'test_upload' => false $upload_overrides = array( 'test_form' => false ); // Handle the upload using WP's wp_handle_upload function. Takes the posted file and an options array $uploaded_file = wp_handle_upload($_FILES['xxxx_image'], $upload_overrides); // If the wp_handle_upload call returned a local path for the image if(isset($uploaded_file['file'])) { // The wp_insert_attachment function needs the literal system path, which was passed back from wp_handle_upload $file_name_and_location = $uploaded_file['file']; // Generate a title for the image that'll be used in the media library $file_title_for_media_library = 'your title here'; // Set up options array to add this file as an attachment $attachment = array( 'post_mime_type' => $uploaded_file_type, 'post_title' => 'Uploaded image ' . addslashes($file_title_for_media_library), 'post_content' => '', 'post_status' => 'inherit' ); // Run the wp_insert_attachment function. This adds the file to the media library and generates the thumbnails. If you wanted to attch this image to a post, you could pass the post id as a third param and it'd magically happen. $attach_id = wp_insert_attachment( $attachment, $file_name_and_location ); require_once(ABSPATH . "wp-admin" . '/includes/image.php'); $attach_data = wp_generate_attachment_metadata( $attach_id, $file_name_and_location ); wp_update_attachment_metadata($attach_id, $attach_data); // Before we update the post meta, trash any previously uploaded image for this post. // You might not want this behavior, depending on how you're using the uploaded images. $existing_uploaded_image = (int) get_post_meta($post_id,'_xxxx_attached_image', true); if(is_numeric($existing_uploaded_image)) { wp_delete_attachment($existing_uploaded_image); } // Now, update the post meta to associate the new image with the post update_post_meta($post_id,'_xxxx_attached_image',$attach_id); // Set the feedback flag to false, since the upload was successful $upload_feedback = false; } else { // wp_handle_upload returned some kind of error. the return does contain error details, so you can use it here if you want. $upload_feedback = 'There was a problem with your upload.'; update_post_meta($post_id,'_xxxx_attached_image',$attach_id); } } else { // wrong file type $upload_feedback = 'Please upload only image files (jpg, gif or png).'; update_post_meta($post_id,'_xxxx_attached_image',$attach_id); } } else { // No file was passed $upload_feedback = false; } // Update the post meta with any feedback update_post_meta($post_id,'_xxxx_attached_image_upload_feedback',$upload_feedback); break; default: } // End switch return; } // End if manual save flag return; } add_action('save_post','xxxx_update_post',1,2); 

Разрешения, владение и безопасность

Если у вас возникли проблемы с загрузкой, возможно, это связано с разрешениями. Я не эксперт в конфигурации сервера, поэтому, пожалуйста, поправьте меня, если эта часть будет неустойчивой.

Во-первых, убедитесь, что ваша папка wp-content / uploads существует и принадлежит apache: apache. Если это так, вы должны иметь возможность устанавливать разрешения на 744, и все должно работать. Собственность важна – даже установка perms на 777 иногда не поможет, если каталог не принадлежит должным образом.

Вы также должны рассмотреть возможность ограничения типов файлов, загруженных и выполняемых с использованием файла htaccess. Это не позволяет пользователям загружать файлы, которые не являются изображениями, и выполнять сценарии, замаскированные под изображения. Вероятно, вы должны использовать это для более авторитетной информации, но вы можете сделать простой тип файла, как это:

 <Files ^(*.jpeg|*.jpg|*.png|*.gif)> order deny,allow deny from all </Files>