PHP

[035] wp_trim_excerpt (抜粋機能)

PHPで文字を抜粋する方法を WordPress の自動抜粋機能「the_excerpt()」をたどって探してみたところ、抜粋する関数 wp_trim_excerpt に辿り着いた。この関数 wp_trim_excerpt を読むと、抜粋($text)がない場合は get_the_content で全文を取得して抜粋等をおこなっている。実際の抜粋部分の流れは以下の通り

  1. preg_split で空白を区切り文字に $text を抜粋文字列数+1まで分割する
  2. count($words) が 文字列数の制限より多い場合は
    array_pop($words) で最後の文字列群を切り捨てる
  3. implode(‘ ‘, $words) で再び区切り文字” “で結合して抜粋は完了
    実際には$excerpt_moreを加える
formatting.php
function wp_trim_excerpt($text) {
$raw_excerpt = $text;
if ( '' == $text ) {
$text = get_the_content('');

$text = strip_shortcodes( $text );

$text = apply_filters('the_content', $text);
$text = str_replace(']]>', ']]>', $text);
$text = strip_tags($text);
$excerpt_length = apply_filters('excerpt_length', 55);
$excerpt_more = apply_filters('excerpt_more', ' ' . '');
$words = preg_split("/+/", $text, $excerpt_length + 1, PREG_SPLIT_NO_EMPTY);
if ( count($words) > $excerpt_length ) {
array_pop($words);
$text = implode(' ', $words);
$text = $text . $excerpt_more;
} else {
$text = implode(' ', $words);
}
}
return apply_filters('wp_trim_excerpt', $text, $raw_excerpt);
}



さて、これに倣って文字列数、文字数それぞれの単位で抜粋するコードを作成した。

続きを読む

[030] WordPress のデバッグ

WordPress の状態遷移等を出力してデバッグする場合、最終的に画面が表示される場合は echo や var_dump を用いて画面に表示して確認する。しかし、 WordPress 起動の流れをデバッグするには画面に出力するのは難しそうだ。そこで、デバッグをファイルに出力する方法でおこなってみた。

実際に wp-config.php で WP_POST_REVISIONS を定義して、その結果をファイルに出力してみた。使用したのは fopen → fwrite → fclose の3つの関数。また、fopen は追記モード「a」でおこなった。また、改行はダブルクォーテーションにする必要があるようだ。(シングルクォーテーションではそのまま \r\n と表示されてしまった)

/** リビジョン設定 */
define('WP_POST_REVISIONS', 0);
$file = fopen('log.txt', 'a');
fwrite($file, 'wp-config.php:WP_POST_REVISIONS='. WP_POST_REVISIONS ."\r\n");
fclose($file);



実際にサイトにアクセスすると、wp-config.php と同じ階層に log.txt が作成され、開くと 「wp-config.php:WP_POST_REVISIONS=0」 と書き込みされている。
続きを読む

[web] WEBサービス

現在、様々なWEBサービスからデータを取得することができるようになっている。各WEBサービスで共通する大まかな流れを記載する

(1) WEBサービスに登録して、API-KEY を取得する
(2) API ガイドラインを参照して仕様を確認する
(3) リクエストURL を作成して、ブラウザでデータが取得できることを確認する
(4) リクエストURLを発行し、XMLデータを取得してパースするPHPを作成する

$file = '作成したリクエストURL'
$data = file_get_contents($file);
$xml = simplexml_load_string($data);
var_dump($data)


(5) パースしたデータの構造を確認する
object(SimpleXMLElement)#1 (4) { 
  => string(4) "3621" 
  => string(2) "30" 
  => string(1) "1" 
  => array(30) {
    => object(SimpleXMLElement)#2 (22) { 
      => array(1) { => string(1) "0" } 
      => string(7) "b847401" 
      => string(19) "2010-09-10 11:49:40" 
      => string(34) "○○○○" 
      => string(42) "○○○○" 


(6) foreach文でデータを展開するPHPを組み込む
foreach($xml->rest as $itemData){
	echo $itemData->attributes()->order ;
	echo $itemData->id ;
	echo $itemData->category_code_l ;
}


(7) foreach文の作成で留意すべき点は下記の通り。
  • ・・・・の繰り返しまでを foreach($xml->○○○->△△△ as $itemData) と定義する
  • $itemData->id のようにデータを取得する
  • @attributes の場合は $itemData->attributes() とする
  • 入れ子の場合は $itemData->category_code_l とする

[021] simplexml_load_string でパースした値

WEBサービスで取得した xml を simplexml_load_string 関数を使いパースし foreach で展開して $item->latitude などと取得した。

さらに、取得したデータを add_post_meta 関数でカスタムフィールドに追加したものの、登録した値を get_post_meta で取得できずにはまってしまった(登録は正常終了するが、値を取得しようとすると取得できず、更新しようとすると存在しないという警告とともに失敗する)。

そこで、データベースを確認してみたところ xml 構造のまま登録されていたので、これが原因そ推察した。そこで、(string)$item->latitude と変更したところ、文字列で登録されるようになった。

$unique=true;
$file = 'WEBサービスへの検索文';
$data = file_get_contents($file);
$xml = @simplexml_load_string($data);
foreach($xml->sample as $item){
  $post_id= ・・・・;
  add_post_meta($post_id, 'latitude',(string)$item->latitude,$unique);
  add_post_meta($post_id, 'longitude',(string)$item->longitude,$unique);
}