プロフィール画像をアップロードするユーザープロフィールにカスタムフィールドを作成しました。とても簡単です。
私が使ったフィールドを作成するには:
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];
}
しかし、うまくいきません。アップロード中に画像が添付ファイルのメタデータを生成しない可能性はありますか?そしてどうすればそれができますか?すでに答えられた提案、記事または質問でさえも評価されるでしょう。プラグイン以外はすべて、カスタムコードを作成したいです。ありがとうございます。
私はついに解決しました!問題は、単純に
update_user_meta( $user_id, 'mycoverimage', $_POST[ 'mycoverimage' ] );
添付ファイルのメタデータを生成せずに画像を保存しました。実際、私のテーブルをチェックすると、添付ファイルIDではないusermeta id
しか得られませんでした。だから私は codex に従って以下のように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="https://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 );
}
});
}
このコードではユーザーメタフィールドに画像IDを格納しています 以前のようにフルサイズの画像URLではなく、ユーザーメタフィールドの画像サイズを取得できます
$image_id = get_user_meta( $user->ID, 'mycoverimage', true );
$fulle_user_image = wp_get_attachment_image( $image_id, 'full' );
違いがあるかどうかはわかりませんが、1つの値が必要なので、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;
}
そしてそれを利用して、あなたはそれを関数に送る前にURL値に対してesc_attr
をしていないか、またはそれはそれにマッチしないでしょう。
_ edit _ (厳密には)完全なURLではなくguid
に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
}