PHP

カスタムタクソノミーのリンク表示

[備忘録]
WordPressでカスタム投稿タイプとそれに付随するカスタムタクソノミー(custom taxonomy カスタム分類)を導入したのだが,それらを各記事のところに表示する方法。

get_the_term_list という関数を用いると,リンク付きの文字列が得られる。使用中のテーマは,WordPress3.5付属のTwenty Twelve というもの。functions.php を修正するのだが,直接変更せずに,Child Theme (子テーマ) を作って,そちらに functions.php を作って,修正する。具体的には,twentytwelve_entry_meta() の中で,次のような記述をすればよい。

echo '分野:' . get_the_term_list($post->ID,'math_cat','',', ');

もっとも,これは単純すぎるので,実際にはカスタム分類があるときに限って表示するようなif文にするのだが。

これで,デフォルトの「投稿」と同じ形式で記事の末尾などに,カスタム分類の項目と,そのアーカイブへのリンクを出力することが出来た。

WordPressでカテゴリー一括登録を手動で行う実験

カテゴリーを一括登録するプラグインもいくつか使ってみたが,その場で登録するものばかりで,事前に用意されたテキストファイルなどを読み込んで,一括して登録するものは見当たらなかった。そこで,見よう見まねで自作することにした。

利用するのは,wp_create_category() という WordPress の内部関数。これを使うためには,これが定義されているファイルをインクルードしなくてはならないらしい。

改行で区切った文字列をヒアドキュメントで定義して,これを改行で分割して配列にする。そして,配列の各々の文字列に対して,カテゴリーとして登録するというもの。

// カテゴリーを手動で登録する実験
function create_my_categories() {
$cat_str =
<<<CATDATA
初等数論
可換環論
ガロア理論
代数曲線論
複素多様体
代数的数論
解析的数論
CATDATA;

	include_once(ABSPATH . 'wp-load.php');
	include_once(ABSPATH . 'wp-admin/includes/taxonomy.php');

	$cat_array = explode("\n", $cat_str);
	foreach($cat_array as $value) {
		wp_create_category($value);
	}
}

とりあえず,実験は成功。自家用としては,これを functions.php に追加して,

add_action('init', 'create_my_categories');

とかすれば良い。汎用性を考えるならファイルから読み込むようにしてプラグインとして動作させるのが良いのだろう。プラグインの作り方,すっかり忘れてしまったが・・・。

Advanced Custom Fields を使ってみる

相変わらず MAMP でローカルにWordPressでのデータベース構築実験,続行中。

標準のカテゴリーだけで処理することも可能かもだが,将来的なことも考えて,Advanced Custom Fields (ACF) というプラグインを試してみることにした。かなり意欲的なプラグインであり,独自APIまでいろいろと準備されている。

オフィシャルサイトのDocumentationとかサンプルを少し読んで,とりあえず自分で作成したフィールドを記事に表示させることが出来たので,忘れないようにメモ。使うのは,get_field, the_field という関数(API)たち。

直にHTMLというかPHPを書き込んでも良いのだが,これも将来的なことを考えて,関数にしてみた。オフィシャルの the_category() という関数のソースを参考にして,適当に自分の関数を定義してみる。例えば名前を show_my_fields() としてみよう。これを,使っているテーマ付属の functions.php の末尾にでも追加する。PHPはまるっきりの初心者で,文字列結合の演算子とかも知らないものだから,思いっきり冗長なベタ書きコードになっているが,まあ,とりあえず動作したということで。

<?php

function show_my_fields( $post_id=false ) {
	if ( get_field('shutten')) {
		echo '<span class="metacat">';
		echo "出典: ";
		echo get_field('shutten');
		if ( get_field('opt')) {
			echo get_field('opt');
		}
		echo "</span>";
	}
}

?>

そして,これをフィールドを表示させたいところに,

 show_my_fields() 

と書けばよい。これで,独自フィールドの表示は成功。

次は,標準のカテゴリー表示のように,特定のフィールドに合致するエントリーをアーカイブとして表示させたいのだが,まだどうしてよいか分からない状態。フィールドに一致するエントリー全体の配列かなにかを返してくれる関数(API)があるはずだとは思うのだが。

あと,PHPの文法も少し勉強しなくては。というか,PHPって,コードとHTMLが同時に混ざっているって,どういう仕様なんだ〜 😯 とか思うのだが。不思議な言語ではある 😉 。

CSV Importerを使ってみた

MAMP上でのWordPressで,簡易データベース構築の実験中。既存の文書から一括して登録するために,ツールをあれこれ探してしるが,CSV Importer というプラグインがあったので,使ってみた。インポートしたいデータをCSV (Comma Separated Value) の形にしておけば,一括して読み込めるというもの。

試した結果,何とか使えそうだが,いくつか問題点も。自分の用途だと,改行のタブとかパラグラフのpタグなどが自動で追加されるのは,ちょっと迷惑。ということで,ソースを読んで改造。

'post_content' => wpautop(convert_chars($data['csv_post_post'])),

という箇所で,記事の本体が取り込まれているのだが,wpautop という関数によって,タグ付きに整形されている。wpautop をはずすことで,タグが付かない元の文章のままで読み込むことが出来た。これで1つ解決。

もう1つは少しやっかい。数学の文章なので,TeXで書いてあるのだが,バックスラッシュが消滅してしまうのだ。記事本体は,ダブルクオートで囲まれていて,そこの部分を1つの文字変数に代入していると思うのだが,その段階で,バックスラッシュがメタ文字と解釈されているのだと思う。試しに,変換前の文章でバックスラッシュ2個にしてみたら,変換後はバックスラッシュ1個になっていたので,多分間違いないと思う。これをどうしたものか。