外部画像を取得してそれをメディアライブラリにアップロードし、その投稿に添付することになっているカスタム投稿フォームを作成しています。これはmedia_sideload_imageを使用することで可能になるはずですが、正しく機能する代わりに空白のページが表示されます。エラーも発生しません。私のコード:
// Add the content of the form to $post as an array
$new_post = array(
'post_title' => $title,
'post_content' => $description,
'tags_input' => $tags,
'post_type' => 'link_submit',
'post_status' => 'publish'
);
//save the new post and return its ID
if ($stop == false){
$pid = wp_insert_post($new_post);
update_post_meta($pid,'Link',$link,true);
update_post_meta($pid,'Type',$type,true);
// attach image
set_time_limit(300);
$upload = media_sideload_image($link, $pid, "test");
if ( is_wp_error( $upload ) ){
die( 'Nope' );
}
$link = get_permalink( $pid );
wp_redirect( $link."?posted" );
die();
}
アイデア?
ありがとう、デニス
編集:新しいコード:
if (is_page('Upp')){
require_once(ABSPATH . 'wp-admin/includes/file.php');
require_once(ABSPATH . 'wp-admin/includes/media.php');
set_time_limit(300);
$upload = media_sideload_image("http://29.media.tumblr.com/tumblr_lmp1tbiYwh1qzlfumo1_500.jpg", "202", "my description");
die ( $upload );
}
まず、あなたの条件付きで順序を逆にします。 if ( false == $stop ) { ...
を使うべきです。これは "Yoda条件付き"と呼ばれ、WPコードのベストプラクティスのリストに載っています。
次に、media_sideload_image
は、失敗しても_ WP errorオブジェクトを返しません。失敗した場合は、渡された投稿のIDを返します(あなたの場合は$pid
)。成功すると、挿入されたばかりの画像をレンダリングするためのHTMLを返します。
$upload
の内容をダンプして、そこに何が入っているのかを調べ、うまくいったかどうかを確認することをお勧めします。それでif(is_wp_error())
コード...それをwp_die( $upload )
に置き換えて、何が出るかを見てください。もしそれがidなら、あなたのシステム上で何か問題があり、あなたはあなたのサーバーがなぜ画像をダウンロードできないのか調査する必要があります。画像のHTMLマークアップであれば、その画像は追加されているので、準備は完了です。
参考のために、569行目の/wp-admin/includes/media.php
の実際のmedia_sideload_image()
関数を見てください。
私はコードをより深く調べ、WordPressのコードで設定したブレークポイントを調べ始めました。これが私が最後に問題を発見したところです。
イメージの処理中に、media_sideload_image()
willは結局、同じファイル内にあるmedia_handle_image()
を呼び出します。問題ありません。しかし、この他の関数はwp_read_image_metadata()
を呼び出します。これは、まだインクルードしていない別のファイルで定義されている関数です。
残念ながら(そしてこのコードがWPベストプラクティスに反するため、まだ明らかにされていないので)、その関数呼び出しの前に厄介な@
シンボルがあります。 PHPの@
記号はパーサーによって投げられたエラーを黙らせるので、PHPは "関数は定義されていません"というエラーを見て停止します。私たちの頭.
そのため、require_once()
sのリストに次の行を追加すると、実際にイメージが読み込まれて挿入されます。
require_once(ABSPATH . 'wp-admin/includes/image.php');
頭痛を起こす他の唯一のことはあなたのコードがpost_type=link_post
のためのものだったということでした...私はそのポストタイプを定義していなかったので、私はwp_insert_post()
がうまくいかなかった理由を見つけようとしていましたそして私は今私のDBに100個の "Test Post"があります:-)