【WordPress】スラッグ名が重複すると、公開中の投稿ページが404になる
※これは、現在最新バージョンである4.7.1で確認しています。
WordPressの管理画面にログインし、以下の手順で記事を作成してみてください。
①新規投稿で、スラッグ名をhogeと設定し、公開保存する。
②再び新規投稿で、スラッグ名をhogeと設定し、下書き保存する。(実際はhoge-2に変わりますが気にせずに)
※①と②の記事は別の記事です。
※スラッグ名は手動で設定してください。
①の投稿ページを、別のブラウザか、Wordpressからログアウトして開いてみてください。
公開しているにも関わらず、エラー404ページになってしまいます。
(pre_get_postsなどで、投稿詳細ページの取得ルールを変えている場合は起こらない可能性があります)
原因
②の投稿を作成する際、スラッグ名を「hoge」と入力すると、重複を回避するため「hoge-2」と表示されるのですが、実際は下書き保存では「-2」はつかず、そのまま「hoge」と保存されてしまいます。(データベースを確認すると、postnameがhogeとなっているレコードが2つ確認できます)
そのため、①のページを開こうとした際、②の投稿データを取得してしまい、しかし下書きのため404ページとなってしまうわけです。
ちなみに投稿詳細ページでのデータ取得の順番は公開日時順になっているらしく、②の下書き投稿が①の公開投稿よりも過去の公開日時に設定していると、①の投稿ページは正常に表示されます。
この現象が発生する条件は正確には以下となります。
- スラッグ名を設定することができるパーマリンク設定になっていること
(%postname%が含まれる設定の場合) - 投稿タイプが「投稿」であること
(固定ページではこの現象は起きない) - 投稿の作成・編集時にスラッグ名を任意に設定すること
(WPがタイトルから自動的に生成する場合は、重複してもこの現象は起きない) - 設定したスラッグ名に自動的に連番がつくこと
(すでに公開されている投稿記事が存在している場合) - 保存時に下書き保存すること
(公開保存なら大丈夫) - 下書き保存した投稿記事と同じURLの公開中の記事が存在すること
(連番なしのURLと完全一致する公開中の投稿記事があること。日付やカテゴリーがパーマリンクに含まれる場合で、これらが異なる場合はこの現象は起きない) - 公開保存されている投稿より、下書き保存した投稿の方が、公開日時が未来に設定されていること
という条件なので、投稿でも命名規則を決めてスラッグ名をきっちり設定するという運用を行っている(例えばニュースなら「news20160120」と設定する)サイトの場合以外は起きないので、なかなか見つかりづらい不具合ではあると思われます。
対策
ひとまず404エラーを回避する方法ですが、functions.phpに以下を追記すると、回避できます。
add_action('pre_get_posts', 'custom_pre_get_posts' ); function custom_pre_get_posts($query){ if ( is_admin() || ! $query->is_main_query() ){ return; } if($query->is_single && !$query->is_preview){ $query->set( 'post_status' , 'publish'); } }
要するに、公開されているものを開けばよいのですが、なぜ下書きのものを取得しようとしてしまうのか、不思議です・・・
なお、この方法で404エラーは回避できますが、もう1つ問題があります。
該当の公開中の記事を編集すると、こっちは重複を回避しようとしてスラッグ名の後ろに「-2」がついて保存されてしまうことです。(なんでやねん)
スラッグ名が変わっても、一応リダイレクトしてくれるみたいですが、下書きの方の記事が「hoge」で公開保存されたら、完全に入れ替わっちゃいます。
結局気を付けるしかないのが現状ですね・・・
冒頭でも書いていますが、これはバージョン4.7.1で起こっています。
もしかしたらこれより古いバージョンでは起きないかもしれません。
また、さらにバージョンアップされたら起きなくなるかもしれません(というか起きなくなってくれ)
総合管理者 | 2017年01月20日 | コメント(0) | トラックバック(2) | CMS関連
iPhoneで撮影した写真が90度傾く
iPhoneで写真を撮影すると、Windowsのフォトビュワーなどで見ると縦横撮影した通りの角度になっているのですが、サーバにアップしてホームページに埋め込んでみると、縦横がおかしくなることがあります。
こんな感じ↓ チンアナゴ水槽が横になっちゃってます。
原因はExifに回転の情報(Orientation)が入っており、Exifの情報を取得できるビュワーであればちゃんと回転して表示くれるのですが、ブラウザではその情報を取得できないため、そのままの状態で表示してしまうかららしいです。
とりあえず画像の修正方法としては、Photoshopで開いて保存し直すという方法があります。
これでExifに頼らず、画像として縦横正確な状態で保存し直されるわけです。
でもPhotoshopなんて持ってねーよという人も、もちろんいるかと思います。(というか普通は持ってない)
その場合は、Windowsであれば必ず入っているペイントを使用してみてください。
ペイントで画像を開いて保存し直せば、Photoshop同様正常な状態で保存し直してくれます。
↓ペイントで保存し直した画像
参考サイト
総合管理者 | 2017年01月16日 | コメント(0) | トラックバック(0) | その他
セッションの保持時間は意外に短い
デフォルトのphp.iniの設定では、セッションの保持時間は24分だそうです。
さらにセッションが削除されるタイミングは100分の1だそうで、100回アクセスに1回のタイミングで24分すぎたセッションファイルを削除するとのこと。
長時間セッションを保持しなければならないようなプログラムの場合は注意しなくては。
php.iniに以下を設定
session.gc_maxlifetime = 14400
session.gc_divisor = 1000
session.gc_probability = 1
これで1000分の1の確率で、240分過ぎたファイルを削除するようになる。
参考サイト
ガベージコレクション(GC)をCakePHPで試してみる | Structured-P
総合管理者 | 2017年01月06日 | コメント(0) | トラックバック(0) | PHP関連
Wordで文字キーが受け付けない場合
ツイッターでも書きましたが、ここにもメモ。
OfficeのWord(自分が使っているのはOffice 365 Solo)で突然キーボードの文字入力が受け付けない現象が発生していました。
最初は大丈夫なんですが、編集している途中で受け付けなくなる感じ。
立ち上げているWordファイルを全部落として、もう一度起動すると入力できるようになるのですが、しばらくするとまた受け付けなくなる。
もちろん、Word以外ではちゃんと入力できます(メモ帳とかブラウザとか)
Windowsが10に上がったからかな?(おのれWindows・・・)と思っていたのですが、どうやらIMEが原因っぽい。
IMEはGoogleのを使用していたのですが、これをWindows標準のものに切り替えたら入力可能となりました。
相性の問題か。
総合管理者 | 2016年06月08日 | コメント(0) | トラックバック(0) | アプリ関連
Javascriptでプルダウンの選択を変更する(jQuery)
Javascriptでプルダウンの選択を変更する(getElementsByTagName)
↑過去記事のjquery版です。
headタグ内に以下を記述。
<script type="text/javascript" src="(jqueryへのパス)"></script> <script> function change_pulldown(value_name){ $("#hoge").val(value_name); } </script>
bodyタグ内に、以下の様な選択を記述。
<p>特殊車両リンクをクリックしてください。プルダウンの選択が変わります。</p> <p><a href="javascript:void(0)" onclick="change_pulldown('p1')">イングラム</a></p> <p><a href="javascript:void(0)" onclick="change_pulldown('p2')">グリフォン</a></p> <p><a href="javascript:void(0)" onclick="change_pulldown('p3')">タイラント2000</a></p> <p><a href="javascript:void(0)" onclick="change_pulldown('p4')">クラブマンハイレッグ</a></p> <select id="hoge"> <option value="">---</option> <option value="p1">イングラム</option> <option value="p2">グリフォン</option> <option value="p3">タイラント2000</option> <option value="p4">クラブマンハイレッグ</option> </select>
Javascript内の記述は凄まじく簡略化されましたね。
- 下のselectタグに、IDとして「hoge」と設定しておく。
- リンクには、クリック時に作成したchange_pulldown関数を呼び出す設定をする。その際、引数として、プルダウンで選択したいvalueを渡す。
- change_pulldown関数では、指定したID(ここではhogeとしている)のselectタグに中身(val)を入れる。
これでリンクをクリックすると指定したものが選択されるようになります。
総合管理者 | 2016年04月30日 | コメント(0) | トラックバック(1) | JavaScript関連
投稿一覧の各投稿のメニューをカスタマイズする方法
フック!フック!フック!
フックは便利ですね!
ということで、テーマで投稿一覧の各投稿のメニューをカスタマイズする方法のメモです。
下図のように、メニューに「サンプル」を追加する場合
テーマのfunctions.phpに以下を追記します。
function custom_post_row_actions($actions, $post) { //$actions['(キー)'] = '<a href="(リンク先)" title="">(ラベル)</a>'; $actions['sample'] = '<a href="/sample.php" title="">サンプル</a>'; return $actions; } add_filter('post_row_actions', 'custom_post_row_actions',10,2);
いらないものを消す場合は、unsetします。(以下クイック編集を削除する)
function custom_post_row_actions($actions, $post) { unset($actions['inline hide-if-no-js']); //クイック編集 return $actions; } add_filter('post_row_actions', 'custom_post_row_actions',10,2);
以下デフォルトのメニューです。
$actions['edit'] | 編集 |
$actions['inline hide-if-no-js'] | クイック編集 |
$actions['trash'] | ゴミ箱 |
$actions['view'] | 表示 |
参考サイト
総合管理者 | 2016年03月25日 | コメント(0) | トラックバック(0) | CMS関連
vsftpで設定したサーバにFTP接続できない(パッシブモード)
vsftpをサーバにインストールし、各種設定を行った後、FTP接続しようとしたのですが、なぜか接続できない。
vsftpd.confやchroot_list、hosts.allow、hosts.deny、user_listを確認しても、特に問題なし。
ファイヤーウォールを確認しても、ちゃんと20・21は設定されている。
なぜ・・・
と思い、エラー内容を確認したところ、ログイン自体は成功しているもののLISTでエラーが出ている様子。
ということで、ググってみたら、こちらのページを見つけました。
vsftpでpasvモードでの接続設定 - watuu's diary
/etc/sysconfig/iptables-config に設定が必要とのこと。
このファイルの「IPTABLES_MODULES」を
IPTABLES_MODULES="ip_conntrack_netbios_ns ip_conntrack_ftp ip_nat_ftp"
としたところ、無事接続できるようになりました。
ちなみに、この設定を行っていない場合でも、接続設定がアクティブだと接続できます。
総合管理者 | 2016年02月10日 | コメント(0) | トラックバック(0) | サーバー関連
Search Console(ウェブマスターツール)でインデックス数が激減
このサイトのURLを
https://nandani.sakura.ne.jp/
から
https://nandani.sakura.ne.jp/
に変更しました。(wwwなし)
理由はwwwあり・なし両方でアクセスできるとSEO的に良くないのが1点(いまさら)
もう1つは、さくらインターネットのサブドメイン(○○○.sakura.ne.jp)でSSLが使えるのが、www無しのみだったので、https://nandani.sakura.ne.jp/をメインURLとしました。(httpsの方がSEO的に良いらしいので。さくらインターネット特有のくせで、記事ページにhttpsでアクセスするとおかしくなるため、まだ変えてませんが。)
そうしてみたところ、Search Consoleのインデックス数が激減。
まあ当たり前です。
これまでは「https://nandani.sakura.ne.jp/」で登録されていたのに、wwwなしになったわけですから。
しばらくしたら治るだろうと思っていたのですが、一向に増える気配はなく、何ならどんどん減っていきます。
ただでさえ減ってたのに!
なんで?と思い、よくよくSearch Consoleに送っているsitemap.xmlを見てみたら、そこに記述されているURLが「https://nandani.sakura.ne.jp/」になっているではありませんか。
サイトマップ書き出しには「Google XML Sitemaps」を使っているのですが、どうやらキャッシュっぽい感じで残っており、それが送信されてたらしい。
通りで全然インデックスされないわけだ。
ということで、設定>XML-Sitemapから設定を更新したら、無事「https://nandani.sakura.ne.jp/」で出力されるようになりました。
インデックスが減っていたとはいえ、あんまりアクセス数は変わってないんですよね。
メインの流入はGoogleからのはずなんだけどなぁ。
総合管理者 | 2016年01月20日 | コメント(0) | トラックバック(0) | CMS関連 | PHP関連 | SEO関連
EC-CUBEでクレジットカード決済が表示されない
EC-CUBEで「イプシロン決済モジュール」を導入し、設定も一通り完了したのですが、なぜか商品購入フローの「お支払方法・お届け時間等の指定」で「クレジットカード決済」の選択が表示されないという現象になってしまいました。
イプシロン側の設定も、EC-CUBE側のイプシロンモジュールの設定も問題なく見えます。
基本情報管理>支払方法設定にも、ちゃんと「クレジットカード決済」は追加されています。
なぜ登録されない・・・と「LC_Page_Shopping_Payment.php」の中身を調べてみたところ
if (in_array($payment['payment_id'], $payments_deliv)) {
というところではじかれている様子。
deliv・・・ということはと、基本情報管理>配送方法設定を調べたところ、「取扱支払方法」の設定で「クレジットカード決済」にチェックが入っていませんでした。
凡ミス・・・
総合管理者 | 2016年01月19日 | コメント(0) | トラックバック(0) | CMS関連
https(SSL)の警告が消えない
とあるサイトをhttps接続に変えたところ、下図のような警告が出るようになってしまいました。
この接続は安全ではありません
このページの一部(画像など)は安全ではありません。
ブラウザはFirefoxで、Google Chromeでも同じようなエラーになっていましました。
ソースを確認したところ、リンクURLでhttpになっているところはありましたが、画像やCSS、JSの読み込みパスはすべてhttps、もしくはスラッシュから始まる絶対パスになっています。
JS、CSS内のパスにhttp接続があるかとも思いましたが、これも違う。
特に読み込みに失敗しているようなファイルはなさそうなので、見た目上は正常なのですが、警告が出っぱなしというのは気持ち悪いし、ユーザーに不安を与えかねません。
CSS・JSを消したり戻したりして、とあるCSSが原因だと判明しました。
そのCSS内では画像が読み込まれていたのですが、そのパス自体は相対パスで問題ありません。
では、何が原因か?とよくよく見てみたところ、そのCSSで読み込もうとしている画像が存在していない・・・
これか!と思い、必要な画像をアップロードしたところ、警告が消えました。
リンク切れが起きても、この現象起こるんですね・・・
総合管理者 | 2016年01月04日 | コメント(1) | トラックバック(0) | CSS関連