Inventory_Presser_Allow_Inventory_As_Home_Page

Inventory_Presser_Allow_Inventory_As_Home_Page


Description Description

Creates a special page that allows users to see "Inventory" in the list of possible home pages in Settings > Reading.


Top ↑

Source Source

File: includes/class-allow-inventory-as-home-page.php

class Inventory_Presser_Allow_Inventory_As_Home_Page
{
	const PAGE_META_KEY = '_inventory_presser_hidden_page';
	
	/**
	 * create_page
	 * 
	 * Creates a page so something shows up in the setting dropdown
	 *
	 * @return void
	 */
	private static function create_page()
	{
		//Does the page already exist?
		if( -1 != self::find_page_id() )
		{
			//Yes, abort
			return;
		}

		$id = wp_insert_post( array(
			'comment_status' => 'closed',
			'meta_input'     => array(
				self::PAGE_META_KEY => '1',
			),
			'post_content'   => __( 'This is not the real Inventory page. This page exists so that you can set the site\'s home page to the Inventory list in the Customizer or the Settings > Reading admin page. The Inventory "page" is actually a custom post type archive, and typically will not show up in those settings drop downs. All requests for this page will be redirected to the Inventory archive.', 'inventory-presser' ),
			'post_status'    => 'publish',
			'post_title'     => __( 'Inventory', 'inventory-presser' ),
			'post_type'      => 'page',
		) );
	}
	
	/**
	 * create_pages
	 *
	 * Are we on multi-site? If so, we need to create a page on every blog
	 * in the multisite network
	 * 
	 * @return void
	 */
	static function create_pages()
	{
		if( ! is_multisite() )
		{
			self::create_page();
			return;
		}

		//We are on multisite, create a page for every site on the network
		$sites = get_sites( array( 'network' => 1, 'limit' => 1000 ) );
		foreach( $sites as $site )
		{
			switch_to_blog( $site->blog_id );
			self::create_page();
			restore_current_blog();
		}
	}
	
	/**
	 * delete_pages
	 *
	 * Are we on multi-site? If so, we need to delete the page from every
	 * blog in the multisite network
	 * 
	 * @return void
	 */
	public static function delete_pages()
	{
		if( ! is_multisite() )
		{
			wp_delete_post( self::find_page_id(), true );
			return;
		}

		//We are on multisite, create a page for every site on the network
		$sites = get_sites( array( 'network' => 1, 'limit' => 1000 ) );
		foreach( $sites as $site )
		{
			switch_to_blog( $site->blog_id );
			wp_delete_post( self::find_page_id(), true );
			restore_current_blog();
		}
	}

	/**
	 * find_page_id
	 *
	 * Finds the ID of the page this plugin creates to allow the user to pick
	 * the inventory listing as a home page option.
	 *
	 * @return int The ID of the page or -1 if the page is not found.
	 */
	static function find_page_id()
	{
		$pages = get_pages( array(
			'meta_key'   => self::PAGE_META_KEY,
			'meta_value' => '1',
		) );

		if( empty( $pages ) )
		{
			return -1;
		}

		return $pages[0]->ID;
	}

	/**
	 * hide_page_from_edit_list
	 *
	 * Prevents the page this plugin creates from showing up in the list of
	 * pages while editing in the dashboard. We need a page to exist in order to
	 * allow users to choose it as their home page, but we don't want them to
	 * see an actual page in the list, because the Inventory listing is not a
	 * page, it's a custom post type archive.
	 *
	 * @param  WP_Query $query An instance of the WP_Query class
	 * @return void
	 */
	function hide_page_from_edit_list( $query )
	{
		global $pagenow, $post_type;
		if( is_admin() && 'edit.php' == $pagenow && 'page' == $post_type )
		{
			$query->query_vars['post__not_in'] = array( self::find_page_id() );
		}
	}
	
	/**
	 * hooks
	 *
	 * Adds hooks
	 * 
	 * @return void
	 */
	function hooks()
	{
		register_activation_hook( INVP_PLUGIN_FILE_PATH, array( 'Inventory_Presser_Allow_Inventory_As_Home_Page', 'create_pages' ) );
		
		add_filter( 'parse_query', array( $this, 'hide_page_from_edit_list' ) );
		add_action( 'pre_get_posts', array( $this, 'redirect_the_page' ) );
	}
	
	/**
	 * redirect_the_page
	 *
	 * Performs the redirect from our special page to the inventory archive
	 * 
	 * @param  WP_Query $wp_query
	 * @return void
	 */
	function redirect_the_page( $wp_query )
	{
		if( is_admin() )
		{
			return;
		}

		if( $wp_query->get( 'page_id' ) == get_option( 'page_on_front' ) && $wp_query->get( 'page_id' ) == self::find_page_id() )
		{
			wp_redirect( get_post_type_archive_link( INVP::POST_TYPE ) );
			exit;
		}
	}
}

Top ↑

Methods Methods