タグ: カスタム投稿

  • WordBench長野の第1回勉強会に参加してきました。 #wbNagano

    WordBench長野の第1回勉強会に参加してきました。 #wbNagano

    11月24日に塩尻インキュベーションプラザで行われた、WordBench長野の第1回勉強会で、「カスタム投稿タイプ&カスタムタクソノミー」というテーマで発表をさせていただきました。

    [slideshare id=15335944&doc=wbnagano20121124-121125054736-phpapp01]

    人と話すこと自体嫌いではないのですが、何せあがり症で人見知りのコミュ障なので、まぁ楽しいながらも大変な経験でした。
    発表の最中でこんなツイートが画面にも映ったり。

    https://twitter.com/CrudeMusic/status/272228366399205377
    そんな苦労もありながらも「カスタム投稿・タクソノミー便利そう!使ってみたい!」みたいなレスポンスも結構いただけたのでそれなりに登壇者としての務めを果たすことができたのではないかなと。

    誘っていただいた、みやざわさん@dxd5001を始め、運営して下さった皆様、発表を見てくれた方やお話させてもらった参加者の方々本当にありがとうございました。

    また、僕が燃え尽きていたせいで声をかけることができなかった方も居たので、TwitterでもFacebookでもリアルでも絡んでいただけたら嬉しいです。発表でも言いましたが、お金以外の寄付も歓迎です。

    ビールも好きですけど、美味しい日本酒はもっと好きです。でもおいしいごはんもやっぱり大好きです。

    そんなわけで、スライドの補足というか、スペースの都合で省略した、register_post_typeregister_taxonomyの実装例をつらつらと。Custom Post Type UIより、細かい設定ができますので、慣れてきたら、コードをfunctions.phpに書くほうがベターかと思います。テキストボックスに一つ一つ書いていくより楽だし、使いまわしも利くので仕様が固まっている場合はこっちのほうがいいかなーと思います。どうせ書くことなんて変わらないですし。

    [php]
    add_action(‘init’,’add_ctp’);
    function add_ctp() {
    register_post_type(
    ‘goods’, //カスタム投稿名
    array(
    ‘label’ => ‘商品’,
    ‘description’ => ”,
    ‘public’ => true, //表示したり、URLでアクセスできたりするかどうか
    ‘hierarchical’ => false, //固定ページみたいに階層にするかどうか
    ‘rewrite’ => array( ‘slug’ => ” ),
    ‘query_var’ => true,
    ‘has_archive’ => true, //アーカイブページを作成する
    ‘menu_position’ => 5, //メニューの位置。5は“投稿”の下。
    ‘supports’ => array( ‘title’, ‘custom-fields’ ),どんな機能を使えるようにするか。
    ‘labels’ => array (
    ‘name’ => ‘商品’, //表示名
    ‘all_items’ =>’商品一覧’, //すべての投稿のラベル
    ‘add_new’ => ‘新規追加’,
    ‘add_new_item’ => ‘新しい商品を追加’,
    ‘edit’ => ‘編集’,
    ‘edit_item’ => ‘商品を編集’,
    ‘new_item’ => ‘新しい商品’,
    ‘view’ => ‘商品を表示’,
    ‘view_item’ => ‘商品を表示’,
    ‘search_items’ => ‘商品を検索’,
    ‘not_found’ => ‘商品が見つかりませんでした。’,
    ‘not_found_in_trash’ => ‘商品がゴミ箱内に見つかりませんでした。’,
    )
    )
    );

    register_taxonomy(
    ‘goodscategory’, //タクソノミー名
    ‘goods’, //対応する投稿タイプ
    array(
    ‘hierarchical’ => true, //階層(カテゴリ)にするか非階層(タグ)にするか
    ‘label’ => ‘商品カテゴリー’,
    ‘query_var’ => true,
    ‘rewrite’ => true,
    ‘labels’ => array(
    ‘name’ => ‘商品カテゴリー’,
    ‘singular_name’ => ‘商品カテゴリー’,
    ‘search_items’ => ‘商品カテゴリーを検索’,
    ‘all_items’ => ‘商品カテゴリー’,
    ‘edit_item’ => ‘商品カテゴリーを編集’,
    ‘update_item’ => ‘商品カテゴリーを更新’,
    ‘add_new_item’ => ‘商品カテゴリーを追加’,
    ‘new_item_name’ => ‘新しい商品カテゴリー’,
    )
    )
    );

    register_taxonomy(
    ‘campaign’,
    ‘goods’,
    array(
    ‘hierarchical’ => true,
    ‘label’ => ‘キャンペーン’,
    ‘query_var’ => true,
    ‘rewrite’ => true,
    ‘labels’ => array(
    ‘name’ => ‘キャンペーン’,
    ‘singular_name’ => ‘キャンペーン’,
    ‘search_items’ => ‘キャンペーンを検索’,
    ‘all_items’ => ‘キャンペーン’,
    ‘edit_item’ => ‘キャンペーンを編集’,
    ‘update_item’ => ‘キャンペーンを更新’,
    ‘add_new_item’ => ‘キャンペーンを追加’,
    ‘new_item_name’ => ‘新しいキャンペーン’,
    )
    )
    );

    }
    [/php]

    カスタム投稿タイプの追加だったら、便利なクラスもあるので、そちらを活用してもよいと思います。
    カスタム投稿タイプを簡単に利用できるようにする便利コード | モンキーレンチ

    あとは、順序をサポートしたカスタム投稿タイプのデフォルト表示順を変更してみる | Simple Colorsとかを使うと、商品一覧とか、日付順で管理をしたくないものとかでは有効です。

    また、register_taxonomyの’hierarchical’は、trueにしておいたほうが管理画面上では何かと使い勝手が良いです。

    こんな感じで、実はかなーり奥が深い機能です。’public’ => false を活用してプラグインのデータを保存したり(Advanced Custom Fields,Contact Form 7なんかで使われている手法です。)、ページを作成せずに更新可能なエリアを作ったりなど、応用範囲は幅広いです。

    カスタム投稿タイプとカスタムフィールド、WP_Queryを組み合わせるとほんとに無敵です。DrupalのViews+CCKと似たような感じですかね。そっちよりは、機能的には少ないですが、実装はシンプルです。Viewsは本当に何でも持ってこれますし、記事の抽出条件もかなり細かく設定できますけど、その分パラメーターも多いので、場合と好みで使い分ければいいんじゃないかと思います。

    カスタム投稿タイプ・カスタムタクソノミーで素敵なWordPressライフをお楽しみください。

  • カスタム分類のパーマリンクを”/カスタム投稿名/カスタム分類名/項目”にする。

    カスタム分類ってデフォルトだと、
    [plain]
    http://example.com/カスタム分類名/項目
    [/plain]

    ってなってるんですが、これを
    [plain]
    http://example.com/カスタム投稿名/カスタム分類名/項目
    [/plain]

    にしたい時があると思います。そんな時のハックです。

    2011-12-28追記:Custom Post Type Permalinksにこの機能は実装しています。是非そちらをお使い下さい。

    [php]
    add_action( ‘generate_rewrite_rules’, ‘my_rewrite’ );
    function my_rewrite( $wp_rewrite ){
    $taxonomies = get_taxonomies();
    $taxonomies = array_slice($taxonomies,4,count($taxonomies)-1);
    foreach ( $taxonomies as $taxonomy ) :

    $post_types = get_taxonomy($taxonomy)->object_type;

    foreach ($post_types as $post_type){
    $new_rules[$post_type.’/’.$taxonomy.’/(.+?)/?$’] = ‘index.php?taxonomy=’.$taxonomy.’&term=’.$wp_rewrite->preg_index(1);
    }

    $wp_rewrite->rules = array_merge($new_rules, $wp_rewrite->rules);

    endforeach;
    }

    add_filter( ‘term_link’, ‘my_term_link’ ,10,3);
    function my_term_link( $termlink, $term, $taxonomy){
    $t=get_taxonomy($taxonomy);
    $wp_home = get_option("home");

    $post_type = $t->object_type[0];
    if(!isset($t->object_type[1])) {
    $termlink = str_replace($wp_home,$wp_home."/".$post_type,$termlink);
    }

    return $termlink;
    }

    [/php]

    上記のコードをfunctions.phpに書きこんでください。

    デフォルトだと、http://example.com/カスタム投稿名/カスタム分類名/項目でアクセスしても、Not Foundになってしまうので、my_rewrite()で、リライトルールを追加します。
    そして、下のmy_term_linkの方で、get_term_link等で出力されるURLを書き換えます。

    この時、複数の投稿タイプに関連付けられているものは書き換えないようにしています。タグとかはそういう運用があるかと思います。
    そういう運用をしない場合は
    [php]
    if(!isset($t->object_type[1]))
    [/php]
    を外しても大丈夫です。

    [php]
    $terms = get_terms(‘カスタム分類’);
    foreach ($terms as $term) { ?>
    <li><a href="<?=get_term_link($term->slug, ‘カスタム分類’);?>"><?=$term->name;?></a></li>
    <?php
    }?>

    [/php]

    で、カスタム分類の一覧がリンク付きで出ると思いますので、試してみてください。

  • カスタム投稿のカスタマイズ

    カスタム投稿のパーマリンクはデフォルトだと

    /カスタム投稿名/投稿タイトル

    になってて、これが結構使いづらいんですよ。日本語タイトルだとURLまで日本語になってしまったり。

    また、月別アーカイブとかが無かったりで色々と面倒。なので、functions.phpで色々カスタマイズします。

    2011-12-28追記:プラグインにしました。今後はこちらをお使い下さい。Custom Post Type Permalinks

    [php]
    class set_custom_rewrite {
    var $post_type;

    function set_custom_rewrite($post_type){
    $this->post_type = $post_type;

    add_action(‘init’, array(&$this,’set_rewrite’));
    add_action(‘init’, array(&$this,’add_rule’));
    add_filter(‘post_type_link’, array(&$this,’set_permalink’), 1, 3);
    }
    //Rewrite Ruleの追加
    function add_rule(){
    add_rewrite_rule($this->post_type.’/([0-9]{4})/([0-9]{1,2})/([0-9]{1,2})/feed/(feed|rdf|rss|rss2|atom)/?$’,’index.php?year=$matches[1]&monthnum=$matches[2]&day=$matches[3]&feed=$matches[4]&post_type=’.$this->post_type);
    add_rewrite_rule($this->post_type.’/([0-9]{4})/([0-9]{1,2})/([0-9]{1,2})/(feed|rdf|rss|rss2|atom)/?$’,’index.php?year=$matches[1]&monthnum=$matches[2]&day=$matches[3]&feed=$matches[4]&post_type=’.$this->post_type);
    add_rewrite_rule($this->post_type.’/([0-9]{4})/([0-9]{1,2})/([0-9]{1,2})/page/?([0-9]{1,})/?$’,’index.php?year=$matches[1]&monthnum=$matches[2]&day=$matches[3]&paged=$matches[4]&post_type=’.$this->post_type);
    add_rewrite_rule($this->post_type.’/([0-9]{4})/([0-9]{1,2})/([0-9]{1,2})/?$’,’index.php?year=$matches[1]&monthnum=$matches[2]&day=$matches[3]&post_type=’.$this->post_type);
    add_rewrite_rule($this->post_type.’/([0-9]{4})/([0-9]{1,2})/feed/(feed|rdf|rss|rss2|atom)/?$’,’index.php?year=$matches[1]&monthnum=$matches[2]&feed=$matches[3]&post_type=’.$this->post_type);
    add_rewrite_rule($this->post_type.’/([0-9]{4})/([0-9]{1,2})/(feed|rdf|rss|rss2|atom)/?$’,’index.php?year=$matches[1]&monthnum=$matches[2]&feed=$matches[3]&post_type=’.$this->post_type);
    add_rewrite_rule($this->post_type.’/([0-9]{4})/([0-9]{1,2})/page/?([0-9]{1,})/?$’,’index.php?year=$matches[1]&monthnum=$matches[2]&paged=$matches[3]&post_type=’.$this->post_type);
    add_rewrite_rule($this->post_type.’/([0-9]{4})/([0-9]{1,2})/?$’,’index.php?year=$matches[1]&monthnum=$matches[2]&post_type=’.$this->post_type);
    add_rewrite_rule($this->post_type.’/([0-9]{4})/feed/(feed|rdf|rss|rss2|atom)/?$’,’index.php?year=$matches[1]&feed=$matches[2]&post_type=’.$this->post_type);
    add_rewrite_rule($this->post_type.’/([0-9]{4})/(feed|rdf|rss|rss2|atom)/?$’,’index.php?year=$matches[1]&feed=$matches[2]&post_type=’.$this->post_type);
    add_rewrite_rule($this->post_type.’/([0-9]{4})/page/?([0-9]{1,})/?$’,’index.php?year=$matches[1]&paged=$matches[2]&post_type=’.$this->post_type);
    add_rewrite_rule($this->post_type.’/([0-9]{4})/?$’,’index.php?year=$matches[1]&post_type=’.$this->post_type);

    }

    function set_rewrite() {
    global $wp_rewrite;

    $queryarg = ‘post_type=’.$this->post_type.’&p=’;
    $wp_rewrite->add_rewrite_tag(‘%’.$this->post_type.’_id%’, ‘([^/]+)’,$queryarg);
    $wp_rewrite->add_permastruct($this->post_type, ‘/’.$this->post_type.’/%year%/%monthnum%/%day%/%’.$this->post_type.’_id%/’, false);
    }

    function set_permalink($post_link, $id = 0) {
    global $wp_rewrite;

    $post = &get_post($id);
    if ( is_wp_error( $post ) )
    return $post;

    $newlink = $wp_rewrite->get_extra_permastruct($this->post_type);
    $newlink = str_replace("%".$this->post_type."%", $post->post_type, $newlink);
    $newlink = str_replace("%".$this->post_type."_id%", $post->ID, $newlink);

    $post_date = strtotime($post->post_date);
    $post_year = date("Y",$post_date);
    $post_monthnum = date("m",$post_date);
    $post_day = date("d",$post_date);

    $newlink = str_replace("%year%",$post_year, $newlink);
    $newlink = str_replace("%monthnum%",$post_monthnum, $newlink);
    $newlink = str_replace("%day%",$post_day, $newlink);

    $newlink = home_url(user_trailingslashit($newlink));
    return $newlink;
    }

    }

    $set_blog_permalink = new set_custom_rewrite("カスタム投稿名");

    [/php]

    こいつをfunctions.phpに書くと、
    /カスタム投稿名/年/月/日/投稿id
    に個別記事のURLが変更されます。

    また、add_ruleのところで
    カスタム投稿の月別アーカイブなどのURLを追加しています。これで
    /カスタム投稿名/年/月
    などで、月別アーカイブ等が表示されるようになります。

    ついでに
    http://ja.forums.wordpress.org/topic/6080
    を参考に
    [php]

    global $my_archives_post_type;
    add_filter( ‘getarchives_where’, ‘my_getarchives_where’, 10, 2 );
    function my_getarchives_where( $where, $r ) {
    global $my_archives_post_type;
    if ( isset($r[‘post_type’]) ) {
    $my_archives_post_type = $r[‘post_type’];
    $where = str_replace( ‘\’post\”, ‘\” . $r[‘post_type’] . ‘\”, $where );
    } else {
    $my_archives_post_type = ”;
    }
    return $where;
    }
    add_filter( ‘get_archives_link’, ‘my_get_archives_link’ );
    function my_get_archives_link( $link_html ) {
    global $my_archives_post_type;
    if ( ” != $my_archives_post_type )
    $my_archives_post_type;
    $blog_url = get_bloginfo("url");

    $link_html = str_replace($blog_url,$blog_url.’/’.$my_archives_post_type,$link_html);

    return $link_html;
    }

    [/php]

    を記述しておくと、
    [php]
    wp_get_archives(‘type=monthly&post_type=カスタム投稿名’);
    [/php]

    でカスタム投稿の月別アーカイブ一覧が表示されます。

    ここまでするならDrupalとかで作った方が楽なんじゃないかとかは言わない約束です。

    参考
    http://ja.forums.wordpress.org/topic/6080
    http://www.phpfreaks.com/forums/index.php?PHPSESSID=ad52a9sjjre4bh7fue8uf5c4g4&topic=328834.0

  • カスタム分類のパーマリンクの変更

    カスタム投稿でカスタム分類を作成したとき、
    カスタム分類のパーマリンクを
    [plain]
    /カスタム分類名/カスタム分類
    [/plain]
    になってしまうのがどうしても、気にくわないのです。
    [plain]
    /カスタム投稿名/カスタム分類名/カスタム分類
    [/plain]
    にはならんのかと。

    というわけで、functions.phpで頑張りました。

    (さらに…)

  • body_classにカスタム投稿タイプを追加。

    カスタム投稿タイプを使ってテンプレート作成するとき、body_class()がカスタム投稿タイプを吐いてくれると楽だなと思ったので、ちょっと作ってみました。

    (さらに…)