WordPress 備忘録 | メシのタネ

sukotelishuhuro
このエントリーをはてなブックマークに追加

【WordPress】カスタム投稿が思いの他ややこしかった

 2014/07/09

WordPressはブログツールとして有名だったので、必要に迫らせない限りブログツールとして使うのが
良いだろうってことと、ぶっちゃけあんまし慣れない事したくないので、
カスタム投稿を避けて避けて居たんですけれど、いつまでも慣れないまま放っておくのも良くないので、
今回新コンテンツでも作ってみるかということで、カスタム投稿を使いました。
そしたら、結構勘違いしてることがありました。やっぱ実際やってみたほうが良いなって思いました。

カスタム投稿タイプ作成

カスタム投稿を作成する前提として、カスタム投稿を作っておく必要があります。
で、カスタム投稿の中にカテゴリを入れたい場合タクソノミーを定義する必要があります。
タクソノミーとは、カテゴリの別の言い方です。

この場合だとお米の種類の中のタイ米がカテゴリでお米の種類がタクソノミーです。
あんまり大した問題ではないです。ちなみにタームっていうのは、日本米の中の新潟産です。

詳しくはこの中の木構造見てください。
この中の根っこの名前がタクソノミーです。

カスタム投稿だけを作る場合にはタクソノミーの定義は必要ないです。
カスタム投稿の中にタクソノミーを設けたい場合タクソノミーの定義をする必要があります。

このかちびとさんの記事中のfunctions.phpに書かれるコードを使えばカスタム投稿の登録ができます。

以下にも同等のものを記載しておきます。


//こっちでカスタム投稿を登録

add_action('init', 'my_custom_init');
function my_custom_init()
{
  $labels = array(
    'name' => _x('連載記事', 'post type general name'),
    'singular_name' => _x('何回か続く記事', 'post type singular name'),
    'add_new' => _x('新しく記事を書く', 'dogs'),
    'add_new_item' => __('記事を書く'),
    'edit_item' => __('記事の編集'),
    'new_item' => __('新しい記事'),
    'view_item' => __('記事を見る'),
    'search_items' => __('記事から探す'),
    'not_found' =>  __('記事はありません'),
    'not_found_in_trash' => __('ゴミ箱に記事はありません'),
    'parent_item_colon' => ''
  );
  $args = array(
    'labels' => $labels,
    'public' => true,
    'publicly_queryable' => true,
    'show_ui' => true,
    'query_var' => true,
    'rewrite' => true,
    'capability_type' => 'post',
    'hierarchical' => false,
    'menu_position' => 5,
    'supports' => array('title','editor','thumbnail','custom-fields','excerpt','author','trackbacks','comments','revisions','page-attributes'),
    'has_archive' => true
  );
  register_post_type('article',$args); //ここの第一引数がカスタム投稿タイプ名になる
}

//投稿時のメッセージとか
add_filter('post_updated_messages', 'book_updated_messages');
function book_updated_messages( $messages ) {

  $messages['dogs'] = array(
    0 => '', // ここは使用しません
    1 => sprintf( __('記事を更新しました <a href="%s">記事を見る</a>'), esc_url( get_permalink($post_ID) ) ),
    2 => __('カスタムフィールドを更新しました'),
    3 => __('カスタムフィールドを削除しました'),
    4 => __('記事を更新'),
    5 => isset($_GET['revision']) ? sprintf( __(' %s 前に記事を保存しました'), wp_post_revision_title( (int) $_GET['revision'], false ) ) : false,
    6 => sprintf( __('連載記事が公開されました <a href="%s">記事を見る</a>'), esc_url( get_permalink($post_ID) ) ),
    7 => __('記事を保存'),
    8 => sprintf( __('記事を送信 <a target="_blank" href="%s">プレビュー</a>'), esc_url( add_query_arg( 'preview', 'true', get_permalink($post_ID) ) ) ),
    9 => sprintf( __('記事を予約投稿しました: <strong>%1$s</strong>. <a target="_blank" href="%2$s">プレビュー</a>'),
      date_i18n( __( 'M j, Y @ G:i' ), strtotime( $post->post_date ) ), esc_url( get_permalink($post_ID) ) ),
    10 => sprintf( __('記事の下書きを更新しました <a target="_blank" href="%s">プレビュー</a>'), esc_url( add_query_arg( 'preview', 'true', get_permalink($post_ID) ) ) ),
  );

  return $messages;
}


