web-dev-qa-db-fra.com

Comment obtenir des permaliens avec la base de catégories travaillant avec des sous-catégories

J'ai rencontré un problème avec un site nécessitant la base de catégories également incluse dans la structure permalink personnalisée. Je sais que c'est un problème et j'ai lu de nombreux articles tels que this qui m'ont permis de mieux comprendre ...

J'ai besoin que les permaliens fonctionnent comme ceci:

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}

Mes paramètres de permalien sont les suivants: Structure personnalisée:

/industries/%category%/%postname%/

Catégorie de base:

industries/.

Cela me permet de travailler avec:

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}

Il semble donc que ce ne sont que les catégories d'enfants qui posent problème.

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}

Je peux obtenir l'ID de catégorie en interceptant le 404 mais je ne vois pas comment charger la page de catégories avec l'ID de catégorie approprié.

Ma question est donc la suivante: Existe-t-il un moyen de charger la page de catégories en appelant une commande interne ou devrai-je écrire mon propre moyen de chargement de la page de catégories? J'espérais pouvoir utiliser une fonction WP, car ce serait idéal. si c'est le dernier cas, y a-t-il quelque chose de spécial dont je dois être conscient? Je sais que je dois définir: status_header(200); mais je voulais savoir s'il y avait d'autres en-têtes ou des étapes importantes à suivre.

En outre, une redirection ne fonctionnera pas pour mon but. Je dois charger la page de catégories avec le nouvel identifiant. Si cela aide, le hook que j'utilise dans WP pour attraper le 404 est: template_redirect

Merci pour toute information que vous pouvez fournir à ce sujet.

7
Jeremy

En fait, j'ai réussi à faire fonctionner cela assez facilement. Je peux maintenant avoir ma base de catégorie dans mes permaliens. Cela me permet maintenant d'avoir des URL comme:

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}

Cela devrait fonctionner pour n'importe quel niveau d'imbrication de catégorie.

Mes paramètres de permalien:

Structure personnalisée: /industries/%category%/%postname%/

Base de la catégorie: industries/. (/. est requis car il empêche 404s pour le post)

Code:

/**
 * 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');

J'ai eu à l'origine:

$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']) );

au lieu de:

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

mais il semble que cette vérification n'était pas nécessaire. J'ai laissé ce commentaire au cas où je l'aurais pour une raison dont je ne me souvenais plus ...

De plus, j'ai eu des problèmes avec la pagination de ma catégorie par défaut ... Une recherche rapide renvoie de nombreuses personnes avec le même problème (ne va pas au-delà de la page 2) et j'ai donc ajouté ce correctif. J'ai trouvé ce correctif dans un plugin WordPress: Catégorie correctif de pagination . J'ai mis à jour le code et le correctif est ci-dessous:

/**
 * 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');

Remarque: Il convient de noter que le correctif de pagination n'était nécessaire que sur les catégories parentes. Les catégories enfants n’avaient aucun problème avec la pagination.

9
Jeremy