怎么定制 Yoast breadcrumb

一般来说Yoast SEO 的 breadcrumb 功能已经很好了。

但是有的时候有的情况下还是需要一定的定制。

如果你有一个自定义文章 custom post type 叫 product,默认情况下, custom post type archive 页面会自动列出所有的 products,但是如果你想更容易的定制 product list 页面,我觉得最好还是创建一个页面模板, page-products.php, 然后创建一个页面来使用这个模板,这样你可以使用 custom fileds 来为这个页面定制更多可控制的内容。

为什么我不使用 custom post type archive page:

  1. archive page 的url 用的是 post-type, 也就是你的链接会是 domian.com/product/, 然而这个情况下的话我觉得用 domain.com/products/ 更有道理些。
  2. 如果 product archive 页面还有其他内容,banner 图片,描述,等等,这样你就很难去设置,而通过页面custom fileds 就很容易解决。
  3. 在使用 WPML 的时候更高的兼容性。

但是这样的设置在使用 Yoast breadcrumb 的时候会出现一个问题,就是你在 product 页面的时候,breadcrumb 会将你带回默认的custom post type archive 页面,这样,我们就需要更改这个链接。

breadcrumb

我的方法是通过 filter “ wpseo_breadcrumb_links ” 来实现。

if (class_exists('WPSEO_Breadcrumbs')) {
    //wpseo_breadcrumb_links
    add_filter('wpseo_breadcrumb_links', 'wpseo_breadcrumb_links_by_wpdevil');

    function wpseo_breadcrumb_links_by_wpdevil($links) {

        if(is_singular('product')){
            unset($links['1']); // 删除 post type archive
            array_splice($links, 1, 0, array(1 => array('id' => PRODUCTS_PAGE_ID))); //在 $links 数组第一位置插入 products 页面的 ID
        }

    	if(is_tax('product_category')){

			array_splice($links, 1, 0, array(1 => array('id' => PRODUCTS_PAGE_ID)));
		}

        if(isset($links[0]['text']) && empty($links[0]['text']))
            $links[0]['text'] = __('Home', WPDEVIL);


        return $links;
    }

     add_filter( 'wpseo_metabox_prio', function() { return 'low';});
}

主要用的一个数组函数

array_splice($links, 1, 0, array(1 => array('id' => PRODUCTS_PAGE_ID)));

在 $links 数组第一位置插入 products 页面的 ID。

PRODUCTS_PAGE_ID 是我预先定义的 静态变量,里面保存着 product page 的 ID。