wordpress」カテゴリーアーカイブ

投稿ページの「次へ>」と「<前へ」の自動リンクを同一カテゴリ内の遷移にしたい

正直、prevとnext機能の書き方はテーマ毎に千差万別です。
なので、とりあえず以下の箇所にtrueを入れておけば良いんじゃないかなって感じです。
ふわっとしてますが自分はなんとか上手く行ったのでメモです。

get_previous_post( true );

大体こういうのは「single.php」とか、凝ってるテーマだと「part-single.php」みたいなのに書いてあります。
trueっていうので同一カテゴリーのリンクを取得するみたいですね。
便利。

固定ページとかアーカイブページのサイドバーをページ毎に変える時の条件分岐

ページ毎にサイドバーを切り替えたいときって沢山あると思います。コーポレートサイトなら尚更です。
というわけで以下。

まずサイドバーを呼び出す基本

<?php get_sidebar(part01); ?>  /*sidebar-part01.phpを呼び出す**/
固定ページ一つだけを別のSidebarを表示する場合
<?php
if(is_page('スラッグ名A')) :
get_sidebar('サイドバーB');
else :
get_sidebar();
endif
?>

もし、「スラッグ名」っていうページだったら「サイドバーB」っていうサイドバー出してねってことです。
ちなみに、「サイドバーB」のところは「sidebar-part01.php」の「part01」の部分だけ入れるよ。全部入れちゃだめだよ。

複数の固定ページを別のSidebarを表示する場合

if(is_page(array('スラッグ名','スラッグ名','スラッグ名'))):
get_sidebar('サイドバーC');
else :
get_sidebar();
endif
?>

もっと分岐

<?php
if(is_page(array('スラッグ名','スラッグ名','スラッグ名'))):
get_sidebar('サイドバーA');
elseif(is_page(array('スラッグ名','スラッグ名','スラッグ名'))):
get_sidebar('サイドバーB');
elseif(is_page(array('スラッグ名','スラッグ名','スラッグ名'))):
get_sidebar('サイドバーC');
else :
get_sidebar();
endif
?>

これ管理面倒だけどまあ楽。

カテゴリごとにSidebarを切り替える(single.php)

<?php
if(in_category('スラッグ名')) :
get_sidebar('ハイフンの後ろ');
elseif(in_category('スラッグ名')) :
get_sidebar('ハイフンの後ろ');
else :
get_sidebar();
endif
?>

カテゴリアーカイブページ(category.php)の場合
is_categoryです。

<?php
if(is_category('スラッグ名')) :
get_sidebar('ハイフンの後ろ');
elseif(is_category('スラッグ名')) :
get_sidebar('ハイフンの後ろ');
else :
get_sidebar();
endif
?>

これ使えるとサイトの表現が格段に上がりますね。
確か、親子関係がしっかり出来た階層サイトの場合、スラッグ名いっぱい入れるの面倒だから、親ページのスラッグ名で判断して子ページに適用、とかもあった気がします。
最近こういう依頼がないのですっかり忘れてしまいましたがググれば出てくるはず。
時間あるときまとめます。

ウィジェットを追加する

特定の固定ページに違うウィジェットを使いたい、とか色々出し分けたいときあると思います。
そういう時には新しくウィジェットを追加します。

いじるもの

  • function.php
  • sidebar.phpをコピーしたsidebar-任意の英数字.php

sidebar.php

<?if ( ! is_active_sidebar( '任意の英数字A' ) ) {
return;
}?>
<aside id="secondary" class="widget-area" role="complementary">
<?php dynamic_sidebar( '任意の英数字A' ); ?>
</aside><!-- #secondary -->

これらは例だから、全然違う形で書いてあったりするけど、とりあえずdynamic_sidebarとかactive_sidebarの中に任意の文字入れておけばオッケー

function.php

register_sidebar( array(
'name' => __( 'ウィジェット編集画面上での見出し', '親テーマ名' ),
'id' => '任意の英数字A',
'description' => __( 'ウィジェット編集画面上でのウィジェットの説明', '親テーマ名' ),
'before_title' => '<div class="ttl">',
'after_title' => '</div>',
'before_widget' => '<div id="%1$s" class="widget %2$s">',
'after_widget' => '</div>'
) );

