Yoast SEO面包屑:如何为面包屑标题创建一个使用url块的过滤器

时间:2019-10-15 作者:tfmwa

我知道我们可以使用Yoast SEO的面包屑功能手动编辑页面或帖子的面包屑标题。

但现有网站上有数千篇帖子和页面,这是不可取的。

当涉及到html和css以外的东西时,我的脑子里就满是土豆,可能会通过大量的尝试和错误来破解一些现有的PHP代码片段。所以,这就是为什么我要接触这里的社区。

示例:

关于蓝色小部件的子页面位于:

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

默认情况下,我认为自动为父页面的子页面生成的面包屑路径如下所示:

Home > We make the most amazing widgets in the world > Our Blue widgets are everything you need!

过滤器将改为:

使用每个页面的url slug[小部件]和[蓝色]作为面包屑标题并输出如下所示的面包屑:

Home > Widgets > Blue

该过滤器将针对所有页面、帖子和类别,这样网站上的所有网页都将有一个面包屑,其中面包屑标题基于面包屑路径不同部分的url段塞。

如果仍然可以通过在现有的Yoast SEO自定义面包屑标题字段中输入自定义面包屑标题来手动覆盖过滤器,那就太棒了。

我试图找到与此功能相近的现有代码段,但迄今为止尚未成功。

我们将非常感谢您提供的任何帮助或链接。提前感谢您抽出时间回复。

2 个回复
SO网友:RedForest

Yoast确实有一个过滤器供您使用。请参见此处:https://gist.github.com/jmcclellan/b2d97ffee0e924e28fa1

我使用它向自定义帖子类型添加“父”页面。我们想使用页面作为我们的类别着陆器,并将自定义帖子类型作为子级。默认情况下,Yoast不会输出父页面slug,因为在技术上没有真正的关系,所以我们使用此函数来覆盖和拼接每个自定义post类型的父slug。您应该能够根据需要修改此解决方案:

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;
}
对于小写样式,只需使用CSS:

#breadcrumbs {
    text-transform: lowercase;
}        

SO网友:RedForest

事实证明,我今天确实需要这样做,所以我继续写了一个页面解决方案。除了CPT之外,我不使用POST,但只要稍加修改,这也可以用于POST。我留下了我之前的答案,因为它确实提供了一种可能足以满足某些用途的解决方案。

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;
}