
2012年の最初の投稿です。本年もよろしくお願いいたします。
先日、Wordpressで新たに企業サイト向けテーマを作成しました。カスタム投稿に対応したテーマで、なるべく自動で表示できるように組んでみました。
都合上見せられない部分もあるためテーマ本体は掲載しませんが、テーマ作成で使ったコードをご紹介します。自分がつくるテーマは「twentyten」をベースに改造しているので、コピペで使えるものだと思います。
色々なサイトで紹介されているコードよりは、ちょっぴり機能的で便利にはなっていると思うので参考にしてくださいませ。
目次
- カスタム投稿の作成手順
- トップページに記事一覧を表示
- ページのローカルナビゲーションを自動で表示
- 月別アーカイブを自動で表示
- カテゴリ別アーカイブを表示
- RSSを読み込み
- トップページに固定ページの内容を表示
- <head>の余計なタグを無効化
- 「ダッシュボード」の不要なコンテンツを非表示
- 管理画面の「投稿」「固定ページ」の不要なコンテンツを非表示
- 管理者以外にアップデートのお知らせ非表示
- ダッシュボードに任意のhtmlを表示
- 管理画面のいらないメニューを削除
①カスタム投稿の作成手順
WordPressの「投稿」をもうひとつ増やしたいときに使用します。

【functions.php】
function my_custom_init() {
register_post_type( 'staffblog', array(
'label' => 'スタッフブログ',
'public' => true,
'supports' => array( 'title', 'editor', 'author', 'thumbnail', 'excerpt', 'custom-fields' ,'comments' ),
'menu_position' => 5,
'has_archive' => true
));
}
add_action( 'init', 'my_custom_init' );
$args = array(
'label' => 'カテゴリー',
'public' => true,
'show_ui' => true,
'hierarchical' => true,
);
register_taxonomy('staffbloglist', 'staffblog', $args);
※ポストタイプは’staffblog’、ラベルは’スタッフブログ’です。
※複数追加の場合は、同じようにコードを用意したら’my_custom_init’の部分を’my_custom_init2′などに変更してください。
URLは
www.hogehoge.jp/staffblog
で閲覧できます。
上記URLで見えない場合は
www.hogehoge.jp/?post_type=staffblog
で見てみてください。
パーマリンクの設定を変えている場合、管理画面のメニューを追加して記事登録したあと、必ず「設定」メニューの「パーマリンクの設定」を空更新してください。
そうしないと詳細記事が表示されません。;;
参考:http://www.softel.co.jp/blogs/tech/archives/2443
②トップページに記事一覧を表示
投稿日、カテゴリ名(リンク付き)、Newマーク、記事タイトルを表示します。
コーポレートサイトや大学サイトのトップページニュースでよく見かけるものを簡単につくることができます。

【home.php】
6,7行目:ポストタイプとタクソノミーを変更することで、新しく作成したポストタイプに対応することができます。
32行目:「$days=7;」は、Newマークの表示期間です。
<div id="news">
<h2 class="entry-title">What's New</h2>
<ul>
<?php
// ▽ポストタイプとタクソノミーを入力
$post_type = 'post';
$taxonomy = 'category';
// △
$args=array(
'post_type' => $post_type,
'post_status' => 'publish',
'posts_per_page' => 3,
'orderby' => 'date',
'order' => DESC,
'caller_get_posts'=> 1
);
$my_posts = get_posts($args);
foreach ($my_posts as $post) {
setup_postdata($post);
$post_title = $post->post_title;
?>
<li>
<span class='date'><?php the_time('Y年m月d日'); ?></span>
<?php
$terms = get_the_terms( $post->ID, $taxonomy );
if ( $terms && ! is_wp_error( $terms ) ) :
$draught_links = array();
foreach ( $terms as $term ) {
echo '<a class="' . $term->slug . '" href="' . home_url( '/' ) . $term->taxonomy .'/'. $term->slug . '">' . $term->name . '</a>';
}
endif;
$days=7; $today=date('U'); $entry=get_the_time('U'); $diff1=date('U',($today - $entry))/86400;
if ($days > $diff1) { echo '<img src="' . get_bloginfo('template_url') . '/images/new.gif" alt="New" />'; }
?>
</span><br />
<a href="<?php the_permalink();?>"><?php the_title(); ?></span></a>
</li>
<?php } ?>
</ul>
</div>
③ページのローカルナビゲーションを自動で表示
ページを追加した際に、ページのローカルナビゲーションを自動で表示してくれます。
階層にも対応しているので、子ページをつくる度にインデントされます。
テーマに下記コードを加えるだけなので、手放せなくなりますよ。

