args['map_meta_cap'] = true; } $result['labels'] = $labels; $result['advanced_settings'] = $args; $result['meta_fields'] = $meta_fields; $result['admin_columns'] = $admin_columns; $result['admin_filters'] = $admin_filters; return $result; } /** * Edit built-in post type * * @param boolean $redirect [description] * @return [type] [description] */ public function edit_built_in_item( $redirect = true ) { if ( ! current_user_can( 'manage_options' ) ) { $this->parent->add_notice( 'error', __( 'You don\'t have permissions to do this', 'jet-engine' ) ); return false; } $item = $this->sanitize_item_from_request( true ); if ( ! $item ) { $this->parent->add_notice( 'error', __( 'Post type name not found in request. Please check your data and try again.', 'jet-engine' ) ); return false; } $this->query_args['status'] = 'built-in'; $this->before_item_update( $item ); $id = $this->update_item_in_db( $item ); $this->after_item_update( $item ); if ( ! $id ) { return false; } else { return $id; } } /** * Check if current storage table already exists * * @param [type] $item [description] * @param boolean $is_new [description] * @return [type] [description] */ public function before_item_update( $item = [], $is_new = false ) { if ( ! isset( $item['id'] ) ) { $is_new = true; } /** * @todo probably process as hook from \Jet_Engine\CPT\Custom_Tables\Manager class */ if ( ! empty( $item['args']['custom_storage'] ) ) { $db = \Jet_Engine\CPT\Custom_Tables\Manager::instance()->get_db_instance( $item['slug'] ); if ( $is_new && $db->is_table_exists() ) { throw new \Exception( sprintf( __( 'You creating a Post Type with "%s" custom storage. But this table already exists in your DB. Please rename your post type.', 'jet-engine' ), $db->table() ) ); } if ( ! $is_new && $db->is_table_exists() ) { $id = $item['id']; $prev_item = $this->get_item_for_edit( $id ); // we changed slug, but table with new slug already exists - so throwing error if ( $prev_item && $prev_item['general_settings']['slug'] && $prev_item['general_settings']['slug'] !== $item['slug'] ) { throw new \Exception( sprintf( __( 'You creating a Post Type with "%s" custom storage. But this table already exists in your DB. Please rename your post type.', 'jet-engine' ), $db->table() ) ); } } } $this->delete_metadata_on_update( $item ); } /** * Process custom_storagge option after item update * * @param [type] $item [description] * @param boolean $is_new [description] * @return [type] [description] */ public function after_item_update( $item = [], $is_new = false ) { if ( ! empty( $item['args']['custom_storage'] ) ) { /** * @todo probabaly process as hook from \Jet_Engine\CPT\Custom_Tables\Manager class */ $fields = ! empty( $item['meta_fields'] ) ? $item['meta_fields'] : []; $db = \Jet_Engine\CPT\Custom_Tables\Manager::instance()->get_db_instance( $item['slug'], \Jet_Engine\CPT\Custom_Tables\Manager::instance()->prepare_fields( $fields )['as_columns'] ?? array() ); if ( $is_new ) { $db->create_table(); } else { if ( ! $db->is_table_exists() ) { $db->create_table(); } $db->adjust_fields_to_schema(); } } } /** * Get built-in post type from data base * * @param [type] $post_type [description] * @return [type] [description] */ public function get_built_in_post_type_from_db( $post_type = null ) { $item = $this->db->query( $this->table, array( 'slug' => $post_type, 'status' => 'built-in', ), array( $this, 'filter_item_for_edit' ) ); if ( ! empty( $item ) ) { return $item[0]; } else { return false; } } /** * Remove modified data for built-in post type * * @return [type] [description] */ public function reset_built_in_post_type( $post_type = null ) { $this->db->delete( $this->table, array( 'slug' => $post_type, 'status' => 'built-in', ), array( '%s', '%s' ) ); return true; } /** * Return user-modified built-in post types * * @return [type] [description] */ public function get_modified_built_in_types() { $types = $this->db->query( $this->table, array( 'status' => 'built-in', ) ); if ( ! $types ) { return array(); } else { return $types; } } /** * Returns default built-in post type * * @return [type] [description] */ public function get_default_built_in_post_type( $post_type ) { $post_type_object = get_post_type_object( $post_type ); if ( ! $post_type_object ) { $this->parent->add_notice( 'error', __( 'Post type not found', 'jet-engine' ) ); return false; } $post_type_object->labels = (array) $post_type_object->labels; $post_type_object = (array) $post_type_object; $_defaults = ! empty( $this->parent->built_in_defaults[ $post_type ] ) ? $this->parent->built_in_defaults[ $post_type ] : false; if ( $_defaults ) { if ( ! empty( $_defaults['labels'] ) ) { $post_type_object['labels'] = array_merge( $post_type_object['labels'], $_defaults['labels'] ); if ( ! empty( $_defaults['labels']['name'] ) ) { $post_type_object['label'] = $_defaults['labels']['name']; } unset( $_defaults['labels'] ); } if ( ! empty( $_defaults ) ) { $post_type_object = array_merge( $post_type_object, $_defaults ); } } $post_type_data = array( 'general_settings' => array( 'name' => $post_type_object['label'], 'slug' => $post_type_object['name'], 'custom_storage' => false, 'show_edit_link' => false, 'hide_field_names' => false, 'delete_metadata' => false, ), 'labels' => $post_type_object['labels'], 'meta_fields' => array(), 'admin_columns' => array(), 'admin_filters' => array(), ); unset( $post_type_object['labels'] ); unset( $post_type_object['cap'] ); unset( $post_type_object['label'] ); unset( $post_type_object['name'] ); $supports = get_all_post_type_supports( $post_type ); $supports = array_filter( $supports ); $supports = array_keys( $supports ); $post_type_object['supports'] = $supports; $post_type_data['advanced_settings'] = $post_type_object; return $post_type_data; } /** * Maybe delete metadata on update item */ public function delete_metadata_on_update( $item = array() ) { $args = ! empty( $item['args'] ) ? $item['args'] : array(); if ( empty( $args['delete_metadata'] ) ) { return; } if ( empty( $item['id'] ) ) { return; } $prev_item = $this->get_item_for_edit( $item['id'] ); if ( ! $prev_item ) { return; } $prev_meta_fields = ! empty( $prev_item['meta_fields'] ) ? $prev_item['meta_fields'] : array(); $new_meta_fields = ! empty( $item['meta_fields'] ) ? $item['meta_fields'] : array(); if ( empty( $prev_meta_fields ) ) { return; } $prev_meta_names = wp_list_pluck( $prev_meta_fields, 'name' ); $new_meta_names = wp_list_pluck( $new_meta_fields, 'name' ); $to_delete = array_diff( $prev_meta_names, $new_meta_names ); if ( empty( $to_delete ) ) { return; } $this->delete_metadata( $prev_item, $to_delete ); } /** * Delete metadata of CPT */ public function delete_metadata( $item = null, $keys_to_delete = array(), $on_delete = false ) { $args = ! empty( $item['general_settings'] ) ? $item['general_settings'] : array(); if ( $on_delete && empty( $args['delete_metadata'] ) ) { return; } $meta_fields = ! empty( $item['meta_fields'] ) ? $item['meta_fields'] : array(); if ( empty( $meta_fields ) ) { return; } $meta_names = wp_list_pluck( $meta_fields, 'name' ); $meta_fields = array_combine( $meta_names, $meta_fields ); if ( $on_delete ) { $keys_to_delete = $meta_names; } $to_delete = array_filter( $keys_to_delete, function ( $name ) use ( $meta_fields ) { if ( ! empty( $meta_fields[ $name ]['object_type'] ) && 'field' !== $meta_fields[ $name ]['object_type'] ) { return false; } if ( ! empty( $meta_fields[ $name ]['type'] ) && 'html' === $meta_fields[ $name ]['type'] ) { return false; } return true; } ); if ( empty( $to_delete ) ) { return; } Jet_Engine_Tools::delete_metadata_by_object_where( 'post', $to_delete, array( 'post_type' => $args['slug'], ) ); } } }