質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
WordPress

WordPressは、PHPで開発されているオープンソースのブログソフトウェアです。データベース管理システムにはMySQLを用いています。フリーのブログソフトウェアの中では最も人気が高く、PHPとHTMLを使って簡単にテンプレートをカスタマイズすることができます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

2回答

1276閲覧

【WP】カスタム投稿をドメイン直下に持ってくると404エラー

erp

総合スコア46

WordPress

WordPressは、PHPで開発されているオープンソースのブログソフトウェアです。データベース管理システムにはMySQLを用いています。フリーのブログソフトウェアの中では最も人気が高く、PHPとHTMLを使って簡単にテンプレートをカスタマイズすることができます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2022/02/09 10:00

編集2022/02/09 11:33

前提・実現したいこと

カスタム投稿「works」で作った投稿のURLはデフォルトで「xxx.com/works/post-slug」ですが、これをドメイン直下「xxx.com/post-slug」に変えたいです。

発生している問題・エラーメッセージ

エラーはなく、ただ、書き換えたURLにアクセスすると404ERRORになってしまいます。

該当のソースコード

PHP

1function generateCustomPostLink($link, $post){ 2 if($post->post_type === 'works'){ 3 // 投稿IDに書き換えたパーマリンク文字列を返す 4 return home_url('/'.$post->post_name.'/'); 5 } else { 6 return $link; 7 } 8} 9function addRewriteRules($rules){ 10 // 書き換えたパーマリンクに対応したクエリルールを追加 11 $new_rule = array( 12 '/?$' => 'index.php?post_type=works&p=$matches[1]' 13 ); 14 // ルール配列に結合 15 return $new_rule + $rules; 16} 17add_filter('post_type_link', 'generateCustomPostLink', 1, 2); 18add_filter('rewrite_rules_array', 'addRewriteRules');

試したこと

調べて出てきたコードをもとに function.php を書いてみたのですが、ドメイン直下に書き換わったものの404エラーになってしまいます。
どうすれば、404でなくなるか、ご助力いただけないでしょうか。

php

1function generateCustomPostLink($link, $post){ 2 if($post->post_type === 'works'){ 3 // スラッグに書き換えたパーマリンク文字列を返す 4 return home_url('/'.$post->post_name.'/'); 5 } else { 6 return $link; 7 } 8} 9function custom_rewrite_tag() 10{ 11 add_rewrite_tag('%myvalue%', '([^&]+)'); 12} 13add_action('init', 'custom_rewrite_tag', 10, 0); 14function addRewriteRules($rules){ 15 //追加するリライトルールの配列を初期化 16 $new_rules = array(); 17 //追加するリライトルールの配列を作成 18 $new_rules['/([^/]+)/?$'] = 'index.php?post_type=works&myvalue=$matches[1]'; 19 // ルール配列に結合 20 return $new_rules + $rules; 21} 22add_filter('post_type_link', 'generateCustomPostLink', 1, 2); 23add_filter('rewrite_rules_array', 'addRewriteRules');

こちらに書き換えてみましたが、404のままでした。

?works=slug で個別ページが表示されるので

php

1function generateCustomPostLink($link, $post){ 2 if($post->post_type === 'works'){ 3 // 投稿IDに書き換えたパーマリンク文字列を返す 4 return home_url('/'.$post->post_name.'/'); 5 } else { 6 return $link; 7 } 8} 9function addRewriteRules($rules){ 10 $new_rules = array(); 11 $new_rules['/([^/]+)/?$'] = 'index.php?works=$matches[1]'; 12 return $new_rules + $rules; 13} 14add_filter('post_type_link', 'generateCustomPostLink', 1, 2); 15add_filter('rewrite_rules_array', 'addRewriteRules');

としましたが、該当ページは404のままでした。

ほかのページは問題なく表示されていますが、やろうとしていることがダメなんでしょうか?

補足情報(FW/ツールのバージョンなど)

Firefox 最新版

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

この回答と同じことを言うことになりますが、
やろうとしていることに問題があります。

任意の文字列のみを取るリライトルールがあるとそれ以降のリライトルールに処理が回らず、
固定ページ含め、当該のカスタム投稿のリライトルール以降にあるページが全て表示されなくなります。
加えて言うと、固定ページのリライトルールがまさに任意の文字列のみを取るリライトルールなので
固定ページのリライトルールより後のリライトルールには処理が回ることがありません。

質問中でやってることの間違いにも言及しておきますが、
結局やろうとしていることに問題があるので、
これを解決したところで問題は解決しません

php

1'/?$' => 'index.php?post_type=works&p=$matches[1]' 23'([^/]+)/?$' => 'index.php?post_type=works&name=$matches[1]'

add_rewrite_tagで登録したタグは
管理画面のパーマリンク設定やadd_permastructで使うもので
rewrite_rules_arrayのフィルタフックで使うことはありません

php

1$new_rules['/([^/]+)/?$'] = 'index.php?post_type=works&myvalue=$matches[1]'; 23$new_rules['/([^/]+)/?$'] = 'index.php?post_type=works&name=$matches[1]';

投稿2022/02/09 11:18

編集2022/02/09 11:25
KazuhiroHatano

総合スコア7804

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

erp

2022/02/09 23:56

ドメイン直下に持ってくるのは、Wordpressの仕様上難しいのですね。勉強になりました。コメント、大変ありがとうございました。
guest

0

WordPress環境が手元にないので「提示コードでおかしいなと思うところ」になりますが、

PHP

1'index.php?post_type=works&name=$matches[1]'

シングルクォート内では変数展開されません。

PHP

1<?php 2$hoge = "hogehoge"; 3echo '----$hoge----'.PHP_EOL; 4echo "----$hoge----".PHP_EOL; 5echo '----'.$hoge.'----'.PHP_EOL;

PHPマニュアル:文字列

ダブルクォートにするか、配列も参照するなら文字列連結にされたほうが良いです。
こんな書き方もありますが。

PHP

1echo "----{$hoge}----".PHP_EOL; 2echo "----${hoge}----".PHP_EOL; 3

投稿2022/02/09 10:11

編集2022/02/09 10:12
m.ts10806

総合スコア80850

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m.ts10806

2022/02/09 10:48 編集

シングルクォート可否ではなく変数展開されないことが問題では? 回答に書いたように配列参照は単にダブルクォートだと正しく参照できません。
KazuhiroHatano

2022/02/09 11:24

変数展開しちゃいけないとこなのでシングルクォートで合ってます 逆にダブルクォートで囲んだら \$ としなくてはいけないところです
m.ts10806

2022/02/09 11:51

なるほどご指摘ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問