自定义 WP_Sitemaps_Provider 站点地图页面加载最后一个博客 post
Custom WP_Sitemaps_Provider sitemap page loading last blog post instead
我已经更新到 Wordpress 5.5 并想从安装中删除 Yoast,因为它几乎只用于站点地图,但是需要创建几个基于不同 post 类型的自定义站点地图,我是目前正在使用 Yoast。
我正在添加一个自定义提供程序,如下所示,它覆盖了两个所需的抽象函数。这两个都在工作,新条目正在添加到 wp-sitemap.xml
的站点地图索引中
但是,当单击 /wp-sitemap-range-1.xml 时,我得到了网站上最新博客 post 的解决,而不是包含三个 post 的预期站点地图一起打字。
我无法在 Wordpress API 规范或法典中找到任何文档,所以目前有点不知所措 - 感谢您的帮助。一个 link 和一个工作提供者的例子也将不胜感激,因为我搜索了很远试图找到一些没有运气的东西。
我的下一步是检查主题中的所有 404 处理程序并重写处理程序,以查看是否有任何内容将其发送到错误的位置。我要生成更复杂的站点地图,但希望这三种 post 类型的简单聚合首先起作用。
<?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', 'keg', '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 扩展的名称 属性 需要与您在 Wordpress 中注册的名称相匹配。此外,这不应包含任何特殊字符
- 站点地图条目中支持的值是:changefreq、priority、loc 和 lastmod。这与我之前的缩短版本相反。
工作示例
/*---------------------*/
add_action('init', function() {
$rangeProvider = new key_sitemapProvidor('range', array('cask', 'keg', '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,
'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(
'changefreq' => 'weekly',
'priority' => 1.0,
'loc' => get_permalink($post),
'lastmod' => 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;
}
/*---------------------*/
}
我有同样的问题,文档根本不存在。
通过多次试验和错误,我发现 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 );
});
我已经更新到 Wordpress 5.5 并想从安装中删除 Yoast,因为它几乎只用于站点地图,但是需要创建几个基于不同 post 类型的自定义站点地图,我是目前正在使用 Yoast。
我正在添加一个自定义提供程序,如下所示,它覆盖了两个所需的抽象函数。这两个都在工作,新条目正在添加到 wp-sitemap.xml
的站点地图索引中但是,当单击 /wp-sitemap-range-1.xml 时,我得到了网站上最新博客 post 的解决,而不是包含三个 post 的预期站点地图一起打字。
我无法在 Wordpress API 规范或法典中找到任何文档,所以目前有点不知所措 - 感谢您的帮助。一个 link 和一个工作提供者的例子也将不胜感激,因为我搜索了很远试图找到一些没有运气的东西。
我的下一步是检查主题中的所有 404 处理程序并重写处理程序,以查看是否有任何内容将其发送到错误的位置。我要生成更复杂的站点地图,但希望这三种 post 类型的简单聚合首先起作用。
<?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', 'keg', '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 扩展的名称 属性 需要与您在 Wordpress 中注册的名称相匹配。此外,这不应包含任何特殊字符
- 站点地图条目中支持的值是:changefreq、priority、loc 和 lastmod。这与我之前的缩短版本相反。
工作示例
/*---------------------*/
add_action('init', function() {
$rangeProvider = new key_sitemapProvidor('range', array('cask', 'keg', '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,
'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(
'changefreq' => 'weekly',
'priority' => 1.0,
'loc' => get_permalink($post),
'lastmod' => 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;
}
/*---------------------*/
}
我有同样的问题,文档根本不存在。
通过多次试验和错误,我发现 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 );
});