カテゴリー: 関数

  • wp_trim_words、文字列を指定した文字数で html タグを除去して取得できる便利な関数がそれ。

    wp_trim_words、文字列を指定した文字数で html タグを除去して取得できる便利な関数がそれ。

    WordPress を使ってちょっと込み入ったことをやりたい、ってときに便利なやつです。

    最近よく使うのでメモ。

     

    Codex

    Codex、ほんと助かります。

     

    wp_trim_words の引数

    <?php $trimmed = wp_trim_words( $text, $num_words = 55, $more = null ); ?>

    ひきすうは3つ。

    • $text…必須、切り取りたい文字列
    • $num_words…切り取りたい文字数。デフォルト値は 55文字。
    • $more…切り取った文字列の後に追加したい文字や html。デフォルトは値 null

    配列とかややこしいのは出てこないので使いやすいですね。

    注意するのは WordPress 3.3 以上でないとこの関数を実装していないことです。

     

    wp_trim_words を使ってみる

    使ってみれば簡単に理解できますきっと。

    yahoo.co.jp サイトの文字列を 50文字切り取って出力するサンプル。

    <?php
    $html = file_get_contents( 'http://www.yahoo.co.jp/' );
    $html = wp_trim_words( $html, 50, '' );
    echo $html;
    ?>
    出力結果は↓
    
    Yahoo! JAPAN ヘルプ Yahoo! JAPANトップページの全機能をご利用いただくには、

     

    はい、文字列だけ取得・出力できました。

    html タグは一切残りません、べんり!

     

    $more 部分に html タグなんかを入れたいってときはこんな感じで。

    <?php
    $html = file_get_contents( 'http://www.yahoo.co.jp/' );
    $html = wp_trim_words( $html, 50, '…<a href="http://yahoo.co.jp">Yahoo はこちら</a>' );
    echo $html;
    ?>

     

    まとめ

    使い方次第で応用が効くので、抜粋の表示をオリジナルにしたい時や1行に収めてリストで色々出力したいときに使うといいかも。

     

  • get_post_time で投稿の日時によって処理を変えたかった、というプラグイン作成時のメモ【WordPress】

    get_post_time で投稿の日時によって処理を変えたかった、というプラグイン作成時のメモ【WordPress】

    プラグインを作っていましてですね、投稿日時によって処理を変えたいなーと思ったんです。

    if ( 投稿が1時間以内なら ) {
    	処理1
    } elseif ( 投稿が1日以内なら ) {
    	処理2
    } elseif ( 投稿が1週間以内なら ) {
    	処理3
    } else ( 投稿が1週間以前 ) {
    	処理4
    }

    こんな感じで。

    ただまぁわからないのでいつもの Codex に聞いてみますよ。

     

    get_post_time が使えそう

    はてブしてるのがぼくしかいない関数を発見。日本語訳もないや。

    get_post_time( $d, $gmt, $post, $translate ); で使う。

    このタグはループ内で使えて、現在の投稿の時間を返してくれるんだってさ!

    パラメータは

    • $d …String、指定必須。フォーマット変えるには日付フォーマットのところを参照しろ、とのこと。
      デフォルト値は ‘U’ (unix 形式のタイムスタンプ)
    • $gmt …任意。GMTタイムゾーンの時刻を返すには true
    • $post …任意。postIDを指定、デフォルトは global $post
    • $translate …任意。時刻文字列を翻訳するか否か デフォルトは false

    すな。ただ、$translate は真偽値変えても結果変わらなかったんですよねぇ、謎い。

    <?php
    // get_post_time() 出力例
    echo '結果: ' . get_post_time( 'U', false );
    ?>
    
    結果: 13576608201
    

     

    現在時刻の取得はphp関数の time() で

    time() で unix 形式のタイムスタンプで取得できるので、これと get_post_time() を比較すればいけますね。

    <?php
    // time() 出力例
    echo '結果: ' . time();
    ?>
    
    結果: 1371131722

     

    組み合わせて投稿日時と現在日時の開き具合で振り分けてみる

    コードの検証は以前書いた WordPressの関数をちょっと試したいときにWordPress外のPHPから使うための小技 を使って外部phpで書いてみました。

    時刻は秒で出力されるので、あらかじめ変数で時間を用意しておいて、

    <?php
    
    $hour = 60 * 60; // 1分 × 60 = 1時間
    $day  = $hour * 24; // 1時間 × 24 = 1日
    $time = time(); // 現在時刻のタイムスタンプ
    
    $args = array( 'posts_per_page' => 5);
    $posts_array = get_posts( $args );
    
    // 直近の投稿10件でループ回す
    if ( $posts_array ): foreach ( $posts_array as $post ): setup_postdata( $post );
    
    	// unix 形式で投稿タイムスタンプを取得、int型に一応キャストしておく
    	$post_time = (integer) get_post_time( 'U', false );
    
    	// ここで振り分け処理
    	if ( $time - $hour <= $post_time ) {
    		echo '1時間以内';
    	} elseif ( $time - $day <= $post_time ) {
    		echo '1日以内';
    	} elseif ( $time - $day * 7 <= $post_time ) {
    		echo '1週間以内';
    	} else {
    		echo '1週間以上前';
    	}
    	echo '<br />';
    
    endforeach; endif;
    ?>

    これでバッチリですね 、動かしてみると

    振り分け処理されてる!
    振り分け処理されてる!

    とまぁうまくいきました。

     

    ホホまとめ

    プラグインを作るまで get_post_time なんてWordPress関数知りませんでしたし!

    やっぱり作りたいものがあると色々調べて力になってると実感できます。

    もっと美しい書き方がや訂正あれば是非教えて頂きたく。これやってみて!ってのがあればコメントしてみてください。

  • wp_remote_get は file_get_contents よりも応用できてよいですね【WordPress】

    wp_remote_get は file_get_contents よりも応用できてよいですね【WordPress】

    WordPressプラグイン開発で使う機会があったので覚え書き。

     

    たとえば。外部APIを使って取得したいデータがあるとき。

    PHPだと file_get_contents 関数を使うのがベターですかね。こんな風に。(json_decode の説明は割愛)

    <?php
    /**
     * Googleのはてブ数を取得するサンプル file_get_contents
     */
    $url = 'http://google.com';
    $hatena = json_decode( file_get_contents( 'http://api.b.st-hatena.com/entry.count?url=' . $url ) );
    echo $hatena;
    ?>
    で google.com のはてブ数が出力されます。

     

    これで何の問題もないんです。ただ、エラーが出たときの処理が必要になると途端にコードの量が増えてしまいます。

     

    そこで出てくるのが wp_remote_get という WordPress の関数

    とりあえず Codex を見る。

    wp_remote_get( $url, $args ); で使う。HTTP GET メソッドでURLを配列で返す関数。

    • $url …必須、取得したいURLを指定
    • $args …任意、ヘッダー情報やcookieの配列を指定したい場合に指定

    普通に使う分には $args はスルーして良さげ。

     

    wp_remote_get を使ってみる

    前述のサンプルコード file_get_contents を置き換えて取得してみる。

    外部phpからWordPressの関数を呼び出しますよ)

    <?php
    /**
     * Googleのはてブ数を取得するサンプル wp_remote_get
     */
    $url = 'http://google.com';
    $hatena = wp_remote_get( 'http://api.b.st-hatena.com/entry.count?url=' . $url );
    ?>
    <pre><?php print_r($hatena); ?></pre>

    ↑ のコードで返ってくるのがこれ ↓

    Array
    (
        [headers] => Array
            (
                [server] => nginx/0.8.52
                [date] => Wed, 12 Jun 2013 14:09:18 GMT
                [content-type] => text/plain
                [cache-control] => max-age=1800
                [expires] => Wed, 12 Jun 2013 14:25:14 GMT
                [content-length] => 2
                [x-varnish] => 3020424506 3015334553
                [age] => 844
                [via] => 1.1 varnish
                [connection] => close
            )
    
        [body] => 74
        [response] => Array
            (
                [code] => 200
                [message] => OK
            )
    
        [cookies] => Array
            (
            )
    
        [filename] => 
    )

    [body] に $url の内容が格納されて、各々のステータスもそれぞれ配列に入ってる。

    ということでエラー時の振り分けが簡単にできるんですな。

    まとめると、

    <?php
    /**
     * Googleのはてブ数を取得するサンプル wp_remote_get
     */
    $url = 'http://google.com';
    $hatena = wp_remote_get( 'http://api.b.st-hatena.com/entry.count?url=' . $url );
    // エラー振り分け
    if ( ! is_wp_error( $hatena ) && $hatena['response']['code'] === 200 ) {
    	echo $hatena['body']; // はてブ数
    } else {
    	// エラー時の処理
    }
    ?>
    <!-- 配列ごと出力 -->
    <pre><?php print_r( $hatena ); ?></pre>

    っという感じで使える、と。

     

    ホホまとめ

    プラグインを作りながら関数を調べながら…ってやっていると知らないことだらけで下書きが増えまくりです。

    調べてやってみて、さらに記事にする、という手順を踏むと間違いなく身についてるなぁと実感しています。

  • Transients APIを使って各ソーシャルのカウント数をWordPressデータベース内に一時保存&表示するのよ!

    Transients APIを使って各ソーシャルのカウント数をWordPressデータベース内に一時保存&表示するのよ!

    最近流行ってるっぽいこんなの、つけたかったんですよね。↓

    ソーシャルのカウントねこれ
    ソーシャルのカウントねこれ

    一覧でカウント数出てるとほら、訴えるモノがあるじゃないですか。

    カウント数少なかったらちょっとしょんぼりできますけどね。

     

    ローカルで試してみたはいいものの

    毎回各APIにJSONリクエスト送って取得した値を表示するっていうことをしてたんで表示がどえらい遅くなりました。

    これじゃあいかんね、っということでちょっと考えてみることに。

     

    作戦その1 データベースに一定時間毎書き込む

    バックグラウンドでpostIDごとにソーシャルボタン押された回数を全部攫って記録したものを呼び出す的なことを考える。

    実装面でめんどいいいので却下。

     

    作戦その2 キャッシュ使えば良いんじゃないの?

    WordPressのCodexで使えそうな関数を探してみることに。

    ふむ。まさにキャッシュ。

    ちょっと使ってみるもなんか違う。

    ちゃんと読んでみたらば、デフォルトだとオブジェクトキャッシュは非永続的で、キャッシュに格納されたデータはメモリ上だけ。セッション間のみでしか存在しない。だと…?

    ちょっと挙動を変えてやらんと使えないねこりゃあ…ということでまた探す。

     

    作戦その3 ええの見つけた!

    Codexでそれっぽい単語調べてると良さげな関数が。

    データに名前と有効期限を設定して、データベース内に保存する関数。

    Transients API は Options API に似てるけども、有効期限という機能を使うことで wp_options テーブルをデータ保存用に使うことを可能にします。

    これよこれ、求めてたのは!

     

    Transients APIの使い方

    調子のって使い方とか書いてますが初めて使いますよ(´∀`)

     

    Transients API

    Transients APIのデータ保存先はデータベースの options

     

    関数

    set_transient( $transient, $value, $expiration ); でデータをセット。

    • $transient…キャッシュデータのユニークID。String型。
    • $value…保存するデータ。変数でも配列でもオブジェクトでもいける。
    • $expiration…データを更新するまでの有効期限(秒)。デフォルトは0。int型。

    get_transient($transient); でデータ取得。set_transient で使った $transient で取得。

    delete_transient($transient); 手動でデータ削除するときの関数。

     

    Transients API を実装してみる

    というわけで実装。

    やりたいことは

    1. 各ソーシャルのカウントを取得
    2. 取得したカウント数がない場合一時保存
    3. 一時保存のカウント数を出力

    ですな。個々のAPIを使った例を出すとややこしくなるので、今回は簡単に取得できる SharedCount

    というサービスを使ったサンプルコードを記。

    /**
     * SharedCount を使ってソーシャルのカウントを取得
     * Transientで保存。
     *
     * 出力例(ループ内がいいよ): <?php social_counts(); ?>
     */
    function social_counts() {
    	// Transient データを取得
    	if ( false === ( $social_counts = get_transient( 'social_counts_' . get_the_ID() ) ) ) {
    		// Transient が存在しない場合、コード実行
    		$url    = get_permalink();
    		$json   = file_get_contents( 'http://api.sharedcount.com/?url=' . rawurlencode( $url ) );
    		$counts = json_decode( $json, true );
    
    		// 配列にカウント格納
    		$social_counts = array(
    			$counts["Twitter"],
    			$counts["Facebook"]["total_count"],
    			$counts["GooglePlusOne"],
    		);
    		/*
    		 * Transient の値を設定。
    		 *
    		 * キャッシュデータのユニークIDは「 social_counts_(投稿IDの数字) 」
    		 * 先頭に _transient_ が自動付加される。
    		 */
    		set_transient( 'social_counts_' . get_the_ID(), $social_counts, 60 * 60 * 4 ); //=4時間 重いと思ったら増やせばいいよ
    	}
    
    	// $social_counts 出力
    	echo '
    <p class="sns">
    	<span class="tw">' . $social_counts[0] . '</span>
    	<span class="fb">' . $social_counts[1] . '</span>
    	<span class="gp">' . $social_counts[2] . '</span>
    </p>
    	';
    }

    上記コードを functions.php にでも貼り付けてあとはループ内に

    <?php social_counts(); ?>

    って書けば( `д´)b オッケー!

    cssはてきとうに書いてください。

    データベースにはこんな感じで格納されてますよ。

    Transients_SharedCount_db_example

     

     

    ホホまとめ

    久しぶりにブログを書く元気が出てわりとしっかり調べて実装できたので満足。

    できる人は公式APIから各JSONを取得するのがいいと思うよ!

    SharedCount だとはてブのカウント取れないしね。

    興味ある人は試してみるとおもしろいよ。

    自分で色々考えるのは楽しいすな。これを Cron でバックグラウンドにすれば完璧っぽい。

    そのまま実装したら重いかもね。