Skip to content
2012/12/18 / Javelina

WordPressにて、tweetを埋め込みする際にキャッシュするようにした

以前、WordPressでEmbedタグを使用してTwitterのつぶやきを複数埋め込むと数回アクセスしただけで埋め込みが反映されなくなり困った!という話をしましたが、結局新たにショートコードを作り、呼び出したツイートの埋め込み用htmlをキャッシュ・読み込みすることで解決することにしました。
 

公式tweetボタンを設置していない場合

<?php
function tweetembedFunc($atts, $tweet = null){
	$script_default = 1; /*デフォルトでwidgets.jsを呼び出すかどうか。1=呼び出す/0=呼び出さない*/
	$term = 168;/*キャッシュさせたい時間。単位:hour*/

	extract( shortcode_atts( array(
		'script' => $script_default,
	), $atts ) );
	
	$omit_script = ($script == 1) ? '' : '&omit_script=true'; 
	$tweet_split = explode('status', strtr($tweet,array('/' => '')));
	$tweetID = $tweet_split[1];
	
	if($tweetID){
	    $transient_key = md5('tweetembed_' . $tweetID);
	
	    if(false === ($tweet_html = get_transient($transient_key))){
			$response = wp_remote_get('https://api.twitter.com/1/statuses/oembed.json?id=' . $tweetID . $omit_script);
			if(!is_wp_error($response) && $response['response']['code'] === 200 ){
				$tweet_status = json_decode($response['body']);
				$tweet_html = $tweet_status->html . "\n";
				set_transient($transient_key, $tweet_html, 60*60*$term);
			}else{
				$tweet_html = '';
			}
		}
	}
	return $tweet_html;
}
add_shortcode('tweetembed', 'tweetembedFunc');
?>

 
これで、ツイートを埋め込む際に従来の

http://ツイートのURL

ではなく

[tweetembed]ツイートのURL[/tweetembed]

と入力することで、埋め込み用に発行されるhtmlをデータベースにキャッシュさせた上で表示することができるようになります。
このままでも使用可能ですが、複数のツイートを埋め込む場合、埋め込みの度に//platform.twitter.com/widgets.jsが呼び出されてしまうので、
2つ目以降の埋め込みの際は

[tweetembed script=0]ツイートのURL[/tweetembed]

このようにオプションで”script=0″を指定すると無駄に同じスクリプトを呼び出さずに済みます。

 

公式tweetボタンを設置済みの場合

 
そもそもこの//platform.twitter.com/widgets.jsは、サイトに「ツイートボタン」を設置している場合は既に呼び出されているはずですので(ツイートボタンとツイートの埋め込みの整形に使用されるスクリプトは同じもの)、
ツイートボタンを導入しているのであれば埋め込みに際して一度もこのスクリプトを呼び出す必要がありません。

その場合は、3行目の $script_default = 1 を $script_default = 0 に変えるとデフォルトでこのスクリプトの呼び出しを省略するようになるので、script=0を入力する手間が省けます。

念の為、デフォルトで//platform.twitter.com/widgets.jsを省略するコード↓

<?php
function tweetembedFunc($atts, $tweet = null){
	$script_default = 0; /*デフォルトでwidgets.jsを呼び出すかどうか。1=呼び出す/0=呼び出さない*/
	$term = 168;/*キャッシュさせたい時間。単位:hour*/

	extract( shortcode_atts( array(
		'script' => $script_default,
	), $atts ) );
	
	$omit_script = ($script == 1) ? '' : '&omit_script=true'; 
	$tweet_split = explode('status', strtr($tweet,array('/' => '')));
	$tweetID = $tweet_split[1];
	
	if($tweetID){
	    $transient_key = md5('tweetembed_' . $tweetID);
	
	    if(false === ($tweet_html = get_transient($transient_key))){
			$response = wp_remote_get('https://api.twitter.com/1/statuses/oembed.json?id=' . $tweetID . $omit_script);
			if(!is_wp_error($response) && $response['response']['code'] === 200 ){
				$tweet_status = json_decode($response['body']);
				$tweet_html = $tweet_status->html . "\n";
				set_transient($transient_key, $tweet_html, 60*60*$term);
			}else{
				$tweet_html = '';
			}
		}
	}
	return $tweet_html;
}
add_shortcode('tweetembed', 'tweetembedFunc');
?>

 

広告

2件のコメント

コメントする
  1. ☆SAKUSAKU☆ (@nakanohito47) / 5月 9 2013 12:34 pm

    ちょうど今探し求めていた情報だったので助かりました。
    いいね!つけました。

  2. Javelina / 5月 9 2013 9:56 pm

    お役に立てたのなら何よりです!
    いいね!もつけて頂いてありがとうございました(^▽^)

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中

%d人のブロガーが「いいね」をつけました。