web-dev-qa-db-fra.com

Forcer Wordpress à afficher des pages au lieu de la catégorie

J'essaie de créer une structure SILO sur l'un de mes sites WordPress.

J'ai toujours vérifié cette option sur le plug-in Yoast SEO "Supprimez la base de la catégorie (habituellement/catégorie /) de l'URL de la catégorie".

Donc, mes pages de catégorie ont cette URL: sitename.com/Apple/ ("Apple" étant la page de catégorie)

Maintenant, je veux créer une nouvelle "page" avec le même slug, Apple.

Je peux facilement créer une nouvelle page "Apple". Toutefois, lorsque je vais sur sitename.com/Apple/, la page de catégorie s’affiche - à la place de la page nouvellement créée.

Ma question: Existe-t-il un moyen de "remplacer" la priorité par défaut de la catégorie sur une page? J'aimerais afficher la page car je vais en avoir le contrôle - je peux personnaliser, ajouter plus de contenu et les modifier facilement (de plus, les pages vont m'aider à mieux structurer mon site)

Apprécier ton aide!

4
Sid

Une solution possible consiste à not changer la base de la catégorie et laisser tel quel, mais modifier au lieu de cela toute sortie d'un lien de catégorie pour supprimer la base de la catégorie via un filtre. Cela aboutira bien sûr à un 404 si vous n'avez pas créé de page à la place de ces liens, il est donc nécessaire de créer une page pour chaque catégorie.

function wpa_alter_cat_links( $termlink, $term, $taxonomy ){
    if( 'category' != $taxonomy ) return $termlink;

    return str_replace( '/category', '', $termlink );
}
add_filter( 'term_link', 'wpa_alter_cat_links', 10, 3 );

Vous voudrez probablement tester ceci à la recherche d'éventuels effets secondaires, utilisez-le à vos risques et périls!

EDIT- modifier uniquement les liens de catégorie de niveau supérieur:

function wpa_alter_cat_links( $termlink, $term, $taxonomy ){
    if( 'category' == $taxonomy && 0 == $term->parent ){
        return str_replace( '/category', '', $termlink );
    }
    return $termlink;
}
add_filter( 'term_link', 'wpa_alter_cat_links', 10, 3 );
5
Milo

J'ai créé la fonction suivante, assez simple, afin de donner une importance plus grande aux pages qu'aux catégories lors du chargement du contenu.

(Remarque: ce n'est peut-être pas le meilleur, mais un moyen simple. J'ai trouvé un problème. Lors de l'utilisation du plug-in Advanced Custom Fields, il n'insère pas les champs personnalisés ni de l'ancienne, ni de la nouvelle page par défaut. Ajout de get_queried_object()->ID car le second paramètre de ACF get_field() a résolu ce problème. Testez-le soigneusement dans votre environnement WP.)

function loadPageFirst() {
    // get the actual category
    $actualCategory = get_category( get_query_var('cat') );
    // get the page with the same slug
    $matchingPage = get_page_by_path( $actualCategory->slug );

    // If no match, load the normal listing template and exit (edit if you are using a custom listing template, eg. category.php)
    if (!$matchingPage) {
        include( get_template_directory() . '/archive.php');
        die();
    }

    // Make a new query with the page's ID and load the page template
    query_posts( 'page_id=' . $matchingPage->ID );
    include( get_template_directory() . '/page.php');
    die();
}
add_filter( 'category_template', 'loadPageFirst' );

Vous pouvez l'inclure dans le fichier functions.php. Cela semble fonctionner correctement avec le plugin Yoast SEO.

2
bencergazda

Il existe une réponse très simple et parfaitement fonctionnelle ici: https://stackoverflow.com/questions/32310453/make-wordpress-use-the-page-instead-of-category

Pour le sac de l'exhaustivité:

Contexte

  • exemple.com est le domaine
  • J'ai une page WP appelée "foobar" avec un contenu
  • J'ai une WP catégorie de post appelée "foobar"
  • J'ai un WP post intitulé "choses amusantes à faire avec les foobars", et la catégorie est définie sur "foobar"

Attentes

  • Lorsque je me rends sur exemple.com/foobar, je souhaite afficher la page consacrée aux foobars, et non une page de catégorie WP contenant toutes les publications de blog portant cette catégorie.
  • Quand je vais au blog pour des choses amusantes, l'URL est example.com/foobar/fun-things-to-do-with-foobars/

Configuration

Voici ma configuration (elle ne nécessite aucun plugin supplémentaire ni modification de code). Quelques plugins installés sont WP Rocket et Yoast sur lesquels je vais me concentrer dans ce fil.

  1. Tableau de bord WP-> Paramètres-> Permaliens

  2. Sélectionnez "Structure personnalisée" et entrez /% category% /% postname%/dans le champ

  3. Sur la même page, remplacez "Base de catégorie" par un seul point. "." (pas de guillemets, juste un point/point/point)

J'ai installé Yoast, que j'avais configuré pour remplacer les paramètres de permalien, mais je crois que cela a gâché ma tâche.

  1. WP Tableau de bord-> SEO-> Avancé-> Permaliens (onglet)

  2. "Change URLs-> Strip the category base ..." = Garder

  3. Ensuite, vous devez vider le cache. J'utilise WP Rocket pour la mise en cache. J'ai donc vidé le cache et tout fonctionne désormais comme il se doit.

Edit: assurez-vous d’enregistrer vos modifications après les étapes 3 et 5

1
Paul Woods

Dépend. Si vous essayez de définir 2 pages différentes avec la même URL, ce n'est pas une bonne idée. Mais si vous ne vous souciez pas des pages de catégorie, vous pouvez les rediriger vers vos pages.

 RedirectMatch 301 ^/category/(.*)$ /$1

Ce code va dans .htaccess et redirige/catégorie/page à/page /

0
JMau

Pour ce faire, la "méthode WordPress" consiste à créer un modèle php personnalisé pour votre page de catégorie et à y appliquer vos personnalisations, plutôt que de créer une "page" unique.

Il existe également de nombreux plugins disponibles qui vous permettent d'ajouter des images et d'autres champs personnalisés à la page d'archivage des catégories, ce qui peut être une meilleure option si vous préférez ne pas modifier les fichiers de thème.

Sinon, je suggérerais d'ajouter une catégorie de base qui est peut-être l'un de vos mots clés principaux.

0
qccreative

Commencez par supprimer la catégorie dans yoast No-index la catégorie dans yoast, mais avant cela, la structure de lien permanent doit être définie sur /% category% /% postname% /

0
Vale