Learn more  » Push, build, and install  RubyGems npm packages Python packages Maven artifacts PHP packages Go Modules Bower components Debian packages RPM packages NuGet packages

jsarnowski / jsarnowski/generatepress-premium   php

Repository URL to install this package:

Version: 2.2.2 

/ class-post-type.php

<?php
/**
 * This file sets up our Elements post type.
 *
 * @package GP Premium
 */

if ( ! defined( 'ABSPATH' ) ) {
	exit; // No direct access, please.
}

/**
 * Start our Elements post type class.
 */
class GeneratePress_Elements_Post_Type {
	/**
	 * Instance.
	 *
	 * @since 1.7
	 *
	 * @var instance
	 */
	private static $instance;

	/**
	 *  Initiator
	 *
	 * @since 1.7
	 */
	public static function get_instance() {
		if ( ! isset( self::$instance ) ) {
			self::$instance = new self();
		}

		return self::$instance;
	}

	/**
	 * Build it.
	 *
	 * @since 1.7
	 */
	public function __construct() {
		add_action( 'init', array( $this, 'post_type' ) );

		if ( is_admin() ) {
			add_action( 'admin_menu', array( $this, 'menu_item' ), 100 );
			add_action( 'admin_head', array( $this, 'fix_current_item' ) );
			add_filter( 'manage_gp_elements_posts_columns', array( $this, 'register_columns' ) );
			add_action( 'manage_gp_elements_posts_custom_column', array( $this, 'add_columns' ), 10, 2 );
			add_action( 'restrict_manage_posts', array( $this, 'build_element_type_filter' ) );
			add_filter( 'pre_get_posts', array( $this, 'filter_element_types' ) );
			add_filter( 'register_post_type_args', array( $this, 'set_standard_element' ), 10, 2 );
			add_action( 'admin_enqueue_scripts', array( $this, 'admin_scripts' ) );
			add_action( 'admin_footer', array( $this, 'element_modal' ) );

			self::setup_metabox();
		}
	}

	/**
	 * Load the metabox.
	 *
	 * @since 1.7
	 */
	public function setup_metabox() {
		require plugin_dir_path( __FILE__ ) . 'class-metabox.php';
	}

	/**
	 * Set up our custom post type.
	 *
	 * @since 1.7
	 */
	public function post_type() {
		$labels = array(
			'name'                   => _x( 'Elements', 'Post Type General Name', 'gp-premium' ),
			'singular_name'          => _x( 'Element', 'Post Type Singular Name', 'gp-premium' ),
			'menu_name'              => __( 'Elements', 'gp-premium' ),
			'all_items'              => __( 'All Elements', 'gp-premium' ),
			'add_new'                => __( 'Add New Element', 'gp-premium' ),
			'add_new_item'           => __( 'Add New Element', 'gp-premium' ),
			'new_item'               => __( 'New Element', 'gp-premium' ),
			'edit_item'              => __( 'Edit Element', 'gp-premium' ),
			'update_item'            => __( 'Update Element', 'gp-premium' ),
			'search_items'           => __( 'Search Element', 'gp-premium' ),
			'featured_image'         => __( 'Background Image', 'gp-premium' ),
			'set_featured_image'     => __( 'Set background image', 'gp-premium' ),
			'remove_featured_image'  => __( 'Remove background image', 'gp-premium' ),
			'item_published'         => __( 'Element published.', 'gp-premium' ),
			'item_updated'           => __( 'Element updated.', 'gp-premium' ),
			'item_scheduled'         => __( 'Element scheduled.', 'gp-premium' ),
			'item_reverted_to_draft' => __( 'Element reverted to draft.', 'gp-premium' ),
		);

		$args = array(
			'labels'                => $labels,
			'supports'              => array( 'title', 'editor', 'thumbnail', 'custom-fields', 'page-attributes', 'revisions' ),
			'hierarchical'          => true,
			'public'                => false,
			'show_ui'               => true,
			'show_in_menu'          => false,
			'can_export'            => true,
			'has_archive'           => false,
			'exclude_from_search'   => true,
			'show_in_rest'          => true,
		);

		register_post_type( 'gp_elements', $args );
	}

