WordPress plugin page.
	Version: 1.6.0
	Author: Never5
	Author URI: http://www.never5.com/
	License: GPL v3
	Requires PHP: 5.3
	What The File Plugin
	Copyright (C) 2012-2022, Never5 - www.never5.com
	This program is free software: you can redistribute it and/or modify
	it under the terms of the GNU General Public License as published by
	the Free Software Foundation, either version 3 of the License, or
	(at your option) any later version.
	This program is distributed in the hope that it will be useful,
	but WITHOUT ANY WARRANTY; without even the implied warranty of
	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
	GNU General Public License for more details.
	You should have received a copy of the GNU General Public License
	along with this program.  If not, see .
*/
class WhatTheFile {
	const OPTION_INSTALL_DATE = 'whatthefile-install-date';
	const OPTION_ADMIN_NOTICE_KEY = 'whatthefile-hide-notice';
	CONST VERSION = '1.6.0';
	/** @var string $template_name */
	private $template_name = '';
	/** @var array $template_parts */
	private $template_parts = array();
	/**
	 * Method run on plugin activation
	 */
	public static function plugin_activation() {
		// include nag class
		require_once( plugin_dir_path( __FILE__ ) . '/classes/class-nag.php' );
		// insert install date
		WTF_Nag::insert_install_date();
	}
	/**
	 * Constructor
	 */
	public function __construct() {
		add_action( 'init', array( $this, 'frontend_hooks' ) );
		add_action( 'admin_init', array( $this, 'admin_hooks' ) );
	}
	/**
	 * Set up the admin hooks
	 *
	 * @return void
	 */
	public function admin_hooks() {
		// Check if user is an administrator
		if ( ! current_user_can( 'manage_options' ) ) {
			return;
		}
		// include nag class
		require_once( plugin_dir_path( __FILE__ ) . '/classes/class-nag.php' );
		// setup nag
		$nag = new WTF_Nag();
		$nag->setup();
		// include plugin links class
		require_once( plugin_dir_path( __FILE__ ) . '/classes/class-plugin-links.php' );
		// setup plugin links
		$plugin_links = new WTF_Plugin_Links();
		$plugin_links->setup();
	}
	/**
	 * Set up the frontend hooks
	 *
	 * @return void
	 */
	public function frontend_hooks() {
		// Don't run in admin or if the admin bar isn't showing
		if ( is_admin() || ! is_admin_bar_showing() ) {
			return;
		}
		// WTF actions and filers
		add_action( 'wp_head', array( $this, 'print_css' ) );
		add_action( 'wp_footer', array( $this, 'print_frontend_js' ), 50 );
		add_filter( 'template_include', array( $this, 'save_current_page' ), PHP_INT_MAX );
		add_action( 'admin_bar_menu', array( $this, 'admin_bar_menu' ), 1000 );
		add_action( 'wp_enqueue_scripts', array( $this, 'enqueue_frontend_script' ) );
		// BuddyPress support
		if ( class_exists( 'BuddyPress' ) ) {
			add_action( 'bp_core_pre_load_template', array( $this, 'save_buddy_press_template' ) );
		}
		// Template part hooks
		add_action( 'all', array( $this, 'save_template_parts' ), 1, 3 );
	}
	/**
	 * Get the current page
	 *
	 * @return string
	 */
	private function get_current_page() {
		return $this->template_name;
	}
	/**
	 * Check if file exists in child theme
	 *
	 * @param $file
	 *
	 * @return bool
	 */
	private function file_exists_in_child_theme( $file ) {
		return file_exists( get_stylesheet_directory() . '/' . $file );
	}
	/**
	 * Returns if direct file editing through WordPress is allowed
	 *
	 * @return bool
	 */
	private function is_file_editing_allowed() {
		return ! ( ( defined( 'DISALLOW_FILE_EDIT' ) && true == DISALLOW_FILE_EDIT ) || ( defined( 'DISALLOW_FILE_MODS' ) && true == DISALLOW_FILE_MODS ) );
	}
	/**
	 * Save the template parts in our array
	 *
	 * @param string $tag
	 * @param string|null $slug
	 * @param string|null $name
	 */
	public function save_template_parts( $tag, $slug = null, $name = null ) {
		if ( 0 !== strpos( $tag, 'get_template_part_' ) ) {
			return;
		}
		// Check if slug is set
		if ( $slug != null ) {
			// Templates array
			$templates = array();
			// Add possible template part to array
			if ( $name != null ) {
				$templates[] = "{$slug}-{$name}.php";
			}
			// Add possible template part to array
			$templates[] = "{$slug}.php";
			// Get the correct template part
			$template_part = str_replace( get_template_directory() . '/', '', locate_template( $templates ) );
			$template_part = str_replace( get_stylesheet_directory() . '/', '', $template_part );
			// Add template part if found
			if ( $template_part != '' ) {
				$this->template_parts[] = $template_part;
			}
		}
	}
	/**
	 * Save the BuddyPress template
	 *
	 * @param $template
	 */
	public function save_buddy_press_template( $template ) {
		if ( '' == $this->template_name ) {
			$template_name       = $template;
			$template_name       = str_ireplace( get_template_directory() . '/', '', $template_name );
			$template_name       = str_ireplace( get_stylesheet_directory() . '/', '', $template_name );
			$this->template_name = $template_name;
		}
	}
	/**
	 * Save the current page in our local var
	 *
	 * @param $template_name
	 *
	 * @return mixed
	 */
	public function save_current_page( $template_name ) {
		$this->template_name = basename( $template_name );
		// Do Roots Theme check
		if ( function_exists( 'roots_template_path' ) ) {
			$this->template_name = basename( roots_template_path() );
		} else if( function_exists( 'Roots\Sage\Wrapper\template_path' ) ) {
			$this->template_name = basename( Roots\Sage\Wrapper\template_path() );
		}
		return $template_name;
	}
	/**
	 * Add the admin bar menu
	 */
	public function admin_bar_menu() {
		global $wp_admin_bar;
		// Check if direct file editing is allowed
		$edit_allowed = $this->is_file_editing_allowed();
		// Add top menu
		$wp_admin_bar->add_menu( array(
			'id'     => 'wtf-bar',
			'parent' => 'top-secondary',
			'title'  => __( 'What The File', 'what-the-file' ),
			'href'   => false
		) );
		// Check if template file exists in child theme
		$theme = get_stylesheet();
		if ( ! $this->file_exists_in_child_theme( $this->get_current_page() ) ) {
			$theme = get_template();
		}
		// Add current page
		$wp_admin_bar->add_menu( array(
			'id'     => 'wtf-bar-template-file',
			'parent' => 'wtf-bar',
			'title'  => $this->get_current_page(),
			'href'   => ( ( $edit_allowed ) ? get_admin_url() . 'theme-editor.php?file=' . $this->get_current_page() . '&theme=' . $theme : false )
		) );
		// Add template parts menu item
		$wp_admin_bar->add_menu( array(
			'id'     => 'wtf-bar-template-parts',
			'parent' => 'wtf-bar',
			'title'  => 'Template Parts',
			'href'   => false
		) );
		// add a dummy child, we replace this via JS
		$wp_admin_bar->add_menu( array(
			'id'     => 'wtf-bar-template-part-loading',
			'parent' => 'wtf-bar-template-parts',
			'title'  => 'Loading...',
			'href'   => false
		) );
		// Add powered by
		$wp_admin_bar->add_menu( array(
			'id'     => 'wtf-bar-powered-by',
			'parent' => 'wtf-bar',
			'title'  => 'Powered by Never5',
			'href'   => 'http://www.never5.com?utm_source=plugin&utm_medium=wtf-bar&utm_campaign=what-the-file'
		) );
	}
	/**
	 * Print the custom CSS
	 */
	public function print_css() {
		echo "\n";
	}
	/**
	 * Enqueue frontend JS
	 *
	 * @return void
	 */
	public function enqueue_frontend_script() {
		wp_enqueue_script( 'rp4wp-frontend-js', plugin_dir_url( __FILE__ ) . 'assets/js/what-the-file.js', array(), self::VERSION, true );
	}
	/**
	 * Print frontend JS
	 *
	 * @return void
	 */
	public function print_frontend_js() {
		$edit_allowed = $this->is_file_editing_allowed();
		$templates = array();
		foreach ( $this->template_parts as $template_part ) {
			// dedupe template parts
			foreach ( $templates as $t ) {
				if ( $t['file'] == $template_part ) {
					continue 2;
				}
			}
			$theme = get_stylesheet();
			if ( ! $this->file_exists_in_child_theme( $template_part ) ) {
				$theme = get_template();
			}
			$templates[] = array(
				"edit_url" => ( ( $edit_allowed ) ? get_admin_url() . 'theme-editor.php?file=' . $template_part . '&theme=' . $theme : false ),
				"file"     => $template_part
			);
		}
		echo "";
	}
}
/**
 * What The File main function
 */
function __what_the_file_main() {
	new WhatTheFile();
}
// Init plugin
add_action( 'plugins_loaded', '__what_the_file_main' );
// Register hook
register_activation_hook( __FILE__, array( 'WhatTheFile', 'plugin_activation' ) );