问题描述
我已经更新到wordpress 5.5,并希望从安装中删除Yoast,因为它几乎只用于站点地图,但是我需要根据不同的帖子类型创建几个自定义站点地图,而我目前正在使用Yoast。 / p>
我正在添加一个自定义提供程序,如下所示,它覆盖了两个必需的抽象函数。两者都可以正常工作,并且新条目将被添加到wp-sitemap.xml的站点地图索引中
但是,当单击/wp-sitemap-range-1.xml时,我得到的是网站上的最新博客文章,而不是包含这三种文章类型的预期站点地图。
我在wordpress API规范或法典中找不到任何文档,所以现在有点茫然-感谢您的帮助。与示例工作提供程序的链接也将不胜感激,因为我已经进行了很多搜索,试图找到没有运气的东西。
下一步是检查主题中的所有404处理程序并重写处理程序,以查看是否有任何内容将其发送到错误的位置。我要制作的站点地图要复杂得多,但是希望这种简单的三种帖子类型的汇总首先起作用。
<?PHP
//Add provider for post types 'cast','keg','cider' to create a sitemap called 'range'
add_action('init',function() {
$rangeProvider = new key_sitemapProvider('range',array('cask','cider'));
wp_register_sitemap_provider('pmrs-range',$rangeProvider);
});
/*---------------------*/
class key_sitemapProvider extends WP_Sitemaps_Provider {
public $postTypes = array();
/*---------------------*/
public function __construct($name,$postTypes) {
$this->name = $name;
$this->postTypes = $postTypes;
$this->object_type = 'post';
}
/*---------------------*/
private function queryArgs(){
return array(
'post_type' => $this->postTypes,'post_status' => 'publish','posts_per_page' => -1,'orderby' => 'post_date','order' => 'DESC'
);
}
/*--OVERRIDE-----------*/
public function get_url_list($page_num,$post_type = '') {
$query = new WP_Query($this->queryArgs());
$urlList = array();
foreach($query->posts as $post) {
$sitemapEntry = array(
'chf' => 'weekly','pri' => 1.0,'loc' => get_permalink($post),'mod' => get_the_modified_time('Y-m-d H:i:s',$post)
);
$sitemapEntry = apply_filters('wp_sitemaps_posts_entry',$sitemapEntry,$post,$post_type);
$urlList[] = $sitemapEntry;
}
return $urlList;
}
/*--OVERRIDE-----------*/
public function get_max_num_pages($post_type = '') {
return 1;
}
/*---------------------*/
}
解决方案
感谢以下马特·贾沃斯基(Matt Jaworski)的回答,它找到了一种使之有效的方法,同时还有其他一些问题。
-
WP_Sitemaps_Provider扩展的
- Name属性需要与您在wordpress中注册的名称匹配。另外,它不应包含任何特殊字符
- 站点地图条目中支持的值为:changefreq,priority,loc和lastmod。这与我以前的缩短版本相反。
工作示例
/*---------------------*/
add_action('init',function() {
$rangeProvider = new key_sitemapProvidor('range','cider'));
wp_register_sitemap_provider('range',$rangeProvider);
});
/*---------------------*/
class key_sitemapProvidor extends WP_Sitemaps_Provider {
public $postTypes = array();
/*---------------------*/
public function __construct($name,$postTypes) {
$this->name = $name;
$this->postTypes = $postTypes;
$this->object_type = 'post';
}
/*---------------------*/
private function queryArgs(){
return array(
'post_type' => $this->postTypes,'order' => 'DESC'
);
}
/*--OVERRIDE-----------*/
public function get_url_list($page_num,$post_type = '') {
$query = new WP_Query($this->queryArgs());
$urlList = array();
foreach($query->posts as $post) {
$sitemapEntry = array(
'changefreq' => 'weekly','priority' => 1.0,'lastmod' => get_the_modified_time('Y-m-d H:i:s',$post_type);
$urlList[] = $sitemapEntry;
}
return $urlList;
}
/*--OVERRIDE-----------*/
public function get_max_num_pages($post_type = '') {
return 1;
}
/*---------------------*/
}
解决方法
我遇到了同样的问题,而文档根本不存在。
通过几次试验和错误,我发现WordPress最有可能不喜欢名称中的任何特殊字符。
在我的情况下,用community-posts
替换了communityposts
。
以下是我们正在研究的非常粗糙(但有效)的概念证明:
class PeepSo3_Sitemap_Provider extends WP_Sitemaps_Provider {
private $limit = 10; // @TODO CONFIGURABLE
public function __construct() {
$this->name = 'communityposts';
$this->object_type = 'communityposts';
}
private function sql($page_num) {
$sql =""; // your queries here;
return $wpdb->get_results($sql);
}
// retrieve a page of results
public function get_url_list( $page_num,$object_subtype = '' ) {
$url_list = [];
$posts = $this->sql($page_num);
foreach($posts as $post) {
$url_list[] = ['loc' => $post->url; // depends on your item structure
}
return $url_list;
}
// estimate how many pages are available
public function get_max_num_pages( $object_subtype = '' ) {
$posts = $this->sql(-1);
return ceil($posts[0]->count_posts/$this->limit);
}
}
// Register XML Sitemap Provider
add_filter('init',function() {
$provider = new PeepSo3_Sitemap_Provider();
wp_register_sitemap_provider( 'communityposts',$provider );
});