You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
223 lines
5.7 KiB
PHP
223 lines
5.7 KiB
PHP
<?php
|
|
/**
|
|
* Local Library API.
|
|
*
|
|
* @since ??
|
|
*
|
|
* @package Divi
|
|
*/
|
|
|
|
if ( ! defined( 'ABSPATH' ) ) {
|
|
exit; // Exit if accessed directly.
|
|
}
|
|
|
|
/**
|
|
* ET_Theme_Options_Library_Local utility class.
|
|
*
|
|
* Item can be a layout, a template, a theme option, a code snippet, etc.
|
|
*
|
|
* @since ??
|
|
*
|
|
* @return void
|
|
*/
|
|
class ET_Theme_Options_Library_Local extends ET_Item_Library_Local {
|
|
/**
|
|
* Gets the class instance.
|
|
*
|
|
* @since ??
|
|
*
|
|
* @return ET_Item_Library_Local
|
|
*/
|
|
public static function instance() {
|
|
if ( ! self::$_instance ) {
|
|
self::$_instance = new self();
|
|
}
|
|
|
|
return self::$_instance;
|
|
}
|
|
|
|
/**
|
|
* Constructor.
|
|
*/
|
|
public function __construct() {
|
|
$this->post_type = ET_THEME_OPTIONS_POST_TYPE;
|
|
|
|
$this->exceptional_processes = array(
|
|
'duplicate',
|
|
'duplicate_and_delete',
|
|
);
|
|
}
|
|
|
|
/**
|
|
* Gets the library items.
|
|
*
|
|
* @param string $item_type Item type.
|
|
* @return array
|
|
*/
|
|
public function get_library_items( $item_type ) {
|
|
$_ = ET_Core_Data_Utils::instance();
|
|
$theme_options_items = ET_Post_Type_Theme_Options::instance();
|
|
$theme_options_tags = ET_Builder_Post_Taxonomy_LayoutTag::instance();
|
|
$theme_options_categories = ET_Builder_Post_Taxonomy_LayoutCategory::instance();
|
|
|
|
$item_categories = [];
|
|
$item_tags = [];
|
|
$items = [];
|
|
$index = 0;
|
|
|
|
$query_posts = $theme_options_items
|
|
->query()
|
|
->run(
|
|
array(
|
|
'post_status' => array( 'publish', 'trash' ),
|
|
'orderby' => 'name',
|
|
'fields' => 'ids',
|
|
)
|
|
);
|
|
|
|
$post_ids = is_array( $query_posts ) ? $query_posts : array( $query_posts );
|
|
|
|
foreach ( $post_ids as $post_id ) {
|
|
$item = new stdClass();
|
|
$post = get_post( $post_id );
|
|
|
|
$item->id = $post->ID;
|
|
$item->index = $index;
|
|
$item->date = $post->post_date;
|
|
|
|
$title = html_entity_decode( $post->post_title );
|
|
|
|
// check if current user can edit library item.
|
|
$can_edit_post = current_user_can( 'edit_post', $item->id );
|
|
|
|
if ( $title ) {
|
|
// Remove periods since we use dot notation to retrieve translation.
|
|
$title = str_replace( '.', '', $title );
|
|
|
|
$item->name = et_core_intentionally_unescaped( $title, 'react_jsx' );
|
|
}
|
|
|
|
$built_for = get_post_meta( $item->id, '_built_for', true );
|
|
|
|
$item->slug = $post->post_name;
|
|
$item->url = esc_url( wp_make_link_relative( get_permalink( $post ) ) );
|
|
|
|
$item->short_name = '';
|
|
$item->builtFor = $built_for && '' !== $built_for ? $built_for : 'Divi'; // phpcs:ignore ET.Sniffs.ValidVariableName.UsedPropertyNotSnakeCase -- This is valid format for the property in the Cloud App.
|
|
$item->description = '';
|
|
$item->is_favorite = $theme_options_items->is_favorite( $item->id );
|
|
$item->isTrash = 'trash' === $post->post_status; // phpcs:ignore ET.Sniffs.ValidVariableName.UsedPropertyNotSnakeCase -- This is valid format for the property in the Cloud App.
|
|
$item->isReadOnly = ! $can_edit_post; // phpcs:ignore ET.Sniffs.ValidVariableName.UsedPropertyNotSnakeCase -- This is valid format for the property in the Cloud App.
|
|
$item->categories = array();
|
|
$item->category_ids = array();
|
|
$item->tags = array();
|
|
$item->tag_ids = array();
|
|
|
|
$this->process_item_taxonomy(
|
|
$post,
|
|
$item,
|
|
$index,
|
|
$item_categories,
|
|
$theme_options_categories->name,
|
|
'category'
|
|
);
|
|
|
|
$this->process_item_taxonomy(
|
|
$post,
|
|
$item,
|
|
$index,
|
|
$item_tags,
|
|
$theme_options_tags->name,
|
|
'tag'
|
|
);
|
|
|
|
$items[] = $item;
|
|
|
|
$index++;
|
|
}
|
|
|
|
return [
|
|
'categories' => $this->get_processed_terms( $theme_options_categories->name ),
|
|
'tags' => $this->get_processed_terms( $theme_options_tags->name ),
|
|
'items' => $items,
|
|
];
|
|
}
|
|
|
|
/**
|
|
* Performs item exceptional updates.
|
|
*
|
|
* @param array $payload Payload.
|
|
* @param array $updated_data Updated data.
|
|
*
|
|
* @since ??
|
|
*
|
|
* @return array
|
|
*/
|
|
private function _perform_item_exceptional_updates( $payload, $updated_data ) {
|
|
if ( empty( $payload['item_id'] ) || empty( $payload['update_details'] ) ) {
|
|
return false;
|
|
}
|
|
|
|
$update_details = $payload['update_details'];
|
|
|
|
if ( empty( $update_details['updateType'] ) ) {
|
|
return false;
|
|
}
|
|
|
|
$item_id = absint( $payload['item_id'] );
|
|
$update_type = sanitize_text_field( $update_details['updateType'] );
|
|
$item_name = isset( $update_details['itemName'] ) ? sanitize_text_field( $update_details['itemName'] ) : '';
|
|
$et_builder_categories = ET_Builder_Post_Taxonomy_LayoutCategory::instance();
|
|
$et_builder_tags = ET_Builder_Post_Taxonomy_LayoutTag::instance();
|
|
|
|
switch ( $update_type ) {
|
|
case 'duplicate':
|
|
case 'duplicate_and_delete':
|
|
if ( isset( $update_details['content'] ) ) {
|
|
$content = $update_details['content'];
|
|
} else {
|
|
$content = get_the_content( null, false, $item_id );
|
|
}
|
|
|
|
if ( is_array( $content ) ) {
|
|
$content = wp_json_encode( $content );
|
|
}
|
|
|
|
$new_item = array(
|
|
'post_title' => $item_name,
|
|
'post_content' => $content,
|
|
'post_status' => 'publish',
|
|
'post_type' => $this->post_type,
|
|
'tax_input' => array(
|
|
$et_builder_categories->name => $updated_data['categories'],
|
|
$et_builder_tags->name => $updated_data['tags'],
|
|
),
|
|
);
|
|
|
|
$updated_data['newItem'] = wp_insert_post( $new_item );
|
|
break;
|
|
}
|
|
|
|
$updated_data['updateType'] = $update_type;
|
|
|
|
return $updated_data;
|
|
}
|
|
|
|
/**
|
|
* Updates the library item.
|
|
*
|
|
* @param array $payload Payload.
|
|
*
|
|
* @return array
|
|
*/
|
|
public function perform_item_update( $payload ) {
|
|
$updated_data = $this->_perform_item_common_updates( $payload );
|
|
|
|
if ( ! empty( $this->exceptional_processes ) ) {
|
|
$updated_data = $this->_perform_item_exceptional_updates( $payload, $updated_data );
|
|
}
|
|
|
|
return $updated_data;
|
|
}
|
|
}
|