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

購読者(Subscriber)に非公開投稿・固定ページを閲覧させる方法

本来、WordPressの非公開設定中の投稿・固定ページは管理者・編集者のみが閲覧可能で、購読者には権限が与えられていません。
そのため、購読者に非公開ページを閲覧させたい・・・という場合に有効な方法になります。

ざっくりやることとしては、プラグインを自作してそれのオンオフで権限の付与・解除を行います。
今回はこういう感じでプラグインを作っています。

  1. Readable-Subscriberという名前でフォルダを作る
  2. Readable-Subscriber.phpというファイルを作る
  3. 2.で作ったファイルにあとで記すコードを記載
  4. wp-content/plugins/の中に1.のフォルダをアップロード
  5. ダッシュボードでプラグイン有効化

<コード>

※固定ページを閲覧させたい場合・・・read_private_pages
※投稿を閲覧させたい場合・・・read_private_posts

<?php
/*
Plugin Name: Readable Subscriber
Version: 0.0.1
*/

/**
* ReadableSubscriber : プラグイン有効時、非公開記事 ( private posts ) を購読者 ( subscriber ) でも閲覧可能にする。無効時、その権限を削除する
*/
class ReadableSubscriber
{
protected $role = 'subscriber';
protected $privilege = 'read_private_posts';

/**
* __construct : コンストラクタ。プラグイン有効時・無効時をトリガーにして対応するメソッドを呼ぶ
*
*/
public function __construct() {
// 有効化の際に発動
register_activation_hook(
__FILE__,
[
$this,
'addReadPrivilege',
]
);
// 無効化の際に発動
register_deactivation_hook(
__FILE__,
[
$this,
'removeReadPrivilege',
]
);
}

/**
* addReadPrivilege : 購読者にも非公開記事を閲覧する権限を付与
*
*/
public function addReadPrivilege ()
{
$subscriber = get_role( $this->role );
$subscriber->add_cap( $this->privilege );
}
/**
* removeReadPrivilege : 購読者から非公開記事を閲覧する権限を剥奪
*
*/
public function removeReadPrivilege ()
{
$subscriber = get_role( $this->role );
$subscriber->remove_cap( $this->privilege );
}
}

// instantiate
$ReadableSubscriber = new ReadableSubscriber();

 

特定のディレクトリだけPHPバージョンを変える方法

さくらインターネットにて、特定のディレクトリ(サイト)だけPHP5.2で動かしたいときの方法です。
(さくらインターネットコントロールパネル上の全体のPHPバージョン設定は7.4です)

【用意するファイル】

php.cgi
.htaccess

php.cgiの中身

#!/bin/sh
#exec /usr/local/php/5.6/bin/php-cgi
#exec /usr/local/php/5.4/bin/php-cgi
#exec /usr/local/php/5.3/bin/php-cgi
exec /usr/local/php/5.2/bin/php-cgi
#exec /usr/local/php/4.4/bin/php-cgi

文字コードをUTF-8かEUC-JPにしないと500エラーになるって聞いたけど、SJISでも動きました。
パーミッションだけ755にするのを忘れない。

.htaccessの中身

Action myphp-script /php.cgi
AddHandler myphp-script .php .html

新しく.htaccess作るか、既存だったら追記する。

これらをサーバーに上げると、任意のPHPバージョンを使うことができる。

なんか投稿がうまく出ないときの最強記述

ショートコードとかで外部PHPから投稿一覧出力の記述を読み込んだ時に、何故かその出力させたページのタイトルがお知らせ一覧に出る!なんで!?!?
ということで、恐らくその外部PHPを包んでるPHPとの兼ね合いとかだと思うんですけど、まあなんというかこれで上手くいったので貼っておきます。
なんでかな~・・?

<?php
$args = array(
'post_type' => 'post',
'posts_per_page' => 10
);
$st_query = new WP_Query( $args );
?>
<?php if ( $st_query->have_posts() ): ?>
<?php while ( $st_query->have_posts() ) : $st_query->the_post(); ?>
<?php the_time( 'Y年m月d日' ); ?><br />
<a href="<?php the_permalink(); ?>"><?php the_title(); ?></a><br />
<?php endwhile; ?>
<?php else: ?>
<p>新しい記事はありません</p>
<?php endif; ?>

固定ページにページャー作成する

これはホントに保存版。
固定ページに投稿一覧を出力してページャー作成したいときって、なんでいつもこんなに時間がかかるんだろう・・
ってくらいうまく行かない!!!ということで我ながらカスタマイズして動いたものをどうぞ。

これを固定ページにインクルードして読み込む。

備忘録なので、「posts_per_page」とか「cat」とか、出力されるループ処理とかは適宜変えるとよろしい。

<?php
$paged = (int) get_query_var('paged');

$args = array(
'posts_per_page' => 10,
'cat' => 3,
'orderby' => 'post_date',
'order' => 'DESC',
'post_type' => 'post',
'post_status' => 'publish'
);
$the_query = new WP_Query($args);

if ($the_query->have_posts()) : while ($the_query->have_posts()) : $the_query->the_post();
?>
<dl>
<dt><i class="far fa-calendar-alt"></i><?php echo get_the_date('Y年m月d日'); ?></dt>
<dd>
<a href="<?php the_permalink() ?>"><?php the_title(); ?></a>
</dd>
</dl>

<?php endwhile; else: ?>
<p><?php echo "お探しの記事、ページは見つかりませんでした。"; ?></p>
<?php endif; ?>

<?php
if ($the_query->max_num_pages > 1) {
echo paginate_links(array(
'base' => get_pagenum_link(1) . '%_%',
'format' => 'page/%#%/',
'current' => max(1, $paged),
'total' => $the_query->max_num_pages
));
}
wp_reset_postdata();
?>

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(); ?>">

おわり。

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(); ?>

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

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

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

<?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

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