rusica.net

雑記帳 : 329ページ目

特定のカテゴリ且つ特定のタグを持つ記事の抽出

<?php 
$category_id = 任意の値;
$tag_slug = "取得したいタグのスラッグ";
$current_paged = intval(get_query_var('paged'));
$query = array('cat'=>$category_id, 'tag_slug__and'=>array($tag_slug), 'paged'=>$current_paged);
query_posts($query);
?>

WordPressループの手前に書いておけばOKなはず。

query_posts関数の引数は文字列ではなく配列形式にする必要がある。また、クエリ内にpagedの値を入れないとページナビゲーション系が動作しない。

ページのスラッグを取得

function get_page_slug($page_id) {
    $page = get_page($page_id);
    return $page->post_name;
}

引数の$page_idはページのIDね。

カスタムフィールドの内容を取得

function my_get_meta($key){
    global $post;
    return get_post_meta($post->ID,$key,true);
}

$keyはカスタムフィールドのフィールド名。値を取得するだけなので、そのまま表示したい場合はechoする。

query_posts()を利用しつつ親カテゴリのアーカイブで子カテゴリの記事を出力する

カテゴリアーカイブ内の$catで取得できる値は親カテのIDだから、そのままquery_posts()に値を投げ込むと親カテと子カテの両方にチェック入れてない限り、親カテのアーカイブでは子カテの記事は表示されない。

よって、get_category_children()でその親カテに所属する子カテのIDを取得してquery_posts()に投げ込めば、子カテにしかチェック入れてない記事も親カテのアーカイブに表示させることができる。

補足。get_category_children()で取得できる値は文字列 *1なのでsplit関数 *2explode関数を使って配列形式にしてからquery_posts()に投げ込まないといけない。

//子カテゴリのIDを配列で取得
function get_child_id_Array($parrentID){
    $childcat = get_category_children($parrentID);
    if($childcat) {
        $childcat = explode('/',$childcat);
        array_shift($childcat);
        return $childcat;
    } else {
        return array($parrentID);
    }
}
  1. たしか「/」区切りだったはず。[]
  2. split関数はPHP 5.3で非推奨になった模様[]

子カテゴリのIDから親カテゴリの情報を取得する

$childCat = get_category($cat);
if ($childCat->parent) {
 $parentCat = get_category($cat->parent);
}

カテゴリーアーカイブ内での使用を想定して$catと書いたけど、$catに子カテゴリのIDを入れれば別にどこでも使える。あとはecho attribute_escape($parentCat->cat_name);とかやればカテゴリ名を出力できたり、色々。

var_dump($parentCat);とかやって$parentCatの中身を出力してみると何が格納されてるのか分かりやすいと思う。$parentCatは配列なのでechoしただけじゃ中身をみられないので注意。