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

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

ただいまの
回答率

89.10%

WordPressで自動生成されるカテゴリURLに記事を入れたい

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 800

4shingo

score 13

WordPressで自動生成されるカテゴリURLに記事を入れたいです…

WordPress初心者です。WordPressサイトを階層化したく、質問させていただきます。

具体的に実装したいこと

具体的には、
https://teratail/wordpress/記事①
https://teratail/wordpress/記事②
https://teratail/wordpress/記事③

上記のようにカテゴリーを指定して、記事を公開している場合、

https://teratail/wordpress/

こちらのURLには、記事①〜③を含む記事一覧が表示されると思います。

今回実現したいことは、
https://teratail/wordpress/
このカテゴリーページに記事を入れたいです。

カテゴリーベースを削除するプラグインを入れているので、固定ページのパーマリンクを被せることで無理やり設定することもできますが、

できれば投稿ページ(single.php)で出したいと思っています。

実装方法や何か参考になるURL、プラグインなどありましたら、教えていただけると嬉しいです。

前提条件

・WordPressの設定→パーマリンクの設定では/category/postname/を使用
・No category base でcategory/カテゴリー/記事のcategoryを削除

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

+2

pre_get_posts を利用して、カテゴリーページかつリクエストの basename がスラッグ名となる投稿が存在する場合のみ、投稿ページとしてクエリすることで可能だと思います。

add_filter( 'pre_get_posts', function( WP_Query $query ) {
    global $wp;

    if ( is_admin() || ! $query->is_main_query() ) {
        return $query;
    }

    // redirect /parent-cat/child-cat/child-cat/ to /parent-cat/child-cat.
    if ( isset( $query->query['name'] ) && isset( $query->query['category_name'] ) && basename( $query->query['category_name'] ) === $query->query['name'] ) {
        wp_redirect( home_url( $query->query['category_name'] ), 301 );
        exit;
    }

    $post_name = basename( $wp->request );

    if ( $query->is_category() && get_page_by_path( $post_name, 'OBJECT', 'post' ) ) {
        $page          = $query->get( 'page' );
        $category_name = $query->query['category_name'];
        $query->parse_query( "page={$page}&name={$post_name}&category_name={$category_name}" );
    }

    return $query;
} );

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/07/17 01:06

    なるほど。

    ありがとうございます!!
    長々とすみません…助かりました…

    丁寧に教えていただき、ありがとうございます。
    ベストアンサーにさせていただきますね!

    キャンセル

  • 2019/07/23 16:21 編集

    YukiYamashina様、なんども申し訳ありません。

    上記で教えていただいたコードを使用したところ、

    http://hogehoge.com/sample/sample/
    http://hogehoge.com/sample/
    上記のリダイレクトは成功しましたが、

    http://hogehoge.com/sample/teratail/test/
    http://hogehoge.com/sample/teratail/code/
    など、下の階層に指定したパーマリンクだとうまく動作しません…
    すべて下記URLへリダイレクトされるようになってしまいました…
    http://hogehoge.com/sample/teratail/

    何か原因をお知りでしたら、ご回答いただけると幸いです。

    キャンセル

  • 2019/07/23 16:53

    追記です。

    1階層目ではちゃんと動作し、2階層目以降でこの症状が発生してしまいます…

    キャンセル

+1

No Category Baseプラグインを使ったことが無いのであれですが、何んかのヒントにはなるかと。

例えば、sample投稿タイプで記事を複数準備
http://hogehoge.com/sample/sample01
http://hogehoge.com/sample/sample03
http://hogehoge.com/sample/sample03

同時に固定ページで
http://hogehoge.com/sample/
を作成。

add_action('generate_rewrite_rules', 'extra_add_rewrite_rules', 1);
function extra_add_rewrite_rules( $wpRewrite ) {

    $new_rules = array(
        'sample/?$'
        => 'index.php?pagename=sample',
        );
    $wpRewrite->rules = $new_rules +  $wpRewrite->rules;
}


