448 lines
13 KiB
PHP
448 lines
13 KiB
PHP
|
<?php
|
||
|
/**
|
||
|
* This file handles the Display Rule conditions for Elements.
|
||
|
*
|
||
|
* @package GP Premium
|
||
|
*/
|
||
|
|
||
|
if ( ! defined( 'ABSPATH' ) ) {
|
||
|
exit; // No direct access, please.
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* The conditions class.
|
||
|
*/
|
||
|
class GeneratePress_Conditions {
|
||
|
/**
|
||
|
* Instance.
|
||
|
*
|
||
|
* @var instance
|
||
|
*/
|
||
|
private static $instance;
|
||
|
|
||
|
/**
|
||
|
* Initiator
|
||
|
*/
|
||
|
public static function get_instance() {
|
||
|
if ( ! isset( self::$instance ) ) {
|
||
|
self::$instance = new self();
|
||
|
}
|
||
|
|
||
|
return self::$instance;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Output our available location conditions.
|
||
|
*
|
||
|
* @since 1.7
|
||
|
*
|
||
|
* @return array
|
||
|
*/
|
||
|
public static function get_conditions() {
|
||
|
$types = array(
|
||
|
'general' => array(
|
||
|
'label' => esc_attr__( 'General', 'gp-premium' ),
|
||
|
'locations' => array(
|
||
|
'general:site' => esc_attr__( 'Entire Site', 'gp-premium' ),
|
||
|
'general:front_page' => esc_attr__( 'Front Page', 'gp-premium' ),
|
||
|
'general:blog' => esc_attr__( 'Blog', 'gp-premium' ),
|
||
|
'general:singular' => esc_attr__( 'All Singular', 'gp-premium' ),
|
||
|
'general:archive' => esc_attr__( 'All Archives', 'gp-premium' ),
|
||
|
'general:author' => esc_attr__( 'Author Archives', 'gp-premium' ),
|
||
|
'general:date' => esc_attr__( 'Date Archives', 'gp-premium' ),
|
||
|
'general:search' => esc_attr__( 'Search Results', 'gp-premium' ),
|
||
|
'general:no_results' => esc_attr__( 'No Search Results', 'gp-premium' ),
|
||
|
'general:404' => esc_attr__( '404 Template', 'gp-premium' ),
|
||
|
'general:is_paged' => esc_attr__( 'Paginated Results', 'gp-premium' ),
|
||
|
),
|
||
|
),
|
||
|
);
|
||
|
|
||
|
// Add the post types.
|
||
|
$post_types = get_post_types(
|
||
|
array(
|
||
|
'public' => true,
|
||
|
),
|
||
|
'objects'
|
||
|
);
|
||
|
|
||
|
foreach ( $post_types as $post_type_slug => $post_type ) {
|
||
|
|
||
|
if ( in_array( $post_type_slug, array( 'fl-theme-layout' ) ) ) {
|
||
|
continue;
|
||
|
}
|
||
|
|
||
|
$post_type_object = get_post_type_object( $post_type_slug );
|
||
|
$counts = wp_count_posts( $post_type_slug );
|
||
|
$count = $counts->publish + $counts->future + $counts->draft + $counts->pending + $counts->private;
|
||
|
|
||
|
// Add the post type.
|
||
|
$types[ $post_type_slug ] = array(
|
||
|
'label' => esc_html( $post_type->labels->name ),
|
||
|
'locations' => array(
|
||
|
'post:' . $post_type_slug => esc_html( $post_type->labels->singular_name ),
|
||
|
),
|
||
|
);
|
||
|
|
||
|
// Add the post type archive.
|
||
|
// We add this regardless of `has_archive` as we deal with that after taxonomies are added.
|
||
|
$types[ $post_type_slug . '_archive' ] = array(
|
||
|
/* translators: post type name */
|
||
|
'label' => sprintf( esc_html_x( '%s Archives', '%s is a singular post type name', 'gp-premium' ), $post_type->labels->singular_name ),
|
||
|
'locations' => array(
|
||
|
/* translators: post type name */
|
||
|
'archive:' . $post_type_slug => sprintf( esc_html_x( '%s Archive', '%s is a singular post type name', 'gp-premium' ), $post_type->labels->singular_name ),
|
||
|
),
|
||
|
);
|
||
|
|
||
|
// Add the taxonomies for the post type.
|
||
|
$taxonomies = get_object_taxonomies( $post_type_slug, 'objects' );
|
||
|
|
||
|
foreach ( $taxonomies as $taxonomy_slug => $taxonomy ) {
|
||
|
|
||
|
$public = $taxonomy->public && $taxonomy->show_ui;
|
||
|
|
||
|
if ( 'post_format' === $taxonomy_slug ) {
|
||
|
continue;
|
||
|
} elseif ( ! apply_filters( 'generate_elements_show_taxonomy', $public, $taxonomy ) ) {
|
||
|
continue;
|
||
|
}
|
||
|
|
||
|
$label = str_replace(
|
||
|
array(
|
||
|
$post_type->labels->name,
|
||
|
$post_type->labels->singular_name,
|
||
|
),
|
||
|
'',
|
||
|
$taxonomy->labels->singular_name
|
||
|
);
|
||
|
|
||
|
if ( isset( $types[ $post_type_slug . '_archive' ]['locations'] ) ) {
|
||
|
/* translators: '%1$s is post type label. %2$s is taxonomy label. */
|
||
|
$types[ $post_type_slug . '_archive' ]['locations'][ 'taxonomy:' . $taxonomy_slug ] = sprintf( esc_html_x( '%1$s %2$s Archive', '%1$s is post type label. %2$s is taxonomy label.', 'gp-premium' ), $post_type->labels->singular_name, $label );
|
||
|
}
|
||
|
|
||
|
if ( isset( $types[ $post_type_slug ]['locations'] ) ) {
|
||
|
$types[ $post_type_slug ]['locations'][ $post_type_slug . ':taxonomy:' . $taxonomy_slug ] = esc_html( $post_type->labels->singular_name . ' ' . $label );
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// Remove the archives location if `has_archive` is set to false.
|
||
|
if ( 'post' !== $post_type_slug && empty( $post_type_object->has_archive ) ) {
|
||
|
unset( $types[ $post_type_slug . '_archive' ]['locations'][ 'archive:' . $post_type_slug ] );
|
||
|
}
|
||
|
|
||
|
// Remove the entire item if no locations exist.
|
||
|
if ( 0 === count( (array) $types[ $post_type_slug . '_archive' ]['locations'] ) ) {
|
||
|
unset( $types[ $post_type_slug . '_archive' ] );
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return $types;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Output our available user conditions.
|
||
|
*
|
||
|
* @since 1.7
|
||
|
*
|
||
|
* @return array
|
||
|
*/
|
||
|
public static function get_user_conditions() {
|
||
|
$rules = array(
|
||
|
'general' => array(
|
||
|
'label' => esc_attr__( 'General', 'gp-premium' ),
|
||
|
'rules' => array(
|
||
|
'general:all' => esc_attr__( 'All Users', 'gp-premium' ),
|
||
|
'general:logged_in' => esc_attr__( 'Logged In', 'gp-premium' ),
|
||
|
'general:logged_out' => esc_attr__( 'Logged Out', 'gp-premium' ),
|
||
|
),
|
||
|
),
|
||
|
'role' => array(
|
||
|
'label' => esc_attr__( 'Roles', 'gp-premium' ),
|
||
|
'rules' => array(),
|
||
|
),
|
||
|
);
|
||
|
|
||
|
$roles = get_editable_roles();
|
||
|
|
||
|
foreach ( $roles as $slug => $data ) {
|
||
|
$rules['role']['rules'][ $slug ] = $data['name'];
|
||
|
}
|
||
|
|
||
|
return $rules;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Get our current location.
|
||
|
*
|
||
|
* @since 1.7
|
||
|
*
|
||
|
* @return array
|
||
|
*/
|
||
|
public static function get_current_location() {
|
||
|
global $wp_query;
|
||
|
global $post;
|
||
|
|
||
|
$location = null;
|
||
|
$object = null;
|
||
|
$queried_object = get_queried_object();
|
||
|
|
||
|
// Get the location string.
|
||
|
if ( is_front_page() ) {
|
||
|
$location = 'general:front_page';
|
||
|
} elseif ( is_home() ) {
|
||
|
$location = 'general:blog';
|
||
|
} elseif ( is_author() ) {
|
||
|
$location = 'general:author';
|
||
|
} elseif ( is_date() ) {
|
||
|
$location = 'general:date';
|
||
|
} elseif ( is_search() ) {
|
||
|
$location = 'general:search';
|
||
|
|
||
|
global $wp_query;
|
||
|
|
||
|
if ( 0 === $wp_query->found_posts ) {
|
||
|
$location = 'general:no_results';
|
||
|
}
|
||
|
} elseif ( is_404() ) {
|
||
|
$location = 'general:404';
|
||
|
} elseif ( is_category() ) {
|
||
|
|
||
|
$location = 'taxonomy:category';
|
||
|
|
||
|
if ( is_object( $queried_object ) ) {
|
||
|
$object = $queried_object->term_id;
|
||
|
}
|
||
|
} elseif ( is_tag() ) {
|
||
|
|
||
|
$location = 'taxonomy:post_tag';
|
||
|
|
||
|
if ( is_object( $queried_object ) ) {
|
||
|
$object = $queried_object->term_id;
|
||
|
}
|
||
|
} elseif ( is_tax() ) {
|
||
|
|
||
|
$location = 'taxonomy:' . get_query_var( 'taxonomy' );
|
||
|
|
||
|
if ( is_object( $queried_object ) ) {
|
||
|
$location = 'taxonomy:' . $queried_object->taxonomy;
|
||
|
$object = $queried_object->term_id;
|
||
|
}
|
||
|
} elseif ( is_post_type_archive() ) {
|
||
|
$post_type = $wp_query->get( 'post_type' );
|
||
|
|
||
|
if ( is_array( $post_type ) ) {
|
||
|
$location = 'archive:' . $post_type[0];
|
||
|
} else {
|
||
|
$location = 'archive:' . $post_type;
|
||
|
}
|
||
|
} elseif ( is_singular() ) {
|
||
|
|
||
|
if ( is_object( $post ) ) {
|
||
|
$location = 'post:' . $post->post_type;
|
||
|
}
|
||
|
|
||
|
if ( is_object( $queried_object ) ) {
|
||
|
$object = $queried_object->ID;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if ( is_admin() && function_exists( 'get_current_screen' ) ) {
|
||
|
$current_screen = get_current_screen();
|
||
|
|
||
|
if ( isset( $current_screen->is_block_editor ) && $current_screen->is_block_editor ) {
|
||
|
$post_id = false;
|
||
|
|
||
|
if ( isset( $_GET['post'] ) ) { // phpcs:ignore -- Just checking if it's set.
|
||
|
$post_id = absint( $_GET['post'] ); // phpcs:ignore -- No data processing going on.
|
||
|
}
|
||
|
|
||
|
if ( $post_id ) {
|
||
|
// Get the location string.
|
||
|
$front_page_id = get_option( 'page_on_front' );
|
||
|
$blog_id = get_option( 'page_for_posts' );
|
||
|
|
||
|
if ( (int) $post_id === (int) $front_page_id ) {
|
||
|
$location = 'general:front_page';
|
||
|
} elseif ( (int) $post_id === (int) $blog_id ) {
|
||
|
$location = 'general:blog';
|
||
|
} else {
|
||
|
if ( isset( $current_screen->post_type ) ) {
|
||
|
$location = 'post:' . $current_screen->post_type;
|
||
|
}
|
||
|
|
||
|
$object = $post_id;
|
||
|
}
|
||
|
} elseif ( isset( $_GET['post_type'] ) ) { // phpcs:ignore -- Just checking if it's set.
|
||
|
$location = 'post:' . esc_attr( $_GET['post_type'] ); // phpcs:ignore -- No data processing going on.
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return array(
|
||
|
'rule' => $location,
|
||
|
'object' => $object,
|
||
|
);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Get info on the current user.
|
||
|
*
|
||
|
* @since 1.7
|
||
|
*
|
||
|
* @return array
|
||
|
*/
|
||
|
public static function get_current_user() {
|
||
|
$status = array();
|
||
|
if ( is_user_logged_in() ) {
|
||
|
$status[] = 'general:logged_in';
|
||
|
} else {
|
||
|
$status[] = 'general:logged_out';
|
||
|
}
|
||
|
|
||
|
$user = wp_get_current_user();
|
||
|
|
||
|
foreach ( (array) $user->roles as $role ) {
|
||
|
$status[] = $role;
|
||
|
}
|
||
|
|
||
|
return $status;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Figure out if we should display the element or not.
|
||
|
*
|
||
|
* @since 1.7
|
||
|
*
|
||
|
* @param array $conditionals The conditions.
|
||
|
* @param array $exclude The exclusions.
|
||
|
* @param array $roles The roles.
|
||
|
* @return bool
|
||
|
*/
|
||
|
public static function show_data( $conditionals, $exclude, $roles ) {
|
||
|
$current_location = self::get_current_location();
|
||
|
$show = false;
|
||
|
|
||
|
// Show depending on location conditionals.
|
||
|
if ( ! $show ) {
|
||
|
foreach ( (array) $conditionals as $conditional ) {
|
||
|
if ( in_array( 'general:site', $conditional ) ) {
|
||
|
$show = true;
|
||
|
} elseif ( is_singular() && in_array( 'general:singular', $conditional ) ) {
|
||
|
$show = true;
|
||
|
} elseif ( is_archive() && in_array( 'general:archive', $conditional ) ) {
|
||
|
$show = true;
|
||
|
} elseif ( ! empty( $current_location['rule'] ) && in_array( $current_location['rule'], $conditional ) ) {
|
||
|
if ( ! isset( $conditional['object'] ) || empty( $conditional['object'] ) ) {
|
||
|
$show = true;
|
||
|
} else {
|
||
|
if ( in_array( $current_location['object'], $conditional ) ) {
|
||
|
$show = true;
|
||
|
}
|
||
|
}
|
||
|
} elseif ( is_singular() && strstr( $conditional['rule'], ':taxonomy:' ) ) {
|
||
|
$tax = substr( $conditional['rule'], strrpos( $conditional['rule'], ':' ) + 1 );
|
||
|
|
||
|
if ( $tax && isset( $conditional['object'] ) && has_term( $conditional['object'], $tax ) ) {
|
||
|
$show = true;
|
||
|
}
|
||
|
} elseif ( is_front_page() && is_home() && ( in_array( 'general:blog', $conditional ) || in_array( 'general:front_page', $conditional ) ) ) {
|
||
|
// If the home page is the blog, both of general:blog and general:front_page apply.
|
||
|
$show = true;
|
||
|
} elseif ( in_array( 'general:is_paged', $conditional ) && is_paged() ) {
|
||
|
$show = true;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// Exclude based on exclusion conditionals.
|
||
|
if ( $show ) {
|
||
|
foreach ( (array) $exclude as $conditional ) {
|
||
|
if ( is_singular() && in_array( 'general:singular', $conditional ) ) {
|
||
|
$show = false;
|
||
|
} elseif ( is_archive() && in_array( 'general:archive', $conditional ) ) {
|
||
|
$show = false;
|
||
|
} elseif ( ! empty( $current_location['rule'] ) && in_array( $current_location['rule'], $conditional ) ) {
|
||
|
if ( ! isset( $conditional['object'] ) || empty( $conditional['object'] ) ) {
|
||
|
$show = false;
|
||
|
} else {
|
||
|
if ( in_array( $current_location['object'], $conditional ) ) {
|
||
|
$show = false;
|
||
|
}
|
||
|
}
|
||
|
} elseif ( is_singular() && strstr( $conditional['rule'], ':taxonomy:' ) ) {
|
||
|
$tax = substr( $conditional['rule'], strrpos( $conditional['rule'], ':' ) + 1 );
|
||
|
|
||
|
if ( $tax && isset( $conditional['object'] ) && has_term( $conditional['object'], $tax ) ) {
|
||
|
$show = false;
|
||
|
}
|
||
|
} elseif ( is_front_page() && is_home() && ( in_array( 'general:blog', $conditional ) || in_array( 'general:front_page', $conditional ) ) ) {
|
||
|
// If the home page is the blog, both of general:blog and general:front_page apply.
|
||
|
$show = false;
|
||
|
} elseif ( in_array( 'general:is_paged', $conditional ) && is_paged() ) {
|
||
|
$show = false;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// Exclude user roles.
|
||
|
if ( $show && ! empty( $roles ) ) {
|
||
|
$user_info = self::get_current_user();
|
||
|
|
||
|
$check = array_intersect( $roles, $user_info );
|
||
|
if ( ! count( $check ) > 0 && ! in_array( 'general:all', $roles ) ) {
|
||
|
$show = false;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return $show;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Returns the label for a saved location.
|
||
|
*
|
||
|
* @since 1.7
|
||
|
* @param string $saved_location The location.
|
||
|
* @return string|bool
|
||
|
*/
|
||
|
public static function get_saved_label( $saved_location ) {
|
||
|
$locations = self::get_conditions();
|
||
|
|
||
|
$rule = $saved_location['rule'];
|
||
|
$object_id = $saved_location['object'];
|
||
|
$object_type = '';
|
||
|
$label = false;
|
||
|
|
||
|
foreach ( $locations as $data ) {
|
||
|
if ( isset( $data['locations'][ $rule ] ) && ! $label ) {
|
||
|
$label = $data['locations'][ $rule ];
|
||
|
|
||
|
$object_types = explode( ':', $rule );
|
||
|
|
||
|
if ( in_array( 'taxonomy', $object_types ) && $object_id ) {
|
||
|
$term = get_term( $object_id );
|
||
|
|
||
|
if ( ! is_object( $term ) || is_wp_error( $term ) ) {
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
$label .= ': ' . $term->name;
|
||
|
} elseif ( ( in_array( 'post', $object_types ) || in_array( 'page', $object_types ) ) && $object_id ) {
|
||
|
$post = get_post( $object_id );
|
||
|
|
||
|
if ( ! is_object( $post ) ) {
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
$label .= ': ' . $post->post_title;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return $label;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
GeneratePress_Conditions::get_instance();
|