646 lines
16 KiB
PHP
646 lines
16 KiB
PHP
<?php
|
|
/**
|
|
* The Gutenberg Block.
|
|
*
|
|
* @link https://codesupply.co
|
|
* @since 1.0.0
|
|
*
|
|
* @package Sight
|
|
*/
|
|
|
|
/**
|
|
* The initialize block.
|
|
*/
|
|
class Sight_Block_Portfolio {
|
|
|
|
/**
|
|
* Initialize
|
|
*/
|
|
public function __construct() {
|
|
add_action( 'init', array( $this, 'block_register' ) );
|
|
add_action( 'wp_ajax_sight_render_thumbnail', array( $this, 'sight_render_thumbnail' ) );
|
|
add_action( 'wp_ajax_nopriv_sight_render_thumbnail', array( $this, 'sight_render_thumbnail' ) );
|
|
}
|
|
|
|
/**
|
|
* Registers layouts of block.
|
|
*/
|
|
public function block_layouts() {
|
|
$layouts = array(
|
|
'standard' => array(
|
|
'name' => esc_html__( 'Standard', 'sight' ),
|
|
'icon' => '<svg height="44" width="52" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 44.69 29.75"><path d="M1.55.75h9.59a.8.8 0 01.8.8v9.64a.8.8 0 01-.8.81H1.55a.8.8 0 01-.8-.81V1.55a.8.8 0 01.8-.8zM17.55.75h9.59a.8.8 0 01.8.8v9.64a.8.8 0 01-.8.81h-9.59a.8.8 0 01-.8-.81V1.55a.8.8 0 01.8-.8zM33.55.75h9.59a.8.8 0 01.8.8v9.64a.8.8 0 01-.8.81h-9.59a.8.8 0 01-.8-.81V1.55a.8.8 0 01.8-.8zM1.55 17.75h9.59a.8.8 0 01.8.8v9.64a.8.8 0 01-.8.81H1.55a.8.8 0 01-.8-.81v-9.64a.8.8 0 01.8-.8zM17.55 17.75h9.59a.8.8 0 01.8.8v9.64a.8.8 0 01-.8.81h-9.59a.8.8 0 01-.8-.81v-9.64a.8.8 0 01.8-.8zM33.55 17.75h9.59a.8.8 0 01.8.8v9.64a.8.8 0 01-.8.81h-9.59a.8.8 0 01-.8-.81v-9.64a.8.8 0 01.8-.8z" fill="none" stroke="#2d2d2d" stroke-width="1.5"/></svg>',
|
|
'template' => SIGHT_PATH . 'render/handler/post-area-init.php',
|
|
'attributes' => array(
|
|
'filter_items' => array(
|
|
'type' => 'boolean',
|
|
'default' => true,
|
|
'active_callback' => array(
|
|
array(
|
|
'field' => 'layout',
|
|
'operator' => '==',
|
|
'value' => 'standard',
|
|
),
|
|
array(
|
|
'field' => 'source',
|
|
'operator' => '==',
|
|
'value' => 'projects',
|
|
),
|
|
array(
|
|
'field' => 'projects_filter_post_type',
|
|
'operator' => '==',
|
|
'value' => 'sight-projects',
|
|
),
|
|
),
|
|
),
|
|
'pagination_type' => array(
|
|
'type' => 'string',
|
|
'default' => 'ajax',
|
|
'active_callback' => array(
|
|
array(
|
|
'field' => 'layout',
|
|
'operator' => '==',
|
|
'value' => 'standard',
|
|
),
|
|
array(
|
|
'field' => 'source',
|
|
'operator' => '==',
|
|
'value' => 'projects',
|
|
),
|
|
),
|
|
),
|
|
),
|
|
),
|
|
);
|
|
|
|
// Return.
|
|
return apply_filters( 'sight_block_portfolio_layouts', $layouts );
|
|
}
|
|
|
|
/**
|
|
* Registers attributes of block.
|
|
*/
|
|
public function block_attributes() {
|
|
$attributes = array(
|
|
'layout' => array(
|
|
'type' => 'string',
|
|
'default' => 'standard',
|
|
),
|
|
'source' => array(
|
|
'type' => 'string',
|
|
'default' => 'projects',
|
|
),
|
|
'video' => array(
|
|
'type' => 'string',
|
|
'default' => 'always',
|
|
'active_callback' => array(
|
|
array(
|
|
'field' => 'source',
|
|
'operator' => '==',
|
|
'value' => 'projects',
|
|
),
|
|
),
|
|
),
|
|
'video_controls' => array(
|
|
'type' => 'boolean',
|
|
'default' => true,
|
|
'active_callback' => array(
|
|
array(
|
|
'field' => 'source',
|
|
'operator' => '==',
|
|
'value' => 'projects',
|
|
),
|
|
array(
|
|
'field' => 'video',
|
|
'operator' => '!=',
|
|
'value' => 'none',
|
|
),
|
|
),
|
|
),
|
|
'custom_post' => array(
|
|
'type' => 'string',
|
|
'default' => '',
|
|
'active_callback' => array(
|
|
array(
|
|
'field' => 'source',
|
|
'operator' => '==',
|
|
'value' => 'post',
|
|
),
|
|
),
|
|
),
|
|
'custom_images' => array(
|
|
'type' => 'array',
|
|
'active_callback' => array(
|
|
array(
|
|
'field' => 'source',
|
|
'operator' => '==',
|
|
'value' => 'custom',
|
|
),
|
|
),
|
|
),
|
|
'number_items' => array(
|
|
'type' => 'number',
|
|
'default' => 10,
|
|
),
|
|
'attachment_lightbox' => array(
|
|
'type' => 'boolean',
|
|
'default' => false,
|
|
),
|
|
'attachment_lightbox_icon' => array(
|
|
'type' => 'boolean',
|
|
'default' => true,
|
|
'active_callback' => array(
|
|
array(
|
|
'field' => 'attachment_lightbox',
|
|
'operator' => '==',
|
|
'value' => true,
|
|
),
|
|
),
|
|
),
|
|
'attachment_link_to' => array(
|
|
'type' => 'string',
|
|
'default' => 'page',
|
|
'active_callback' => array(
|
|
array(
|
|
'field' => 'attachment_lightbox',
|
|
'operator' => '!=',
|
|
'value' => true,
|
|
),
|
|
),
|
|
),
|
|
'attachment_view_more' => array(
|
|
'type' => 'boolean',
|
|
'default' => false,
|
|
'active_callback' => array(
|
|
array(
|
|
'field' => 'attachment_lightbox',
|
|
'operator' => '!=',
|
|
'value' => true,
|
|
),
|
|
array(
|
|
'field' => 'attachment_link_to',
|
|
'operator' => '!=',
|
|
'value' => 'none',
|
|
),
|
|
),
|
|
),
|
|
'attachment_size' => array(
|
|
'type' => 'string',
|
|
'default' => 'large',
|
|
),
|
|
'attachment_orientation' => array(
|
|
'type' => 'string',
|
|
'default' => 'landscape-16-9',
|
|
),
|
|
'typography_heading' => array(
|
|
'type' => 'string',
|
|
'default' => '',
|
|
'active_callback' => array(
|
|
array(
|
|
'field' => 'source',
|
|
'operator' => '!=',
|
|
'value' => 'post',
|
|
),
|
|
array(
|
|
'field' => 'source',
|
|
'operator' => '!=',
|
|
'value' => 'custom',
|
|
),
|
|
array(
|
|
'field' => 'meta_title',
|
|
'operator' => '==',
|
|
'value' => true,
|
|
),
|
|
),
|
|
),
|
|
'typography_heading_tag' => array(
|
|
'type' => 'string',
|
|
'default' => 'h3',
|
|
'active_callback' => array(
|
|
array(
|
|
'field' => 'source',
|
|
'operator' => '!=',
|
|
'value' => 'post',
|
|
),
|
|
array(
|
|
'field' => 'source',
|
|
'operator' => '!=',
|
|
'value' => 'custom',
|
|
),
|
|
array(
|
|
'field' => 'meta_title',
|
|
'operator' => '==',
|
|
'value' => true,
|
|
),
|
|
),
|
|
),
|
|
'typography_caption' => array(
|
|
'type' => 'string',
|
|
'default' => '',
|
|
'active_callback' => array(
|
|
array(
|
|
'field' => 'meta_caption',
|
|
'operator' => '==',
|
|
'value' => true,
|
|
),
|
|
),
|
|
),
|
|
'meta_title' => array(
|
|
'type' => 'boolean',
|
|
'default' => true,
|
|
'active_callback' => array(
|
|
array(
|
|
'field' => 'source',
|
|
'operator' => '!=',
|
|
'value' => 'post',
|
|
),
|
|
array(
|
|
'field' => 'source',
|
|
'operator' => '!=',
|
|
'value' => 'custom',
|
|
),
|
|
),
|
|
),
|
|
'meta_caption' => array(
|
|
'type' => 'boolean',
|
|
'default' => true,
|
|
),
|
|
'meta_caption_length' => array(
|
|
'type' => 'number',
|
|
'default' => 100,
|
|
'active_callback' => array(
|
|
array(
|
|
'field' => 'meta_caption',
|
|
'operator' => '==',
|
|
'value' => true,
|
|
),
|
|
),
|
|
),
|
|
'meta_category' => array(
|
|
'type' => 'boolean',
|
|
'default' => false,
|
|
'active_callback' => array(
|
|
array(
|
|
'field' => 'source',
|
|
'operator' => '==',
|
|
'value' => 'projects',
|
|
),
|
|
array(
|
|
'field' => 'projects_filter_post_type',
|
|
'operator' => '==',
|
|
'value' => 'sight-projects',
|
|
),
|
|
),
|
|
),
|
|
'meta_date' => array(
|
|
'type' => 'boolean',
|
|
'default' => false,
|
|
'active_callback' => array(
|
|
array(
|
|
'field' => 'source',
|
|
'operator' => '!=',
|
|
'value' => 'categories',
|
|
),
|
|
),
|
|
),
|
|
'projects_filter_post_type' => array(
|
|
'type' => 'string',
|
|
'default' => 'sight-projects',
|
|
'active_callback' => array(
|
|
array(
|
|
'field' => 'source',
|
|
'operator' => '==',
|
|
'value' => 'projects',
|
|
),
|
|
),
|
|
),
|
|
'projects_filter_categories' => array(
|
|
'type' => 'array',
|
|
'active_callback' => array(
|
|
array(
|
|
'field' => 'source',
|
|
'operator' => '==',
|
|
'value' => 'projects',
|
|
),
|
|
array(
|
|
'field' => 'projects_filter_post_type',
|
|
'operator' => '==',
|
|
'value' => 'sight-projects',
|
|
),
|
|
),
|
|
),
|
|
'projects_filter_offset' => array(
|
|
'type' => 'string',
|
|
'active_callback' => array(
|
|
array(
|
|
'field' => 'source',
|
|
'operator' => '==',
|
|
'value' => 'projects',
|
|
),
|
|
),
|
|
),
|
|
'projects_orderby' => array(
|
|
'type' => 'string',
|
|
'default' => 'date',
|
|
'active_callback' => array(
|
|
array(
|
|
'field' => 'source',
|
|
'operator' => '==',
|
|
'value' => 'projects',
|
|
),
|
|
),
|
|
),
|
|
'projects_order' => array(
|
|
'type' => 'string',
|
|
'default' => 'DESC',
|
|
'active_callback' => array(
|
|
array(
|
|
'field' => 'source',
|
|
'operator' => '==',
|
|
'value' => 'projects',
|
|
),
|
|
),
|
|
),
|
|
'categories_filter_ids' => array(
|
|
'type' => 'array',
|
|
'active_callback' => array(
|
|
array(
|
|
'field' => 'source',
|
|
'operator' => '==',
|
|
'value' => 'categories',
|
|
),
|
|
),
|
|
),
|
|
'categories_orderby' => array(
|
|
'type' => 'string',
|
|
'default' => 'name',
|
|
'active_callback' => array(
|
|
array(
|
|
'field' => 'source',
|
|
'operator' => '==',
|
|
'value' => 'categories',
|
|
),
|
|
),
|
|
),
|
|
'categories_order' => array(
|
|
'type' => 'string',
|
|
'default' => 'ASC',
|
|
'active_callback' => array(
|
|
array(
|
|
'field' => 'source',
|
|
'operator' => '==',
|
|
'value' => 'categories',
|
|
),
|
|
),
|
|
),
|
|
'color_heading' => array(
|
|
'type' => 'string',
|
|
'default' => '',
|
|
'active_callback' => array(
|
|
array(
|
|
'field' => 'source',
|
|
'operator' => '!=',
|
|
'value' => 'post',
|
|
),
|
|
array(
|
|
'field' => 'source',
|
|
'operator' => '!=',
|
|
'value' => 'custom',
|
|
),
|
|
array(
|
|
'field' => 'meta_title',
|
|
'operator' => '==',
|
|
'value' => true,
|
|
),
|
|
),
|
|
),
|
|
'color_heading_hover' => array(
|
|
'type' => 'string',
|
|
'default' => '',
|
|
'active_callback' => array(
|
|
array(
|
|
'field' => 'source',
|
|
'operator' => '!=',
|
|
'value' => 'post',
|
|
),
|
|
array(
|
|
'field' => 'source',
|
|
'operator' => '!=',
|
|
'value' => 'custom',
|
|
),
|
|
array(
|
|
'field' => 'meta_title',
|
|
'operator' => '==',
|
|
'value' => true,
|
|
),
|
|
),
|
|
),
|
|
'color_caption' => array(
|
|
'type' => 'string',
|
|
'default' => '',
|
|
'active_callback' => array(
|
|
array(
|
|
'field' => 'meta_caption',
|
|
'operator' => '==',
|
|
'value' => true,
|
|
),
|
|
),
|
|
),
|
|
);
|
|
|
|
// Set attributes from layouts.
|
|
$layouts = $this->block_layouts();
|
|
|
|
foreach ( $layouts as $slug => $layout ) {
|
|
if ( isset( $layout['attributes'] ) && $layout['attributes'] ) {
|
|
foreach ( $layout['attributes'] as $attribute => $settings ) {
|
|
$attributes[ $slug . '_' . $attribute ] = $settings;
|
|
}
|
|
}
|
|
}
|
|
|
|
// Set system settings.
|
|
foreach ( $attributes as $key => $attribute ) {
|
|
$attributes[ $key ]['visible'] = true;
|
|
}
|
|
|
|
// Return.
|
|
return apply_filters( 'sight_block_portfolio_attributes', $attributes );
|
|
}
|
|
|
|
/**
|
|
* Registers a block type.
|
|
*/
|
|
public function block_register() {
|
|
wp_register_script( 'sight-block-portfolio', SIGHT_URL . 'gutenberg/jsx/block-portfolio.js', array( 'wp-blocks', 'wp-components', 'wp-element', 'wp-i18n', 'wp-editor' ) );
|
|
|
|
// Set config of block.
|
|
wp_localize_script(
|
|
'sight-block-portfolio',
|
|
'sightBlockConfig',
|
|
array(
|
|
'name' => esc_html__( 'Portfolio', 'sight' ),
|
|
'icon' => '<svg width="24" height="24" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg" role="img" aria-hidden="true" focusable="false"><path d="M20 4v12H8V4h12m0-2H8c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h12c1.1 0 2-.9 2-2V4c0-1.1-.9-2-2-2zm-8.5 9.67l1.69 2.26 2.48-3.1L19 15H9zM2 6v14c0 1.1.9 2 2 2h14v-2H4V6H2z"></path></svg>',
|
|
'category' => 'common',
|
|
'archive' => sight_is_archive(),
|
|
'layouts' => $this->block_layouts(),
|
|
'attributes' => $this->block_attributes(),
|
|
'post_types_stack' => $this->convert_array_to_options( sight_get_post_types_stack() ),
|
|
'categories_stack' => $this->convert_array_to_options( sight_get_categories_stack() ),
|
|
'image_sizes' => $this->convert_array_to_options( sight_get_list_available_image_sizes() ),
|
|
'ajax_url' => admin_url( 'admin-ajax.php' ),
|
|
)
|
|
);
|
|
|
|
// Register portfolio block.
|
|
register_block_type(
|
|
'sight/portfolio',
|
|
array(
|
|
'attributes' => $this->block_attributes(),
|
|
'editor_script' => 'sight-block-portfolio',
|
|
'render_callback' => array( $this, 'block_render_callback' ),
|
|
)
|
|
);
|
|
}
|
|
|
|
/**
|
|
* Render attributes from block.
|
|
*
|
|
* @param array $attributes The attributes.
|
|
* @param string $layout The layout.
|
|
*/
|
|
public function render_attributes( $attributes, $layout ) {
|
|
// Get layouts.
|
|
$block_attributes = $this->block_attributes();
|
|
|
|
foreach ( $attributes as $key => $settings ) {
|
|
if ( isset( $block_attributes[ $key ]['active_callback'] ) && $block_attributes[ $key ]['active_callback'] ) {
|
|
$is_visible = Sight_Utils_Is_Field_Visible::check_condition( $block_attributes[ $key ]['active_callback'], $attributes, 'AND' );
|
|
|
|
if ( ! $is_visible ) {
|
|
unset( $attributes[ $key ] );
|
|
}
|
|
}
|
|
}
|
|
|
|
return $attributes;
|
|
}
|
|
|
|
/**
|
|
* Render options from block.
|
|
*
|
|
* @param array $attributes The attributes.
|
|
* @param string $layout The layout.
|
|
*/
|
|
public function render_options( $attributes, $layout ) {
|
|
$options = array();
|
|
|
|
// Get layouts.
|
|
$layouts = $this->block_layouts();
|
|
|
|
// Render stack.
|
|
if ( isset( $layouts[ $layout ]['attributes'] ) && $layouts[ $layout ]['attributes'] ) {
|
|
|
|
foreach ( $layouts[ $layout ]['attributes'] as $key => $settings ) {
|
|
|
|
$search = $layout . '_' . $key;
|
|
|
|
if ( array_key_exists( $search, $attributes ) ) {
|
|
$options[ $key ] = $attributes[ $search ];
|
|
}
|
|
}
|
|
}
|
|
|
|
return $options;
|
|
}
|
|
|
|
/**
|
|
* Callback used to render blocks of this block type.
|
|
*
|
|
* @param array $attributes The attributes.
|
|
* @param string $content The content.
|
|
*/
|
|
public function block_render_callback( $attributes, $content ) {
|
|
$layouts = $this->block_layouts();
|
|
|
|
ob_start();
|
|
|
|
// Generate id.
|
|
$id = uniqid();
|
|
|
|
// Set layout.
|
|
$layout = $attributes['layout'];
|
|
|
|
// Render attributes.
|
|
$attributes = $this->render_attributes( $attributes, $layout );
|
|
|
|
// Render options.
|
|
$options = $this->render_options( $attributes, $layout );
|
|
|
|
// Set classes.
|
|
$classes = " sight-block-portfolio-id-{$id}";
|
|
$classes .= " sight-block-portfolio-layout-{$layout}";
|
|
|
|
// Output.
|
|
?>
|
|
<div class="sight-block-portfolio <?php echo esc_attr( $classes ); ?>">
|
|
<?php
|
|
if ( isset( $layouts[ $layout ]['template'] ) && file_exists( $layouts[ $layout ]['template'] ) ) {
|
|
|
|
// Require custom template.
|
|
require $layouts[ $layout ]['template'];
|
|
} else {
|
|
|
|
// Default template.
|
|
require SIGHT_PATH . 'render/handler/post-area-init.php';
|
|
}
|
|
?>
|
|
</div>
|
|
|
|
<?php sight_portfolio_render_style( $attributes, $options, $id ); ?>
|
|
|
|
<?php
|
|
|
|
return ob_get_clean();
|
|
}
|
|
|
|
/**
|
|
* Convert array to options
|
|
*
|
|
* @param array $array The array.
|
|
*/
|
|
public function convert_array_to_options( $array = array() ) {
|
|
|
|
$options = array();
|
|
|
|
foreach ( $array as $key => $value ) {
|
|
$options[] = array(
|
|
'value' => $key,
|
|
'label' => $value,
|
|
);
|
|
}
|
|
|
|
return $options;
|
|
}
|
|
|
|
/**
|
|
* Render thumbnail.
|
|
*/
|
|
public function sight_render_thumbnail() {
|
|
wp_verify_nonce( null );
|
|
|
|
if ( isset( $_GET['image_id'] ) ) { // Input var ok.
|
|
$image_id = sanitize_text_field( wp_unslash( $_GET['image_id'] ) ); // Input var ok.
|
|
|
|
$image_url = wp_get_attachment_image_url( $image_id, 'thumbnail' );
|
|
|
|
if ( $image_url ) {
|
|
header( 'Location: ' . $image_url );
|
|
}
|
|
}
|
|
die();
|
|
}
|
|
}
|
|
|
|
new Sight_Block_Portfolio();
|