//コッチでタクソノミー登録
add_action('init', 'create_custom_taxonomies');
function create_custom_taxonomies() {
    register_taxonomy(
        'customcat', // これがタクソノミー名
        'article',  // 適用する投稿タイプ
        array(
            'label' => '連載記事カテゴリ',    // 表向きの分類名
            'hierarchical' => true, // この値をtrueにしたからカテゴリと同じ
            'query_var' => true,
            'rewrite' => true,
            'public' => true,
            'show_ui' => true
        )
    );
    register_taxonomy( // 二つ目の分類を追加する場合
        'regtype',
        'article',
        array(
            'label' => '連載記事の種別',
            'hierarchical' => false, // この値をfalseにしたからタグと同じ
            'query_var' => true,
            'rewrite' => true,
            'public' => true,
            'show_ui' => true
        )
    );
}



register_taxonomy


register_post_type

詳しいパラメータCODEX載ってるのでみてね!

カスタム投稿タイプのTOPみたいなページ

やりたいことはとりあえず、hoge.com/カスタム投稿名/
こいつでアクセスした時に$postsが、
アドレスに書いてあるカスタム投稿名のデータを持っている状態にしたかった。

要は、hoge.com/カスタム投稿名/アドレスにアクセスしたら、
このカスタム投稿名が持っている記事一覧を出すみたいなことがしたかった。

これは、ここを参考にしました。
カスタム投稿タイプのアーカイブ用テンプレート

register_post_type()に与える引数の中の
has_archiveをtrueに設定して、

archive-カスタム投稿タイプ名.phpってファイルを作れば
このファイルで$postsの値はカスタム投稿タイプのデータになります。

タクソノミーの専用ページを作る

URLの値を判断して、
タームの一覧を出すページを作りたいので作りました。

正しいやり方に沿った上で私が思いつく案として
taxonomy-taxonomy-term.php
こういうページをターム分作ってあげるのが良いんだと思いますが、
これだと非常に面倒臭い。

スラッグを呼び出すにも、内部的にはどうもURLからは呼んできてなくて、
投稿の情報でデータを呼び出すか$_GETの値から呼び出してきてるっぽいです。
あくまで私が検索した範囲なので、良い方法あれば知りたいです。

なので、クエリに渡すパラメータとして、
URLからスラッグ名を取得するという方法で対処しました。
多分あまりオススメされていない方法なので、良い方法があれば
早めにそちらを使う方が良いと思います。



$sp = parse_url($_SERVER["REQUEST_URI"]); //URLを分解して
$sp = explode("/",$sp["path"]); //配列のpathを/で分割
$sp = array_filter($sp,"strlen"); //配列が空のものを削除して
$sp = array_values($sp); //インデックスを振りなおして
$tax = count($sp)-1; //最後の配列番号を生成して


$obj = new WP_Query(
               array('post_type' => 'article'),
               array(
                    'tax_query' => array(
                    'taxonomy' => 'customcat',
                    'field' => 'slug',
                    'terms' => $sp[$tax], //クエリに入れる
                    )
               )
     );


なんかまだカスタム投稿について不明瞭な点が多いので
機械があれば、またなんとかしてやりたいなぁと思う次第です。

そんな訳で!
記事数1個ですけど、実は連載記事コンテンツを設けました!
メニューのとこにこーっそり追加されてるので、良かったら見てくださいねー!

こっからもいけます


このエントリーをはてなブックマークに追加

コメント

"【WordPress】カスタム投稿が思いの他ややこしかった"
でメシのタネのおすすめを検索したよ!

プログラミング備忘録 | メシのタネ