こんな感じでできるような気もしますが、ぶっちゃけAPI機能を使うためのURLを生成して出力する関数(カスタムテンプレートタグ)をfunctions.phpに書いてテンプレート側で呼び出してやった方が簡単な気もします。
それとソースコードはコメント入力フォーム上部の code ボタンをソースコードを選択してから押して整形して投稿して下さいね。
functions.php
<?php
// add_action( フックするアクション名, コールバック, 実行優先順位, 引数の数 )
add_action( 'save_post' , 'action_save_post', 99, 2 );
function action_save_post( $post_id, $post ) {
if ( defined('DOING_AUTOSAVE') && DOING_AUTOSAVE ) {
/** 自動保存時 */
// 何もしない
return $post_id;
} elseif ( !empty( $_POST ) ) {
/** 投稿更新時 */
// URLのカスタムフィールドを取得する
$url = ①get_post_metaを使用;
// スクリーンショットAPI機能用のURL生成
$value = "http://s.wordpress.com/mshots/v1/" . trailingslashit( $url ) . "?w=300";
// スクリーンショット用のカスタムフィールドを更新する
②update_post_metaを使用;
}
}
かぶってしまいましたが、
add_action( 'edit_post', 'my_add_thumbnail_fields',11,2 );
function my_add_thumbnail_fields( $content,$post ) {
$article_body = $post->post_content;
if( preg_match("/(https?:\/\/)([-_.!˜*()a-zA-Z0-9;\/?:@&=+$,%#]+)/siu",$article_body,$regs) ) {
$url = $regs[1].$regs[2];
$api_rest = "http://s.wordpress.com/mshots/v1/{$url}?w=300";
add_post_meta($post->ID, 'api_url', $api_rest, true );
add_post_meta($post->ID, 'url', $url, true );
}
}
Tsuyoshi wrote
こんな感じでできるような気もしますが、ぶっちゃけAPI機能を使うためのURLを生成して出力する関数(カスタムテンプレートタグ)をfunctions.phpに書いてテンプレート側で呼び出してやった方が簡単な気もします
私も、同じ意見で、投稿フォーマットのリンクかなんかのテンプレートを作って、投稿フォーマット リンクを選択した時に、テンプレート側の処理でやってしまったほうがいいんじゃないかなと思いました。
http://wordpress.org/themes/obandes という万年不人気なテーマで、投稿フォーマットリンクの時に、投稿サムネールを表示するというのをやっていて、丁度今メンテ中でした。
http://www.heartrails.com/ のキャプチャ使っていたんですけど、http://s.wordpress.com/mshots/v1/ のほうが良いのかな? よかったら教えてください
Tsuyoshi.さん、迅速なご回答ありがとうございます。
それとソースコード整形の件はすみませんでした。
さて、早速ですがご回答いただいた内容にて検証しようと思ったのですが
私の言葉が足りなかったようで、条件を再度説明させていただきます。
やりたいこと:
①カスタムフィールドテンプレート(プラグイン)を利用して
以下内容のテキストフィールドを投稿画面に設置。
[URL]
type = text
size = 80
②投稿画面に表示されたテキスト入力欄にURLを入力。
例. [http://hogehoge.com/]
③投稿を保存もしくは更新した時点で以下の2つの値がDBに登録。
“URL” => http://hogehoge.com/
“スクリーンショット” => http://s.wordpress.com/mshots/v1/" 後部に"?w=300
④固定ページやフロントページのテンプレート(ループ内)で、以下表示。
<a href="<?php the_permalink();?>" title="<?php the_title(); ?>">
<img src="<?php echo get_post_meta($post->ID,"スクリーンショット",true); ?>" alt="" /><br />
<?php echo get_post_meta($post->ID,"URL",true); ?>
</a>
以上です。
よろしくお願い致します。
たびたびすみません。
③の箇所に誤植がありましたので修正します。
以下が希望している条件です。
【正】
③投稿を保存もしくは更新した時点で以下の2つの値がDBに登録。
“URL” => http://hogehoge.com/
“スクリーンショット” => http://s.wordpress.com/mshots/v1/http://hogehoge.com/?w=300
僕やnobitaさんが提示したコードに手を加えれば実現可能だと思いますが、いかがでしょうか。
カスタムフィールドのキーなどはご自分の環境に合わせて修正すれば良いかと思います。
Tsuyoshiさん、nobitaさん
ご回答ありがとうございます。
「テンプレート側の処理でやってしまったほうが簡単」っていうのは、良く分かります。
ただ、1ページ内で数十件のループを表示させる際にAPIで画像生成するのに時間がかかるので、記事投稿時に一旦DBに格納できればと思っていました。
とはいえ、私が当初考えていた内容と、(ご丁寧に)ご教示いただいた内容で、
いざ固定ページなどで表示させようとすると
やっぱりAPIで画像生成する際に時間がかかるのにはかわりないので、
(そもそも要件が整理できておらず、すみませんでした、、)
一旦趣旨をかえて以下が実装できるかを質問させていただければと思います。
■改めてやりたいこと:
①カスタムフィールドテンプレート(プラグイン)を利用して
以下内容のテキストフィールドを投稿画面に設置。
[URL]
type = text
size = 80
②投稿画面に表示されたテキスト入力欄にURLを入力。
例. [http://hogehoge.com/
]
③投稿を保存もしくは更新した時点で以下データを生成&メディア保存。
テキストフィールドに入力したhttp://hogehoge.com/
から
http://s.wordpress.com/mshots/v1/http://hogehoge.com/?w=300
を生成し、
このAPI処理によって生成されたスクリーンショット画像を
投稿記事のメディアとしてファイル保管(uploadsフォルダに)。
④固定ページやフロントページのテンプレート(ループ内)で、メディアを表示。
以上です。
要するに、投稿画面でurl情報を入力しただけで、
その対象サイトのスクリーンショット(画像)を取得&表示させたいです。
ただし、前述したとおり、固定ページなどで数十件のサイト情報を一括表示させた際に、
API処理で時間がかかるのはNGなので、事前に画像ファイルとして保管したい。
というものです。
どうぞ、ご回答のほど、よろしくお願いします。
PHPのファイルを読み書きする関数を用いて、生成したスクリーンショット用のURLを元に画像を生成すれば良いです。
実装は可能です。
1. カスタムフィールドのURLを元にスクリーンショット用のURLを生成。
2. スクリーンショット用のURLから画像を読み込む。
3. 読み込んだ内容を画像として自サイトに書き出す。
以上です。
PHP: ファイルシステム 関数 – Manual