Re: WordPressで記事のツイート数だけを取得して表示する方法

先日設置しましたメニューバー下の新着記事サムネイルに、その記事のツイート数を表示してみました!
いろんなサイトを見て「いいなぁ」と思っていたのでけっこー感動。いいわぁw

ということで、記事のツイート数を取得して表示する方法と、この斜め三角をどうやって作ったかを解説したいと思います!

via. WordPressで記事のツイート数だけを取得して表示する方法 | NANOKAMO BLOG

これだと、記事にアクセスがあったときに毎回 Twitter API 叩いて、Twitter サーバーにいらん負荷をかけちゃうので、WordPress の Transient API 使って、キャッシュを取得するようにしたほうが良いと思う。
あと WP 使うんなら file_get_contents() ではなく、wp_remote_get() 使ったほうが、何かと便利。

※未検証です。

WordPress で wp-cron を無効化する

wp-config.php に以下のコードを追加。

define('DISABLE_WP_CRON', true);

ただし、これを記述しても wp-cron.php に直接アクセスすれば、wp-cron は動作する。

WordPress の日付別アーカイブタイトルを修正

Twenty Eleven とかで、日付別アーカイブのタイトルが、以下のような残念な感じになるのを修正。

16 | 4月 | 2012 | ブログ名
function jp_date_archive_wp_title( $title ) {
    if ( is_date() ) {
        $title = '';
        if ( $y = intval(get_query_var('year')) )
            $title .= sprintf('%4d年', $y);
        if ( $m = intval(get_query_var('monthnum')) )
            $title .= sprintf('%2d月', $m);
        if ( $d = intval(get_query_var('day')) ) {
            $title .= sprintf('%2d日', $d);
        $title .= ' | ';
    }
    return $title;
}
add_filter( 'wp_title', 'jp_date_archive_wp_title', 1 );

こうなる

2012年 4月16日 | ブログ名

参考: WordPressの日付別アーカイブのtitleタグに年やら日やらを追加する | Simple Colors

WordPress で HTTP Status code を出力

status_header() 関数を使うと簡単。

例えば、こんな感じでログインユーザオンリーのコンテンツを作れるよ。

if ( !is_user_logged_in() ) {
	status_header('401');
	wp_die('Unauthorized');
}

404 Not Found 出したいなら、こんな感じ。

if ( !have_posts() ) {
	status_header('404');
	wp_die('Not Found');
}

Re: WordPressでイベントカレンダー

WordPress ではウィジェットや get_calendar タグ/ファンクションを使って、ブログによくある投稿カレンダーを出力することができます。カレンダーの日付のリンク先は日付別アーカイブとなっているのですが、カレンダーの日付枠内に記事のタイトルを表示したいという要望がよくあります。巷ではイベントカレンダーと呼ばれるニーズですね。
そのようなことを実現するプラグインはありますが、他人のルールで作られたものは敬遠したいという方のために get_calendar をいじくる方法をご紹介します。さらにカレンダーに表示する記事はカテゴリーで指定できるようにします。

via. WordPressでイベントカレンダー  |  wpxtreme

添削するのは、パーマリンクから日付を取得する正規表現。

if(preg_match_all('@<td><a href="' . get_option('home') . '/(\?m=)?([^"]*?)" title="[^"]*?">([0-9]+?)</a>@i', $output, $matches)){
  foreach($matches[0] as $key => $match){
    $date  = preg_replace('@/@', '', $matches[2][$key]);
    $year  = substr($date, 0, 4);   // 年
    $month = substr($date, 4, 2); // 月
    $day   = substr($date, 6, 2);   // 日
    /* do stuff */
  }
}

これだと、http://example.com/archives/date/2011/11/21 とかの形式に対応できない。
こんな感じに修正。

    $date  = preg_replace('@^[^0-9]*([0-9]+)/?(0[0-9]|1[0-2])/?([0-2][0-9]|3[01]).*$@', '$1$2$3', $matches[2][$key]);
// http://example.com/?m=201001 や http://example.com/201001 の月別アーカイブリンクを
//   http://example.com/event-calendar/?ym=201001 の形式に変更する  
// 前後月リンクは td に next, prev の ID が付加されているのでそれを利用する
if(preg_match_all(
  '@<td( id="[prev|next]")?[^>]*?><a href="(' . get_option('home') . '/)(\?m=)?([^"]*?)" title="[^"]*?">[^<]+?</a>@i', 
  $output, $matches)){
  foreach($matches[0] as $key => $match){
    $ym  = preg_replace('@/@', '', $matches[4][$key]);
    $output = preg_replace(
      '@' . preg_quote($matches[2][$key]) . preg_quote($matches[3][$key]) . preg_quote($matches[4][$key]) . '@',   
      get_permalink() . '/?ym=' . $ym, 
      $output
    ); 
  }
}

同様にこんな感じ。

    $ym  = preg_replace('@^[^0-9]*([0-9]+)/?(0[0-9]|1[0-2]).*$@', '$1$2', $matches[4][$key]);

is_mac とか is_windows とかあるといいんだけど。。

functions.php にでも書けば良いと思うよ。

global $is_win, $is_mac;
$is_win = $is_mac = false;
if ( isset($_SERVER['HTTP_USER_AGENT']) ) {
    if ( strpos($_SERVER['HTTP_USER_AGENT'], 'Win') !== false ) {
        $is_win = true;
    } elseif ( strpos($_SERVER['HTTP_USER_AGENT'], 'Mac') !== false ) {
        $is_mac = true;
    }
}

WPTouch Pro と Nginx リバースプロキシ

WPTouch Pro がスマートフォン判定したら、expires 0 (PHP 5.3用)。

add_action( 'wptouch_pro_loaded', function(){
	global $wptouch_pro;
	if ( $wptouch_pro->is_mobile_device ) {
		nocache_headers();
	}
});

または、nginx.conf 内で cookie で判別。

set $mobile "";
if ($http_user_agent ~* '(DoCoMo|J-PHONE|Vodafone|MOT-|UP\.Browser|DDIPOCKET|ASTEL|PDXGW|Palmscape|Xiino|sharp pda browser|Windows CE|L-mode|WILLCOM|SoftBank|Semulator|Vemulator|J-EMULATOR|emobile|mixi-mobile-converter|PSP)') {
    set $mobile "@ktai";
}
if ($http_user_agent ~* '(iPhone|iPod|Opera Mini|Android.*Mobile|NetFront|BlackBerry)') {
    set $mobile "@smartphone";
}
if ($http_cookie ~* "wptouch(_switch_cookie=normal|-pro-view=desktop)") {
    set $mobile "@smartphone.off";
}

WordPress + Nginx でパーマリンク設定に index.php が含まれる時の対策

WordPress でリバースプロキシ使ってる時のコメントユーザーIP対策

//  applied to the comment author's IP address prior to saving the comment in the database. 
function auto_reverse_proxy_pre_comment_user_ip() {    
	if ( isset($_SERVER['X_FORWARDED_FOR']) && !empty($_SERVER['X_FORWARDED_FOR']) ) {
		$X_FORWARDED_FOR = (array)explode(",", $_SERVER['X_FORWARDED_FOR']);
		$REMOTE_ADDR = trim($X_FORWARDED_FOR[0]); //take the last 
	} else {
		$REMOTE_ADDR = $_SERVER['REMOTE_ADDR'];
	}
	return $REMOTE_ADDR;
}
add_filter ( 'pre_comment_user_ip','auto_reverse_proxy_pre_comment_user_ip' );

via. Plugin API/Filter Reference/pre comment user ip « WordPress Codex

Ktai Style からの出力に Cache-Control: no-cache ヘッダを追加する

PHP 5.3 用

add_action('init', function(){
	if ( function_exists('is_ktai') && is_ktai() ) {
		nocache_headers();
		header('X-KtaiType: ' . is_ktai('type') );
	}
});

Ktai Style からの出力を、リバースプロキシキャッシュとかにキャッシュさせたくない時にどうぞ。

nocache_headers() は、WordPress の独自関数。
is_ktai() は、Ktai Style の独自関数。

フォロー

Get every new post delivered to your Inbox.

現在1,816人フォロワーがいます。