	/**
	 * Disable editor and show_in_rest support for non-Block Elements.
	 *
	 * @since 1.11.0
	 * @param array  $args The existing args.
	 * @param string $post_type The current post type.
	 */
	public function set_standard_element( $args, $post_type ) {
		if ( 'gp_elements' === $post_type ) {
			$post_id = false;
			$type = false;

			if ( isset( $_GET['post'] ) ) { // phpcs:ignore -- No processing happening.
				$post_id = absint( $_GET['post'] ); // phpcs:ignore -- No processing happening.
			}

			if ( $post_id ) {
				$type = get_post_meta( $post_id, '_generate_element_type', true );
			} elseif ( isset( $_GET['element_type'] ) ) { // phpcs:ignore -- No processing happening.
				$type = esc_html( $_GET['element_type'] ); // phpcs:ignore -- No processing happening.
			}

			if ( ! $type ) {
				return $args;
			}

			if ( 'block' !== $type ) {
				$args['supports'] = array( 'title', 'thumbnail' );
				$args['show_in_rest'] = false;
				$args['hierarchical'] = false;
			}

			if ( 'block' === $type ) {
				$args['supports'] = array( 'title', 'editor', 'custom-fields', 'page-attributes', 'revisions' );
			}

			if ( 'layout' === $type ) {
				$args['labels']['add_new_item'] = __( 'Add New Layout', 'gp-premium' );
				$args['labels']['edit_item'] = __( 'Edit Layout', 'gp-premium' );
			}

			if ( 'hook' === $type ) {
				$args['labels']['add_new_item'] = __( 'Add New Hook', 'gp-premium' );
				$args['labels']['edit_item'] = __( 'Edit Hook', 'gp-premium' );
			}

			if ( 'header' === $type ) {
				$args['labels']['add_new_item'] = __( 'Add New Header', 'gp-premium' );
				$args['labels']['edit_item'] = __( 'Edit Header', 'gp-premium' );
			}
		}

		return $args;
	}

	/**
	 * Register custom post type columns.
	 *
	 * @since 1.7
	 *
	 * @param array $columns Existing CPT columns.
	 * @return array All our CPT columns.
	 */
	public function register_columns( $columns ) {
		$columns['element_type'] = esc_html__( 'Type', 'gp-premium' );
		$columns['location'] = esc_html__( 'Location', 'gp-premium' );
		$columns['exclusions'] = esc_html__( 'Exclusions', 'gp-premium' );
		$columns['users'] = esc_html__( 'Users', 'gp-premium' );

		$new_columns = array();

		// Need to do some funky stuff to display these columns before the date.
		foreach ( $columns as $key => $value ) {
			if ( 'date' === $key ) {
				$new_columns['element_type'] = esc_html__( 'Type', 'gp-premium' );
				$new_columns['location'] = esc_html__( 'Location', 'gp-premium' );
				$new_columns['exclusions'] = esc_html__( 'Exclusions', 'gp-premium' );
				$new_columns['users'] = esc_html__( 'Users', 'gp-premium' );
			}

			$new_columns[ $key ] = $value;
		}

		return $new_columns;
	}

