WPプラグイン – 更新中にエラーが発生しました: ダウンロードに失敗しました。 Unauthorized

WordPressプラグインを更新したところ、以下のエラーが表示された。

CM Tooltip Glossary Pro+ の更新中にエラーが発生しました: ダウンロードに失敗しました。 Unauthorized

よく見ると、ダウンロードリンクが表示されていたため、アクセスしてみたところ、「Your download link has expired」と表示された。
おそらく、セッションかなにかの期限が切れたから、ダウンロードできない状態になってしまっているだけっぽい。

しょうがないため、対象のプラグインサイトにログインしてプラグインをダウンロード後に手動で更新(pluginsフォルダに直接ぶちこむ)して解決した。

参考サイト

【WordPress】DigiPress専用プラグインが更新できないときは手動で更新しよう!そして、もうひとつの方法とは!?

用語集プラグイン CM Tooltip Glossary Pro+の設定

有名な用語集プラグインの無料版「CM Tooltip Glossary」だと、標準の投稿や固定ページには用語ハイライトに対応しているのですが、ACFで登録したカスタムフィールドには対応されていません。有料版の「CM Tooltip Glossary Pro+」を購入するとACFにも対応することができます。

用語ハイライトのイメージ

以下は、「昇華印刷」という用語と説明文を登録したため、該当キーワードにマウスを重ねると、説明が表示されます。

なお、キーワードの前後には空白のスペースを入れることで、用語ハイライトとして認識されるようになります。

実際の動作イメージはこちらを参照(「スペック」という箇所に用語ハイライトがあります) → MassdropでALTキーボード購入 – コトコト

ACFのカスタムフィールドへの対応

有料版の「CM Tooltip Glossary Pro+」を購入したあと、該当プラグインの「Settings」メニュー > 「General Settings」タブより、以下の設定を行います。

  • Highlight terms in ACF fields? → チェック入れる
  • Types of fields to highlight → チェック入れる

    ハマりポイント1

    「Types of fields to remove the WP functions:」は、チェックを入れると、改行が自動削除されます。意図しない挙動を防ぐため、チェックを外したほうがよいでしょう。

    ハマりポイント2

    ACFのカスタムフィールドに、のショートコードだけを入力しているような場合(たとえばInstagramだけ入力)、CM Tooltip Glossaryプラグインの上記設定と競合してうまく表示されませんでした。
    なんでもよいため、カスタムフィールドには冒頭に文字が入力されている必要があります。

カスタム投稿タイプへの対応

カスタム投稿タイプかつACFのカスタムフィールドを利用していますが、そのままの設定で動作しました。特に意識する必要はないようです。

関連キーワードを非表示にする

記事の下部に、以下のような形で「Related Terms:」という関連するキーワードが自動的に表示されてしまいます。

「Settings」メニュー > 「Glossary Terms」タブより、以下の設定で非表示にできます。

  • Show linked glossary terms list under post/page? → チェック外す

補足

記事の中身をいろいろと変えてしまうようなので、設定は一通り、ご覧になることをオススメします。

WP Twenty Seventeenテーマの1カラム表示

先ほどWordPressのTwenty-Seventeenテーマがver1.6への更新通知がきていたので更新したところ、表示が2カラム形式に戻ってしまっていた。本来は1カラムで設定をしていた。

  • 外観 > カスタマイズ > テーマオプション(この時にプレビュー表示が固定ページじゃないとこのメニューが表示されない) > 1カラム に設定する
  • 外観 > カスタマイズ > ウィジェット > ブログサイドバー で全てのウィジェットを削除する

雑な感じだったけど、これでもとの1カラム表示に戻った。

WordPress ACF ProのInstagramとYouTube表示が異常に重い

WordPress ACF Proプラグインでカスタムフィールドを作成して、InstagramとYouTubeコンテンツをフィールドタイプ「oEmbed」を使って、10件ほど登録したところ、表示までに8秒ほど時間がかかり、異常に遅くなった。

やったこと

フィールドタイプ「Wysiwyg」に置き換えてから、URLを貼り付けて登録したところ、劇的に改善した。表示速度が0.18秒になった(元々のKUSANAGIの速さに戻った)。

原因はわからず

WordPressのoEmbed機能自体は全く問題なく、ACF ProのoEmbedフィールドタイプが問題と思われるが、バグ情報などが見つからず、原因わからず。もしかしたらACFではない可能性もあるが、ひとまずACF ProのoEmbedは利用しないでおく。(非常に便利だったので改善されたらまた使いたい)

ACF Proの柔軟コンテンツ

プライベートでWordPressのプラグイン ACF Pro を購入して柔軟コンテンツを利用したため、そのメモ。

柔軟コンテンツの超わかりやすい図解はこちら。
[WordPress] Advanced Custom Fieldsの拡張パッケージ、Flexible Content Fieldの使い方

柔軟コンテンツの登録例

柔軟コンテンツの中に柔軟コンテンツを入れる、っていう入れ子の構造も可能。
ACF Proの繰り返しフィールドの中に繰り返しフィールドを入れる、っていう入れ子と同じ仕組みが使える。

柔軟コンテンツの入力例

「行を追加」ボタンで柔軟コンテンツを呼び出せる。
以下の画像はすでに呼び出した後だが、右下にそのボタンを押したときにパターン選択できる模様も表示しておいた。

ACF ProはPersonal(1サイトのみ利用)で日本円で2,000円ぐらいだった。
がんばって開発するぐらいなら、これ買ったほうが確実に楽できる。安いし。
Developer(サイト無限に利用)はいつでもアップグレードできるらしいので、まずはPersonalからスタート。

WP Mail SMTPでOAuth認証するときに401エラーが出る場合

