web-dev-qa-db-fra.com

Yoast SEO Breadcrombbs: Comment créer un filtre qui utilise l'URL Slug pour les titres d'Ariane

Je sais que nous pouvons éditer manuellement le titre d'Ariane pour une page ou une publication à l'aide de la fonctionnalité de Breadcrumbe de Yoast SEO.

Mais avec des milliers de messages et de pages sur un site existant, ce n'est pas souhaitable.

Mon cerveau devient une pomme de terre complète en ce qui concerne les choses autres que HTML et CSS et peut-être pirater certains éléments existants PHP extrait de code pour faire mes enchères avec beaucoup d'essais et d'erreurs. C'est pourquoi je suis pourquoi je suis Tendre la main à la communauté ici.

Exemple:

Une page enfant sur les widgets bleus vit à:

https://www.example.com/widgets/blue

Par défaut, je crois que le chemin Breadcrumbe généré automatiquement pour cette page enfant d'une page parent ressemblerait à quelque chose comme:

Accueil> Nous faisons les plus étonnants widgets au monde> Nos widgets bleus sont tout ce dont vous avez besoin!

Le filtre serait à la place:

  1. Utilisez la limace URL pour chaque page [widgets] et [bleu] en tant que titre de fil d'affections.
  2. Capitalisez la première lettre du premier mot.
  3. Tournez tous les tirets (-) dans la limace dans des espaces pour le titre d'Ariane.

Et émise une biblique qui ressemble à ceci:

Accueil> Widgets> Bleu

Le filtre ciblerait des pages, des poteaux et des catégories à travers le tableau afin que toutes les pages Web sur le site auraient un fil d'album avec des titres de fil d'album basés sur les limaces URL des différentes parties du chemin Breadcrumb.

S'il est possible de remplacer toujours manuellement le filtre en entrant dans un titre personnalisé de fil d'affichage dans le champ Titre de fil d'Ariane sur mesure Yoast SEO existant, ce serait génial.

J'ai essayé de trouver des extraits de code existants qui se rapprochent de cette fonctionnalité, mais n'ont pas été réussis jusqu'à présent.

Toute aide ou liens que vous êtes disposés à fournir sera très apprécié. Merci d'avance d'avoir pris le temps de répondre.

1
tfmwa

Yoast a un filtre à utiliser. Voir ici: https://gist.github.com/jmcclellan/b2d97FEE0E924E28FA1

J'ai utilisé cela pour ajouter des pages "parent" aux types de poste personnalisés. Nous voulions utiliser des pages comme étant notre catégorie Landers avec des types de poste personnalisés comme enfants. Yoast n'émettrait pas la limace de la page parent par défaut, car il n'y a techniquement aucune relation réelle, nous avons donc utilisé cette fonction pour remplacer et épiler dans la limace parent pour chaque type de poste personnalisé. Vous devriez être en mesure de modifier cette solution pour vos besoins:

add_filter("wpseo_breadcrumb_links", "wpse_100012_override_yoast_breadcrumb_trail");

function wpse_100012_override_yoast_breadcrumb_trail($links)
{
    $post_type = get_post_type();

    if ($post_type === 'claims') {
        $breadcrumb[] = array(
            'url' => '/claim',
            'text' => 'claim'
        );
        array_splice($links, 1, -3, $breadcrumb);
    }
    return $links;
}

Pour le style minuscule, utilisez simplement CSS:

#breadcrumbs {
    text-transform: lowercase;
}        
2
RedForest

En fait, je devais faire cela aujourd'hui, il s'avère, alors je suis allé de l'avant et j'ai écrit une solution pour les pages. Je n'utilise pas de messages, autres que CPT pour ce projet, mais avec une petite modification, cela peut également travailler pour les articles. J'ai quitté ma réponse précédente car elle fournit une solution pouvant être suffisante pour certaines utilisations.

add_filter('wpseo_breadcrumb_links', 'wpse350538_customize_yoast_breadcrumbs');

function wpse350538_customize_yoast_breadcrumbs($links)
{
    //get current page slug and make it pretty
    $current_page = sanitize_post($GLOBALS['wp_the_query']->get_queried_object());
    $slug = $current_page->post_name;
    $slug_pretty = str_replace('-', ' ', $slug);

    if (is_page()) {
        //this page has ancestors
        if ($current_page->post_parent) {
            //set the first breadcrumb to homepage
            $links = array(
                0 => array(
                    'url' => get_home_url(),
                    'text' => 'home'
                )
            );
            //get a list of parent pages, loop through them and add to link array
            $parents = get_post_ancestors($current_page->ID);
            foreach ($parents as $parent) {
                $id = get_post_field('ID', $parent);
                //make sure we don't add the current page twice
                if ($id !== $current_page->ID) {
                    //get parent slug and make it pretty
                    $parent_slug = get_post_field('post_name', $current_page->post_parent);
                    $links[] = array(
                        'url' => get_permalink($id),
                        'text' => str_replace('-', ' ', $parent_slug)
                    );
                }

            }
            //lastly, add current page to link array
            $links[] = array(
                'url' => $slug,
                'text' => $slug_pretty
            );

        } else {
            // this page is top level so we just use the slug and make it pretty
            $links = array(
                0 => array(
                    'url' => get_home_url(),
                    'text' => 'home'
                ),
                1 => array(
                    'url' => $slug,
                    'text' => $slug_pretty
                )
            );
        }

    }

    return $links;
}
0
RedForest