Home > アーカイブ > 2010-06

2010-06

複数のカテゴリーに属している記事のタイトルに複数のアイコンをつけたい【WordPress】

複数のカテゴリーに属している記事のタイトルに複数のアイコンをつけたい。
ということを実現するのにかなり時間を費やしてしまった…
あーもっと検索上手にならなくっちゃ。
ってその前に、もっと勉強しなきゃ…

下記、迷える人がいたら参考になればと…
ただ、もっといい方法があれば是非おしえてください。

さて、今回、アイコン表示は以下のようなルールにしたいと思ってとりかかったわけで…

カテゴリA (ID=1)
カテゴリAの子
カテゴリAの子の子
カテゴリB (ID=2)
カテゴリBの子
カテゴリBの子の子

があったとする。

カテゴリA、カテゴリAの子、カテゴリAの子の子 の記事はAのアイコン
カテゴリB、カテゴリBの子、カテゴリBの子の子 の記事はBのアイコン
カテゴリA、カテゴリBの子の二つに属する場合はAのアイコンとBのアイコン

といった具合にしたかった。

まず試したのが下記の方法

<?php
  $post_cats = get_the_category();
  if ( $post_cats[0]->cat_ID == 1 || $post_cats[0]->category_parent == 1 || cat_is_ancestor_of( 1, (int)$post_cats[0]->category_parent ) ) {
  echo 'Aアイコン';
 } else {
  echo 'Bアイコン';
 ?>

これだと、複数のカテゴリに属する場合、1つ目しか読み込まない。
よって、カテゴリA、カテゴリBの子の二つに属する場合はAのアイコンしか表示されなくなってしまう。

やりたいことはこれじゃない!

そして彷徨ってようやく見つけたのは
フォーラム【特定のカテゴリ記事へのアイコン表記 】
この記事で下記のような方法を発見
下記引用

テーマのディレクトリー直下に category-SLUG.png を作っておけば、それを表示するというサンプルです (SLUG の部分は実際のカテゴリースラッグに差し替えてください)。

<?php
$ClassAddCategory = '';
$cats = wp_get_post_categories(get_the_ID());
if( is_array( $cats)){
  foreach( $cats as $cat){
    $cobj = get_category( $cat);
    $icon_file =  '/category-' . $cobj->slug . '.png';
    if (file_exists(get_template_directory() . $icon_file)) {
        echo '<img src="' . get_template_directory_uri() . $icon_file . '" alt="' . $cobj->name . '" />';
    }
  }
}
?>

ほぉー…
しかしこれでは子孫のところがうまくいかない。
すべての子孫カテゴリーの画像も用意すればいいのかもしれないが、同じ画像がいくつもあるのはスマートじゃない!しかもカテゴリーが増えるたびに画像も…。それは大変だー。

さらに旅を続けること数時間…

見つけたー!!これ!!

post_is_in_descendant_category 関数!!

下記で定義する post_is_in_descendant_category 関数(呼び出す前にテンプレート、プラグイン、またはテーマ関数にコードをコピーする必要がある)を使用することで実現可能!

post_is_in_descendant_category 関数

<?php
/**
 * Tests if any of a post's assigned categories are descendants of target categories
 *
 * @param int|array $cats The target categories. Integer ID or array of integer IDs
 * @param int|object $_post The post. Omit to test the current post in the Loop or main query
 * @return bool True if at least 1 of the post's categories is a descendant of any of the target categories
 * @see get_term_by() You can get a category by name or slug, then pass ID to this function
 * @uses get_term_children() Passes $cats
 * @uses in_category() Passes $_post (can be empty)
 * @version 2.7
 * @link http://codex.wordpress.org/Function_Reference/in_category#Testing_if_a_post_is_in_a_descendant_category
 */
function post_is_in_descendant_category( $cats, $_post = null )
{
 foreach ( (array) $cats as $cat ) {
  // get_term_children() accepts integer ID only
  $descendants = get_term_children( (int) $cat, 'category');
  if ( $descendants && in_category( $descendants, $_post ) )
   return true;
 }
 return false;
}
?>

私はこれをfunction.phpにコピーして、テンプレは下記のように…

<?php
 if ( in_category(1) || post_is_in_descendant_category(1) ) {
  echo 'Aアイコン';
 }
 if ( in_category(2) || post_is_in_descendant_category(2) ) {
  echo 'Bアイコン';
 }
?>

これでやりたかったことが実現。

まぁ、親カテゴリーが増えると増やさなくてはいけなのであんまりスマートじゃないかな…?
でも子孫が増える分には問題なし!
今回は親カテゴリはほぼ増えないのでよしとする!
上記2つの方法をうまく組み合わせてカテゴリーが増えてもいいようにできそうだが、
とりあえず今日は力尽きたのでここまで。
とりあえず実現できたということで。

ふぅー長かった~

カテゴリーの親カテゴリーを取得【WordPress】

書式

<?php echo(get_category_parents(category, display link, separator, nice name)); ?>

引数

  • category (整数/$cat)- 親カテゴリーを取得するカテゴリーのID。
    デフォルト値は「$cat」で、現在表示しているカテゴリーページ/記事のカテゴリーID。
  • display link (true/false) – 各カテゴリーへのリンクを出力するかどうか。
    true(デフォルト。リンクを出力する)
    false(デフォルト。リンクを出力しない)
  • separator (文字列)- リンクの間を区切る記号やテキスト。デフォルト値は「»」。
  • nice name (true/false)- カテゴリー・スラッグを名前として使うかどうか。
    true(デフォルト。英数字小文字のみのカテゴリー・スラッグを出力)
    false(デフォルト。大文字や記号、日本語を使ったカテゴリー名を出力)

<?php echo(get_category_parents($cat, true, ' » ')); ?>

※separatorは後ろにつく。

【参考・抜粋】
WORDPRESS Codex テンプレートタグ/get category parents

カレンダーの表示形式【WordPress】

WordPressのカレンダーとほんのちょっと向き合ってみる。

<?php get_calendar(); ?>

で吐き出すカレンダーの翌月、先月の表示箇所は日付の下に出る。
これを月の左右または下段に表示したい…
と思い、ちょっと見てみると下記ファイルを修正すると実現できそう。

wp-includes\general-template.php

あんまり触りたくないのだが、もっと簡単にできるのだろうか?
プラグインはありそうだが、極力プラグインなしで制作したいと思うのだが…

とりあえず、今回はいったんスルーで。
必要に迫られたらまた考えよう。

何かいい方法をご存知の方、ご教授くださればうれしいです。
なんて、あまいこと言ってちゃだめだねー…

同じ日付が表示されない【WordPress】

<?php the_date(); ?>

を使って日時を出力した場合、
同じ日に複数の投稿をした場合、日付が最初の1件しか表示されません。

記事毎に日付を入れたい!!そんなときは…

<?php the_time(); ?>

の登場です。
「2010年6月22日」と表示させたい場合は、

<?php the_time("Y年n月j日"); ?>

のように記述します。
フォーマット文字列については下記リンク先参照!

【WORDPRESS Codex】日時と時刻の書式

Dreamweaverでテンプレートを使用する際の注意点(パスを使う場合)

  • 2010-06-18 (金)
  • web

テンプレートでファイルを相対パスで指定した場合、Dreamweaver側で自動的にパスを書き換えてファイルを参照しますが、うまくいかない時があるので注意が必要。

テンプレート内にJavascriptコードを埋め込んでいて、さらに引数としてファイルのパスを指定していた場合、パスの変換は行われないので要注意!!

その際は、必ずサイトルート相対パスを使ってファイルを指定する。

 が、しかし、、、

テスト環境とかだとサイトルート相対パスだとディレクトリきったりしてるから、本番環境と同じ記述だとルートの位置がうまくいかない…。

うーーーん、困った。

 とりあえず、今回は小窓を開きたかっただけなので素直にDreamweaverのビヘイビアブラウザウィンドウを開くを使う。この場合はうまくパスを変換してくれるらしい。

<a href="../hoge.html" target="_blank" onClick="MM_openBrWindow('../hoge.html','windowname','scrollbars=yes,width=600,height=500'); return false;">別ウィンドウで開く/a>

こんな感じ。
ただし、普通にメニューで「ビヘイビアの追加」で追加すると、
「return false;」が入らないので、ソースに追記することと、リンク先にURLを指定しておくことも忘れずに!

【関連記事】
JavaScriptがOFFでも閲覧できるように別ウィンドウを小窓で開く

WordPress のアドレス (URL)を誤って変更してしまったら…【WordPress】

ログインできません!
あーやっちまったなー!!
って時も慌てず焦らず下記の通りやるのである。

設定 > 一般 のWordPressのアドレス(URL)をブログのアドレス(URL)を変更するときに、誤って一緒のアドレスに変更してしまった場合の対処法

MySQLのテーブルから直接データを修正します。
wp_optionテーブルのsiteurlの値をインストールした正しい場所に変更すればOK!

ふー…あせった。。。

macのFinderで不可視ファイル(.htaccess等)を見えるようにする方法

  • 2010-06-15 (火)
  • mac

ターミナルであれこれするとみれるらしいが、
面倒なので…

下記のプラグインが便利!!

hiddenfiles

特定のカテゴリにある記事のスタイルを変更する【WordPress】

HTMLコードをテンプレート内に書く場合は、必ずというPHP開始・終了タグの外側に書かなければなりません。逆に、PHPコードは、必ず タグの内側に書きます。
下記のように、if や else ステートメント内でもPHPコードを一時的に閉じ、HTMLコードを書くことができます。

<!-- WordPressループ開始 -->
<?php if ( have_posts() ) : while ( have_posts() ) : the_post(); ?>

<!-- 以下で、記事がカテゴリー3に属しているかテスト -->
<!-- もし属している場合、"post-cat-three"というCSSクラスのdivボックスを表示 -->
<!-- それ以外の場合、"post"というCSSクラスのdivボックスを表示 -->
<?php if ( in_category('3') ) { ?>
           <div class="post-cat-three">
<?php } else { ?>
           <div>
<?php } ?>

<!-- 記事のタイトルとパーマリンクを表示 -->
<h2><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></h2>

<!-- 日時を表示 -->
<small><?php the_time('F jS, Y'); ?></small>

<!-- 記事の本文をdiv内に表示 -->
<div>
  <?php the_content(); ?>
</div>

<!-- 記事のカテゴリーをコンマ区切りで表示 -->
<p>Posted in <?php the_category(', '); ?></p>
</div> <!-- 最初の div ボックスを閉じる -->

<!-- “else”部分を除いたWordPressループ終了 -->
<?php endwhile; else: ?>

<!-- 最初の“if”にて表示する記事があるかどうかをテストしたため、“else”では記事がない場合に実行 -->
<!-- つまり、記事がなければ以下を表示 -->
<p>Sorry, no posts matched your criteria.</p>

<!-- WordPressループを「完全に」終了 -->
<?php endif; ?>

【参考・引用】
The Loop

子孫含むカテゴリでの条件分岐【WordPress】

求めていた答えが見つかった。

<?php
$post_cats = get_the_category();
if ( $post_cats[0]->cat_ID == 1 || $post_cats[0]->category_parent == 1 || cat_is_ancestor_of( 1, (int)$post_cats[0]->category_parent ) ) { ?>
親カテゴリー1の記事の表示内容
<?php } elseif ( $post_cats[0]->cat_ID == 5 || $post_cats[0]->category_parent == 5 || cat_is_ancestor_of( 5, (int)$post_cats[0]->category_parent ) ) { ?>
親カテゴリー5の記事の表示内容
<?php } else { ?>
その他の記事の表示内容
<?php } ?>

※複数カテゴリーにチェックされている記事でも取得できた最初のカテゴリーで判別されます。

これーー!!
いやー、ほんとたどりつくのに時間がかかった…
メモメモ!!

cat_is_ancestor_of という関数を使うようです。

cat_is_ancestor_of($cat1, $cat2)

$cat1で指定したカテゴリが$cat2の親である場合にtrueを返す。(どれだけ下の階層でもヒットすればtrue)
引数はカテゴリーIDで、数値でないと常にfalseになる。(’1′,’4′)ではなく(1,4)で指定

【参考】
フォーラム 条件分岐について
[WP]Category, Tag and Taxonomy Functions
MovableType・WordPressでカテゴリーの親子関係を判定する

カテゴリー1とその子孫カテゴリーを呼び出す【WordPress】

query postsを使ってカテゴリー1とその子孫カテゴリーを呼び出す

<?php query_posts($query_string. '&cat=1&showposts=0'); ?>
<?php if(have_posts()):while(have_posts()):the_post();?>
    <p><a href=”<?php the_permalink(); ?>”><?php the_title(); ?></a></p>
<?php endwhile; endif; ?>

’showposts’ => 0 の表示件数は「管理画面>設定>表示設定」の「1ページに表示する最大投稿数」の値になる

投稿件数5件かつIDではなくカテゴリー名で指定したい場合

<?php query_posts($query_string. '&category_name=cat1-name&showposts=5'); ?>
<?php if(have_posts()):while(have_posts()):the_post();?>
    <p><a href=”<?php the_permalink(); ?>”><?php the_title(); ?></a></p>
<?php endwhile; endif; ?>

複数カテゴリーの指定方法

IDで指定した複数のカテゴリーすべてに含まれるカテゴリーを取得します。
以下はカテゴリーID 2 と 6 の両方に含まれる投稿を取得:

query_posts(array('category__and' => array(2,6)));

カテゴリーID 2 または 6 に含まれる投稿を取得するには、前述の cat か category__in(こちらは子孫カテゴリーを含みません)を使います:

query_posts(array('category__in' => array(2,6)));

以下の指定では複数のカテゴリーのいずれかに含まれる投稿を除くことができます:

query_posts(array('category__not_in' => array(2,6)));

その他引数等詳しくは Codexテンプレートタグ/query posts に掲載されています。

【関連記事】
特定カテゴリーの記事を指定件数分表示【WordPress】
※引数に$query_stringを付けないと、posts_nav_linkを使ったページが分割処理がうまく動作しない。※showpostsで指定した値はダッシュボード > 設定 > 表示設定「1ページに表示する最大投稿数」で指定した値より優先される。

もうちょっと勉強。
1catと1cat-childを読み込みたい場合

<?php if ( in_category('1cat')||in_category('1cat-child') )  ?>

または

 <?php if ( in_category( array( '1cat','1cat-child' ) ))  ?>

どちらでもいい。のかな…?!完全に自信はない。

Home > アーカイブ > 2010-06

want

Return to page top