一般来说Yoast SEO 的 breadcrumb 功能已经很好了。
但是有的时候有的情况下还是需要一定的定制。
如果你有一个自定义文章 custom post type 叫 product,默认情况下, custom post type archive 页面会自动列出所有的 products,但是如果你想更容易的定制 product list 页面,我觉得最好还是创建一个页面模板, page-products.php, 然后创建一个页面来使用这个模板,这样你可以使用 custom fileds 来为这个页面定制更多可控制的内容。
为什么我不使用 custom post type archive page:
- archive page 的url 用的是 post-type, 也就是你的链接会是 domian.com/product/, 然而这个情况下的话我觉得用 domain.com/products/ 更有道理些。
- 如果 product archive 页面还有其他内容,banner 图片,描述,等等,这样你就很难去设置,而通过页面custom fileds 就很容易解决。
- 在使用 WPML 的时候更高的兼容性。
但是这样的设置在使用 Yoast breadcrumb 的时候会出现一个问题,就是你在 product 页面的时候,breadcrumb 会将你带回默认的custom post type archive 页面,这样,我们就需要更改这个链接。
我的方法是通过 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。