【sidebar.php】
<?php
if (is_page()){
if($post->ancestors){
foreach($post->ancestors as $post_anc_id){
$post_id = $post_anc_id;
}
} else {
$post_id = $post->ID;
}
if ($post_id) {
$children = wp_list_pages("title_li=&child_of=".$post_id."&echo=0");
if ($children) {
$ancestors = array_reverse( get_post_ancestors( $post->ID ) );
array_push($ancestors, $post->ID);
echo '<h2 class="parent-pageid-'. $ancestors[0] .'">';
echo get_the_title($ancestors[0]);
echo '</h2>';
echo '<ul>';
echo '<li><a href="'. get_permalink($ancestors[0]) .'">';
echo get_the_title($ancestors[0]);
echo '</a></li>';
echo $children;
echo '</ul>';
}
}
}?>
④月別アーカイブを自動で表示
カスタム投稿に対応した月別アーカイブです。
記事を追加した際に、月別アーカイブを自動で表示してくれます。

function.phpとsidebar.phpにコードを追加してください。
【function.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 )
$add_link .= '?post_type=' . $my_archives_post_type;
$link_html = preg_replace("/href=\'(.+)\'\s/","href='$1".$add_link."'",$link_html);
return $link_html;
}
【sidebar.php】
<?php
if (!is_home() && !is_page() || is_page_template() ) {
echo '<h2 class="posttype-' .get_post_type(). '">';
if ( get_post_type() === 'post' ){
echo 'カスタム投稿タイプが「post」のときのタイトル';
} else {
$customPostTypeObj = get_post_type_object(get_post_type());
echo esc_html($customPostTypeObj->labels->name);
}
echo '</h2>';
echo '<ul>';
wp_get_archives('type=monthly&post_type=' .get_post_type(). '');
echo '</ul>';
}?>
※5行目:月別アーカイブの上に表示されるタイトルです。
カスタム投稿タイプが’post’のときは「投稿」と表示されてしまうため、タイトル任意で変更できるようにしました。新しく作成したカスタム投稿タイプの場合は、function.phpに記述したラベル名が自動で表示されます。
⑤カテゴリ別アーカイブを表示

上記「月別アーカイブを自動で表示」の12~14行目を以下に変更してください。
ポストタイプ毎に以下を複製します。
1、2行目のポストタイプとタクソノミー名を変更してください。
if ( get_post_type() === 'ポストタイプ' ){
$args=array('orderby'=>'menu_order','taxonomy'=>'タクソノミー','title_li'=>'');
echo '<ul>';
wp_list_categories( $args );
echo '</ul>';
}
⑥RSSを読み込み
複数登録可能なRSSを読み込むコードです。

