<?php

class WP_Sitemaps_Taxonomies extends WP_Sitemaps_Provider
{
    public function __construct()
    {
        $this->name = 'taxonomies';
        $this->object_type = 'term';
    }
    public function get_object_subtypes()
    {
        $taxonomies = get_taxonomies(array('public' => true), 'objects');
        $taxonomies = array_filter($taxonomies, 'is_taxonomy_viewable');
        return apply_filters('wp_sitemaps_taxonomies', $taxonomies);
    }
    public function get_url_list($page_num, $taxonomy = '')
    {
        $supported_types = $this->get_object_subtypes();
        if (!isset($supported_types[$taxonomy])) {
            return array();
        }
        $url_list = apply_filters('wp_sitemaps_taxonomies_pre_url_list', null, $taxonomy, $page_num);
        if (null !== $url_list) {
            return $url_list;
        }
        $url_list = array();
        $offset = ($page_num - 1) * wp_sitemaps_get_max_urls($this->object_type);
        $args = $this->get_taxonomies_query_args($taxonomy);
        $args['offset'] = $offset;
        $taxonomy_terms = new WP_Term_Query($args);
        if (!empty($taxonomy_terms->terms)) {
            foreach ($taxonomy_terms->terms as $term) {
                $term_link = get_term_link($term, $taxonomy);
                if (is_wp_error($term_link)) {
                    continue;
                }
                $sitemap_entry = array('loc' => $term_link);
                $sitemap_entry = apply_filters('wp_sitemaps_taxonomies_entry', $sitemap_entry, $term, $taxonomy);
                $url_list[] = $sitemap_entry;
            }
        }
        return $url_list;
    }
    public function get_max_num_pages($taxonomy = '')
    {
        if (empty($taxonomy)) {
            return 0;
        }
        $max_num_pages = apply_filters('wp_sitemaps_taxonomies_pre_max_num_pages', null, $taxonomy);
        if (null !== $max_num_pages) {
            return $max_num_pages;
        }
        $term_count = wp_count_terms($this->get_taxonomies_query_args($taxonomy));
        return (int) ceil($term_count / wp_sitemaps_get_max_urls($this->object_type));
    }
    protected function get_taxonomies_query_args($taxonomy)
    {
        $args = apply_filters('wp_sitemaps_taxonomies_query_args', array('fields' => 'ids', 'taxonomy' => $taxonomy, 'orderby' => 'term_order', 'number' => wp_sitemaps_get_max_urls($this->object_type), 'hide_empty' => true, 'hierarchical' => false, 'update_term_meta_cache' => false), $taxonomy);
        return $args;
    }
}