ちょっと説明>
before_titleとafter_title:ウィジェットの出力されるタイトルのタグ
こんな感じで出る。

<div class="ttl">ウィジェットのタイトル</div>

before_widgetとafter_widget:ウィジェットの大きい固まりではなくその中のパーツパーツを包むdivの記述ぽい。
変数は謎。とりあえず親テーマのregister_sidebar見とけばなんとかなるぞ。
テーマ作った人は偉大。

大事なこと
idはsidebar.phpで設定した名前にしておくこと!

そしたらpage.phpとかサイドバーを取得しているテンプレートファイルの以下の箇所を変更する。

<?php get_sidebar("任意の英数字"); ?>

これは、コピーしたsidebar.phpにつけた名前を入れる。

こんな感じです。

ついでに、固定ページとか投稿ページとかでこのスラッグ名の固定ページだけ今回作ったサイドバーを出したいとか、このカテゴリーのアーカイブページだけこのサイドバーを出したいとかその色々はここから。

(っ’ヮ’c)<おつかれ

○年前より古い記事は取得しない

タイトルのとおりです。
あまり需要がないのか調べてもヒットしなくて苦戦しましたがなんとか。

strtotime( ‘-2 years’ ) の部分を-1daysとか-3monthsとか色々変更するとよしです。

<?php
add_filter( 'posts_where', 'filter_where' );
function filter_where( $where = '' ) {
$where .= " AND DATE(post_date) >= '" . date( 'Y-m-d', strtotime( '-2 years' ) ) . "'";
return $where;
}
global $query_string;
query_posts( $query_string );
?>

実際の使い方としてはこんな感じ。

<div class="txt">
<div class="home-c_t">
<ul class="home-tp">
<?php
add_filter( 'posts_where', 'filter_where' );
function filter_where( $where = '' ) {
$where .= " AND DATE(post_date) >= '" . date( 'Y-m-d', strtotime( '-2 years' ) ) . "'";
return $where;
}
global $query_string;
query_posts( $query_string );
?>
<?php query_posts("showposts=-1&cat=3");
while (have_posts()) : the_post();
?>
<?php
$cat = get_the_category();
$catslug = $cat[0]->slug; //スラッグ名
?>

<?php if(empty($post->post_content)) : ?>
<li class="newscontent">
<div class="<?php echo $catslug; ?> date"><?php the_time('Y.m.d');?></div>
<div id="post-<?php the_ID(); ?>"><?php the_title(); ?></div>
</li>
<?php else : ?>
<li class="newscontent">
<div class="<?php echo $catslug; ?> date"><?php the_time('Y.m.d');?></div>
<div id="post-<?php the_ID(); ?>"><a href="<?php the_permalink(); ?>" class="home-a_link"><?php the_title(); ?></a></div>
</li>
<?php endif; ?>
<?php endwhile; ?>
<?php wp_reset_query(); ?>
</ul>
</div>
</div>

参考サイト

http://webcake.no003.info/webdesign/wp-queryposts-datesearch.html

