WordPressのマルチサイトで変数の返り値を見てみた

WordPressプラグインをマルチサイトに対応させるためのテストと結果をメモします。

前回は

少し前に、リンクをカード形式で表示させるWordPressプラグイン「Pz-LinkCard」をマルチサイトで動かしてみました。

[link url=”https://popozure.info/20160821/10780″]

マルチサイト対応に向かって、もう少しあれこれテストしてみます。

テストプログラム1

アクティベーションしたときに、マルチサイト向けの変数などで、「ネットワーク有効化」されたのか、各ブログで有効化されたのかを検知できるか試してみる。

テストプログラムのアクティベーション時に呼ばれるサブルーチンはこんな感じ。

[php start-line=”34″]public function activation() {
echo ‘activation<br>’;
echo ‘is_multisite()=’.is_multisite().'<br>’;
echo ‘is_main_site()=’.is_main_site().'<br>’;
global $current_site , $current_blog , $blog_id;
echo ‘current_site=’.$current_site.'<br>’;
echo ‘current_blog=’.$current_blog.'<br>’;
echo ‘blog_id=’.$blog_id.'<br>’;
}[/php]

結果はこんな感じ。

is_multisite() is_main_site()
ネットワーク有効化 1 1
メインサイト 1 1
サブサイト1 1 null
サブサイト2 1 null

「ネットワーク有効化」したときと、メインサイトで「有効化」したときの違いは分からなかった。

グローバル変数の「$current_blog」と「$blog_id」の組み合わせも試してみた。

activation
is_multisite()=1
is_main_site()=1
current_site=

WP_Network Object
(
    [id:WP_Network:private] => 1
    [domain] => application.secret.jp
    [path] => /
    [blog_id:WP_Network:private] => 1
    [cookie_domain] => application.secret.jp
    [site_name] => マルチサイトのテスト
)

current_blog=

WP_Site Object
(
    [blog_id] => 1
    [domain] => application.secret.jp
    [path] => /
    [site_id] => 1
    [registered] => 2016-08-20 17:04:05
    [last_updated] => 2016-08-31 13:01:22
    [public] => 0
    [archived] => 0
    [mature] => 0
    [spam] => 0
    [deleted] => 0
    [lang_id] => 0
)

blog_id=1

グローバル変数の「$current_site」は現在の「WP_Network Object」という表示どおり、「サイトネットワーク番号」を返す。複数のネットワークは実装されていないため、今のところ値は変動しないっぽい。

グローバル変数の「$current_blog」は「WP_Site Object」。現在の「サイト情報」を返す。

表示された内容だと、ネットワーク有効化したときと、メインサイトで有効化したときとで見分けられない気がした。

テストプログラム2

アクティベーションしたときに、update_site_optionとupdate_optionでオプションを設定して、どんな風に設定されたかで「ネットワーク有効化」されたのか子サイトで有効化されたのか検知してみようと思う。

テストプログラムのアクティベーション時に呼ばれるサブルーチンはこんな感じ。

[php start-line=”34″]public function activation() {
echo ‘activation<br>’;

$this->options = get_site_option(‘pz_test_options’, null );
$this->options[‘active’] = 1;
update_site_option(‘pz_test_options’, $this->options);

$this->options = get_option(‘pz_test_options’, null );
$this->options[‘active’] = 2;
update_option(‘pz_test_options’, $this->options);
}[/php]

結果としては、site_optionはサイト全体で共通のオプションで、シングルサイトのときはoptionをアクセスするけど、マルチサイトのときはoptionとは別扱い。

optionは各サイトのオプションだけど、「ネットワーク有効化」のときはメインサイト扱いだった。

そっちじゃない「ネットワーク有効化のみ」設定

プラグインのプログラムのヘッダー部に「Network: true」と記述すると、ネットワーク有効化のみができるようになり、サイトごとに有効化ができなくなります。

[php mark=”7″]<?php
/*
Plugin Name: Pz-Test
Plugin URI: http://popozure.info
Description:
Version: 0.0.1
Network: True
Author: poporon
Author URI: http://popozure.info
License: GPLv2 or later
*/

defined(‘ABSPATH’) || die;[/php]

「false」にすると各サイトでも有効化できるようになるだけで、「ネットワーク有効化」だけを禁止する記述は分かりませんでした。

収穫なしという収穫

理想としては「ネットワーク有効化」したときは、どのサイトからも同じキャッシュテーブルを利用して、各サイトから「有効化」したときは、それぞれのキャッシュテーブルを利用するという感じでした。

アクティベーション時にはupdate_site_optionでサイトオプションを保存しておいてDBのテーブル名も保存しておいて、普段はget_optionして見つからなかったらget_site_optionする感じにすれば実現できそうですが、マルチサイト向けのコードを沢山書くと、WordPressの仕様変更時の対応に追われそうです。

当面、「Pz-LinkCard」のマルチサイト正式対応は厳しいという状態で、各サイトごとに有効化するのをお勧めとしようと思います。→ver2.0.7で対応しました。

DBアクセスに失敗したらactivateのルーチンをまわすくらいの対応は考えたいと思います。→ver2.0.0で対応しました。

では、この辺で。(^-^)o

さくらレンタルサーバーからXSERVERへ移転してみた

XSERVERのキャンペーンでドメインも無料で付くというので新しいドメインを取得して移転してみました。

XSERVERを契約してみた

さくらインターネットはPHPがCGI型で動いているようで、モジュール型に比べると遅いようです。

CGI型の利点としてはCPU負荷などの統計が取りやすいことなどがあるようですが、当サイトのアクセス数が増えるにつれ、「そもそもちゃんと動かない」ことが増えてきてしまいました。

WordPressのアクセス数が多くても軽いという噂のXSERVERで一番安いX10プランでもドメインが1個プレゼントされるというので、契約してみました。

[link url=”https://popozure.info/20161220/10843″]

貰ったドメインを設定

ドメイン設定

XSERVERの「インフォパネル」から「サーバーパネル」、「ドメイン」メニューのところにある「ドメイン設定」と選んでいき、貰ったドメインを追加しておきます。

ここで登録したドメインを使用してアクセスできるようになるまで数時間~数日かかる場合があります。アクセスできないからといって焦らないようにしましょう。

WordPressのインストール

今度は「サーバーID」を選択して、「ホームページ」のところにある「自動インストール」で「WordPress」をインストールしておきます。

(WordPressを自動インストールしなくても、ディレクトリとDBを自分で用意すれば大丈夫ですが、自動インストールしちゃっておいた方が楽な気がします。)

SSLの設定

無料でSSLの設定が出来るので、SSL化もしておきます。

「ドメイン」のところにある「SSL設定」から「独自SSL設定の追加」からSSLも追加しておきます。

SSL対応の「https://」のアドレスでアクセスするのも数時間かかるようなので、のんびり待ちましょう。

WordPressのファイル群をコピー

FTP等を利用して、WordPressのディレクトリ内のファイルを移転元(今回はさくらインターネット)から全部ダウンロードします。

移転先の自動インストールされたWordPressのディレクトリに全部上書きコピーします。

特にwp-contentに入っている画像なんかはエクスポート/インポートでは移行されないので、ちゃんとダウンロードしておきましょう。

DBのエクスポート/インポート

さくらレンタルサーバーのコントロールパネルからphpMyAdminに入って、DBを選んで、エクスポートを選びます。

形式はSQL、圧縮はgzipにしておきました。(圧縮なしだとファイルが大きすぎたり、zipだと上手く取り込めなかったりするのでgzipがお勧め。)

 

phpMyAdminに入って、DBを選んでからインポート。先ほどエクスポートしたgzipのファイルを選択して実行します。

WordPressの自動インストールをしたときに作成されたテーブルたちを選択して削除します。

サイトURL、WordPress URLの変更

WordPressの「設定」→「一般」から変更する「WordPress アドレス (URL)」と「サイトアドレス (URL)」を設定する必要がありますが、すでに旧URLで設定されている状態なので、まだWordPressは開けません。

phpMyAdminの画面のまま、「wp1_options」を開きます。(「wp1_」の部分はサイトによって違います。)

「option_name」のところに「siteurl」と書いてあるものが「WordPressアドレス」、「home」と書いてあるものが「サイトアドレス」にあたるります。

「編集」を押してそれぞれ新しいURLに変更して、「実行」を押して変更していきます。

Search regexで記事内リンクの置き換え

ドメインを変更しないならば、このまま運用開始出来るのですが、今回はドメイン変更も行います。

画像のURLや、リンク先のURLは移転元のままなので、WordPressプラグイン「Search regex」を使用して、置き換えを行っていきます。

「Source」から「Post content」を選んで、投稿内容を置き換え対象にします。

「Search pattern」に置き換え前の文字。ここでは旧サイトのURLを入れます。

「Replace pattern」に置き換え後の文字。ここでは新サイトのURLを入れます。

「Replace」ボタンを押すと置き換えたときにどうなるかが表示されます。

しっかり置き換え前と後を見て、大丈夫そうであれば、「Replace&Save」を押すと、ちゃんと置き換えたもので更新してくれます。

置き換えを更新したあとは、そのまま元に戻すことは出来ないので運用中のWordPressで置き換えをするときには十分注意をしてください。

たとえば自分のサイトをSSL化したときに「http://」→「https://」というような置き換えをしてしまうと、他サイトへのリンクも置き換わってしまいます。

「http://poporon.poponet.jp」→「https://poporon.poponet.jp」というように、なるべく前後の文字を含めて置き換えを行いましょう。

Amazonアソシエイトリンクの修正

Amazonアソシエイトのリンク、特に昔貼ったリンクは「http://」になっているので、SSL化したあとに表示されなくなってしまいます。

これも「src=”http://rcm-jp.amazon.co.jp/」から「src=”//rcm-jp.amazon.co.jp/」に置き換える等しておきます。

動作確認

今まで使っていたファイルとDBをそのまま持ってきているので、テーマやプラグインもそのまま動いている状態だと思います。

やはり「さくらインターネット」だとphpがCGI型なので、モジュール型のプランが選べる方がWordPressは速いようです。

新しいドメインは無料で貰えて、SSL化もさくっと出来て、軽くなって、良かった良かった。

では、この辺で。(^-^)o



XSERVER契約してみた。今ならドメイン1個プレゼント!Σ(゚ロ゚)o

「安心さと快適さを兼備した高性能レンタルサーバー」といううたい文句の「XSERVER」を契約してみました。

(移転はもうちょっとしてから…。)

ドメインプレゼントキャンペーン中!

すでに2016年9月2日(金)12:00から始まっているキャンペーンで、12月23日(金)18:00までに契約すれば、独自ドメイン(.com/.net/.org/.biz/.infoからいずれ)を1個プレゼントしてくれます。【終了しました】

2017年1月11日(水)12:00から2017年2月28日(火)18:00までに契約すれば、独自ドメイン(.com/.net/.org/.biz/.infoからいずれ)を1個プレゼントしてくれるキャンペーンがまた始まりました!

[link url=”https://www.xserver.ne.jp/campaign/campaign_160902.php”]

36ヶ月契約で月額900円換算(12ヶ月だと月額1,000換算)になるX10プランでもドメインが1個プレゼント。

しかも、「今回ご契約のサーバーをご利用の間は更新費もずっと無料!」とのこと。

ちなみに、X20/X30プランは特典として「.com .net .org .biz .info な中から1つ無料で独自ドメインをプレゼント」というのがありますが、これとは別のキャンペーンみたいです。

つまり、通常はドメインを貰えない最安のX10プランでも独自ドメインが貰えちゃう!Σ(゚ロ゚)o゙

レンタルサーバーの契約を解除しない限り、未来に渡ってドメインの更新費もかからないってことなので、独自ドメインも欲しかった人は、ここがチャンスじゃないかなっ!?Σ(゚ロ゚)o゙

さっそく申し込み

現在のレンタルサーバーは「さくらインターネット」の「スタンダードプラン」です。

月額525円の安いプランなので、特に不満も無かったのですが、ずっとサイトが重くて重くて・・・。

「XSERVERの人はアクセス速いよなぁ」なんて思っていたところに、ドメインのキャンペーンもやっていたことに気付いて、今回申し込んでみました。

10日間の無料お試し期間

10日間の無料お試し期間がありますので、通常はWordPressを入れてみたり、他のことをしてみたり、あれこれ動きを確認します。

気に入ったら支払情報を入力して本契約します。

本契約、支払いの更新期間はどうする?

今回はドメインを取得しちゃうのもメインだったので、とっとと本契約しちゃいます。

と、その前に。

「取得したいドメイン名」がすでに誰かに取得されていないか確認しておきましょう。

サーバーを契約したけど、取りたいドメイン名は既に使用中だった…ということになりませんように…(^-^;

さて、「料金のお支払い」から、支払いをするプランにチェックを入れて、「更新期間」を選択して「お支払い方法を選択する」ボタンを押します。

初期手数料が3,000円かかり、月額1,000円×12か月分を足した15,000円(税込16,200円)が今回の支払い金額になります。

12か月だと月額換算で1,000円、36か月にすれば月額換算で900円と安くなるのですが、3年ごとに支払いが来るよりも、毎年均一の支払い額にしたかったので12か月にしました。

プラン X10
更新期間 12ヶ月 24ヶ月 36ヶ月
初期費 3,000円 3,000円 3,000円
月額 1,000円 950円 900円
支払金額 15,000円 25,800円 35,400円
(税込) (16,200円) (27,864円) (38,232円)

ちなみに、3年、6年運用したときの金額も表にしてみます。(税抜き)

12ヶ月 24ヶ月 36ヶ月
1年目 15,000円 25,800円 35,400円
2年目 12,000円 – –
3年目 12,000円 22,800円 –
4年目 12,000円 – 32,400円
5年目 12,000円 22,800円 –
6年目 12,000円 – –
合計 75,000円 71,400円 67,800円

6年間で税抜き7,200円の差が大きいと思う場合は36ヶ月更新も良いと思います。

本契約してキャンペーンドメイン取得

支払いをする前は、「プレゼントドメイン」を開いても、「キャンペーンドメイン」を開いても、対象のサーバIDを選択できない状態でした。

支払い登録をして本契約したところ、「キャンペーンドメイン」でドメイン名を選択する画面が出てきました。

「.com」「.net」「.org」「.biz」「.info」を組み合わせて、取得したい独自ドメイン名を登録します。

「ドメイン検索」を押して取得に問題が無ければ確認画面が表示されて、「キャンペーンドメイン申請」を押すと登録されます。

「キャンペーンドメインの取得を完了しました。」と表示されれば大丈夫です。

独自ドメインがDNSに反映されて利用できるようになるまで数時間かかる場合もあるので、すぐにブラウザに入力して表示されなくてもあわてないようにしましょう。

設定とかはまたゆっくり…

とりあえず、今回取得したドメインにアクセスできるところまでは確認できたのですが、設定とかはまたのんびりしていきたいと思います。

では、この辺で。(^-^)o



花王 食器用洗剤「キュキュット 詰め替え 1380ml」を買ってみた

詰め替え用食器用洗剤を購入しました。

詰め替え用を買ってみた

「【大容量】キュキュット 食器用洗剤 クリア除菌 グレープフルーツの香り 詰め替え 1380ml」を購入しました。

Amazonで698円でした。

[Pz-LkC][1.7.4]リンクをカード形式で表示するプラグイン更新。ドメイン名が取得できない不具合を修正。

リンクをカード形式で表示するWordPressプラグイン「Pz-LinkCard」。

最新版ver1.7.4を公式プラグインディレクトリで公開しました。

このプラグインについて

WordPressでリンクをブログカードっぽく表示したりするプラグインです。

[link url=”https://popozure.info/pz-linkcard”]

ショートコードを使用するタイプなので、面倒ではありますが今後同じような高機能なプラグインが見つかった場合、乗り換え易かったりします。

また、外観設定で色や枠線などをサイトのテーマなどに合わせることで親和性の高いリンク表示が出来ます。

ver1.7.3→ver1.7.4変更点など

今回は2016年8月22日に公開したver1.7.3に対する不具合修正(デバッグ)です。

[link url=”https://popozure.info/20160822/10911″]

新規インストールしたときにデータベースが作成されない不具合を修正

ver1.7.3にて、リンク切れ確認を行うための項目をデータベースに追加しましたが、記述ミスがあり、新規インストールしたときにキャッシュ用のデータベースが作成されない不具合が発生していました。

これにより、リンクカードを表示するたびにデータベースへのアクセスがタイムアウトになり、ページの表示が長時間になったりする不具合が発生していました。

前バージョンから使用している方はこの不具合は発生せず、発覚が遅れました。

新規インストールして「期待外れ」と感じてしまった方々には申し訳ありません。

その他

開発環境で開発を行ったあとに、当ブログ「ぽぽづれ。」に適用してから公式ディレクトリへリリースしているのですが、今回のバグは大きな不具合である上に自分のサイトでは発覚しなかったので情けないやらです。

あとは言い訳しか出てこないのでこの辺で。(T-T)o

メモリ増設してみた(子どもが)

子どものパソコンのメモリ増設をやってもらいました。

自分で組んだパソコン

長男は自分で組んだパソコンを使っています。

[link url=”https://popozure.info/20150624/7556″]

さすがにメモリ1GB×2=2GBでは辛かろうと思って、中古で8GBのメモリを1枚購入してきました。

さっそくメモリ増設

ぼくに言われるがままに、長男がケースを開けてメモリを交換。

差し替え完了です。

1枚差し替えたので、8GB+1GBで約9GBになりました。

動作確認

起動確認して問題なし。

動作も「気持ち」速くなったようです。

ぽぽろん「速くなったっていうよりも、遅くなりづらくなったと思うんだけど!Σ(゚ロ゚)o゙」
長男「確かに、待ち時間みたいなのがちょっと減った!Σ(゚ロ゚)o゙」

とりあえず8GBあれば当面は大丈夫でしょう。

スペック

現在のスペックです。

種別 外観 品名 備考 購入
ケース [amzn-img asin=”B00ASVJUDY”] Antec ISK-110 VESA ⇒Mini-ITX用ケース。電源内蔵。 2015/06/02 ¥13,824-
電源 (AcBel ADB002(90W))
マザーボード [amzn-img asin=”B00JRTNG2O”] GIGABYTE GA-E2100N ⇒Mini-ITX。CPUとGPUを統合した「E1-2100」搭載。 2015/04/24 ¥10,790-
CPU (AMD E1-2100 APU)
グラフィック (Radeon HD 8210)
メモリ [amzn-img asin=”B001KJX7FU”] ELIXIR W3U1333Q-1G(1GB) ⇒DDR3-1333(PC3-10600)。 2016/09/15
–
– Team TED38192M1333C9 8GB ⇒DDR3-1333(PC3-10600)。中古。 2016/09/15
¥3,980-
ドライブ [amzn-img asin=”B012BSHGNW”] SanDisk SSD 128GB ⇒SATA3(6Gbps)。128GB SSD。 2015/12/01
¥5,680-
光学ドライブ – – ⇒必要なときにぼくに借りる。 –
ディスプレイ [amzn-img asin=”B004KNXKY6″] SHARP LC-19K5B ⇒普通の19インチ地デジテレビ。 2011/05/04
¥29,400-
キーボード [amzn-img asin=”B00A7O7ZKC”] LOGICOOL ワイヤレスコンボ mk270 
(K270+M185 セット)
⇒ワイヤレス式のマウスとキーボードがセットになったやつ。Unifying対応。 2015/06/04
¥2,136-
マウス
無線LAN – (なし) ⇒無線だとレスポンスが悪いので有線LANに。 –
OS [amzn-img asin=”B00HSCH3GW”] Microsoft Windows 7 Home Premium SP1 DSP 64ビット – 2015/04/24
¥12,700-
その他 [amzn-img asin=”B00475S15U”] SATAケーブル  SATA2  ????/??/??
???-

結果は…?

さすがに「E1-2100」なので劇的に速くことはありませんでした。

しかししばらくこれで我慢して貰うしか…。

[Pz-LkC][1.7.3]リンクをカード形式で表示するプラグイン更新。ドメイン名が取得できない不具合を修正。

リンクをカード形式で表示するWordPressプラグイン「Pz-LinkCard」。

最新版ver1.7.3を公式プラグインディレクトリで公開しました。

ver1.7.2→ver1.7.3変更点など

2016年8月21日に公開したver1.7.2に対する不具合修正と、リンク切れ確認のためのデータベースの項目追加を行いました。

[link url=”https://popozure.info/20160821/10909″]

ドメイン名が取得できていない不具合を修正

ver1.7.1の修正によってドメイン名が上手く取得できなくなっていました。

これを修正しました。

アライブ確認のための準備

リンク切れを検出するためにデータベースに項目を追加しました。

設定画面に「リンク切れを確認する」の項目を追加しました。

Twitterのツイート数や、フェイスブックのシェア数、はてなブックマークのブックマーク数などのソーシャルカウントはWP-CRONという仕組みを使って、一定時間ごとに取得しています。

これと同様にWP-CRONを使って一定時間ごとにリンク切れが無いかチェックする仕組みを用意している途中です。

今回のバージョンでは設定項目はありますが、実際にリンク切れを検出したりお知らせする機能はありません。

その他

今回もほとんどが「不具合修正(デバッグ)」でした。(^-^;

リンク先が「403 Not Found」などになっている「リンク切れ」を検出する仕組みを実装する予定です。

今のところ試行錯誤中でソースにはリンク切れを検出しようとしている痕跡がありますが、まだ実装できていません。

では、この辺で。(^-^)o

[Pz-LkC][1.7.2]リンクをカード形式で表示するプラグイン更新。モバイル時の文字サイズ変更など。

リンクをカード形式で表示するWordPressプラグイン「Pz-LinkCard」。

最新版ver1.7.2を公式プラグインディレクトリで公開しました。

このプラグインについて

WordPressでリンクをブログカードっぽく表示したりするプラグインです。

[link url=”https://popozure.info/pz-linkcard”]

WordPress4.4でURLを直書きするとインラインフレーム(iframe)でカードっぽく表示される機能が実装されました。(リンク先もWordPress(4.4以上)である必要があったり、レイアウトの変更はスタイルシートをいじる必要があります。)

また、現在、当サイトでも使用している、わいひら(@MrYhira)氏作成のテーマ「Simplicityシリーズ」などでもブログカードの機能があります。

iframeタグを組み込むブックマークレットを使用する方法や、function.phpに組み込む方法など、リンク先をブログカードを表示する方法はいくつかあります。

そういったものを比べて自分の使い方とかに合った方を使うとよいと思います。

当プラグインの強みとしては、ショートコードはurlを指定するだけなので、今後同じような高機能なプラグインが見つかった場合、乗り換え易かったり、そのときの気分やテーマに合わせて一括に外観を変更できる点だと思います。

ver1.7.1→ver1.7.2変更点など

今回は2016年8月11日に公開したver1.7.1に対するマイナーバージョンアップで、不具合の修正が主な変更点となります。

[link url=”https://popozure.info/20160811/10773″]

WordPress 4.6での動作確認

最新のWordPress 4.6をインストールすることによる、Pz-LinkCardへの影響が無いことを確認しました。

幅に合わせてフォントも縮小

画面幅が狭いモバイル端末などで表示させたときにサムネイルが大きいままだったため、サムネイルとタイトルで表示スペースを大きくとっていたため、ver1.6.9で「幅に合わせて縮小」の機能を実装していました。

それでもタイトルの文字サイズが大きいと抜粋文が表示しきれないことがあったため、「幅に合わせて縮小」にチェックを入れると文字サイズも小さくなるように変更しました。

管理画面で記事内容を再取得したときのソーシャルカウント

「Pz カード管理」画面で「再取得」を押して、記事内容を再取得したときにソーシャルカウントがすべて「0」になってしまう不具合を修正しました。

内部リンクの画像が取得できない不具合を修正

ver1.7.1で記事内容の取得が失敗している記事のサムネイルを表示させないように変更していました。

この判断が誤っていたため、内部リンクはすべて記事内容の取得が失敗したかのようになっており、アイキャッチ画像(サムネイル)が表示されていませんでした。

これを修正しました。

マルチサイト対応の準備

設定値の取得と保管にget_option()関数、update_option()関数を使用していたのを、ver1.7.1にてget_site_option()関数、update_site_option()関数に変更しましたが、有効性が見いだせなかったため、元の状態に戻しました。

作者がWordPressマルチサイトに対する知識が不足しているため、もうしばらく先になりそうです。

「ネットワーク有効化」を行わず、サブサイトごとに「有効化」することで、とりあえず正常に使用できることを確認しています。

その他

今回もほとんどが「不具合修正(デバッグ)」でした。(^-^;

もうちょっと機能改善・機能追加を行いたいのですが、体力と知力が足りません。Σ(゚ロ゚)o゙

では、この辺で。(^-^)o

[Pz-LkC]Pz-LinkCardをWordPressマルチサイトで使ってみた

マルチサイトで動作検証してみた

リンクをカード形式で表示させるWordPressプラグイン「Pz-LinkCard Ver1.7.1.1」をWordPressマルチサイトで動作確認・動作検証してみました。

※この記事はPz-LinkCardを修正するにあたっての「覚え書き」という側面が強いので、読みやすいようには編集していませんが、同様のプラグイン作成者には参考になる可能性があります。

WordPressマルチサイトでの動作

WordPressには、WordPressを1つインストールしただけで複数の別のサイトを管理できる「マルチサイト」という機能があります。

直近のバージョンではだいぶ洗練されてきているようですが、通常のWordPressと違った注意点があったり、うまく動作しないプラグインがあったりすることから、自分も使ったことがありませんでした。

さて、当サイトでは「リンクをカード形式で表示するプラグイン Pz-LinkCard」を公開していますが、けっこうあちこちで使っていただき、中にはマルチサイトでも使用したいけどうまく動かないといった声がありました。

[link url=”http://www.forusoku.com/it/blog/wordpress/post-945″]

マルチサイト機能は知っていたものの、実際にその環境を作ったことが無かったので、「きっとマルチサイトでは不具合あるよなー」とは思っていましたが、一応動きはしているようなので、「思ったより対応してた!Σ(゚ロ゚)o゙」という感じです。

とりあえずどんな感じなのか分からないので、実際に環境を用意してみました。

マルチサイトを用意してみる

今のところ公開しているこのサイトと、開発・確認用のサイトが同じサーバーにあったので、色々テストをしていると公開している側も一緒に重くなってしまうことがあったので、「ロリポップ!レンタルサーバー」の月額250円の「ライトプラン」に契約してWordPressをインストール。

マルチサイト設定されたサイトを用意してみました。

超覚書き!Σ(゚ロ゚)o゙

  1. ロリポップ!レンタルサーバーでライトプランを契約する。
  2. 簡単インストールから「WordPress」をインストールする。
  3. FTPを開く。
  4. 「wp-config.php」のパーミッションが「400」になっているので「666」に変更。
  5. 「wp-config.php」にマルチサイト設定の行「define(‘WP_ALLOW_MULTISITE’, true);」を追加する。
  6. WordPress管理画面の「ツール」→「ネットワークの設置」を見ながら、「wp-config.php」と「.htaccess」を編集する。
  7. 「サイト」からテスト用サイトを追加していく。

こんな感じで用意しました。

[php title=”wp-config.php” start-line=”74″]define (‘WPLANG’, ‘ja’);
define(‘WP_DEBUG’, true);
define(‘WP_ALLOW_MULTISITE’, true);[/php]

言語設定の行の後ろにデバッグモードとマルチサイトの定義を追加。

公開するサイトはデバッグモードでは無い方が良いので、公開系の場合は「define(‘WP_DEBUG’, false);」にするか、この行を追加しない方が良いです。

自分はテスト用に用意した程度なので、詳しくは他サイトさんを検索されると良いと思います。

なお、下記サイトを参考にしました。

[link url=”http://webdesignerwork.jp/wordpress/multisite_blog/”]

[link url=”https://www.templateking.jp/practical/build/sub_dir.html”]

Pz-LinkCardのインストール

「サイトネットワーク管理者」のダッシュボード、「プラグイン」から「Pz-LinkCard」を検索して新規インストール。

「ネットワーク有効化」というのをすると、ぶらさがっているサイト全部でそのプラグインが有効化されるようです。

この「ネットワーク有効化」をしてみたところ、キャッシュ用のDBが用意されて、親サイト(メインサイト)では上手く動いたものの、子サイトを表示させたら「500エラー」(サーバーエラー)が発生してしまいました。

「ネットワーク停止」をしたあとに、「参加サイト」の各ダッシュボードで「有効化」を行ったところ、サイトごとにDBが作成されました。

プラグイン側では特に意識をしなくても有効化とかをしたサイトのDBが利用できるようです。

具体的には「$wpdb->prefix」をとったときに、たとえばDB接頭辞が「wp_」だった場合、メインサイトでは「wp_」、子サイトでは「wp_2_」「wp_3_」という値が戻ってきます。

「ネットワーク有効化」したときにはメインサイトと同じ「wp_」がとられてくるので、activate時にDBを生成している場合、1つしか用意されない結果になりました。

それぞれのサイトで有効化すると、それぞれのサイトでactivateが走るので、有効化時にDBが用意できるという感じです。

「ネットワーク有効化」した場合には自動的に「ネットワーク停止」して各サイトで「有効化」を促すメッセージが表示されると良いのですが、やり方がわかりませんでした。

マルチサイトが有効化になっているかどうかの判断

下記リンク先が詳しくて助かりました。

[link url=”http://nskw-style.com/2012/wordpress/ms/wpmu-global-variables.html”]

どうやら、WordPress関数の「is_multisite()」でマルチサイトが有効になっているかどうかの判断ができるようです。

[php]if ( is_multisite() ) {
echo ‘マルチサイトが有効です。’;
}[/php]

また、「is_main_site()」関数で、現在がメインサイトかどうかの判断ができるようです。

[php]if ( is_main_site() ) {
echo ‘現在、メインサイトで実行中です。’;
} else {
echo ‘現在、追加サイトで実行中です。’;
}[/php]

マルチサイトが有効で、メインサイトかどうかの判断は組み合わせることでできそうです。

「Pz-LinkCard」ではURLで自サイトの判断を行っているため、「サブディレクトリ型」を利用した場合にメインサイト以外の子サイトは「メインサイトの配下」になってしまい、記事IDが上手く取得できません。

メインサイトのときだけは記事IDが取得できなかったものは外部サイトと判断することで解決できそうな気がします。(2017/11/22 ver2.0.7 で対応しました)

[php]if ( is_multisite() ) {
if ( is_main_site() ) {
echo ‘マルチサイト有効かつメインサイトで実行中。’;
}
}[/php]

ただし、この方法だとカテゴリページやタグページ、トップページも記事IDが取得できないため、外部リンク扱いになってしまいます。(2017/8/1 ver2.0.1 で対応しました)

グローバル変数で実行中のサイトの判断

「$current_site」オブジェクトを参照すると「WP_Network Object」が返ってきます。

WordPressではサイトの集まりを「ネットワーク」と呼ぶようで、マルチサイト関連の機能が「ネットワーク設置」とか「ネットワーク設定」になっているようです。

つまり、「$current_site」は「現在のネットワーク」を取得できるようです。

マルチネットワークの機能は無いと思うので、将来拡張用かも知れません。

「current_site」じゃなくて「site_current」か「current_network」だったらもうちょっと分かり易かった気がします。

「$current_blog」オブジェクトを参照すると「WP_Site Object」が返ってきます。

同一「ネットワーク」配下のブログが「サイト」。つまりは「現在のサイト」が取得できるようです。

マルチサイトが有効化どうか、メインサイトかどうかは先ほどの関数で確認ができるので、グローバルを使う必要はあまり出てこないかも知れません。

むしろ、名前と実態がずれているので今後変更される可能性も…?

($WPMUクラスとかいうところで使ってるのかな?まあ、あんまり触りたいところでは無いですね…(^-^;)

get_optionとget_site_optionの違い

通常のシングルサイトであれば「get_option()」と「update_option()」、「delete_option()」でオプションの取得・更新・削除を行います。

「get_site_option()」と「update_site_option()」、「delete_site_option()」があるので、こちらがマルチサイト対応の関数かな?と思ったのですが、少々認識が誤っていました。

マルチサイトだとしても実行中のサイトの情報は「get_option」でそれぞれのサイトのオプションが取得できていました。

つまり、オプション取得に関してはマルチサイト対応は考慮しなくて良い感じです。

実際に格納されるDBはメインサイトならば「wp_options」(接頭辞が「wp_」の場合)、2つ目のサイト(1つ目の子サイト)ならば「wp_2_options」、3つ目のサイト(2つ目の子サイト)ならば「wp_3_options」といった感じです。

「get_site_option()」「update_site_option()」「delete_option()」の方は、「サイト」というか「ネットワーク」に対するオプションで、「wp_sitemeta」に格納されます。

どのサイトからアクセスしても同じ内容がかえってくるので、どのサイトでも設定を共有化したい場合は「get_site_option()」シリーズを使うと良いでしょう。

なお、シングルサイトで「get_site_option()」を使用すると「get_option()」の結果が戻ってくるようです。

この点、勘違いしていたため、マルチサイトで使用していた場合、Pz-LinkCard ver1.7.1からそれ以降に1.7.2に更新すると、いったん設定が初期化されます。ご了承ください…。

wp_upload_dir()も気にしないで良さそう

プラグインが格納されているディレクトリの中身は、プラグインを更新する度に一掃されます。

このため、スタイルシートを保存する場所として、プラグインのディレクトリは使用せず、アップロードディレクトリを使用しています。(画像などが保存されているディレクトリ配下)

これを取得するために「wp_upload_dir()」関数を使用しているのですが、メインサイトでは「/wp-content/uploads」が返され、2つ目のサイト(1つ目の子サイト)では「/wp-content/uploads/sites/2」が返され、3つ目の子サイト(2つ目の子サイト)では「/wp-content/uploads/site/3」が返されるので、プラグイン内では意識せずにディレクトリを分けてくれます。

テーマとプラグインをインストールする場所は共有されているので、「plugin_basename()」「plugin_dir_path()」「plugin_dir_url()」はどのサイトから見ても同じものが入っているようです。

テーマをサイトごとにカスタマイズしたいときは「子テーマ」をインストールして、それぞれのサイトにはそれぞれの子テーマを有効化すると良いでしょう。

プラグインをサイトごとにカスタマイズすることは少ないと思いますが、この場合には別ディレクトリに別プラグインとして名前を変更しておく必要があります。

まとめ

マルチサイトを意識して有効化(アクティベート)処理から停止(ディアクティベート)、削除(アンインストール)までを完全対応させるのはちょっと大変かなぁという気がしました。

とはいえ、基本的なWordPress関数を使っている限り、マルチサイトを意識しなくてもほとんどのプラグインはそのまま動作することが分かりました。

Pz-LinkCardも思ったより普通に動きそうということが分かりました。

ということで、「Pz-LinkCard」をマルチサイトで使用するにあたっての注意点です。

  • 有効化時にDBと初期設定を行うので各サイトから有効化する。
  • すでに「ネットワーク有効化」してしまった場合は、いったん「ネットワーク停止」してから、利用したい各サイトのプラグイン画面で「有効化」していく。
  • 設定はサイト毎に保存されるため、書式などもサイト毎になる。(ver1.7.1は不具合があるため、1.7.2以降で対応予定)
  • 記事内容をキャッシュしているDBも共有されずサイト毎になる。(キャッシュデータは共有するのがデータ節約になるとも思いましたが、「表示する抜粋文をサイトごとに分けたい場合」に対応できなくなるので、このままで良いと思います。)
  • URLの前方一致で内部リンクの判定を行っているため、サブディレクトリ式の場合は、子サイトは親サイトから見て内部サイトと判断されてしまう。
  • 子サイトから見ると「メインサイト(親サイト)」と他の「子サイト」は外部サイトになります。(URL前方一致のため)
  • サブドメイン方式ではURLがそもそも違うため、内部リンクと外部リンクの判断も正しく行えると思います。

一番大きいところはネットワーク管理者のダッシュボードのプラグイン画面から「ネットワーク有効化」しないところ。

メインサイトは上手く動いているようでも、子サイトはDBアクセスに失敗するためサイトそのものがうまく表示されなく場合があります。

「ネットワーク有効化」してしまっても、「ネットワーク停止」をしてから各サイトで有効化すれば大丈夫そうです。

DBの削除は「停止」時では無く、アンインストール時なので、メインサイトの分しか削除を考慮していません。

子サイトのキャッシュは「(接頭辞)_pz_linkcard」というテーブルが残ってしまいますので、気になる場合は手動で削除するしかありません。

プラグイン停止時にDBを削除してしまうと、不具合対応などで一時的にプラグインを停止したときに多量のキャッシュを失うこととなってしまうため、このタイミングは仕様です。

アンインストール時にマルチサイトの場合は消すようにすると良いのですが、不具合出すと返って大変なことになるので対応はまたいずれ…?

「マルチサイトで使用するとこんな不具合があった!」など、情報があれば、コメントやツイッターでお知らせいただけると嬉しいです。

また、過去バージョンでは上手く取得できていなかったものも最新バージョンでは取得できたりする可能性があるので、管理画面で再取得するか、キャッシュを削除してみてください。

では、この辺で。(^-^)o

↓続き

[link url=”https://popozure.info/20161230/10886″]