Google XML Sitemaps に独自のページを追加する方法

Google XML Sitemaps 利用時に、WordPressに依存しない、独自に用意したURLを追加する方法です。
Google XML Sitemapsには、sm_buildmap というアクションフックが用意されているのでそれを利用します。

add_action('sm_buildmap', array($this,'addSitemapGXS'));

function addSitemapGXS(){
	$generatorObject = &GoogleSitemapGenerator::GetInstance();
	if ( $generatorObject!=null ) {
		$generatorObject->AddUrl("http://hogehoge.com/test.html", "2015-04-13", "daily", 0.5);
	}
  }
}


AddUrl メソッドで指定された情報が、sitemap-misc.xml に追加されます。

Breadcrumb NavXT で独自の項目を追加する

独自のページが有る場合、 Breadcrumb NavXT 導入時に、パンくずリストにそのページを追加する方法を調べました。

Breadcrumb NavXT には、アクションフックが二つ用意されています。

add_action('bcn_before_fill', 'my_filter_breadcrumbs_before');
add_action('bcn_after_fill', 'my_filter_breadcrumbs_after');

bcn_before_fill は、パンくずリスト生成前、 bcn_after_fillは、パンくずリスト生成後のアクションフックです。
パンくずリストを追加することを考えますので、bcn_after_fillを使います。

以下の例は、とあるページ(投稿ページ、固定ページなど)にitemnameというクエリパラメータがついていたら、そのページ下層の独自ページとする。
という前提です。(例 http://test.com/?p=123&itemname=あいうえお)

add_action('bcn_after_fill', 'my_filter_breadcrumbs_after');
function my_filter_breadcrumbs_after($bcnObj) {
	if ( count($bcnObj->trail) > 0 ) {
		$itemname = htmlspecialchars($_GET["itemname"]);
		if ($itemname){
			//独自ページのパンくず生成
			$trail_add[0] = clone $bcnObj->trail[0];//クローンを用意 ※1
			$trail_add[0]->set_title($itemname);//タイトルを設定 ※2
			if($bcnObj->opt['bcurrent_item_linked']){// ※3
				$query = array('itemname' => $itemname);
				$seturl = add_query_arg( $query , get_permalink()) ;
				$trail_add[0]-> set_url($seturl);// ※4
			}else{
				//親ページをリンク付きに変更
				$bcnObj->trail[0]->set_url(get_permalink());//URLを設定 ※5
				$bcnObj->trail[0]->set_template($bcnObj->opt['Hpost_post_template']);//テンプレートを設定 ※6
			}
			$bcnObj->trail = array_merge ($trail_add, $bcnObj->trail);//ここでマージ ※7
		}
	}
	return $bcnObj;
}


フックで受け取った変数$bcnObjにパンくずの情報が入っています。
$bcnObj->opt にBreadcrumb NavXTの設定ページした情報が入っています。
$bcnObj->trail に表示するパンくずが配列で入っています。

$bcnObj->trail[0] が一番右側で、 ホーム > 親ページ > 投稿ページ のようなパンくずリストの場合、 $bcnObj->trail[2] > $bcnObj->trail[1] > $bcnObj->trail[0] という感じになっています。
そこで、一番右にパンくずを追加したいのなら、[0]のところにもう一つ挿入すればいいということになります。

ホーム > 親ページ > 投稿ページ > あいうえお

$bcnObj->trail[3] > $bcnObj->trail[2] > $bcnObj->trail[1] > $bcnObj->trail[0]

なので、$bcnObj->trail[0] からクローンを取り出して、(※1) タイトルを設定して、(※2 例ではクエリパラメータをそのまま突っ込んでます。) 内容を書き換えて、マージするようにしてみました。(※7)

設定で、「現在のページを示す項目にリンクを張る」がONの場合(※3)は、独自ページのところにもリンクを追加したいので、set_urlメソッドで独自ページのリンクを追加します。(※4)

その一方、「現在のページを示す項目にリンクを張る」がOFFの場合は、本来の現在のページにはリンクがついていないので追加します。(※5)

set_template関数でパンくずのテンプレートを設定しますが、$bcnObj->opt['Hpost_post_template'] はBreadcrumb NavXTの設定にある、投稿タイプの投稿テンプレートです。(※6) (その他のテンプレートは、プラグインのclass.bcn_breadcrumb_trail.php にありますが、設定ページのソースコード(HTML)を覗いても大体わかります。)

参考: http://notnil-creative.com/blog/archives/981 http://tenman.info/labo/snip/archives/3761

 

the_titleフィルターフックをつかうと、関係のないメニュータイトルなんかも変わってしまうのを避ける方法

WordPressでタイトルを加工するときなんかに、フィルターフックの the_title を使うわけですが、 目的のページのタイトル以外のメニューまで変わってしまって、ぷちはまってしまったのでメモ。

add_filter( 'the_title', 'modify_single_post_entry_titles' );
function modify_single_post_entry_titles( $title ) {
    if ( is_singular() && in_the_loop() ) {
        /* Modify $title */
    }
    return $title;
}

is_singular() と、 in_the_loop() を入れておくのがポイントですね。

参考:https://codex.wordpress.org/Function_Reference/in_the_loop

WordPressでバックグラウンド処理

WordPressで重たい処理をさせようとすると、表示に時間がかかってよろしくありません。

そこで、バックグラウンドで処理させたいときは、wp_schedule_single_eventを使います。

https://wpdocs.osdn.jp/関数リファレンス/wp_schedule_single_event

まず、バックグラウンドで処理したいことを登録。

//バックグラウンドで処理させたいこと
    function do_background() {
      //ここにやりたいことを入れる
      file_put_contents('do_this_in_an_hour.txt' , time());
    }
    add_action('my_background_event' , 'do_background'));

これでバックグラウンド処理始動。

wp_schedule_single_event(time(), 'my_background_event');
     spawn_cron( time() );

なので、

    //コンテンツを表示するとき
    function my_the_content($the_content) {
      wp_schedule_single_event(time(), 'my_background_event');
      spawn_cron( time() );//すぐやる
      return $the_content;
    }
    add_filter('the_content' , 'my_the_content');

    //バックグラウンドで処理させたいこと
    function do_background() {
      file_put_contents('do_this_in_an_hour.txt' , time());
    }
    add_action('my_background_event' , 'do_background'));

とすることで、コンテンツを表示する度にバックグラウンドでやりたいことを動作させられる。
(ただし、spawn_cron( time() ); としても、60秒に一回しか処理しない)

プラグインを一括でインストール【Multi Plugin Installer】

WordPressのプラグインを一括でインストールできるプラグインです。

以前は「Bulk Plugin Installation」を使っていたのですが、WordPress4.0以降では利用できなくなってしまったので、代わりに導入したのが、Multi Plugin Installer です。

「Bulk Plugin Installation」 はプラグインのインストール画面で利用できていたのですが、WordPress4.0以降では、その画面がなくなってしまい、結果として利用できなくなってしまいました。
ということで、「Multi Plugin Installer」を利用します。

まずはプラグインのインストールから。    

プラグイン→新規追加 をクリックしてから、「Multi Plugin Installer」を入力してEnterキーを押します。
1504090001

「Multi Plugin Installer」が見つかったら、いますぐインストールをクリックします。
1504090002

OKをクリックします。
1504090003

有効化 をクリックして準備完了!
1504090004

Multi Plugin Installer をクリックして、インストールしたいプラグインを入れ、[Install & Activate plugins »]ボタンをクリックします。
1504090005

これで、一斉にプラグインをインストール&有効化できます。