Moral Hazard!!

ドラマーが音楽やホームページやガラクタを作るよ。

外部WordPressサイトから投稿記事をRSSで読み込み、表示

No Comment wordpress,,

■やりたい事…Wordpressサイト1の投稿記事を、他サーバにあるWordpress2サイトで取得、表示。

同一DBサーバのWPから記事を持ってくる方法は他にあるみたいけど、設定が煩雑なのとDBサーバに外部接続用のユーザを作ったりしないといけないのでレンタルサーバでは荷が重いか。

今回はWordpress自体が出力しているRSSを取得・表示する方法。
(出典・モンキーレンチ様。こことかこことか)

<?php
include_once(ABSPATH . WPINC . '/feed.php');
$rss = fetch_feed('http://hogehoge.com/feed'); // RSSの取得元URL
if (!is_wp_error( $rss ) ) : $maxitems = $rss->get_item_quantity(3); // 記事数
	$rss_items = $rss->get_items(0, $maxitems); 
endif;
?>

<ul>
<?php
if ($maxitems == 0): echo '<li>記事はありません</li>';
else :
date_default_timezone_set('Asia/Tokyo');
foreach ( $rss_items as $item ) : ?>

<li><a href="<?php echo $item->get_permalink(); ?>" target="_blank" rel="bookmark"><?php echo $item->get_title(); ?>
<span class="news-date"><?php echo $item->get_date('(Y/m/d)'); ?></span></a>
</li>

<?php endforeach; ?>
<?php endif; ?>
</ul>

で可能。
ただ、上記でRSSを取得した場合、取得した側のWordpressで最大12時間のキャッシュが効いてしまって最新記事が取得できないことがある。
なので、取得先Wordpressサイト1のfunction.phpに追記して、キャッシュ時間を変更する。

return 数値を秒で指定する。30分なら1800を入力することで、30分ごとにRSSキャッシュを更新してくれる。

add_filter( 'wp_feed_cache_transient_lifetime', function(){'return 1800;';});

上記はPHP5.3から使用可能な無名関数を使用。
ちなみにそれ以前のverの場合は

add_filter( 'wp_feed_cache_transient_lifetime', create_function( '$a', 'return 1800;' ) );

と匿名関数(create_functionで定義)を使うか、

function return_rss_num() {
	return 3600;
}
add_filter( 'wp_feed_cache_transient_lifetime' , 'return_rss_num' );

関数を作って入れることになる。

匿名関数と無名関数の違いはこちら

PHP5.3以降を使用している場合は、PHPマニュアルにもあるように無名関数を使用したほうがよさそう。

警告 / この関数は、内部的に eval() を実行しているので、 eval() と同様にセキュリティ上のリスクがあります。 さらに、パフォーマンスやメモリ使用効率の面でも問題があります。
PHP 5.3.0 以降を使っている場合は、この関数ではなく、ネイティブの 無名関数 を使うべきです。(出典・PHPマニュアル)

他にも無名関数は匿名関数の倍の処理速度だそうで。

WordPress カスタムフィールドの日付を使って今月の投稿を取得

1 Comment wordpress,

前提:
ミュージシャンのライブスケジュール用に、
カスタムフィールド(key:live_date)にDATE型の値(yyyy-mm-dd)を入れている。
その値を元に、指定した範囲の投稿を取得。(今月のライブなど)

※Wordpressには投稿日時を指定するdate_queryというパラメータがあるが、投稿日時自体は予約投稿などに使いたいので、今回はカスタムフィールドにライブ日時を設定している。

カスタム投稿用のパラメータcompareで、BETWEENなどの演算子が使え、しかもtype='DATE'と指定する事で、yyyy-mm-ddをそのまま比較する事が出来る。
具体的には、

$args = array(
	'order' => ASC,
	'orderby' => 'meta_value',
    'meta_query' => array(
       'relation' => 'AND',
       array(
         'key' => 'live_date',
         'value'=>array( '2016-05-01', '2016-05-31' ), //ここに配列で範囲をDATE型で設定。
         'compare'=>'BETWEEN',
	 'type'=>'DATE'
       )
    )
);
$wp_query = new WP_Query($args);

みたいな形。
ほんと凄い進化だねwordpress。

WordPressを4.5.2にアップデートしたら同梱のjQuery1.12で構文エラー祭り

No Comment wordpress,

WordPressがXSS,SOME(Same Origin Method Execution)脆弱性に対するアップデートを4.5.2で行った事を受けて、管理サイトを全てアップデートしていったのだが、この4.5.2に同梱されているjQueryが1.12になった事でエラーチェックが厳密になり、今まで動作してくれていたページ内遷移やYoutubeAPIなどが動作しなくなって困った。


(function($){

$(function() {
$('a[href^="#"]:not([href$="#"])').click(function() {
var href = $(this).attr('href');
var pos = $(href).offset().top;
var duration = 200;
$('body, html').animate({ scrollTop: pos }, duration, 'swing');
return false;
});
});

})(jQuery);

jQuery1.2以降で動作するスムーズスクロール。
出典はXakuro Systemさま
ありがとうございます。
エラーの詳細はリンク先を。

さて、ここからが本題。

上記スクリプトではページ内遷移出来ないケースがいくつかあった。
まぁ自分が悪いのだが、一応備忘録。

