HEX
Server: Apache/2.4.65 (Debian)
System: Linux 88f31f35b0b8 6.1.0-38-amd64 #1 SMP PREEMPT_DYNAMIC Debian 6.1.147-1 (2025-08-02) x86_64
User: www-data (33)
PHP: 8.2.29
Disabled: NONE
Upload Files
File: /var/www/html/wp-content/plugins/wpseo-news/classes/admin-page.php
<?php
/**
 * Yoast SEO: News plugin file.
 *
 * @package WPSEO_News\Admin
 */

/**
 * Represents the admin page.
 */
class WPSEO_News_Admin_Page {

	/**
	 * Display admin page.
	 *
	 * @return void
	 */
	public function display() {
		// Admin header.
		Yoast_Form::get_instance()->admin_header( true, 'wpseo_news' );

		// Introduction.
		echo '<div id="wpseo-news-genre-removal-alert" style="max-width: 600px;"></div>';
		echo '<p>', esc_html__( 'You will generally only need a News Sitemap when your website is included in Google News.', 'wordpress-seo-news' ), '</p>';
		echo '<p>';
		printf(
			/* translators: %1$s opening tag of the link to the News Sitemap, %2$s closing tag for the link. */
			esc_html__( '%1$sView your News Sitemap%2$s.', 'wordpress-seo-news' ),
			'<a target="_blank" href="' . esc_url( WPSEO_News_Sitemap::get_sitemap_name() ) . '">',
			'</a>'
		);
		echo '</p>';

		echo '<h2>', esc_html__( 'General settings', 'wordpress-seo-news' ), '</h2>';

		/* translators: Hidden accessibility text. */
		echo '<fieldset><legend class="screen-reader-text">', esc_html__( 'News Sitemap settings', 'wordpress-seo-news' ), '</legend>';

		// Google News Publication Name.
		Yoast_Form::get_instance()->textinput( 'news_sitemap_name', __( 'Google News Publication Name', 'wordpress-seo-news' ) );

		echo '</fieldset>';

		// Post Types to include in News Sitemap.
		$this->include_post_types();

		// Post categories to exclude.
		$this->excluded_post_type_taxonomies();

		// Admin footer.
		Yoast_Form::get_instance()->admin_footer( true, false );
	}

	/**
	 * Generates the HTML for the post types which should be included in the sitemap.
	 *
	 * @return void
	 */
	private function include_post_types() {
		$post_type_helper = YoastSEO()->helpers->post_type;

		// Post Types to include in News Sitemap.
		echo '<h2>' . esc_html__( 'Post Types to include in News Sitemap', 'wordpress-seo-news' ) . '</h2>';
		/* translators: Hidden accessibility text. */
		echo '<fieldset><legend class="screen-reader-text">', esc_html__( 'Post Types to include:', 'wordpress-seo-news' ), '</legend>';

		$post_types      = get_post_types( [ 'public' => true ], 'objects' );
		$post_types_list = [];
		foreach ( $post_types as $post_type ) {
			if ( ! $post_type_helper->is_excluded( $post_type->name ) && $post_type->name !== 'attachment' ) {
				$post_types_list[ $post_type->name ] = $post_type->labels->name . ' (' . $post_type->name . ')';
			}
		}

		Yoast_Form::get_instance()->checkbox_list( 'news_sitemap_include_post_types', $post_types_list );

		echo '</fieldset><br>';
	}

	/**
	 * Generates the HTML for excluding post categories.
	 *
	 * @return void
	 */
	private function excluded_post_type_taxonomies() {
		$post_types = get_post_types( [ 'public' => true ], 'objects' );
		$post_types = array_filter( $post_types, [ $this, 'filter_included_post_type' ] );

		array_walk( $post_types, [ $this, 'excluded_post_type_taxonomies_output' ] );
	}

	/**
	 * Filter function used to determine what post times should be included in the new sitemap.
	 *
	 * @param WP_Post_Type $post_type The post type.
	 *
	 * @return bool Whether or not the post type should be included in the sitemap.
	 */
	protected function filter_included_post_type( $post_type ) {
		static $included_post_types;
		if ( ! $included_post_types ) {
			$included_post_types = (array) WPSEO_Options::get( 'news_sitemap_include_post_types', [] );
		}

		return array_key_exists( $post_type->name, $included_post_types );
	}

	/**
	 * Creates an array of objects containing taxonomies and the list of terms that are eligible for exclusion in the
	 * sitemap.
	 *
	 * @param WP_Post_Type $post_type Post type for which to exclude taxonomies.
	 *
	 * @return array Returns an array containing terms and taxonomies. Can be empty.
	 */
	private function get_excluded_post_type_taxonomies( $post_type ) {
		$excludable_taxonomies = new WPSEO_News_Excludable_Taxonomies( $post_type->name );

		return $excludable_taxonomies->get_terms();
	}

	/**
	 * Echoes the sub heading + checkboxes to exclude terms within each of the post type's taxonomies.
	 *
	 * @param WP_Post_Type $post_type The post type.
	 *
	 * @return void
	 */
	private function excluded_post_type_taxonomies_output( $post_type ) {
		$terms_per_taxonomy = $this->get_excluded_post_type_taxonomies( $post_type );

		if ( $terms_per_taxonomy === [] ) {
			return;
		}

		/* translators: %1%s expands to the post type name. */
		echo '<h2>' . esc_html( sprintf( __( 'Terms to exclude for %1$s', 'wordpress-seo-news' ), $post_type->labels->name ) ) . '</h2>';

		foreach ( $terms_per_taxonomy as $data ) {
			$taxonomy = $data['taxonomy'];
			$terms    = $data['terms'];

			/* translators: %1%s expands to the taxonomy name name. */
			echo '<h3>' . esc_html( sprintf( __( '%1$s to exclude', 'wordpress-seo-news' ), $taxonomy->labels->name ) ) . '</h3>';

			$taxonomies_list = [];
			foreach ( $terms as $term ) {
				$taxonomies_list[ $term->term_id . '_for_' . $post_type->name ] = $term->name;
			}

			Yoast_Form::get_instance()->checkbox_list( 'news_sitemap_exclude_terms', $taxonomies_list );
		}
	}

	/**
	 * Checks if the current page is a news seo plugin page.
	 *
	 * @param string $page The page to check.
	 *
	 * @return bool True when currently on a new page.
	 */
	protected function is_news_page( $page ) {
		$news_pages = [ 'wpseo_news' ];

		return in_array( $page, $news_pages, true );
	}
}