をfunctions.phpに追記し、WordPress管理画面>設定>パーマリンク設定>(何も変更せずに)設定を保存を押すと、
http://hogehoge.com/sample/でアクセスしたときに、固定ページの方を出力してくれます。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/07/15 15:56

    ご丁寧に回答ありがとうございます!!!!!

    教えていただいた方法でもできるのですが、3階層に記事ページをおいた場合、パーマリンクが自動で補正されてしまい、設定できないんです…

    例えば、このようなURLになっていた場合、
    http://hogehoge.com/親カテゴリ①/子カテゴリ①/記事①
    http://hogehoge.com/親カテゴリ②/子カテゴリ②/記事②
    http://hogehoge.com/親カテゴリ③/子カテゴリ③/記事③

    本来カテゴリに属する記事一覧が生成されるURLは、
    http://hogehoge.com/親カテゴリ①/
    http://hogehoge.com/親カテゴリ①/子カテゴリ①/

    固定ページで出力できるものとできないものがある。
    http://hogehoge.com/親カテゴリ①/ ← ◯ 出力できる
    http://hogehoge.com/親カテゴリ①/子カテゴリ①/ ← × 出力できない(パーマリンクが自動で補正されてしまう)

    このような状態になってしまいます…

    できれば、固定ページとは分けて、投稿ページで管理したいため
    http://hogehoge.com/親カテゴリ①/子カテゴリ①/%postname%/

    %postname%の部分を無しにする設定などができたら、最高なのですが…

    また何か知っていらっしゃることがあれば、教えていただけると幸いです。

    キャンセル

  • 2019/07/15 17:01

    (1)No Category Base (WPML)をインストール

    (2)固定ページで
    親ページ:http://hogehoge.com/parentcat1/
    子ページ:http://hogehoge.com/parentcat1/childcat1/
    を作成

    (3)カテゴリーにて、
    親カテゴリー:parentcat1
    子カテゴリー:childcat1
    を作成

    (4)投稿にて、記事を作成し、子カテゴリーchildcat1にチェック
    パーマリンクは、 http://hogehoge.com/parentcat1/childcat1/testarticle/

    (5)この状態で、
    http://hogehoge.com/parentcat1/childcat1/
    にアクセスすると、childcat1に属する記事一覧ページ

    (6)functions.phpに以下のコードを追加し、WordPress管理画面>設定>パーマリンク設定>(何も変更せずに)設定を保存を押す。

    add_action('generate_rewrite_rules', 'extra_add_rewrite_rules', 1);
    function extra_add_rewrite_rules( $wpRewrite ) {

    $new_rules = array(
    'parentcat1/childcat1/?$'
    => 'index.php?pagename=parentcat1/childcat1',
    );
    $wpRewrite->rules = $new_rules + $wpRewrite->rules;
    }

    (7)この状態で、‎http://hogehoge.com/parentcat1/childcat1/にアクセスすると固定ページが出力されます。

    ただいま新しいWordPressを設置して確認しました。

    キャンセル

  • 2019/07/15 17:09

    読み飛ばしていました。

    >できれば、固定ページとは分けて、投稿ページで管理したいため
    http://hogehoge.com/親カテゴリ①/子カテゴリ①/%postname%/
    >%postname%の部分を無しにする設定などができたら、最高なのですが…

    つまり、上記例だと、
    http://hogehoge.com/parentcat1/childcat1/
    にアクセスしたときに、親カテゴリparentcat1に属する、childcat1という名前の投稿を表示させたいという事ですね。

    YukiYamashitaさんが既にご回答されているので、そちらが正解です。

    キャンセル

  • 2019/07/16 11:31

    ご丁寧に確認までしていただき、大変助かりました…

    初めてteratailで質問したのですが、こんな親切な方たちがおられるとは思わず…

    固定ページでの出力方法も今後役立ちます!

    ありがとうございます!!

    キャンセル

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

  • ただいまの回答率 89.10%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる