自定义WP_Sitemaps_Provider网站地图页面改为加载最后一篇博客文章

问题描述

我已经更新到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 );
});

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...