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

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

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

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

WordPressマルチサイトでの動作

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

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

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

マルチサイト機能は知っていたものの、実際にその環境を作ったことが無かったので、「きっとマルチサイトでは不具合あるよなー」とは思っていましたが、一応動きはしているようなので、「思ったより対応してた!Σ(゚ロ゚)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. 「サイト」からテスト用サイトを追加していく。

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

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

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

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

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

Pz-LinkCardのインストール

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

メインサイトのときだけは記事IDが取得できなかったものは外部サイトと判断することで解決できそうな気がします。

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

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

「$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

広告

『[Pz-LkC]Pz-LinkCardをWordPressマルチサイトで使ってみた』へのコメント

  1. 名前:ダニエル 投稿日:2016/09/14(水) 09:30:29 ID:589cff6af 返信

    すみません、

    pz-linkcardを使わせていただいているのですが
    (テーマ:hueman)

    「ショートコードで囲んだ文字列」を、
    「抜粋文として使用」を選択し、
    [blogcard url=””](抜粋文として使用したい文章)[/blogcard]
    としているのですが

    カードに表示される抜粋文が、リンク先記事の冒頭部のまま、
    変わりません。

    「抜粋文が設定されている投稿はそちらを優先する」
    等にもしているのですが
    変わらず。

    試しに、「抜粋文として使用」ではなく
    「タイトルとして使用」にもしてみたのですが
    これも、タイトルが変わることはありませんでした。

    ツール→pg管理画面、を見ると
    現在、記事中に2つ、リンクカードを設置しているものの
    一覧に何も表示されない(キャッシュが1つもされていない)
    状態になっていることが
    何か関係あるのでしょうか。

    抜粋文として、記事の冒頭ではなく
    meta descriptionを使用したく思っており
    質問をさせていただいております。

    何卒、よろしくお願いいたします。

    • 名前:ぽぽろん 投稿日:2016/09/15(木) 01:26:43 ID:f6f0cc755 返信

      ダニエルさん、ご利用&コメントありがとうございます。

      土日になってしまうと思いますが調査したいと思います。
      もし可能であれば、ブログのURLとリンク先URLを教えていただけると助かります。
      広める段階で無いサイトだったりする場合は、ツイッターのDMでも大丈夫です!
      @popozure もしくは @popo68k あてに教えていただけると助かります。

    • 名前:ぽぽろん 投稿日:2016/09/15(木) 01:28:30 ID:f6f0cc755 返信

      現在、meta descriptionからは取得してこない仕様となっておりますが、他の方からも要望としてあがっているため設定を追加したいと考えています。

  2. 名前:hiro 投稿日:2016/09/16(金) 12:28:52 ID:757899c83 返信

    ページの先頭に、
    そのページにリンクカードを設置している数だけ、
    「Warning: mysqli_num_fields() expects parameter 1 to be mysqli_result, boolean given in /home/(サイト名)/public_html/wp-includes/wp-db.php on line 3078」
    というメッセージが出ます。
    これは治す方法はありますか?

    • 名前:ぽぽろん 投稿日:2016/09/16(金) 22:03:24 ID:c5a25c59c 返信

      hiroさん、ご利用&コメントありがとうございます。

      同様のワーニング(警告)の報告があり原因が分かればプログラム修正を行いたいところですが、こちらのサーバーだとこのワーニングは表示されない状態です。

      そして、「ワーニング(警告)」というのは通常運用しているサーバーでは発生しても表示させないようにするのが推奨されています。
      レンタルサーバーのphp.iniの設定という項目があれば、ワーニングを表示しない設定にするのがお勧めです。
      https://www.xserver.ne.jp/manual/man_server_phpini_setting_item.php

    • 名前:ぽぽろん 投稿日:2016/09/16(金) 22:10:42 ID:c5a25c59c 返信

      プログラム側で対応できそうなので、次バージョンにて対応してみようと思います。もうしばらくお待ちください。

      修正できる方は、「pz-linkcard.php」の

      global $wpdb;

      という行があったら、

      global $wpdb;
      $wpdb->hide_errors();

      と、後ろの行に追記すると大丈夫かも知れません。

      これは警告を表示しないだけの対応なので、次バージョンでは警告そのものを発生しないように修正したいと考えています。

      • 名前:hiro 投稿日:2016/09/16(金) 23:51:52 ID:757899c83 返信

        ありがとうございます。
        とりあえず、php.ini設定で、
        display errors をoffにしてみました。

        サイトの編集をしているIEではwarningは出ず、
        スマホやChromeを使って閲覧しているときだけ
        warningが出るという状態ですが
        解決することを祈ります。

        • 名前:ぽぽろん 投稿日:2016/09/17(土) 13:34:21 ID:449a1dde5 返信

          一部対応できたようで良かったです。

          ワーニングなどのエラーが表示されているのはあまりよく無いので対応頑張ります。

  3. 名前:ぽぽろん 投稿日:2016/09/19(月) 22:12:04 ID:7324998ed 返信

    製作者体調不良につき、この3連休は修正できませんでした(^-^;
    時間が取れるときに少しずつ対応していく予定です。

  4. 名前:punch 投稿日:2016/09/30(金) 17:32:39 ID:d9820adb8 返信

    ぽぽろん様

    pz-linkcardを使わせてインストールさせて頂きました。
    とても便利なプラグイン、ありがとうございます!

    そのままでは動かない箇所がありました。
    以下の修正をすることで動くようになりましたので、
    ご参考になればと思いご連絡をさせて頂きました。

    ・pz-linkcardバージョン
    1.7.3

    ・事象
    DBキャッシュ用のテーブルが作成されない

    ・修正箇所
    「pz-linkcard.php」のSQL作成部分にて、以下を修正
    1161行目:VARCGAR(32) → VARCHAR(32)
    1175行目:update → `update`

    ・当方MySQLバージョン
    5.6.32-78.1

    既出の問題でしたらすみません。
    ご参考になればと幸いです。

    よろしくお願いします。

    • 名前:punch 投稿日:2016/09/30(金) 17:35:52 ID:d9820adb8 返信

      編集中にポストしてしまいました。。
      ところどころおかしな日本語になってしまい、申し訳ございません。

      内容は伝わるかなと思いますので、よろしくお願いします。

    • 名前:ぽぽろん 投稿日:2016/10/01(土) 08:53:24 ID:9d6c67319 返信

      punchさん、ご利用&コメントありがとうございます。

      新規インストールするテストを失念していたため気付けていませんでした。次のバージョンアップで反映させていただきます。(^-^)o

      • 名前:匿名 投稿日:2016/10/06(木) 14:18:19 ID:70f7be9f2 返信

        ぽぽろん様

        pz-linkcardをマルチサイトにて使用させて頂こうと思いまして、インストールしたところDBキャッシュへの出力が動作しなかったため、こちらのサイトにたどり着きました。

        ネットワークの有効化をやり直してもできませんでしたが、punch様が記載されていたとおり修正したところ、動作するようになりました。
        ありがとうございます。

        しかしながら、サムネイルの取得、ショートコードで囲んだ文字列の抜粋文としての使用の動作ができません。

        修正する方法があれば、ご指導頂けましたら幸いです。

        また、次のバージョンアップを期待しております。

        • 名前:ぽぽろん 投稿日:2016/10/06(木) 20:46:09 ID:e2ce3b608 返信

          ゲストさん、コメントありがとうございます。

          DB定義については完全に不具合なので早めの対応をしたいと考えています。ショートコードで囲んだ文字列についてはこちらでも調査してみます。
          参考までに記述方法なども教えていただけると助かります。

          • 名前:匿名 投稿日:2016/10/06(木) 22:43:06 ID:70f7be9f2 返信

            ぽぽろん様

            早速のご返答ありがとうございます。
            私の環境では、マルチサイトのサブディレクトリ型で運用しています。

            ・サムネイルに関してはメインサイトでは問題なく動作しますが、サブディレクトリのサイトでは表示されません。

            ・ショートコードに関しては、どちらとも動作しません。
            設定→pzカード設定を開き、
            リンクカード設定の基本設定の

            ショートコードで囲んだ文字列 [blogcard url=”xxx”] 抜粋文として使用 [/blogcard]
            ショートコード1にのみ適用されます

            を設定して、記事に
            [blogcard url=”http://省略”]テスト文字列[/blogcard]
            と記述したところ、ブログカードは表示されましたが、抜粋文には反映されませんでした。

            以上よろしくお願いいたします。

  5. 名前:青山 投稿日:2016/12/06(火) 00:25:30 ID:25b78bed9 返信

    お世話になっています。

    Pz-link cardを導入させていただきました。
    見栄えがとても良くなり、嬉しいです。

    不具合とリクエストをご報告させてください。

    不具合:
    スマホで表示した時、抜粋文が枠におさまり切らず、見えなくなってしまいます。PCでは問題ありません。環境に依存せずに枠内に抜粋文を収める方法があればご教示ください。

    機能のリクエスト:
    link card内の画像に、記事のアイキャッチ画像を設定したいです。現状のリンク先ページのスクリーンショットですと、圧縮されてサムネイルがぼやけた感じになってしまいます。

    以上、コードの分からない初心者なので稚拙な内容かもしれませんが、
    ご検討のほど宜しくお願いいたします。

    • 名前:ぽぽろん 投稿日:2016/12/08(木) 20:08:16 ID:1b1f2155a 返信

      青山さん、コメントありがとうございます。
      そして、プラグインの利用、ありがとうございます。

      スマホで表示されたときに画像を小さく表示させる機能があります。
      WordPress管理画面から「設定」→「Pz カード設定」と入って、「外観設定」の「サムネイル」の「幅に合わせて縮小」にチェックを入れてみてください。
      モバイル端末で表示した際に画像と文字が少しだけ小さくなります。
      こちらの設定で足りないようでしたら、またご相談くださいませ。(^-^)o

      外部リンクのリンク先のアイキャッチ画像を表示するプラグインやWebサービスがあれば、設定できるようにしたいと思っています。
      直接リンク先のアイキャッチ画像を表示する機能は作れるのですが、リンク先サイトに負担がかかってしまうため、実装は見合わせています。お役に立てずすいません・・・。(>_<)

      • 名前:青山 投稿日:2016/12/08(木) 23:14:35 ID:0a6efbb69 返信

        ぽぽろん 様

        ご回答ありがとうございます。
        仰せのとおり設定したところ、スマホでも切れることなく表示できるようになりました。とてもうれしいです。

        >外部リンクのリンク先のアイキャッチ画像を表示するプラグインやWebサービ>スがあれば、設定できるようにしたいと思っています。
        >直接リンク先のアイキャッチ画像を表示する機能は作れるのですが、リンク先>サイトに負担がかかってしまうため、実装は見合わせています。お役に立てず>すいません・・・。(>_<)

        こちらこそ無知なので事情を知らずリクエストしてしまいました。あればいいなあ、くらいの気持ちでお願いしたので、気にしないでください。

        • 名前:ぽぽろん 投稿日:2016/12/10(土) 23:05:42 ID:2f4e81eac 返信

          返信ありがとうございます。

          表示ができるようになったようでとにかく良かったです。
          どこがどのくらい簡単に直せるかや、どのくらい難しいかは製作者にしか分からないと思うので、要望とかはどんどん言ってくださると良いと思います。
          また、お気づきの点などあれば、お気軽にどうぞ。(^-^)o