[WP]WordPressテンプレートカスタマイズ用小技メモ

テンプレートファイルのカスタマイズで使えそうなソースのサンプルをつらつらと書き散らしてみる。その2はこちら。

タイトルの文字数制限

一定数以上のタイトルを省略(抜粋)する。
下記サンプルだと10文字まで拾って以下を三点リーダにしています

<?php 
	$title= mb_substr($post->post_title,0,10);
	echo '<h1>'.$title.'…</h1>';
?>

検索キーワードとヒット数の表示

search.phpとかに入れると結構見栄えがいい。

<?php $allsearch =& new WP_Query("s=$s&showposts=-1");
$key = wp_specialchars($s, 1);
$count = $allsearch->post_count;
if($count!=0){
	echo '<em>'.$key.'</em>で検索した結果、<span class="count">'.$count.'</span>件ヒットしました';
}else{
	echo '<em>'.$key.'</em>で検索しましたが、何も見つかりませんでした';
}
 ?></p>

特定のカテゴリーに投稿された記事だけ表示

重要なのはループの前のquery_postsとループの後のwp_reset_query()
query_postsを使う場合wp_reset_query()を最後につけないとqueryの指定が後のループに引き継がれる。

カテゴリID5の本文だけ表示するサンプル

<?php query_posts('cat=5');if (have_posts()) :?>
<?php while (have_posts()) : the_post(); ?>
<div class="post">
<?php the_content(__('Read More &raquo;','my84')); ?>
</div>
<?php endwhile;?>
<?php wp_reset_query();endif;?>

IDで指定した記事の本文だけを表示

あるページ(または記事)の本文だけサイトのトップとかに表示したい時に使える。

functions.php

function site_content($my_id){
	$post_home = get_post($my_id); 
	$content = $post_home->post_content;
	$content = wpautop($content);
	return $content;
}

ショートコードに対応させる場合
$content=wpautop($content);の前に、
$content = do_shortcode($content);を追加する。

テンプレートファイル側
引数は表示する記事のID

<?php echo site_content(2);?>

wpautopはpタグとかを自動でつけて整形するwordpress内の関数。(formatting.php内)

カテゴリーで条件分岐

「もしカテゴリーID5の子カテゴリなら」とか「カテゴリースラッグがhogeなら」みたいな条件指定

$category = get_the_category();
if($category[0]->category_parent==5){
//ID5ならtrue
}elseif($category[0]->category_nicename=='hoge'){
//スラッグがhogeならtrue
}else{
//他
}

