2016年12月28日水曜日

【備忘録】WordPress で特定カテゴリーに限定した月別アーカイブの出し方

特定カテゴリの月別アーカイブを表示したいです(WordPerss.org フォーラム)に触発されて、久々にSQL文にチャレンジしたと思っていろいろやっていたら出来たようなので、メモっておきます。なお考えたのはデータの取得までで、表示は上記フォーラムのものをそのまま使っています。

最初にコード全体を見せて、次にそれぞれの説明をしていきます。

参考情報




コード


青文字が考えた部分です。それ以外は変更していません。

<?php // カテゴリーなし(slug名)のみの月別アーカイブ表示

$year_prev = null;
$slug = 'カテゴリーなし';

// 日本語のエンコード処理
$slug = urlencode($slug);
// エンコードした場合、%が入る。SQLでは %は %% とエスケープが必要
if(preg_match("/%/", $slug)):
  $slug = str_replace('%','%%', $slug);
endif;

// SQLクエリ
$query = $wpdb->prepare("SELECT DISTINCT MONTH( post_date ) AS month ,
YEAR( post_date ) AS year,
COUNT( id ) as post_count FROM $wpdb->posts
WHERE post_status = 'publish' and post_date <= now( )
and post_type = 'post'
and id IN(
SELECT object_id FROM wp_term_relationships
WHERE term_taxonomy_id = (
SELECT term_taxonomy_id FROM wp_term_taxonomy AS tt
INNER JOIN wp_terms AS tm ON tt.term_id = tm.term_id
WHERE tm.slug = '%s'

)
GROUP BY month , year
ORDER BY post_date DESC",$slug);


$months = $wpdb->get_results($query);

foreach($months as $month) :
$year_current = $month->year;
if ($year_current != $year_prev){
if ($year_prev != null){?>
</ul>
<?php } ?>
<h3><?php echo $month->year; ?></h3>
<ul class="archive-list">
<?php } ?>
<li>
        <a href="<?php bloginfo('url') ?>/<?php echo $month->year; ?>/<?php echo date("m", mktime(0, 0, 0, $month->month, 1, $month->year)) ?>"> <span class="archive-month"><?php echo date("n月", mktime(0, 0, 0, $month->month, 1, $month->year)) ?></span> </a>
</li>
<?php $year_prev = $year_current;
endforeach; ?>
</ul>

以下、青色部分について説明していきたいと思います。

2016年12月8日木曜日

【備忘録】StaticPress プラグインを BASIC認証下の WordPress サイトで利用する場合の注意点

まぁ既出の問題らしいのですが、プラグイン本体の書き換えが必要なので、その方法をメモ。問題は下記で報告しておきました。


問題


WordPress 4.7で確認。
Basic認証しているサイトの場合、 StaticPress の BASIC認証のオプション設定をしたとしても、HTMLファイルが出力されない。

修正


includes/class-static_press_admin.php

static public function basic_auth(){
// return get_option(self::OPTION_STATIC_BASIC, false);
return 'ID:PASS(BASE64への変換が必要)';
}

と直接 BASIC認証のデータを ID:PASS でBASE64エンコードで入れるというもの
Macをお使いなら、ターミナルから

echo 'hogehoge:hogegegege' | base64

でBASE64エンコードできます。
あるいは
などのウェブサービスをつかうとよいです。

2016年12月8日 @kimipooh