【问题标题】:Custom WP_Sitemaps_Provider sitemap page loading last blog post instead自定义 WP_Sitemaps_Provider 站点地图页面加载最后一篇博客文章
【发布时间】:2020-08-12 16:22:31
【问题描述】:

我已经更新到 Wordpress 5.5 并希望从安装中删除 Yoast,因为它几乎只用于站点地图,但是需要根据不同的帖子类型创建几个自定义站点地图,我目前正在使用 Yoast。

我正在添加一个自定义提供程序,如下所示,它覆盖了两个所需的抽象函数。这两个都在工作,新条目被添加到 wp-sitemap.xml 的站点地图索引中

但是,当单击 /wp-sitemap-range-1.xml 时,我会使用站点上的最新博客文章而不是预期的站点地图以及三种类型的文章来解决问题。

我在 Wordpress API 规范或 codex 中找不到任何文档,所以目前有点茫然 - 感谢任何帮助。与示例工作提供者的链接也将不胜感激,因为我已经搜索了很长时间以尝试找到没有运气的东西。

我接下来要检查所有 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', '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;
  }
  
  /*---------------------*/
}

【问题讨论】:

    标签: php wordpress wordpress-theming sitemap xml-sitemap


    【解决方案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 );
    });
    

    【讨论】:

    • 干杯马特,我会试一试,让你知道它是否有效
    • 我刚刚用一些示例代码更新了我的回复。我们的东西不使用 WP_Query,但你应该可以很好地调整它。
    • 为代码干杯马特。在接下来的几天里,我会看一下,如果你让它使用这个代码,那么我很有信心我可以调整它来让它工作。我会让你知道我是怎么做的并接受你的回答:-)
    • 快速提问。我已经有几个现有的 my-custom-sitemap1.xml、my-custom-sitemap2.xml 等文件,我试图确定上述代码中的方式/位置我只需将每个自定义站点地图条目放入主 wp -sitemap.xml 顶级站点地图?非常感谢您的帮助!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-08
    • 1970-01-01
    相关资源
    最近更新 更多