WordPressのWP Mail SMTPやRubyとかでOAuth認証を実装するときに、「Client ID」と「Client Secret」を作成するアプリケーション側に記述することになるが、OAuth認証を実行しようとすると、Google側には遷移するものの、「401. That’s an error.」と表示される。
これは、「Client ID」や「Client Secret」がちゃんと入力されていない可能性がある。Google Cloud Platform側でそれらの値をコピーしてから、ペーストすると、なぜか文頭と文末に空白(スペース)が入ってしまう。このスペースが入っていると動作しないため、前後にスペースが入ってしまっていないか要注意。(HanamiのOAuth認証実装時と、WordPressのOAuth認証実装時と、2回もこれでハマってしまった。)

この画面でコピーすると、すでに空白も一緒にコピーされている

OAuth認証を実行すると401エラー

参考サイト

入力フォームで改行する場合は’¥n’ではなく”¥n”

何年かおきに同じところでハマってしまう。
恥ずかしい内容だけど学習しないのでメモ。

入力フォーム(textarea)内で文章を改行させたい
場合は改行コードを入れてあげる必要がある。

$str = ‘1行目¥n2行目’; // サニタイズして¥nに変換してたとする
echo str_replace(‘n’, “¥n”, $str); // 改行コードに置換する

のような感じで改行が可能となる。

この時に、 “¥n” ではなく ‘¥n’ としてしまうと
改行コードではなく文字列としての ¥n になってしまうため
うまく改行されず、そのまま ¥n がtextareaに表示
されてしまう。
シングルクォーテーションとダブルクォーテーションで
意味が変わってしまうので要注意。

■参考
データベースから取り出したテキストの改行 – PHP – 教えて!goo

異なるDB間をモデル内でリレーション定義→利用不可

■環境 
 CakePHP 1.3.x 

■やりたいこと
 モデル内で異なるDB間(複数のDB)をリレーションし、
 それぞれのDBのカラムを出力する関数を定義する。
 
■結論
 普通の仕組みではムリ。ハックすればできる(らしい)。
 
■現状の整理
 異なるDB間のリレーション自体ができないわけではない。
 
 異なるDB間のモデルの紐付け(hasManyとか) → ○
 異なるDB間のモデル紐付け後にmodelsに関数作成 → ×(unknown columnと言われる)
 異なるDB間のモデル紐付け後にcontrollersに関数作成 → ○(model以外なら実行可)

■自分が取った対策
 modelsで関数定義はあきらめて、component化した。
 (ファットモデルはあらきめた) 

 【app/config/database.phpの設定】 
  こんな感じで設定 → CakePHP で複数のデータベースを使用する - mallowlabsの備忘録
 
 【app/models/読み込むモデルの設定】
  同上
 
 【app/controllers/components/読み込むコンポーネントの設定】
  ここを参考に異なるDBのカラムを出力する関数を作成
  第12回 コンポーネントの作り方:CakePHPで高速Webアプリ開発|gihyo.jp … 技術評論社 
  
 
 【app/controllers/コントローラの設定】 

  冒頭でこんな感じで呼び出し

  var $useDbConfig = 'userdb';
  var $uses = array('DB1のモデル', 'DB2のモデル';
  var $components = array('DB1とDB2両方を参照する関数を書いたコンポーネント');
 
  そのあと、コンポーネントを呼び出す。
 
■参考資料
 本件についての議論など(ハックすればできるよ的な内容含む)。
 ※日本語での内容は見当たらず
 CakePHP - querying across models with multiple databases and useDbConfig
 cakephp - Association and model data saving problem - Stack Overflow
 Multiple Databases Model Relationship - CakePHP | Google Groups 
 
■補足
 自分がCakePHPの仕組みをあまり分かっていない可能性もあり、
 そもそも、そういう動きをさせない(こういう疑問が出ないのが普通?)のが
 普通かもしれません。

画像アップロード関連メモ

以下、完全に自分用メモ

■CakePHPで画像アップロードした場合の中身
 参照ボタンで画像を選択してアップロード後に debug($this->data) すると、

    [image] => Array
        (
            [name] => Bonsai.gif
            [type] => image/gif
            [tmp_name] => /Applications/MAMP/tmp/php/phpCXMUmf
            [error] => 0
            [size] => 2105
        )

 [tmp_name]が画像を一時的に設置するテンポラリフォルダの場所 になっている。
 画像アップ後は move_uploaded_file で移動させる処理を行う。

■テンポラリフォルダの取得方法
 テンポラリフォルダは2つある。
 1)php.ini で upload_tmp_dir にパスを記載している場合
   → var_dump(ini_get(‘upload_tmp_dir’));
     でパスを取得できる
     ※記述がない場合は no value となりbool(false)が返り
      システムのテンポラリフォルダが自動的に利用される。
 2)システムのテンポラリフォルダ
   →  echo sys_get_temp_dir();
     でシステムが利用するテンポラリフォルダのパスを取得できる

■URLを指定して画像を取得

 $author_img_url = 'http://images.apple.com/iphone/home/images/a6_hero.png';
 $tmp_author_img_data = file_get_contents($author_img_url);
 file_put_contents('./test-aaa.jpg', $tmp_author_img_data); 

■参考URL
 PHP: sys_get_temp_dir – Manual
 [PHP]画像をダウンロードしてサーバーの特定のディレクトリに保存する « Codaholic

CakePHP x さくら x サブドメイン で Internal Server Error

下記構成で、

 CakePHP 1.3.x
 さくらインターネット
 サブドメイン
 
Internal Server Error が出た。
 
 
↓この設定通りにやったら一発で解決(ありがとうございます)

 [CakePHP] さくら で「500 Internal Server Error」 Web Sytem | AIDREAM

他のサイトにも設定方法が載ってたが、
上記サイトの設定でしか動かなかった。