HEX
Server: Apache/2.4.6 (CentOS) OpenSSL/1.0.2k-fips PHP/7.4.30
System: Linux iZj6c1151k3ad370bosnmsZ 3.10.0-1160.76.1.el7.x86_64 #1 SMP Wed Aug 10 16:21:17 UTC 2022 x86_64
User: root (0)
PHP: 7.4.30
Disabled: NONE
Upload Files
File: /var/www/html/breadsecret.com/wp-content/plugins/insert-php/admin/pages/class.snippet-library.php
<?php
/**
 * Snippet Library Page Class
 * 
 * @package Woody_Code_Snippets
 */

// Exit if accessed directly.
if ( ! defined( 'ABSPATH' ) ) {
	exit;
}

/**
 * WINP_SnippetLibrary Class
 */
class WINP_SnippetLibrary {
	
	/**
	 * Singleton instance
	 *
	 * @var WINP_SnippetLibrary|null
	 */
	private static $instance = null;

	/**
	 * Private constructor to prevent direct instantiation
	 */
	private function __construct() {
		add_action( 'admin_menu', [ $this, 'register_snippet_library_page' ] );
		
		require_once WINP_PLUGIN_DIR . '/admin/includes/class.snippets.table.php';
	}

	/**
	 * Register snippet library page
	 */
	public function register_snippet_library_page(): void {
		$page_hook_suffix = add_submenu_page(
			'edit.php?post_type=' . WINP_SNIPPETS_POST_TYPE,
			__( 'Snippets Library', 'insert-php' ),
			__( 'Snippets Library', 'insert-php' ),
			WINP_Helper::has_post_capabilities(),
			'snippet-library',
			[ $this, 'render_snippet_library_page' ]
		);

		add_action( "admin_print_scripts-$page_hook_suffix", [ $this, 'enqueue_snippet_library_assets' ] );
	}

	/**
	 * Load assets for snippet library page
	 */
	public function enqueue_snippet_library_assets(): void {
		wp_enqueue_style( 'winp-snippets-table', WINP_PLUGIN_URL . '/admin/assets/css/snippets-table.css', [], WINP_PLUGIN_VERSION );
		wp_enqueue_script( 'winp-snippet-library', WINP_PLUGIN_URL . '/admin/assets/js/snippet-library.js', [ 'jquery' ], WINP_PLUGIN_VERSION, true );
		wp_localize_script(
			'winp-snippet-library',
			'winp_snippet_library',
			[
				'is_import'     => __( 'Import snippet?', 'insert-php' ),
				'is_delete'     => __( 'Delete snippet?', 'insert-php' ),
				'import_failed' => __( 'Import failed. Please check your file format and try again.', 'insert-php' ),
				'delete_failed' => __( 'Delete failed. Please refresh the page and try again.', 'insert-php' ),
			]
		);
	}

	/**
	 * Render snippet library page content
	 */
	public function render_snippet_library_page(): void {
		$my_snippets_tab = true;
		$library_tab     = false;
		$my_snippets_url = esc_url_raw( remove_query_arg( [ 'tab' ] ) );
		$library_url     = esc_url_raw( add_query_arg( 'tab', 'library', $my_snippets_url ) );

		// phpcs:ignore WordPress.Security.NonceVerification.Recommended -- Just checking tab parameter for UI display
		if ( isset( $_GET['tab'] ) && 'library' === $_GET['tab'] ) {
			$my_snippets_tab = false;
			$library_tab     = true;
		}

		do_action( 'themeisle_internal_page', WINP_PLUGIN_SLUG, 'snippet-library' );
		?>
		<div class="wrap">
			<div class="winp-snippet-library">
				<h3><?php esc_html_e( 'Snippets Library', 'insert-php' ); ?></h3>

				<div class="nav-tab-wrapper">
					<a href="<?php echo esc_url( $my_snippets_url ); ?>" class="nav-tab<?php echo $my_snippets_tab ? ' nav-tab-active' : ''; ?>">
						<?php esc_html_e( 'My Snippets', 'insert-php' ); ?>
					</a>
					<a href="<?php echo esc_url( $library_url ); ?>" class="nav-tab<?php echo $library_tab ? ' nav-tab-active' : ''; ?>">
						<?php esc_html_e( 'Snippets Library', 'insert-php' ); ?>
					</a>
				</div>

				<?php if ( $library_tab ) : ?>
					<div id="tab1">
						<?php $this->render_html( true ); ?>
					</div>
				<?php else : ?>
					<div id="tab2">
						<?php $this->render_html( false ); ?>
					</div>
				<?php endif; ?>
			</div>
		</div>
		<?php
	}

	/**
	 * Render html part with snippets list
	 *
	 * @param bool $common Whether to show common snippets (library) or user snippets.
	 */
	private function render_html( bool $common ): void {
		$snippet_list_table = new WINP_Snippet_Library_Table();

		$is_pro = WINP_Plugin::app()->get_api_object()->is_key();
		// phpcs:ignore WordPress.Security.NonceVerification.Recommended -- Just checking tab parameter for display logic
		$is_library_tab = isset( $_GET['tab'] ) && 'library' === $_GET['tab'];
		
		if ( $is_pro || $is_library_tab ) :
			?>
			<!-- Forms are NOT created automatically, so you need to wrap the table in one to use features like bulk actions -->
			<form id="winp-snippet-library" method="get">
				<!-- For plugins, we also need to ensure that the form posts back to our current page -->
				<input type="hidden" name="page" value="<?php echo esc_attr( isset( $_GET['page'] ) ? sanitize_text_field( wp_unslash( $_GET['page'] ) ) : '' ); ?>"/>
				<!-- Now we can render the completed list table -->
				<?php
				$snippet_list_table->prepare_items( $common );
				$snippet_list_table->display();
				?>
			</form>

			<?php wp_nonce_field( 'winp-snippet-library', 'winp-snippet-library-nonce' ); ?>
		<?php else : ?>
			<div class="winp-upsell-container">
				<div class="winp-upsell-card">
					<div class="winp-upsell-icon">
						<span class="dashicons dashicons-category"></span>
					</div>
					<div class="winp-upsell-title">
						<?php esc_html_e( 'My Templates', 'insert-php' ); ?>
					</div>
					<p class="winp-upsell-badge">
						<?php esc_html_e( 'Pro feature', 'insert-php' ); ?>
					</p>
					<p class="winp-upsell-description">
						<?php esc_html_e( 'Snippets saved as templates sync automatically across all your sites—no import/export needed.', 'insert-php' ); ?>
					</p>
					<a href="<?php echo esc_url( tsdk_utmify( WINP_UPGRADE, 'snippet_library', 'my_templates_upsell' ) ); ?>" class="button button-primary button-large winp-upsell-button" target="_blank">
						<?php esc_html_e( 'Upgrade to Pro', 'insert-php' ); ?>
					</a>
				</div>
			</div>
			<?php
		endif;
	}

	/**
	 * Prevent cloning of the instance
	 * 
	 * @throws \Exception An exception when trying to clone the instance.
	 */
	private function __clone() {
		throw new \Exception( 'Cannot clone singleton' );
	}

	/**
	 * Prevent unserialization of the instance
	 * 
	 * @throws \Exception An exception when trying to unserialize the instance.
	 */
	public function __wakeup() {
		throw new \Exception( 'Cannot unserialize singleton' );
	}

	/**
	 * Get singleton instance
	 *
	 * @return WINP_SnippetLibrary
	 */
	public static function get_instance() {
		if ( null === self::$instance ) {
			self::$instance = new self();
		}
		return self::$instance;
	}
}