<?php
/**
 * Google News Sitemap Feed Template
 *
 * @package XML Sitemap Feed plugin for WordPress
 */

defined( 'WPINC' ) || die;

$options = get_option( 'xmlsf_news_tags' );

if ( XMLSF_GOOGLE_NEWS_NAME ) {
	$options['name'] = XMLSF_GOOGLE_NEWS_NAME;
}

// Do xml tag via echo or SVN parser is going to freak out.
echo '<?xml version="1.0" encoding="' . esc_xml( esc_attr( get_bloginfo( 'charset' ) ) ) . '"?>' . PHP_EOL;
echo '<?xml-stylesheet type="text/xsl" href="' . \esc_url( \wp_make_link_relative( XMLSF\get_stylesheet_url( 'news' ) ) ) . '?ver=' . \esc_xml( XMLSF_VERSION ) . '"?>' . PHP_EOL;
?>
<?php do_action( 'xmlsf_generator' ); ?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9" xmlns:news="http://www.google.com/schemas/sitemap-news/0.9" <?php do_action( 'xmlsf_urlset', 'news' ); ?>>
<?php
global $wp_query, $post;

setlocale( LC_TIME, 'C' );

// Loop away!
if ( have_posts() ) :
	$wp_query->in_the_loop = true;
	while ( have_posts() ) :
		// Not using the_post() to avoid expensive but useless setup_postdata().
		$post = $wp_query->next_post(); // phpcs:ignore WordPress.WP.GlobalVariablesOverride.Prohibited
		$url  = apply_filters( 'xmlsf_news_entry_url', get_permalink(), $post );

		// Use xmlsf_news_entry_url filter to return falsy value to exclude a specific URL.
		if ( empty( $url ) ) {
			continue;
		}

		// Or if post meta says "exclude me please".
		if ( apply_filters( 'xmlsf_news_excluded', get_post_meta( $post->ID, '_xmlsf_news_exclude', true ), $post->ID ) ) {
			continue;
		}

		$did_posts = true;

		do_action( 'xmlsf_news_url', $post );

		echo '<url><loc>' . esc_xml( esc_url( $url ) ) . '</loc>';

		// Make sure the post is not older than 2 days.
		$post_age = strtotime( $post->post_date_gmt );

		if ( $post_age && $post_age >= strtotime( '-48 hours' ) ) {
			// The news tags.
			echo '<news:news><news:publication><news:name>';
			echo esc_xml( apply_filters( 'xmlsf_news_publication_name', ( ! empty( $options['name'] ) ? $options['name'] : get_bloginfo( 'name' ) ), $post->ID, $post->post_type ) );
			echo '</news:name>';
			echo '<news:language>' . esc_xml( apply_filters( 'xmlsf_news_language', get_bloginfo( 'language' ), $post->ID, $post->post_type ) ) . '</news:language>';
			echo '</news:publication>';
			echo '<news:publication_date>' . esc_xml( get_date_from_gmt( $post->post_date_gmt, DATE_W3C ) ) . '</news:publication_date>';
			echo '<news:title>' . esc_xml( apply_filters( 'xmlsf_news_title', get_the_title() ) ) . '</news:title>';
			echo '<news:keywords>' . esc_xml( implode( ', ', (array) apply_filters( 'xmlsf_news_keywords', array(), $post->ID ) ) ) . '</news:keywords>';
			echo '<news:stock_tickers>' . esc_xml( implode( ', ', apply_filters( 'xmlsf_news_stock_tickers', array() ) ) ) . '</news:stock_tickers>';

			do_action( 'xmlsf_news_tags_inner', $post );

			echo '</news:news>';

			do_action( 'xmlsf_news_tags_after', $post );
		}

		echo '</url>';

		do_action( 'xmlsf_news_url_after', $post );

		echo PHP_EOL;
	endwhile;
	$wp_query->in_the_loop = false;
endif;

if ( empty( $did_posts ) ) {
	// No posts done? Then do at least the homepage to prevent error message in Google Search Console.
	echo '<url><loc>' . esc_url( home_url() ) . '</loc></url>' . PHP_EOL;
}
?>
</urlset>
