Intereting Posts
get_the_categories (), но исключить детей из категории "Без рубрики" Иерархия категорий в URL-адресе Цикл перенаправления WordPress HTTPS Утверждение регистрации пользователя на основе выбранной роли Где WordPress Mu DB хранит ссылку панели управления сетевого администратора Показать тип персонализированного типа категории X на странице архива категории X? Требовать теги для тем bbPress Постоянная структура между двумя пользовательскими типами сообщений и таксономией Фильтровать по почте в Media Library Почему the_content не работает, как другие, для заданного идентификатора сообщения? Избегайте обновления почты при отправке запроса POST или GET на post.php изменить URL-адрес на «вход в систему», «подключить как» и «отключить» ссылки в комментариях Как добавить класс CSS в пользовательский логотип? Постоянная ссылка / Проблема с разбивкой на страницы: базовое имя категории совпадает с именем страницы Внешние соединения wpdb в разных плагинах на одной странице

Получить идентификатор приложения author_meta image – Метаданные приложения

Я создал настраиваемое поле в профиле пользователя, где загружает изображение профиля. Это очень просто.

Чтобы создать поля, которые я использовал:

add_action( 'show_user_profile', 'cover_image_function' ); add_action( 'edit_user_profile', 'cover_image_function' ); function cover_image_function( $user ) { <h3>Cover Image</h3> <style type="text/css"> .fh-profile-upload-options th, .fh-profile-upload-options td, .fh-profile-upload-options input { vertical-align: top; } .user-preview-image { display: block; height: auto; width: 300px; } </style> <table class="form-table fh-profile-upload-options"> <tr> <th> <label for="image">Cover Image</label> </th> <td> <img class="user-preview-image" src="<?php echo esc_attr( get_the_author_meta( 'mycoverimage', $user->ID ) ); ?>"> <input type="text" name="mycoverimage" id="mycoverimage" value="<?php echo esc_attr( get_the_author_meta( 'mycoverimage', $user->ID ) ); ?>" class="regular-text" /> <input type='button' class="button-primary" value="Upload Image" id="coverimage"/><br /> <span class="description">Please upload your cover image.</span> </td> </tr> </table> <script type="text/javascript"> (function( $ ) { $( 'input#coverimage' ).on('click', function() { tb_show('', 'media-upload.php?type=image&TB_iframe=true'); window.send_to_editor = function( html ) { imgurl = $( 'img', html ).attr( 'src' ); $( '#mycoverimage' ).val(imgurl); tb_remove(); } return false; }); })(jQuery); </script> } 

Чтобы сохранить изображение:

 add_action( 'personal_options_update', 'save_cover_image' ); add_action( 'edit_user_profile_update', 'save_cover_image' ); function save_cover_image( $user_id ) { if ( !current_user_can( 'edit_user', $user_id ) ) { return false; } update_user_meta( $user_id, 'mycoverimage', $_POST[ 'mycoverimage' ] ); } 

Все работает нормально, но я не могу получить attachment ID для создания миниатюр и меньших размеров . На данный момент я могу просто получить URL-адрес:

 echo esc_attr( get_the_author_meta( 'mycoverimage', $user->ID ) ); 

Я даже использовал известный метод, как в других вопросах:

 function get_attachment_id($image_url) { global $wpdb; $attachment = $wpdb->get_col($wpdb->prepare("SELECT ID FROM $wpdb->posts WHERE guid='%s';", $image_url )); return $attachment[0]; } 

Но это не сработает. Возможно ли, что изображение не генерирует никаких метаданных вложений при загрузке? И как я могу это сделать? Даже приветствуются даже предложения, статьи или вопросы. Все, кроме плагина, я хочу создать собственный код. Благодаря!

Solutions Collecting From Web of "Получить идентификатор приложения author_meta image – Метаданные приложения"

Я, наконец, решил! Проблема заключалась в том, что просто используя

 update_user_meta( $user_id, 'mycoverimage', $_POST[ 'mycoverimage' ] ); 

Изображение было сохранено без генерирования метаданных. Фактически, проверяя мою таблицу, он получил только usermeta id который не является идентификатором вложения. Поэтому мне пришлось немного изменить функцию загрузки в соответствии с кодом с использованием wp_insert_attachment например:

 add_action( 'personal_options_update', 'save_cover_image' ); add_action( 'edit_user_profile_update', 'save_cover_image' ); function save_cover_image( $user_id ) { if ( !current_user_can( 'edit_user', $user_id ) ) { return false; } $filename = $_POST['mycoverimage']; $parent_post_id = 0; $filetype = wp_check_filetype( basename( $filename ), null ); $wp_upload_dir = wp_upload_dir(); $attachment = array( 'guid' => $wp_upload_dir['url'] . '/' . basename( $filename ), 'post_mime_type' => $filetype['type'], 'post_title' => preg_replace( '/\.[^.]+$/', '', basename( $filename ) ), 'post_content' => '', 'post_status' => 'inherit', 'post_author' => $uid ); $attach_id = wp_insert_attachment( $attachment, $filename, $parent_post_id ); require_once( ABSPATH . 'wp-admin/includes/image.php' ); $attach_data = wp_generate_attachment_metadata( $attach_id, $filename ); wp_update_attachment_metadata( $attach_id, $attach_data ); update_user_meta( $user_id, 'mycoverimage', $_POST[ 'mycoverimage' ] ); } 

В этот момент у меня есть usermeta id attachment id который я могу легко извлечь для больших пальцев и других операций. Спасибо @majick в любом случае.

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

