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]);

パフォーマンスチューニングした WordPress のベンチ

色々、やった結果 Amazon EC2 Micro インスタンス上に構築している WordPress 上で、ネットワーク越しでも ab -n 1000 -c 100 の結果が、これくらいになるようにはなった。
リソース少ないマシンをチューニングするのは楽しいすなぁ。

$ ab -n 1000 -c 100 -H 'Accept-Encoding: gzip' http://dogmap.jp/

Server Software:        nginx
Server Hostname:        dogmap.jp
Server Port:            80

Document Path:          /
Document Length:        14265 bytes

Concurrency Level:      100
Time taken for tests:   3.40771 seconds
Complete requests:      1000
Failed requests:        0
Write errors:           0
Total transferred:      14473818 bytes
HTML transferred:       14295933 bytes
Requests per second:    328.86 [#/sec] (mean)
Time per request:       304.077 [ms] (mean)
Time per request:       3.041 [ms] (mean, across all concurrent requests)
Transfer rate:          4648.16 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        8   11   5.5     10      43
Processing:    27  275  68.2    267     563
Waiting:       19  263  67.9    254     545
Total:         38  287  69.2    278     594

Percentage of the requests served within a certain time (ms)
  50%    278
  66%    290
  75%    317
  80%    338
  90%    371
  95%    394
  98%    427
  99%    520
 100%    594 (longest request)

秒間 328 リクエスト

ちなみに PHP Ninja 上の WordPress だと、このくらい。

$ ab -n 1000 -c 100 -H 'Accept-Encoding: gzip' http://ninja.dogmap.jp/
Server Software:        nginx
Server Hostname:        ninja.dogmap.jp
Server Port:            80

Document Path:          /
Document Length:        8783 bytes

Concurrency Level:      100
Time taken for tests:   1.548749 seconds
Complete requests:      1000
Failed requests:        0
Write errors:           0
Total transferred:      9063550 bytes
HTML transferred:       8812060 bytes
Requests per second:    645.68 [#/sec] (mean)
Time per request:       154.875 [ms] (mean)
Time per request:       1.549 [ms] (mean, across all concurrent requests)
Transfer rate:          5714.94 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:       12   23  11.5     20      63
Processing:    32  123  45.0    125     206
Waiting:       14   87  45.4     80     172
Total:         46  146  40.3    149     218

Percentage of the requests served within a certain time (ms)
  50%    149
  66%    173
  75%    185
  80%    191
  90%    194
  95%    198
  98%    207
  99%    214
 100%    218 (longest request)

秒間 645 リクエスト、にばーいにばーい。

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;
    }
}

WordPressでプラグインなしで画像にパスワードをかける

試してないのですが、以下のように.htaccessで制御する記事を海外のブログで見つけたので、メモがわりに書いておきます。

この方法を使用するとプラグインを使わなくてもアップロードファイルにパスワード保護をかけられるので、SNS系のシステムなどを構築するのに便利かもしれません。

via. WordPressでプラグインなしで画像にパスワードをかける | firegoby

Nginx でやるなら、こんな感じ。

location ~ /wp-content/uploads/.* {
    if ($http_cookie !~ "wordpress_logged_in") {
        rewrite .*$ /wp-login.php?redirect_to=$uri permanent;
    }
}

厳密にはログインしてるかどうかは見てないので注意が必要ですよ。

Re: 【ノンデザイナー向け】 WordPress で今風なページトップを超簡単に設置する方法

2011年くらいから、
ページをスクロールすると、フワっと表示されるページトップ(クリックするとページの一番上にいくやつ)が
流行ってますよね! 超簡単にコピペするだけで作れるソース作ったので、公開します!

via. 【ノンデザイナー向け】Wordpressで今風なページトップを超簡単に設置する方法 | しらさかブログ

僕が WordPress に実装するなら、こうかな?
以下を functions.php に追加。

// テーマの head 部で jQuery を読み込む
add_action('wp_print_scripts', 'add_print_scripts_jquery');
function add_print_scripts_jquery() {
    wp_enqueue_script('jquery');
}

// Scroll to Top 用のスタイルを head 部に追加
add_action('wp_head', 'add_scroll_to_top_style');
function add_scroll_to_top_style() {
    ?>
<style type="text/css">
#pagetop { display:none;position:fixed;right:10px;bottom:10px;z-index:100; }
#pagetop a { padding:5px;background:#ccc;color:#fff;display:block;font-size:20px;font-weight:bold;-webkit-border-radius:8px;-moz-border-radius:8px;border-radius:8px; }
</style>
    <?php
}

// Scroll to Top 用の JavaScript をフッター部に追加
add_action('wp_footer', 'add_scroll_to_top');
function add_scroll_to_top() {
    ?>
<script type="text/javascript">
jQuery(function($){
    $('body').append(
        $('<div id="pagetop">')
        .append(
            $('<a href="#">↑</a>')
            .click(function(){$('html,body').animate({scrollTop:0}, 800, 'swing')})
            )
        );
    $(window).scroll(function () {
        if ($(this).scrollTop() > 100) {
            $('#pagetop').fadeIn();
        } else {
            $('#pagetop').fadeOut();
        }
    });
});
</script>
    <?php
}

本当は、css とか JavaScript とかは別ファイルにして外出ししたほうが良いと思うけど、まぁ簡単にコピペでできるってことで。

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

フォロー

Get every new post delivered to your Inbox.

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