	/**
	 * Add a filter select input to the admin list.
	 *
	 * @since 1.7
	 */
	public function build_element_type_filter() {
		$screen = function_exists( 'get_current_screen' ) ? get_current_screen() : false;

		if ( ! $screen ) {
			return;
		}

		if ( ! isset( $screen->post_type ) || 'gp_elements' !== $screen->post_type ) {
			return;
		}

		$values = array(
			'block' => esc_html__( 'Blocks', 'gp-premium' ),
			'header' => esc_html__( 'Headers', 'gp-premium' ),
			'hook' => esc_html__( 'Hooks', 'gp-premium' ),
			'layout' => esc_html__( 'Layouts', 'gp-premium' ),
		);

		$current_element_type = isset( $_GET['gp_element_type_filter'] ) ? esc_html( $_GET['gp_element_type_filter'] ) : '';  // phpcs:ignore -- No processing happening.
		$current_block_type = isset( $_GET['gp_elements_block_type_filter'] ) ? esc_html( $_GET['gp_elements_block_type_filter'] ) : '';  // phpcs:ignore -- No processing happening.
		?>
		<select name="gp_element_type_filter">
			<option value=""><?php esc_html_e( 'All types', 'gp-premium' ); ?></option>
			<?php
			foreach ( $values as $value => $label ) {
				printf(
					'<option value="%1$s" %2$s>%3$s</option>',
					esc_html( $value ),
					$value === $current_element_type ? 'selected="selected"' : '',
					esc_html( $label )
				);
			}
			?>
		</select>
		<?php
		if ( 'block' === $current_element_type ) {
			$block_types = array(
				'hook',
				'site-header',
				'page-hero',
				'content-template',
				'post-meta-template',
				'post-navigation-template',
				'archive-navigation-template',
				'right-sidebar',
				'left-sidebar',
				'site-footer',
			);
			?>
				<select name="gp_elements_block_type_filter">
					<option value=""><?php esc_html_e( 'All block types', 'gp-premium' ); ?></option>
					<?php
					foreach ( $block_types as $value ) {
						printf(
							'<option value="%1$s" %2$s>%3$s</option>',
							esc_html( $value ),
							$value === $current_block_type ? 'selected="selected"' : '',
							esc_html( GeneratePress_Elements_Helper::get_element_type_label( $value ) )
						);
					}
					?>
				</select>
			<?php
		}
	}

	/**
	 * Filter the shown elements in the admin list if our filter is set.
	 *
	 * @since 1.7
	 *
	 * @param object $query Existing query.
	 */
	public function filter_element_types( $query ) {
		// phpcs:ignore -- No processing happening.
		if ( ! isset( $_GET['post_type'] ) || 'gp_elements' != $_GET['post_type'] ) {
			return;
		}

		global $pagenow;

		$type = isset( $_GET['gp_element_type_filter'] ) ? $_GET['gp_element_type_filter'] : '';  // phpcs:ignore -- No processing happening.
		$meta_query = array();

		if ( 'edit.php' === $pagenow && $query->is_main_query() && '' !== $type ) {
			$meta_query[] = array(
				'key' => '_generate_element_type',
				'value' => esc_attr( $type ),
				'compare' => '=',
			);

			$block_type = isset( $_GET['gp_elements_block_type_filter'] ) ? $_GET['gp_elements_block_type_filter'] : '';  // phpcs:ignore -- No processing happening.

			if ( 'block' === $type && '' !== $block_type ) {
				$meta_query['relation'] = 'AND';

				$meta_query[] = array(
					'key' => '_generate_block_type',
					'value' => esc_attr( $block_type ),
					'compare' => '=',
				);
			}

			$query->set( 'meta_query', $meta_query );
		}
	}

	/**
	 * Add content to our custom post type columns.
	 *
	 * @since 1.7
	 *
	 * @param string $column The name of the column.
	 * @param int    $post_id The ID of the post row.
	 */
	public function add_columns( $column, $post_id ) {
		switch ( $column ) {
			case 'element_type':
				$type = get_post_meta( $post_id, '_generate_element_type', true );
				$hook_location = get_post_meta( $post_id, '_generate_hook', true );

				if ( 'block' === $type ) {
					echo esc_html__( 'Block', 'gp-premium' );

					$block_type = get_post_meta( $post_id, '_generate_block_type', true );

					if ( $block_type ) {
						echo ' - ' . esc_html( GeneratePress_Elements_Helper::get_element_type_label( $block_type ) );

						if ( 'hook' === $block_type && $hook_location ) {
							echo '<br />';

							if ( 'custom' === $hook_location ) {
								$custom_hook = get_post_meta( $post_id, '_generate_custom_hook', true );
								echo '<span class="hook-location">' . esc_html( $custom_hook ) . '</span>';
							} else {
								echo '<span class="hook-location">' . esc_html( $hook_location ) . '</span>';
							}
						}
					}
				}

				if ( 'header' === $type ) {
Loading ...