月別アーカイブ: 2月 2018

Recent Posts ExtendedとVK Link Target Controllerを併せて使うとき

Recent Posts Extendedはウィジェット上でカテゴリーを指定して投稿を出力出来る便利プラグインです。

VK Link Target Controllerで投稿のリンクを押下したときに別ページ&別タブにするのは、ここでやりました。

ですが、この対処法はRecent Posts Extendedで出力された投稿には効かないのです・・・

ということで、以下。

いじるファイルはこれ。

../wp-content/plugins/recent-posts-widget-extended/includes/functions.php

その中に、以下のような記述があるところがあります。

$html .= '<h3 class="rpwe-title" id="post-'.get_the_ID().'"><a href="' . esc_url( get_permalink() ) . '" title="' . sprintf( esc_attr__( 'Permalink to %s', 'recent-posts-widget-extended' ), the_title_attribute( 'echo=0' ) ) . '" rel="bookmark">' . esc_attr( get_the_title() ) . '</a></h3>';

h3 class=”rpwe-title”とかで検索引っ掛けるとすぐ見つかります。多分一箇所しかないので。

それで、この↓部分を

<h3 class="rpwe-title">

こうする。

<h3 class="rpwe-title" id="post-'.get_the_ID().'">

これで大丈夫だと思います。

<?php the_ID(); ?>

だと、上手く取得できないので、上みたいに書いてください。
何でかはあとで調べておきます。

余談:
本当に何でもかんでも別タブにしたいときはこうする。

$html .= '<h3 class="rpwe-title"><a href="' . esc_url( get_permalink() ) . '" title="' . sprintf( esc_attr__( 'Permalink to %s', 'recent-posts-widget-extended' ), the_title_attribute( 'echo=0' ) ) . '" target="_blank" rel="bookmark">' . esc_attr( get_the_title() ) . '</a></h3>';

VK Link Target Controllerのリンクを別タブで出す

VK Link Target Controllerという、個別の投稿のリンクを押下すると投稿詳細ではなく別のページにジャンプ出来るプラグインがあります。

それがどうやら、普通のテーマだと別タブで開かないらしいです。外部リンクにしたいとき面倒。
公式テーマ(Twentyシリーズ)とかはいけるっぽいけど・・

ということで以下の対処。

<?php while (have_posts()): the_post(); ?>
<div class="entry">
<a href="<?php the_permalink(); ?>"><?php the_title(); ?></a>
<span><?php the_excerpt(); ?></span>
</div>
<?php endwhile; ?>

こういう場合、リンクの親要素に以下のid属性を付与。

<div class="entry" id="post-<?php the_ID(); ?>">

おわり。

カテゴリーを一つだけ取得する

使い勝手としては以下。

個別記事をページングしたい。記事のカテゴリは一つだけど、レパートリとして複数カテゴリある。
今のところ単一カテゴリを絞ったページングは可能だけど、複数カテゴリを跨いではしんどい。

結局ページング用カテゴリをページングさせたい記事に設定するしかない・・・

要はこういうこと。
カテゴリー1、2、3を一グループとしてページングさせたい。

記事A>カテゴリ:1
記事B>カテゴリ:2
記事C>カテゴリ:3
記事D>カテゴリ:1

ページング機能で引数をtrueにしてると同一カテゴリでページングすることがアダとなり。記事Aで次へを押すと、本当は記事Bに飛んで欲しいところ記事Dに飛んでしまう。

ということで、以下の対応。

記事A>カテゴリ:1、4
記事B>カテゴリ:2、4
記事C>カテゴリ:3、4
記事D>カテゴリ:1、4

カテゴリ4をページング用として設定。

そうすると、カテゴリ4が共通ということで遷移する・・・けど、記事一覧に表に出てほしくないページング制御用のカテゴリが出てしまう。
ということで、1,2、3などフロント用のカテゴリだけを出すために先頭の一つだけ出力!

先頭の一つだけカテゴリ出力(リンク無し)

<?php
$category = get_the_category();
echo $category[0]->cat_name;
?>

先頭の一つだけカテゴリ出力(リンク有り)

<?php
$category = get_the_category();
if ( $category[0] ) {
echo '<a href="' . get_category_link( $category[0]->term_id ) . '">' . $category[0]->cat_name . '</a>';
}
?>

先頭の二つだけ出力・・・とかになったときはまたその時調べます。

archive.phpなどループ処理で記事の表示件数やカテゴリーを指定する方法

archive.phpとかいじるとうまくいかないことっていっぱいあったけど何かうまくいきました。

<?php if (have_posts()) : while (have_posts()) : the_post(); ?>
<h2><a href="<?php the_permalink() ?>"><?php the_title(); ?></a></h2>
<div class="post"><?php the_content(); ?></div>
<?php endwhile; ?>
<?php else: ?>
<h2>記事がありません</h2>
<?php endif; ?>

上のループ処理は、記事があればタイトルをタグで、本文を「post」というクラス名の付いたタグで括った状態で表示し、この処理を記事がある分だけ繰り返して行ってください、そして記事がなければ「記事がありません」という文字列をタグで括って表示してください、という意味です。
このループ処理の開始タグの前に1行追加し「どんな記事を探してくるか」などの条件を付加してやることで、表示件数を指定したり、特定のカテゴリーのみを抽出して一覧表示できるようになります。

カテゴリーIDが1,3,5の記事を10個表示する
これがわかればあとは応用

<?php query_posts('cat=1,3,5&posts_per_page=10'); ?>
<?php if (have_posts()) : while (have_posts()) : the_post(); ?>

除外系も。

カテゴリーIDが1,3,5以外の記事を10個表示する

<?php query_posts('cat=-1,-3,-5&posts_per_page=10'); ?>
<?php if (have_posts()) : while (have_posts()) : the_post(); ?>

一つのパーツに複数のウィジェットを入れる

サイドバーで使ってるウィジェットとフッターで使ってるウィジェットを共通化したい時は滅多にないと思う。
けど、要するにそういうことをしたいとき(謎

<!-- ウィジェット1 -->
<?php if(!function_exists('dynamic_sidebar') || !dynamic_sidebar('sidebar1')): ?>
<p>ウィジェットが設定されていない場合、ここが表示されます。</p>
<?php endif; ?>
<!-- ウィジェット2 -->
<?php if(!function_exists('dynamic_sidebar') || !dynamic_sidebar('sidebar2')): ?>
<p>ウィジェットが設定されていない場合、ここが表示されます。</p>
<?php endif; ?>

正直なところ、sidebar.phpを2つも3つも作ったとき、上半分はサイドバー毎に違うけど、下半分は同じなんだよなってときに使います。
同じウィジェットパーツ沢山つくるのも面倒ですので₍₍ ◝(‘ω’◝) ⁾⁾ ₍₍ (◟’ω’)◟ ⁾⁾

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

正直、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

です。

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