すごくためになりそうだったからスクリーンショットもとっといた。(よくページが消えるから

WordPressにおけるカテゴリーの優先度

投稿の一覧出力にカテゴリーの見出しを付けるで出力したい投稿にカテゴリーを付与しました。
しかし、カテゴリー関係なく全部の投稿を一括でarchiveページに表示したいとき少し厄介です。

まずarchive.phpによって生成されるarchiveページは1カテゴリしか表示できないです。(うまくいかないから多分)
なので、大体は各投稿にarchiveページ用の共通カテゴリーをもう一つ付与してその共通カテゴリーのarchiveページということで一括一覧表示する対応だと思いますが、上記の投稿の一覧出力にカテゴリーの見出しを付けるをやろうとすると、なぜか共通カテゴリーの方が優先されてユニークなカテゴリが取得できません。
(ユニークとは言ってますが、共通カテゴリと差別化するだけで実際一個一個違うわけではありません)

なぜか調べたところ、今回共通カテゴリは「Information」というアルファベットにしてました。
他のユニークなカテゴリは日本語でした。
どうやら、get_the_categoryで取得するカテゴリーはアルファベット(AtoZ)→日本語(五十音)の順で優先度が決まるみたいです。
実際、適当な漢字にしたら期待される結果を得ることができました。でも、どうしてもカテゴリスラッグをアルファベットにしたいときってあると思います。
今回がそれです。

そこで、不本意ですがプラグインの力を借りました。

Category Order and Taxonomy Terms Order

です。

なんか、これ何かしらどうにかしたらプラグイン使わずともできるんじゃない?って思いますが、自分では時間がかかりすぎます(非力)
これでカテゴリーの順序(優先度)を変更できるので期待される結果を得ることができます。

投稿の一覧出力にカテゴリーの見出しを付ける

こゆやつ。

まずWordPressのカテゴリを作るとこから始める。

スラッグ名=$catslug。

$catnameは設定した日本語とかのカテゴリ名が出るよ。

私が作ったやつ。
これを出したいところに入れる。

<div class="pr_area">
<h2>Information</h2>
<div class="pr_content">
<?php
$posts = get_posts(array(
'posts_per_page' => 5, // 表示件数
));
?>
<?php if($posts): foreach($posts as $post): setup_postdata($post); ?>
<?php
$cat = get_the_category();
$catname = $cat[0]->cat_name; //カテゴリー名
$catslug = $cat[0]->slug; //スラッグ名
?>

<p class="newslist"><span class="time"><?php the_time('Y/m/d') ?></span><span class="news_cat <?php echo $catslug; ?>"><?php echo $catname; ?></span><a href="<?php the_permalink() ?>"><?php the_title(); ?></a></p>

<?php endforeach; endif; ?>
<div class="btn_center">
<a class="button" href="<?php echo home_url(); ?>/category/news/">一覧はこちら</a>
</div>
</div>
</div>

CSS

取得したカテゴリスラッグ名分だけ、以下のul li span.cat-a を作る。
cat-aのところは適宜スラッグ名を入れる。

ul {
list-style: none;
margin: 0;
padding: 0;
}
ul li {
clear: both;
margin: 0 0 1em;
}
ul li span {
display: block;
float: left;
width: 6em; /*カゴテリー名による*/
margin: 0 10px 10px 0;
padding: 5px;
text-align: center;
font-size: 10px;
}
ul li span.cat-a {
background: #e3efef;
}
ul li span.cat-b {
background: #efe3ec;
}
ul li span.cat-c {
background: #efefe3;
}
ul li span.ymd {
display: inline;
float: none;
padding: 0 5px;
font-size: 13px;
color: #999;
}

ウィジェットでショートコードを使う

これをfunction.phpに記述する

add_filter('widget_text', 'do_shortcode' );

テーマのカスタマイザーでもショートコードを使えるようになるといいのにな~(ありそうだけど

特定のカテゴリーだけ表示させるプラグイン

Recent posts of specific category

これ。

便利すぎ。
ウィジェットで最新の投稿一覧を出す時に特定のカテゴリだけを表示することが出来るよ!

WPウィジェット上の最新の投稿一覧で特定のカテゴリーを除外

これfunction.phpに入れとけ。

<?php

class WP_Widget_Recent_Posts_Exclude extends WP_Widget {

function __construct() {
$widget_ops = array('classname' => 'widget_recent_entries', 'description' => __( "The most recent posts on your site") );
parent::__construct('recent-posts', __('Recent Posts with Exclude'), $widget_ops);
$this->alt_option_name = 'widget_recent_entries';

add_action( 'save_post', array(&$this, 'flush_widget_cache') );
add_action( 'deleted_post', array(&$this, 'flush_widget_cache') );
add_action( 'switch_theme', array(&$this, 'flush_widget_cache') );
}

function widget($args, $instance) {
$cache = wp_cache_get('widget_recent_posts', 'widget');

if ( !is_array($cache) )
$cache = array();

if ( ! isset( $args['widget_id'] ) )
$args['widget_id'] = $this->id;

if ( isset( $cache[ $args['widget_id'] ] ) ) {
echo $cache[ $args['widget_id'] ];
return;
}

ob_start();
extract($args);

$title = apply_filters('widget_title', empty($instance['title']) ? __('Recent Posts') : $instance['title'], $instance, $this->id_base);
if ( empty( $instance['number'] ) || ! $number = absint( $instance['number'] ) )
$number = 10;
$exclude = empty( $instance['exclude'] ) ? '' : $instance['exclude'];

$r = new WP_Query(array('posts_per_page' => $number, 'no_found_rows' => true, 'post_status' => 'publish', 'ignore_sticky_posts' => true, 'category__not_in' => explode(',', $exclude) ));
if ($r->have_posts()) :
?>
<?php //echo print_r(explode(',', $exclude)); ?>
<?php echo $before_widget; ?>
<?php if ( $title ) echo $before_title . $title . $after_title; ?>
<ul>
<?php while ($r->have_posts()) : $r->the_post(); ?>
<li><a href="<?php the_permalink() ?>" title="<?php echo esc_attr(get_the_title() ? get_the_title() : get_the_ID()); ?>"><?php if ( get_the_title() ) the_title(); else the_ID(); ?></a></li>
<?php endwhile; ?>
</ul>
<?php echo $after_widget; ?>
<?php
// Reset the global $the_post as this query will have stomped on it
wp_reset_postdata();

endif;

$cache[$args['widget_id']] = ob_get_flush();
wp_cache_set('widget_recent_posts', $cache, 'widget');
}

function update( $new_instance, $old_instance ) {
$instance = $old_instance;
$instance['title'] = strip_tags($new_instance['title']);
$instance['number'] = (int) $new_instance['number'];
$instance['exclude'] = strip_tags( $new_instance['exclude'] );
$this->flush_widget_cache();

$alloptions = wp_cache_get( 'alloptions', 'options' );
if ( isset($alloptions['widget_recent_entries']) )
delete_option('widget_recent_entries');

return $instance;
}

function flush_widget_cache() {
wp_cache_delete('widget_recent_posts', 'widget');
}

function form( $instance ) {
$title = isset($instance['title']) ? esc_attr($instance['title']) : '';
$number = isset($instance['number']) ? absint($instance['number']) : 5;
$exclude = esc_attr( $instance['exclude'] );
?>
<p><label for="<?php echo $this->get_field_id('title'); ?>"><?php _e('Title:'); ?></label>
<input class="widefat" id="<?php echo $this->get_field_id('title'); ?>" name="<?php echo $this->get_field_name('title'); ?>" type="text" value="<?php echo $title; ?>" /></p>

<p><label for="<?php echo $this->get_field_id('number'); ?>"><?php _e('Number of posts to show:'); ?></label>
<input id="<?php echo $this->get_field_id('number'); ?>" name="<?php echo $this->get_field_name('number'); ?>" type="text" value="<?php echo $number; ?>" size="3" /></p>

<p>
<label for="<?php echo $this->get_field_id('exclude'); ?>"><?php _e( 'Exclude Category(s):' ); ?></label> <input type="text" value="<?php echo $exclude; ?>" name="<?php echo $this->get_field_name('exclude'); ?>" id="<?php echo $this->get_field_id('exclude'); ?>" class="widefat" />
<br />
<small><?php _e( 'Category IDs, separated by commas.' ); ?></small>
</p>
<?php
}
}

function WP_Widget_Recent_Posts_Exclude_init() {
unregister_widget('WP_Widget_Recent_Posts');
register_widget('WP_Widget_Recent_Posts_Exclude');
}

add_action('widgets_init', 'WP_Widget_Recent_Posts_Exclude_init');

?>

前から気になってたんだけど、WPテーマの中でfunction.phpとfunctions.phpがあるのは何故?????????

サブページなどページ毎にヘッダーなどを変える

使い所としては、サブページにはスライドショーを出したくない!グローバルメニューだけで良い!という時用です。
トップとサブページに同じテンプレートを適用すると、同じheader.phpが読まれてしまうのです。
なので、スライドショーを削除したheader.phpを作成する感じです。詳細は以下。

1. 異なるヘッダーを使用するページ用のpage-sub.phpを作成します。(subの部分は任意です)

2. page-new.php内の冒頭に下記の記述を行います。

<?php

/*
Template Name: サブページ用(とか)
*/

?>

3. 異なるヘッダーを使用するページ用のheader-sub.phpを作成します。

4. page-sub.php内に下記の記述をし、header-sub.phpを呼び出します。

<?php get_header(sub); ?>

5. page-sub.phpとheader-sub.phpをサーバ上のオリジナルテーマフォルダ内にアップロードします。

あとは固定ページのテンプレートで選べるようになるよ。