1件のコメント

  1. 初めまして。
    有用なTipsが多くとても参考になります。
    さて、こちらの記事の『IDで指定した記事の本文だけを表示』というものですが
    今まで私は同じ目的の為にImproved Include Pageを使用しておりましたが
    それをプラグインを使わずに実現できるならば、と思い早速試させて頂きました。
    しかし、こちらの方法ですとショートコードはただのテキストになってしまうのですね。。。
    素人なのでこの処理にどういった差があるのかはわかりませんが
    ショートコードを使ったページを表示させることは可能なのでしょうか?
    動作は似ているようで何となくImproved Include Pageと同じ動きをさせるのは大変そうな気がしますが。。。

    もしくは自分が実現したい内容というのが
    『サイドバーに特定のカテゴリーのエントリーで使用された画像のサムネイルを
    エントリー本文へのリンクという形で数件表示』
    というものなので、これが実現できれば尚良いのですが。。。
    こちらを拝見していてかなり近い内容の記事をいくつか散見したもので
    これらを組み合わせて何とかならないものかと。。。
    今回のfunctionやImproved Include Pageで引っ張って来たい内容自体理想のものではないので。
    どうやらMovable Typeでは簡単なようなのですが
    WordPressではプラグイン等も探しましたが今のところ実現する方法が見つからないんですよね。。。
    元画像を縮小表示するものだったり記事ではなくオリジナル画像へのリンクだったり。
    限りなく近い動作は可能なんですが。。。

    ということで、不躾ではありますが何か良い方法など御座いましたらご教授頂ければと思います。
    長文失礼致しました。

    Reply
  2. kasumiさん>
    こんばんは。ショートコードはサンプルの関数内に
    1行追加すれば表示されるようになります。
    記事に追加しておいたので試してみてください。

    理想とは違うかもしれませんが
    『サイドバーに特定のカテゴリーのエントリーで使用された画像のサムネイルをエントリー本文へのリンクという形で数件表示』

    これについては新規記事で追加してみたのでご覧ください。

    wordpressはPHPなのでPHPさえ分かれば色々遊べて楽しいですよ。
    ・・・・なんて偉そうなこと言ってますが、私もまだまだ初心者レベルです(笑

    Reply
  3. 早速のお返事ありがとう御座います!
    まず、上記のソースコードですが一行追加するだけで実現できたのですね!
    素晴らしいです…!
    これでプラグインを一つ減らすことができましたました。

    そして『[WP]画像サムネイルを投稿された記事へのリンク付きで表示』の記事拝見させて頂きました。
    完璧です。
    ずっと探していて実現できなかったことが、それもプラグインに依存せずに実現できるなんて感激です。
    しかも多くのプラグインではカテゴリーの指定もできず、メディアライブラリから直接引っ張って来る為に
    時系列が記事ではなく、メディアの投稿順となっていたり色々と不便だったのですが
    上記記事の方法ですとその点等も含めプラグインに依存しないなどあらゆる面において理想的です。
    本当にわざわざ対応頂きありがとうございました! 大感謝です。

    最後にPHPに関してですが
    元々私はここまで本格的にカスタマイズするつもりはなくてですねw
    PHPに関しては全くわからないので
    今まではプラグインやこちらの記事のコードなども
    文脈からここで値を代入してるのかな?などとあたりをつけてトライアンドエラーで何とかやってきたのですが
    WordPressに触れれば触れるほどPHPの重要性をひしひしと感じる次第ですw
    一々やりたいことの為にプラグインなどを探しまわらなくてもPHPが分かれば自分で対応できるのでは?とw
    その為最近はPHPも少しかじってみようかなあなどとは考えています。確かにw

    とにもかくにも
    本当に助かりました。
    こちらはピンポイントでかなり実用的な情報が多いので他の記事も参考にさせて頂きますね。
    今回は本当にありがとうございました!

    Reply
  4. kasumiさん>
    あーよかったです。
    暑さで朦朧として読解ミスしてないか心配してたので(笑
    プラグインは入れすぎると喧嘩することもあるし
    数が減らせるならそれに越したことはないですよね。

    PHPは文法がjavascriptとよく似ているので、
    javascriptがなんとなくでも読めるなら覚えやすいと思いますよ。
    私も同時に覚えたのでこれはガチです!

    こちらこそいいネタをありがとうございました!

    Reply
  5. Pingback: SOUSAKUYA-SAI BLOG
  6. こんばんは、久しぶりに書き込みします。
    カスタムフィールドの値で記事を並び替えしたいのですが、うまくいかなくて困ってます。
    星が多い順番や星が少ない順番で記事を並び替えが出来たら便利だと考えています。
    SmartSortが一番近いような気がするのですが、メニューをクリックするとError 404になってしまいます。
    http://www.dyasonhat.com/wordpress-plugins/smart-sort-wordpress-plugin-sort-posts-by-custom-field/

    PHPをカスタマイズすることで上記のことを実現するのは可能でしょうか?
    特定のカテゴリーだけに適用、query_postsと併用可能が出来るといいのですが。
    よろしくお願いします。

    Reply
  7. チョッパーさん>

    プラグインのことは多分何かエラーになる原因があるのでしょう。
    他のプラグインと喧嘩している可能性もあるので、
    404になる原因については私の方からはなんともいえません。

    カスタムフィールドでの並び替えについてはサンプルを
    別記事で投稿しますのでそちらをご覧下さい。

    Reply
  8. タイトルの文字数制限(私は、ぱんくずのタイトルを文字数制限した)んですが、
    同じようにスクリプトを書いてやってみたのですが、
    省略したタイトルの一番最後の1文字だけが「・・・」の前の1文字だけが
    ◆に?マークが入った記号に変わってしまい、文字化けしてしまいます。
    英語表記だと文字化けしていないのですが、日本語表記だと文字化けしています。

    例)
    文字数制限10文字の場合

    日本語の場合

    「わーどぷれすのタイト◆・・・」

    英語の場合
    「WordPressT・・・」

    みたいな感じで、日本語が入るとダメなんです。
    テーマファイルvicunaの中のphpデータを 文字コードをUTF8 ・BOMなしで保存しなおして、再度試して
    みたんですが、やはり最後の1文字だけ(「・・・」の一文字前のみ)文字化けしてしまいます。

    原因が全くわからずで・・・、Tenderfeelさん この原因っておわかりになられますでしょうか?
    すいません。。。

    Reply
  9. ひろさん>

    別の文字コードが混入
    バイナリコードの混入
    機種依存文字の混入

    今ぱっと思いつくのはそれくらいです。
    対処は…

    ・文字コード変換を追加してみる
    $title= mb_substr(mb_convert_encoding($post->post_title,"UTF-8","EUC-JP,SJIS"),0,10);

    ・ドット[…]など別の文字にしてみる

    ・機種依存文字がないか確かめる

    以上試してみてください。

    Reply
  10. Tenderfeelさん、早速のご回答、ありがとうございます。
    早速、教えていただいたコードを挿入してやってみましたが
    これだと英語はちゃんと表示できても、日本語部分が全部文字化けしてしまいました。
    続いて、ドット[…]など別の文字にしてみるを試してみましたが 変化なしでした。
    機種依存文字はないと思うのですが。。。

    タイトルを省略せずに、全文(全文字)表示させると ちゃんと日本語も英語も
    全文字きれいに表示しているんですが、 文字数制限をかけると
    最後の1文字(「…」の1文字前)だけ
    ◆に?が入った記号の文字化けです。

    試しに、文字数制限を(0,10) ではなく
    (3,10)にしてみると、日本語でも文字化けしていません。 問題なく表示しているんです。

    どういう事なんだろう??? 原因不明ってとこですかね???

    Reply
  11. 初めまして、ほんわかです。

    wpを触るのが不慣れなため、戸惑っています。
    htmlエディタの様にビジュアルで直せるツールとかないですかね。

    Reply
  12. ほんわか さん >

    ビジュアルエディタに近い感覚で使えるCMSならありますよ
    concrete5 http://concrete5-japan.org/

    WordPressはPHPなのでDreamweaverでもデザインビュー上で100%再現することは出来ないです。
    ライブビューならサイト上で表示されるものと同じ状態で見ることが出来ますが(http://twitpic.com/4ei3ee)
    ライブコードの編集はテンプレートを編集するのとは異なるので
    結局のところコードビューでテンプレートを直接編集するしかないですね。

    お使いのエディタにWordpress用の拡張機能があれば、
    それを導入してコーディングをちょっと楽にすることができますよ。

    Reply

Leave a Comment.