修改代码以更改站点地图中的时间戳时区


Modify code to change timestamp timezone in sitemap

下面是我用于站点地图的插件的代码。

  1. 我想知道是否有办法对所有日期变量和函数"强制"不同的时区。

  2. 如果没有,如何修改代码以更改时间戳以反映不同的时区?例如,America/New_York时区。

请查找date以快速找到相应的代码块。粘贴代码

<?php
/**
 * @package XML_Sitemaps
 */
class WPSEO_Sitemaps {
.....
    /**
     * Build the root sitemap -- example.com/sitemap_index.xml -- which lists sub-sitemaps
     * for other content types.
     *
     * @todo lastmod for sitemaps?
     */
    function build_root_map() {
        global $wpdb;
        $options = get_wpseo_options();
        $this->sitemap = '<sitemapindex xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">' . "'n";
        $base          = $GLOBALS['wp_rewrite']->using_index_permalinks() ? 'index.php/' : '';
        // reference post type specific sitemaps
        foreach ( get_post_types( array( 'public' => true ) ) as $post_type ) {
            if ( $post_type == 'attachment' )
                continue;
            if ( isset( $options['post_types-' . $post_type . '-not_in_sitemap'] ) && $options['post_types-' . $post_type . '-not_in_sitemap'] )
                continue;
            $count = $wpdb->get_var( $wpdb->prepare( "SELECT COUNT(ID) FROM $wpdb->posts WHERE post_type = %s AND post_status = 'publish' LIMIT 1", $post_type ) );
            // don't include post types with no posts
            if ( !$count )
                continue;
            $n = ( $count > 1000 ) ? (int) ceil( $count / 1000 ) : 1;
            for ( $i = 0; $i < $n; $i++ ) {
                $count = ( $n > 1 ) ? $i + 1 : '';
                if ( empty( $count ) || $count == $n ) {
                    $date = $this->get_last_modified( $post_type );
                } else {
                    $date = $wpdb->get_var( $wpdb->prepare( "SELECT post_modified_gmt FROM $wpdb->posts WHERE post_status = 'publish' AND post_type = %s ORDER BY post_modified_gmt ASC LIMIT 1 OFFSET %d", $post_type, $i * 1000 + 999 ) );
                    $date = date( 'c', strtotime( $date ) );
                }
                $this->sitemap .= '<sitemap>' . "'n";
                $this->sitemap .= '<loc>' . home_url( $base . $post_type . '-sitemap' . $count . '.xml' ) . '</loc>' . "'n";
                $this->sitemap .= '<lastmod>' . htmlspecialchars( $date ) . '</lastmod>' . "'n";
                $this->sitemap .= '</sitemap>' . "'n";
            }
        }
        // reference taxonomy specific sitemaps
        foreach ( get_taxonomies( array( 'public' => true ) ) as $tax ) {
            if ( in_array( $tax, array( 'link_category', 'nav_menu', 'post_format' ) ) )
                continue;
            if ( isset( $options['taxonomies-' . $tax . '-not_in_sitemap'] ) && $options['taxonomies-' . $tax . '-not_in_sitemap'] )
                continue;
            // don't include taxonomies with no terms
            if ( !$wpdb->get_var( $wpdb->prepare( "SELECT term_id FROM $wpdb->term_taxonomy WHERE taxonomy = %s AND count != 0 LIMIT 1", $tax ) ) )
                continue;
            // Retrieve the post_types that are registered to this taxonomy and then retrieve last modified date for all of those combined.
            $taxobj = get_taxonomy( $tax );
            $date   = $this->get_last_modified( $taxobj->object_type );
            $this->sitemap .= '<sitemap>' . "'n";
            $this->sitemap .= '<loc>' . home_url( $base . $tax . '-sitemap.xml' ) . '</loc>' . "'n";
            $this->sitemap .= '<lastmod>' . htmlspecialchars( $date ) . '</lastmod>' . "'n";
            $this->sitemap .= '</sitemap>' . "'n";
        }
        // allow other plugins to add their sitemaps to the index
        $this->sitemap .= apply_filters( 'wpseo_sitemap_index', '' );
        $this->sitemap .= '</sitemapindex>';
    }
    /**
     * Build a sub-sitemap for a specific post type -- example.com/post_type-sitemap.xml
     *
     * @param string $post_type Registered post type's slug
     */
    function build_post_type_map( $post_type ) {
        $options = get_wpseo_options();
        ............
        // We grab post_date, post_name, post_author and post_status too so we can throw these objects into get_permalink, which saves a get_post call for each permalink.
        while ( $total > $offset ) {
            $join_filter  = apply_filters( 'wpseo_posts_join', '', $post_type );
            $where_filter = apply_filters( 'wpseo_posts_where', '', $post_type );
            // Optimized query per this thread: http://wordpress.org/support/topic/plugin-wordpress-seo-by-yoast-performance-suggestion
            // Also see http://explainextended.com/2009/10/23/mysql-order-by-limit-performance-late-row-lookups/
            $posts = $wpdb->get_results( "SELECT l.ID, post_content, post_name, post_author, post_parent, post_modified_gmt, post_date, post_date_gmt
            FROM ( 
                SELECT ID FROM $wpdb->posts {$join_filter}
                        WHERE post_status = 'publish'
                        AND post_password = ''
                        AND post_type = '$post_type'
                        {$where_filter}
                        ORDER BY post_modified ASC
                        LIMIT $steps OFFSET $offset ) o
            JOIN $wpdb->posts l
                ON l.ID = o.ID
                ORDER BY l.ID" );
            /*          $posts = $wpdb->get_results("SELECT ID, post_content, post_name, post_author, post_parent, post_modified_gmt, post_date, post_date_gmt
                FROM $wpdb->posts {$join_filter}
                WHERE post_status = 'publish'
                AND post_password = ''
                AND post_type = '$post_type'
                {$where_filter}
                ORDER BY post_modified ASC
                LIMIT $steps OFFSET $offset"); */
            $offset = $offset + $steps;
            foreach ( $posts as $p ) {
                $p->post_type   = $post_type;
                $p->post_status = 'publish';
                $p->filter      = 'sample';
                if ( wpseo_get_value( 'meta-robots-noindex', $p->ID ) && wpseo_get_value( 'sitemap-include', $p->ID ) != 'always' )
                    continue;
                if ( wpseo_get_value( 'sitemap-include', $p->ID ) == 'never' )
                    continue;
                if ( wpseo_get_value( 'redirect', $p->ID ) && strlen( wpseo_get_value( 'redirect', $p->ID ) ) > 0 )
                    continue;
                $url = array();
                $url['mod'] = ( isset( $p->post_modified_gmt ) && $p->post_modified_gmt != '0000-00-00 00:00:00' ) ? $p->post_modified_gmt : $p->post_date_gmt;
                $url['chf'] = 'weekly';
                $url['loc'] = get_permalink( $p );
.............
    }
    /**
     * Build a sub-sitemap for a specific taxonomy -- example.com/tax-sitemap.xml
     *
     * @param string $taxonomy Registered taxonomy's slug
     */
    function build_tax_map( $taxonomy ) {
        $options = get_wpseo_options();
..........
            // Grab last modified date
            $sql        = "SELECT MAX(p.post_date) AS lastmod
                    FROM    $wpdb->posts AS p
                    INNER JOIN $wpdb->term_relationships AS term_rel
                    ON      term_rel.object_id = p.ID
                    INNER JOIN $wpdb->term_taxonomy AS term_tax
                    ON      term_tax.term_taxonomy_id = term_rel.term_taxonomy_id
                    AND     term_tax.taxonomy = '$c->taxonomy'
                    AND     term_tax.term_id = $c->term_id
                    WHERE   p.post_status = 'publish'
                    AND     p.post_password = ''";
            $url['mod'] = $wpdb->get_var( $sql );
            $url['chf'] = 'weekly';
            $output .= $this->sitemap_url( $url );
        }
    }
    /**
     * Build the <url> tag for a given URL.
     *
     * @param array $url Array of parts that make up this entry
     * @return string
     */
    function sitemap_url( $url ) {
        if ( isset( $url['mod'] ) )
            $date = mysql2date( "Y-m-d'TH:i:s+00:00", $url['mod'] );
        else
            $date = date( 'c' );
        $output = "'t<url>'n";
        $output .= "'t't<loc>" . $url['loc'] . "</loc>'n";
        $output .= "'t't<lastmod>" . $date . "</lastmod>'n";
        $output .= "'t't<changefreq>" . $url['chf'] . "</changefreq>'n";
        $output .= "'t't<priority>" . str_replace( ',', '.', $url['pri'] ) . "</priority>'n";
        if ( isset( $url['images'] ) && count( $url['images'] ) > 0 ) {
            foreach ( $url['images'] as $img ) {
                $output .= "'t't<image:image>'n";
                $output .= "'t't't<image:loc>" . esc_html( $img['src'] ) . "</image:loc>'n";
                if ( isset( $img['title'] ) )
                    $output .= "'t't't<image:title>" . _wp_specialchars( html_entity_decode( $img['title'], ENT_QUOTES, get_bloginfo('charset') ) ) . "</image:title>'n";
                if ( isset( $img['alt'] ) )
                    $output .= "'t't't<image:caption>" . _wp_specialchars( html_entity_decode( $img['alt'], ENT_QUOTES, get_bloginfo('charset') ) ) . "</image:caption>'n";
                $output .= "'t't</image:image>'n";
            }
        }
        $output .= "'t</url>'n";
        return $output;
    }
    /**
     * Get the modification date for the last modified post in the post type:
     *
     * @param array $post_types Post types to get the last modification date for
     * @return string
     */
    function get_last_modified( $post_types ) {
        global $wpdb;
        if ( !is_array( $post_types ) )
            $post_types = array( $post_types );
        $result = 0;
        foreach ( $post_types as $post_type ) {
            $key  = 'lastpostmodified:gmt:' . $post_type;
            $date = wp_cache_get( $key, 'timeinfo' );
            if ( !$date ) {
                $date = $wpdb->get_var( $wpdb->prepare( "SELECT post_modified_gmt FROM $wpdb->posts WHERE post_status = 'publish' AND post_type = %s ORDER BY post_modified_gmt DESC LIMIT 1", $post_type ) );
                if ( $date )
                    wp_cache_set( $key, $date, 'timeinfo' );
            }
            if ( strtotime( $date ) > $result )
                $result = strtotime( $date );
        }
        // Transform to W3C Date format.
        $result = date( 'c', $result );
        return $result;
    }
}
global $wpseo_sitemaps;
$wpseo_sitemaps = new WPSEO_Sitemaps();

我相信您正在寻找date_default_timezone_set()函数,它将强制所有日期函数(包括 date() )使用指定的时区。

date_default_timezone_set( 'America/New_York');

对于您的特定情况,仅将更改应用于插件,您应该使用 date_default_timezone_get() 保存当前时区,然后设置您自己的时区,并在完成后将其还原。所以,你可以做这样的事情:

class WPSEO_Sitemaps {
    private $old_timezone = '';
    private $new_timezone = 'America/New_York';
    function setTimezone() {
        $this->old_timezone = date_default_timezone_get();
        date_default_timezone_set( $this->new_timezone);
    }
    function revertTimezone() {
        date_default_timezone_set( $this->old_timezone);
    }
    function foo() {
        $this->setTimezone();
        date();
        $tihs->revertTimezone();
    }
}