■ページ内遷移でドメインを入れている

例) http://mysite.com の中で、ページ内リンクを http://mysite.com#page-link などドメインを付けてリンクしていた場合、1.12では動かない。

■リンクhtmlに半角スペースを入れてしまっていた

例)

<a href=" page-link ">

phpの記述が不味く、リンクタグの属性内に半角スペースが入ってしまっていた場合、1.12では動かない。

javascriptと正規表現はホント苦手…。

pTypeConverterで残ってしまったカテゴリを除去する方法(荒業)

No Comment wordpress

タイトルの通り。
pTypeConverterで通常の投稿(カテゴリ名"hoge"とする)をカスタム投稿に変換しても、カテゴリ情報は削除されない。
そのため、その後条件分岐でin_category("hoge")などで振り分けようとしても通常の投稿と一緒に、変更したカスタム投稿が引っかかってしまう。
そりゃそうっちゃそうなんだけど、古いWPでカテゴリ分けで作っていたものを、カスタム投稿に振り分けたいなんて案件はざらにある。

で、カスタム投稿にした投稿からカテゴリ情報を除去する為には、そのカスタム投稿に"categeory"というカスタムタクソノミを作ってやればいい。

	register_post_type( 'hoge',
        array(
        'labels' => array(
        'name' => __( 'カスタム投稿名' ),
        'singular_name' => __( 'カスタム投稿名' )
        ),
        'public' => true,
        'has_archive' => true,
        'menu_position' => 5,
		'supports'=> array('title', 'thumbnail', 'excerpt', 'editor') ,
        )
    );
	register_taxonomy(
		'category',
		'column',
		array(
		'hierarchical' => true,
		'update_count_callback' => '_update_post_term_count',
		'label' => 'カテゴリー',
		'singular_label' => 'カテゴリー',
		'public' => true,
		'show_ui' => true,
		'query_var' => true
		)
	);  

こんな感じでカスタム投稿名に「カテゴリ」というカスタムタクソノミを追加してやると、通常の投稿(post)と同じカテゴリーが表示される。
ここでカテゴリ情報を除去すると、MySQL内のカテゴリとの関連性を示す「wp_term_relationships」が除去される。
カテゴリーもカスタムタクソノミの一種ってことですね。
流石Wordpress。

管理画面でカテゴリやカスタムタクソノミにチェックが入って無かったらアラートを出す

No Comment wordpress,

とある案件で、管理画面からカスタム投稿記事を投稿する際に、カスタムタクソノミ(カスタム分類)にチェックが入って無ければアラートを出す、という機能が欲しくなった。

クライアントが投稿する時にチェックを忘れると、通常の投稿は自動的に一番上のカテゴリにチェックが入り、カスタム投稿の場合は、カスタムタクソノミが空白で投稿される。
投稿ミスで自動的にチェックを入れられると困る場合、空白だとサイト表示で困る場合が多いので、
これを防ぎたくて「管理画面のカスタム分類投稿ページ」を分岐させる方法を探して四苦八苦していたが結局なんともならず、フォーラムに投稿。
すると投稿当日にはもう解決案が投稿されてた。
有難うオープンソース、最高だwordpress。

https://gist.github.com/gatespace/11020994

回答者の方はgithubにUPしてくれてたけど、一応自サイトにもメモ。

/*
* WordPressの投稿作成画面で必須項目を作る(空欄ならJavaScriptのアラート)
*/
add_action( 'admin_head-post-new.php', 'mytheme_post_edit_required' ); // 新規投稿画面でフック
add_action( 'admin_head-post.php', 'mytheme_post_edit_required' ); // 投稿編集画面でフック
function mytheme_post_edit_required() {
?>
<script type="text/javascript">
jQuery(document).ready(function($){
if( 'post' == $('#post_type').val() || 'page' == $('#post_type').val() ){ // post_type 判定。例は投稿と固定ページ。カスタム投稿タイプは適宜追加
$("#post").submit(function(e){ // 更新あるいは下書き保存を押したとき
if('' == $('#title').val()) { // タイトル欄の場合
alert('タイトルを入力してください!');
$('.spinner').hide(); // spinnerアイコンを隠す
$('#publish').removeClass('button-primary-disabled'); // #publishからクラス削除
$('#title').focus(); // 入力欄にフォーカス
return false;
}
if($("#taxonomy-category input:checked").length < 1 ) { // カテゴリーがチェックされているかどうか。条件を要確認。普通は設定したカテゴリーになるから要らない
alert('カテゴリーを選択してください');
$('.spinner').hide();
$('#publish').removeClass('button-primary-disabled');
$('#taxonomy-category').focus();
return false;
}
if( $("#set-post-thumbnail img").length < 1 ) { // アイキャッチ画像
alert('アイキャッチ画像を設定してください!');
$('.spinner').hide();
$('#publish').removeClass('button-primary-disabled');
$('#set-post-thumbnail').focus();
return false;
}
});
}
});
</script>
<?php
}

という事。
実際にはカスタム投稿の場合は、2か所ある#taxonomy-category となっている部分を #taxonomy-tax名 に変更して使用する。
これで投稿時カテゴリー(or カスタムタクソノミ)にチェックが入って無ければアラートが出て、チェックを入れないと投稿できなくなる。

殴り書きで文章変だけれども、自分用メモという事で。