Moral Hazard!!

ドラマーが音楽やホームページやガラクタを作るよ。

各記事のカテゴリ名を取得する方法

No Comment wordpress

やりたいこと・・・ループ内でカテゴリ名が「オススメ」の時だけ「オススメ記事」という文字列を出力する。

<?php if(have_posts()) : ?>
<?php while(have_posts()) : the_post(); ?>
<li>
<a href="<?php the_permalink();?>"><?php the_title();?></a>
<?php foreach((get_the_category()) as $cat){
$catName = $cat->name;
if($catName == 'オススメ') {echo "オススメ記事";}
} ?>
</li>
<?php endwhile ; else : ?>
<p>記事が見つかりません。</p>
<?php endif;?>

※何故foreachを使うか?
get_the_category()で取得したデータは「stdClass Object」というクラスオブジェクト。
これにprint_rをかけると

Array
(
    [0] => stdClass Object
        (
            [term_id] => 53
            [name] => オススメ記事
            [slug] => asdasd
            [term_group] => 0
            [term_taxonomy_id] => 54
            [taxonomy] => category
            [description] => 説明
            [parent] => 0
            [count] => 13
            [object_id] => 1147
            [cat_ID] => 53
            [category_count] => 13
            [category_description] => 説明
            [category_nicename] => asdasd
            [category_parent] => 0
        )

    [1] => stdClass Object
        (
            [term_id] => 16
            [name] => 普通の記事
            [slug] => asdasd
            [term_group] => 0
            [term_taxonomy_id] => 16
            [taxonomy] => category
            [description] =>
            [parent] => 44
            [count] => 5
            [object_id] => 1147
            [cat_ID] => 16
            [category_count] => 5
            [category_description] =>
            [cat_name] =>普通の記事
            [category_nicename] => asdasd
            [category_parent] => 44
        )

)

のように、配列の中にstdClass Objectとして格納されていることが分かる。
(多次元配列ではない)
classの中の変数「メンバ変数」を取り出すには、「->(アロー演算子)」を使う。
例えば一つしかカテゴリに属していないとして、その中からnameを取り出すには、

$catData = get_the_category();
$catName = $catData[0]->name;
echo $catName;

としてやればいいが、実際はカテゴリの数だけ配列が増えるので、foreachを使って

<?php foreach((get_the_category()) as $cat){
$catName = $cat->name;
if($catName == 'オススメ') {echo "オススメ記事";}
} ?>

とする。
すると配列[0][1][2]...と順番に処理されていき、nameが「オススメ」という文字列なら、「オススメ記事」が表示される。

参考
foreach文
クラスとオブジェクト
多次元配列
stdClass Object

Custom Field GUI Utilityのcheckbox

No Comment wordpress

Custom Field GUI Utilityのcheckbox項目はデフォルトでチェックされている。
これはconfig.iniのcheckbox項目に

[checkbox]
fieldname = チェックボックス(共通表示)
type = checkbox
class = post page
default = checked
sample = input the caption

とあるが、このdefault = checkedを削除すればデフォルトでチェックが入っていない状態になる。
念のため。

no future postsで未来の投稿を表示させたい

1 Comment wordpress,,

やりたいこと・・・投稿日付が未来の予約投稿を、wordpressに表示させたい。

「no future posts」というプラグインを使う。
最近wordpress3.01に対応したようだ。

・functions.phpに以下を追加する。
僕はwordpress3.0にアップデートしたタイミングで上記no future postsが対応していなかったため、こちらを使っている。

function forced_publish_future_post( $data, $postarr ) {
	if ( $data['post_status'] == 'future' && $postarr['post_status'] == 'publish' ) {
		$data['post_status'] = 'publish';
	}
	return $data;
}
add_filter( 'wp_insert_post_data', 'forced_publish_future_post', 10, 2 );

future_to_publishを使う
フォーラムに載っていたが、予約投稿の記事ごとに公開するかどうか決められるらしい。
便利そう。

テーマの管理画面にメニュー項目が出ない

No Comment wordpress,,

wordpressが3.0になって、デフォルトのテーマ「Twenty Ten」がなんかイケてる。
特にメニューや背景、ヘッダをwordpress上で変更出来るのが素敵。
ブログやりたい!でも広告ウザい!とか言う人は、php分からなくてもちょっと頑張ったら作れるよ!

で、新しくメニュー入りのテーマを作ろうと思ったが、ちょっとはまったのでメモ。

自作テーマにメニューをメニューを追加する場合、表示させたい場所に

<?php wp_nav_menu(); ?>

を追加。そしてfunctions.phpに

add_theme_support( 'nav-menus' );

を追加する。
のだが、実際にこれだけ追加した場合、「外観」に「メニュー」の設定項目が表示されない事がある。
サイト自体にはメニューは表示されるけど、編集できない。Oh!

原因は、テーマがウィジェットに対応していないから。
つまり、functions.phpに

if ( function_exists('register_sidebar') )
    register_sidebar();

とウィジェットに対応させると、外観メニュー項目が表示されるようになる。
ちなみに、サイドバー(sidebar.php)を作らなくても表示される。

get_the_contentでコンテンツ内容を取得

No Comment wordpress

やりたいこと
「本文に特定の文字列が含まれている場合に表示」

<?php
$pregA="img";
$pregB= get_the_content();
if(preg_match("/[$pregA]/",$pregB)): ?>
<p>表示したい文字列</p>
<?php endif ;?>

・$pregAに検索したい文字列(例:img)
・get_the_content()を使って、投稿本文を$pregBに代入
・preg_match関数を使ってマッチング
・投稿本文内に検索文字列「img」があった場合は表示

preg_match関数(正規表現を使って文字列内を検索する)
http://php.net/manual/ja/function.preg-match.php

get_the_content()
the_content()では不可能な、本文に修正加えたり、代入する場合などに使える。
以下、本文に改行を加えて表示する方法。

<?php
$content = get_the_content();
$content = preg_replace("/\n/","<br />",$content);
//ソース上で改行(\n)がある場合は、テキストでも改行を加える
echo $content;
?>