以下のコードを現在使用しているテーマフォルダの読み込みたい場所に記述します。
3、4行目にに読み込みたいRSSのURLを記述します。カンマで区切ることで、幾つも読み込みます。
<?php include_once(ABSPATH . WPINC . '/feed.php');
$rss = fetch_feed(array(
'http://www.doya-doya.com/feed/',
'http://web-daysign.net/feed/'
));
if (!is_wp_error( $rss ) ) :
$rss->set_cache_duration(1800);
$rss->init();
$maxitems = $rss->get_item_quantity(3);
$rss_items = $rss->get_items(0, $maxitems);
date_default_timezone_set('Asia/Tokyo');
endif;
?>
<dl>
<?php if ($maxitems == 0) echo '<dt>No items.</dt>';
else
foreach ( $rss_items as $item ) : ?>
<dt>
<?php echo $item->get_feed()->get_title(); ?><br />
<a href='<?php echo $item->get_permalink(); ?>' target="_blank"><?php echo $item->get_title(); ?></a>
</dt>
<dd>(<?php echo $item->get_date("Y-n-j H:i:s"); ?>)</dd>
<?php endforeach; ?>
</dl>
⑦トップページに固定ページの内容を表示
クライアントがテーマファイルをいじらなくてもトップページを更新できるようにします。
トップページの一部を固定ページとして登録しておき、それを呼び出します。
【home.php】
<?php $page_id = 1; //ページID $mes = get_page($page_id); echo $mes->post_content; ?>
⑧<head>の余計なタグを無効化
【function.php】
remove_action( 'wp_head', 'feed_links_extra', 3 ); remove_action( 'wp_head', 'feed_links', 2 ); remove_action( 'wp_head', 'rsd_link' ); remove_action( 'wp_head', 'wlwmanifest_link' ); remove_action( 'wp_head', 'index_rel_link' ); remove_action( 'wp_head', 'parent_post_rel_link', 10, 0 ); remove_action( 'wp_head', 'start_post_rel_link', 10, 0 ); remove_action( 'wp_head', 'adjacent_posts_rel_link_wp_head', 10, 0 ); remove_action( 'wp_head', 'wp_generator' );
⑨「ダッシュボード」の不要なコンテンツを非表示
表示させたいものは、「//」でコメント化すると便利です。
【function.php】
function tidy_dashboard(){
global $wp_meta_boxes, $current_user;
// remove incoming links info for authors or editors
if(in_array('author', $current_user->roles) || in_array('editor', $current_user->roles))
{
unset($wp_meta_boxes['dashboard']['normal ']['core']['dashboard_incoming_links']);
}
unset($wp_meta_boxes['dashboard']['normal']['core']['dashboard_plugins']); //プラグイン
unset($wp_meta_boxes['dashboard']['side']['core']['dashboard_primary']); //WordPress開発ブログ
unset($wp_meta_boxes['dashboard']['side']['core']['dashboard_secondary']); //WordPressフォーラム
unset($wp_meta_boxes['dashboard']['normal']['core']['dashboard_right_now']); //現在の状況
unset($wp_meta_boxes['dashboard']['normal']['core']['dashboard_recent_comments']); //最近のコメント
unset($wp_meta_boxes['dashboard']['normal']['core']['dashboard_incoming_links']); //被リンク
unset($wp_meta_boxes['dashboard']['side']['core']['dashboard_quick_press']); //クイック投稿
unset($wp_meta_boxes['dashboard']['side']['core']['dashboard_recent_drafts']); //最近の下書き
}
//add our function to the dashboard setup hook
add_action('wp_dashboard_setup', 'tidy_dashboard');
⑩管理画面の「投稿」「固定ページ」の不要なコンテンツを非表示
【function.php】
function remove_default_page_screen_metaboxes() {
//投稿用
remove_meta_box( 'postcustom','post','normal' ); // カスタムフィールド
remove_meta_box( 'postexcerpt','post','normal' ); // 抜粋
remove_meta_box( 'commentstatusdiv','post','normal' ); // ディスカッション
remove_meta_box( 'commentsdiv','post','normal' ); // コメント
remove_meta_box( 'trackbacksdiv','post','normal' ); // トラックバック送信
remove_meta_box( 'slugdiv','post','normal' ); // スラッグ
remove_meta_box( 'authordiv','post','normal' ); // 作成者
remove_meta_box( 'formatdiv','post','normal' ); // フォーマット
//固定ページ用
remove_meta_box( 'postcustom','page','normal' ); // カスタムフィールド
remove_meta_box( 'commentstatusdiv','page','normal' ); // ディスカッション
remove_meta_box( 'commentsdiv','page','normal' ); // コメント
remove_meta_box( 'slugdiv','page','normal' ); // スラッグ
remove_meta_box( 'authordiv','page','normal' ); // 作成者
}
add_action('admin_menu','remove_default_page_screen_metaboxes');
⑪管理者以外にアップデートのお知らせ非表示
編集者以下に「WordPress 3.3.1 が利用可能です ! 更新してください。」を表示させないようにするコード。
【function.php】
if (!current_user_can('edit_users')) {
add_action('admin_menu','wphidenag');
function wphidenag() {
remove_action( 'admin_notices', 'update_nag', 3 );
}
}
⑫ダッシュボードに任意のhtmlを表示
【function.php】
add_action('wp_dashboard_setup', 'my_custom_dashboard_widgets');
function my_custom_dashboard_widgets() {
global $wp_meta_boxes;
wp_add_dashboard_widget('custom_help_widget', 'サイト管理者からのお知らせ', 'dashboard_text');
}
function dashboard_text() {
echo '
<p>ダッシュボードに任意のhtmlを表示させることができます。<br />
必要ない場合は、テーマのための関数(functions.php)で該当の場所を削除してください。</p>
';
}
⑬管理画面のいらないメニューを削除
【function.php】
function remove_menus () {
if (!current_user_can('level_10')) { //level10以下(編集者以下)のユーザーの場合メニューをunsetする
global $menu;
//unset($menu[2]);//ダッシュボード
//unset($menu[4]);//メニューの線1
//unset($menu[5]);//投稿
//unset($menu[10]);//メディア
unset($menu[15]);//リンク
//unset($menu[20]);//ページ
unset($menu[25]);//コメント
//unset($menu[59]);//メニューの線2
//unset($menu[60]);//テーマ
//unset($menu[65]);//プラグイン
//unset($menu[70]);//プロフィール
unset($menu[75]);//ツール
unset($menu[80]);//設定
//unset($menu[90]);//メニューの線3
}
}
add_action('admin_menu', 'remove_menus');
まとめ
冒頭でも書きましたが、自分は「twentyten」をベースに改造しているので、コピペで使えるものだと思います。気になったらコピペして是非試してみて下さい:)
では、本年もどうぞよろしくお願いいたします。












いつも大変為になる記事をありがとうございます!
質問のですが
「トップページに記事一覧を表示」の記事で
「受験生」「保護者」「社会人」等のカテゴリを
色分けで表示するのはどうやればよいのですか?
コピペしてみたのですが特に違うCSSを出すわけでもないのですよね?
>mahaさま
こちらこそ、いつも読んで頂きありがとうございます!
>コピペしてみたのですが特に違うCSSを出すわけでもないのですよね?
すみません!クラスを付け加えたつもりが抜けていました。。。
ご指摘いただきありがとうございます。
早速、コード(29行目)を更新したので再度試していただいてもよろしいでしょうか。
aタグのclassにスラッグ名が入りますので、CSSで調整してみてください:)
<a class=”スラッグ名” href=”カテゴリURL”>カテゴリ名</a>
早々にありがとうございます!
これからも更新楽しみしています!