Здесь рабочий пример (это быстрый пример, построенный из предыдущего кода, для его использования могут потребоваться некоторые настройки):

 add_action( 'admin_enqueue_scripts', 'load_wp_media_files' ); function load_wp_media_files( $page ) { if( $page == 'profile.php' || $page == 'user-edit.php' ) { wp_enqueue_media(); wp_enqueue_script( 'my_custom_script', plugins_url( '/js/myscript.js' , __FILE__ ), array('jquery'), '0.1' ); } } add_action( 'show_user_profile', 'cover_image_function' ); add_action( 'edit_user_profile', 'cover_image_function' ); function cover_image_function( $user ) { $image_id = get_user_meta( $user->ID, 'mycoverimage', true ); if( intval( $image_id ) > 0 ) { // Change with the image size you want to use $image = wp_get_attachment_image( $image_id, 'medium', false, array( 'id' => 'user-preview-image' ) ); } else { $image = '<img id="user-preview-image" src="http://img.wordpressask.com/images/some.default.image.jpg" />'; } ?> <h3>Cover Image</h3> <style type="text/css"> .fh-profile-upload-options th, .fh-profile-upload-options td, .fh-profile-upload-options input { vertical-align: top; } .user-preview-image { display: block; height: auto; width: 300px; } </style> <table class="form-table fh-profile-upload-options"> <tr> <th> <label for="image">Cover Image</label> </th> <td> <?php echo $image; ?> <input type="hidden" name="mycoverimage" id="mycoverimage" value="<?php echo esc_attr( get_the_author_meta( 'mycoverimage', $user->ID ) ); ?>" class="regular-text" /> <input type='button' class="button-primary" value="Upload Image" id="coverimage"/><br /> <span class="description">Please upload your cover image.</span> </td> </tr> </table> <?php } add_action( 'personal_options_update', 'save_cover_image' ); add_action( 'edit_user_profile_update', 'save_cover_image' ); function save_cover_image( $user_id ) { if ( ! current_user_can( 'edit_user', $user_id ) ) { return false; } update_user_meta( $user_id, 'mycoverimage', $_POST[ 'mycoverimage' ] ); } // Ajax action to refresh the user image add_action( 'wp_ajax_cyb_get_image_url', 'cyb_get_image_url' ); function cyb_get_image_url() { if(isset($_GET['id']) ){ $image = wp_get_attachment_image( filter_input( INPUT_GET, 'id', FILTER_VALIDATE_INT ), 'medium', false, array( 'id' => 'user-preview-image' ) ); $data = array( 'image' => $image, ); wp_send_json_success( $data ); } else { wp_send_json_error(); } } 

И файл myscript.js:

 jQuery(document).ready( function($) { jQuery('input#coverimage').click(function(e) { e.preventDefault(); var image_frame; if(image_frame){ image_frame.open(); } image_frame = wp.media({ title: 'Select Media', multiple : false, library : { type : 'image', } }); image_frame.on('close',function() { // get selections and save to hidden input plus other AJAX stuff etc. var selection = image_frame.state().get('selection'); var gallery_ids = new Array(); var my_index = 0; selection.each(function(attachment) { gallery_ids[my_index] = attachment['id']; my_index++; }); var ids = gallery_ids.join(","); jQuery('input#mycoverimage').val(ids); Refresh_Image(ids); }); image_frame.on('open',function() { var selection = image_frame.state().get('selection'); ids = jQuery('input#mycoverimage').val().split(','); ids.forEach(function(id) { attachment = wp.media.attachment(id); attachment.fetch(); selection.add( attachment ? [ attachment ] : [] ); }); }); image_frame.on('toolbar:create:select',function() { image_frame.state().set('filterable', 'uploaded'); }); image_frame.open(); }); }); function Refresh_Image(the_id){ var data = { action: 'cyb_get_image_url', id: the_id }; jQuery.get(ajaxurl, data, function(response) { if(response.success === true) { jQuery('#user-preview-image').replaceWith( response.data.image ); } }); } 

Обратите внимание, что этот код хранит идентификатор изображения в мета-поле пользователя вместо полного URL-адреса изображения, как вы делали это раньше, поэтому вы можете получить любой размер изображения в поле пользователя пользователя:

 $image_id = get_user_meta( $user->ID, 'mycoverimage', true ); $fulle_user_image = wp_get_attachment_image( $image_id, 'full' ); 

Не уверен, что это будет иметь значение, но поскольку вам просто нужно одно значение, вы можете получить get_var вместо get_col . Я слегка подправил запрос к тому, что знаю:

 function get_attachment_id($image_url) { global $wpdb; $attachment = $wpdb->get_var($wpdb->prepare("SELECT ID FROM ".$wpdb->prefix."posts WHERE post_type='attachment' AND guid='%s'", $image_url )); return $attachment; } 

И, используя, вы не делаете esc_attr по значению URL перед отправкой его функции или не будете соответствовать ей.

EDIT. Вы можете попробовать это (менее строго), просто сопоставить URL-путь с директором вместо полного URL-адреса:

 function get_attachment_id($image_url) { $parseurl = parse_url($image_url); $path = $parseurl['path']; global $wpdb; $attachments = $wpdb->get_results("SELECT ID,guid FROM ".$wpdb->prefix."posts WHERE post_type='attachment'"); foreach ($attachments as $attachment) { if (strstr($attachment->guid,$path)) {return $attachment->ID;} } echo "<!-- All Attachments "; print_r($attachments); echo "-->"; // debug output }