web-dev-qa-db-ja.com

サブカテゴリを扱うカテゴリベースのパーマリンクを取得する方法

私はカスタムパーマリンク構造にも含まれるカテゴリベースを必要とするサイトで問題に遭遇しました。私はこれが問題であることを知っています、そして私は this のような多くの記事を読んできました。

パーマリンクを次のように機能させる必要があります。

http://www.new1450.dev/industries/ {Main blog post only showing category selection}
http://www.new1450.dev/industries/development/ {a parent category}
http://www.new1450.dev/industries/development/parent-category-i/ {child of parent}
http://www.new1450.dev/industries/development/parent-category-i/child-category-i/ {child of child}
http://www.new1450.dev/industries/development/parent-category-i/child-category-i/some-cool-post/ {actual post}

私のパーマリンク設定は以下の通りです:カスタム構造:

/industries/%category%/%postname%/

カテゴリーベース:

industries/.

これは私と一緒に仕事をすることができます:

http://www.new1450.dev/industries/ {Main blog post only showing category selection}
http://www.new1450.dev/industries/development/ {a parent category}
http://www.new1450.dev/industries/development/parent-category-i/child-category-i/some-cool-post/ {actual post}

それで問題を引き起こしているのは単なる子カテゴリです。

http://www.new1450.dev/industries/development/parent-category-i/ {child of parent}
http://www.new1450.dev/industries/development/parent-category-i/child-category-i/ {child of child}

404をインターセプトしてカテゴリIDを取得することはできますが、適切なカテゴリIDを使ってカテゴリページを読み込む方法がわかりません。

だから私の質問は: いくつかの内部コマンドを呼び出してカテゴリページを読み込む方法はありますか、それともカテゴリページを読み込むための自分の方法を書く必要がありますか?これが理想的なので、WP関数を使用できることを望みました。これが後者の場合、私が知っておく必要がある何か特別なものはありますか?私は、status_header(200);を設定する必要があることを知っていますが、他に必要なヘッダーや重要な手順があるかどうかを知りたかったのです。

また、リダイレクトは私の目的のためには機能しません。新しいIDでカテゴリページを読み込む必要があります。それが助けになるのであれば、404をキャッチするためにWPで使用しているフックは次のとおりです。template_redirect

この件に関してあなたが提供できる情報をありがとう。

7
Jeremy

私はこれを実際にかなり簡単に動作させることができました。私は今私のパーマリンクに私のカテゴリーベースを含めることができます。これは私が今のようなURLを持つことを可能にします:

http://www.new1450.dev/industries/ {Main blog post only showing category selection}
http://www.new1450.dev/industries/development/ {a parent category}
http://www.new1450.dev/industries/development/parent-category-i/ {child of parent}
http://www.new1450.dev/industries/development/parent-category-i/child-category-i/ {child of child}
http://www.new1450.dev/industries/development/parent-category-i/child-category-i/some-cool-post/ {actual post}

これはあらゆるレベルのカテゴリの入れ子に対して機能するはずです。

私のパーマリンク設定:

カスタム構造体:/industries/%category%/%postname%/

カテゴリベース:industries/.(投稿に404秒を防ぐため/.は必須です)

コード:

/**
 * Fix 404 for permalinks using category_base
 */
function permalinkWithCategoryBaseFix() {
    global $wp_query;
    // Only check on 404's
    if ( true === $wp_query->is_404) {
        $currentURI = !empty($_SERVER['REQUEST_URI']) ? trim($_SERVER['REQUEST_URI'], '/') : '';
        if ($currentURI) {
            $categoryBaseName = trim(get_option('category_base'), '/.'); // Remove / and . from base
            if ($categoryBaseName) {
                // Perform fixes for category_base matching start of permalink custom structure
                if ( substr($currentURI, 0, strlen($categoryBaseName)) == $categoryBaseName ) {
                    // Find the proper category
                    $childCategoryObject = get_category_by_slug($wp_query->query_vars['name']);
                    // Make sure we have a category
                    if (is_object($childCategoryObject)) {
                        $paged = ($wp_query->query_vars['paged']) ? $wp_query->query_vars['paged']: 1;
                        $wp_query->query(array(
                                              'cat' => $childCategoryObject->term_id,
                                              'paged'=> $paged
                                         )
                        );
                        // Set our accepted header
                        status_header( 200 ); // Prevents 404 status
                    }
                    unset($childCategoryObject);
                }
            }
            unset($categoryBaseName);
        }
        unset($currentURI);
    }
}

add_action('template_redirect', 'permalinkWithCategoryBaseFix');

私はもともと持っていました:

$childCategoryObject = get_category_by_slug( ((!empty($wp_query->query_vars['page']) && $wp_query->query_vars['page'] > 1) ? $wp_query->query_vars['category_name'] : $wp_query->query_vars['name']) );

代わりに:

$childCategoryObject = get_category_by_slug($wp_query->query_vars['name']);

しかし、チェックは必要ではなかったようです。思い出せない理由でこのコメントを残しました….

また、私は私のデフォルトのカテゴリページネーションに問題がありました...クイック検索は同じ問題を持つ多くの人々を返します(2ページを過ぎない)ので、私もこの修正を加えました。私はWordPressプラグインでこの修正を見つけました: カテゴリページネーション修正 。コードを更新しました。修正は以下のとおりです。

/**
 * Fix the problem where next/previous of page number buttons are broken of posts in a category when the custom permalink
 * The problem is that with a url like this:
 * /categoryname/page/2
 * the 'page' looks like a post name, not the keyword "page"
 */
function fixCategoryPagination($queryString) {
    if (isset($queryString['name']) && $queryString['name'] == 'page' && isset($queryString['page'])) {
        unset($queryString['name']);
        // 'page' in the query_string looks like '/2', so i'm exploding it
        list($delim, $page_index) = explode('/', $queryString['page']);
        $queryString['paged'] = $page_index;
    }
    return $queryString;
}

add_filter('request', 'fixCategoryPagination');

注: 注意してください。ページ分割の修正は親カテゴリに対してのみ必要でした。子カテゴリはページ付けに問題がありませんでした。

9
Jeremy