私はワードプレス環境の外でPHP経由でカスタム投稿に画像を取得して挿入しようとしています。
その画像をwordpressのアップロードディレクトリの年月日フォルダ形式に移動/アップロードして、その画像をカスタム投稿に対するおすすめの画像に設定する方法
カスタム投稿ギャラリーにも画像をアップロードするには?
以下は私のコードです
$filename = $image['name'];
$target_path = "../wp-content/uploads/";
$target_path = $target_path . $filename;
$wp_filetype = wp_check_filetype(basename($filename), null );
$wp_upload_dir = wp_upload_dir();
$attachment = array(
'guid' => $wp_upload_dir['baseurl'] . '/' . basename( $filename ),
'post_mime_type' => $wp_filetype['type'],
'post_title' => preg_replace('/\.[^.]+$/', '', basename($filename)),
'post_content' => '',
'post_status' => 'inherit',
);
$attach_id = wp_insert_attachment( $attachment, $target_path, $post_id );
$attach_data = wp_generate_attachment_metadata( $attach_id, $filename );
wp_update_attachment_metadata( $attach_id, $attach_data );
set_post_thumbnail( $post_id, $attach_id );
アップロードディレクトリに画像をアップロードできましたが、年月日フォルダを作成できません。これはそれのための任意のWP関数ですか?
これは media_sideload_image()で単純にはできません ?
とても単純そうです。あなたが管理領域にいないのであれば、WordPressに含まれるいくつかのライブラリを含める必要があります。
// only need these if performing outside of admin environment
require_once(ABSPATH . 'wp-admin/includes/media.php');
require_once(ABSPATH . 'wp-admin/includes/file.php');
require_once(ABSPATH . 'wp-admin/includes/image.php');
// example image
$image = 'http://example.com/logo.png';
// magic sideload image returns an HTML image, not an ID
$media = media_sideload_image($image, $post_id);
// therefore we must find it so we can set it as featured ID
if(!empty($media) && !is_wp_error($media)){
$args = array(
'post_type' => 'attachment',
'posts_per_page' => -1,
'post_status' => 'any',
'post_parent' => $post_id
);
// reference new image to set as featured
$attachments = get_posts($args);
if(isset($attachments) && is_array($attachments)){
foreach($attachments as $attachment){
// grab source of full size images (so no 300x150 nonsense in path)
$image = wp_get_attachment_image_src($attachment->ID, 'full');
// determine if in the $media image we created, the string of the URL exists
if(strpos($media, $image[0]) !== false){
// if so, we found our image. set it as thumbnail
set_post_thumbnail($post_id, $attachment->ID);
// only want one image
break;
}
}
}
}
パスと投稿IDを使用したアップロードのこの説明を試してください 。
これが(レガシー用の)コードです。
/* Import media from url
*
* @param string $file_url URL of the existing file from the original site
* @param int $post_id The post ID of the post to which the imported media is to be attached
*
* @return boolean True on success, false on failure
*/
function fetch_media($file_url, $post_id) {
require_once(ABSPATH . 'wp-load.php');
require_once(ABSPATH . 'wp-admin/includes/image.php');
global $wpdb;
if(!$post_id) {
return false;
}
//directory to import to
$artDir = 'wp-content/uploads/2013/06';
//if the directory doesn't exist, create it
if(!file_exists(ABSPATH.$artDir)) {
mkdir(ABSPATH.$artDir);
}
//rename the file
$ext = array_pop(explode("/", $file_url));
$new_filename = 'blogmedia-'.$ext;
if (@fclose(@fopen($file_url, "r"))) { //make sure the file actually exists
copy($file_url, ABSPATH.$artDir.$new_filename);
$siteurl = get_option('siteurl');
$file_info = getimagesize(ABSPATH.$artDir.$new_filename);
//create an array of attachment data to insert into wp_posts table
$artdata = array();
$artdata = array(
'post_author' => 1,
'post_date' => current_time('mysql'),
'post_date_gmt' => current_time('mysql'),
'post_title' => $new_filename,
'post_status' => 'inherit',
'comment_status' => 'closed',
'ping_status' => 'closed',
'post_name' => sanitize_title_with_dashes(str_replace("_", "-", $new_filename)), 'post_modified' => current_time('mysql'),
'post_modified_gmt' => current_time('mysql'),
'post_parent' => $post_id,
'post_type' => 'attachment',
'guid' => $siteurl.'/'.$artDir.$new_filename,
'post_mime_type' => $file_info['mime'],
'post_excerpt' => '',
'post_content' => ''
);
$uploads = wp_upload_dir();
$save_path = $uploads['basedir'].'/2013/06/'.$new_filename;
//insert the database record
$attach_id = wp_insert_attachment( $artdata, $save_path, $post_id );
//generate metadata and thumbnails
if ($attach_data = wp_generate_attachment_metadata( $attach_id, $save_path)) {
wp_update_attachment_metadata($attach_id, $attach_data);
}
//optional make it the featured image of the post it's attached to
$rows_affected = $wpdb->insert($wpdb->prefix.'postmeta', array('post_id' => $post_id, 'meta_key' => '_thumbnail_id', 'meta_value' => $attach_id));
}
else {
return false;
}
return true;
}
プログラムで注目の画像を設定した以下のコードを参照してください。 http://www.pearlbells.co.uk/code-snippets/set-featured-image-wordpress-programatically/ /
function setFeaturedImages() {
$base = dirname(__FILE__);
$imgfile= $base.DS.'images'.DS.'14'.DS.'Ascot_Anthracite-Grey-1.jpg';
$filename = basename($imgfile);
$upload_file = wp_upload_bits($filename, null, file_get_contents($imgfile));
if (!$upload_file['error']) {
$wp_filetype = wp_check_filetype($filename, null );
$attachment = array(
'post_mime_type' => $wp_filetype['type'],
'post_parent' => 0,
'post_title' => preg_replace('/\.[^.]+$/', '', $filename),
'post_content' => '',
'post_status' => 'inherit'
);
$attachment_id = wp_insert_attachment( $attachment, $upload_file['file'], 209 );
if (!is_wp_error($attachment_id)) {
require_once(ABSPATH . "wp-admin" . '/includes/image.php');
$attachment_data = wp_generate_attachment_metadata( $attachment_id, $upload_file['file'] );
wp_update_attachment_metadata( $attachment_id, $attachment_data );
}
set_post_thumbnail( 209, $attachment_id );
}
}
多分私は誤解していますが、なぜあなたはWordPress環境の外でそれをしたいのでしょうか?この機能を複製するのは大変な作業です。 WordPressは、単にファイルをアップロードして特定のディレクトリに配置するだけではありません。たとえば、ファイルのアップロードを許可するユーザーの制御、アップロード用のデータベースレコードの追加、注目画像の関連付けの設定、ファイルのアップロード - (命名規則、メディアのアップロード場所などに関して)サイト設定に従っている間。
WordPressの管理セクションにログインせずに単にファイルをアップロードしようとしている場合、たとえば外部サイトからファイルをアップロードする場合は、 XML-RPC API 、特にuploadFile
メソッドを見てください。
他の選択肢は自分でミニAPIを書くことです。基本的にあなたがやりたいことはこれです:
wp_upload_dir()
を使用し、パスを作成して結果の場所にファイルを書き込むにはsanitize_file_name()
を使用します。wp_insert_attachment()
を使用します(wp_check_filetype()
はpost_mime_type
の設定に役立ちます)。必要に応じて、オプションでpost_parent
および_thumbnail_id
メタキーも設定します。wp_create_nonce()
とwp_verify_nonce()
を使用してください。