From 17b9b62970509a29b65b9c0e6414591e5845d420 Mon Sep 17 00:00:00 2001 From: kodinkat Date: Thu, 30 May 2024 13:59:52 +0100 Subject: [PATCH 1/6] Ensure to only restrict to records user is responsible for --- dt-metrics/records/genmap.php | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/dt-metrics/records/genmap.php b/dt-metrics/records/genmap.php index a0f0d2edb1..637d68da95 100644 --- a/dt-metrics/records/genmap.php +++ b/dt-metrics/records/genmap.php @@ -162,6 +162,10 @@ public function get_query( $post_type, $p2p_type, $p2p_direction, $filters = [] } $user = wp_get_current_user(); + $user_contact_id = Disciple_Tools_Users::get_contact_for_user( $user->ID ); + if ( ( $post_type !== 'contacts' ) || ! intval( $user_contact_id ) ) { + $user_contact_id = 0; + } // Determine archived meta values. $status_key = $filters['status_key'] ?? ''; @@ -173,7 +177,10 @@ public function get_query( $post_type, $p2p_type, $p2p_direction, $filters = [] ( SELECT p_status.meta_value FROM $wpdb->postmeta as p_status WHERE ( p_status.post_id = a.ID ) AND ( p_status.meta_key = %s ) ) as status, ( SELECT EXISTS( SELECT p_shared.user_id FROM $wpdb->dt_share as p_shared WHERE p_shared.user_id = %d AND p_shared.post_id = a.ID ) ) as shared FROM $wpdb->posts as a + LEFT JOIN $wpdb->postmeta AS pm_assigned ON ( a.ID = pm_assigned.post_id AND pm_assigned.meta_key = 'assigned_to' ) + LEFT JOIN $wpdb->p2p AS p2p_subassigned ON ( a.ID = p2p_subassigned.p2p_to AND p2p_subassigned.p2p_type = 'contacts_to_subassigned' ) WHERE a.post_type = %s + AND ( pm_assigned.meta_value = %s OR p2p_subassigned.p2p_from = %d ) AND a.ID %1s IN ( SELECT DISTINCT (p2p_from) FROM $wpdb->p2p @@ -195,7 +202,7 @@ public function get_query( $post_type, $p2p_type, $p2p_direction, $filters = [] ( SELECT EXISTS( SELECT u_shared.user_id FROM $wpdb->dt_share as u_shared WHERE u_shared.user_id = %d AND u_shared.post_id = p.%1s ) ) as shared FROM $wpdb->p2p as p WHERE p.p2p_type = %s; - ", $status_key, $user->ID, $post_type, $not_from, $p2p_type, $not_to, $p2p_type, $select_id, $select_parent_id, $select_id, $select_id, $status_key, $user->ID, $select_id, $p2p_type ), ARRAY_A ); + ", $status_key, $user->ID, $post_type, ( 'user-' . $user->ID ), $user_contact_id, $not_from, $p2p_type, $not_to, $p2p_type, $select_id, $select_parent_id, $select_id, $select_id, $status_key, $user->ID, $select_id, $p2p_type ), ARRAY_A ); return $query; } From a7d4dddd7326150470347972d5691bea89e346f4 Mon Sep 17 00:00:00 2001 From: kodinkat Date: Mon, 3 Jun 2024 13:18:01 +0100 Subject: [PATCH 2/6] Filter accordingly by slug & post type --- dt-metrics/records/genmap.js | 1 + dt-metrics/records/genmap.php | 66 ++++++++++++++++++++++++++++++----- 2 files changed, 59 insertions(+), 8 deletions(-) diff --git a/dt-metrics/records/genmap.js b/dt-metrics/records/genmap.js index f8dc993521..31d49866f8 100644 --- a/dt-metrics/records/genmap.js +++ b/dt-metrics/records/genmap.js @@ -87,6 +87,7 @@ jQuery(document).ready(function ($) { post_type: selected_post_type, gen_depth_limit: 100, show_archived: jQuery('#archivedToggle').prop('checked'), + slug: window.dtMetricsProject.base_slug, }; // Dynamically update URL parameters. diff --git a/dt-metrics/records/genmap.php b/dt-metrics/records/genmap.php index 637d68da95..54dbc0b5b9 100644 --- a/dt-metrics/records/genmap.php +++ b/dt-metrics/records/genmap.php @@ -63,7 +63,18 @@ public function tree( WP_REST_Request $request ) { $post_type = $params['post_type']; $post_settings = DT_Posts::get_post_settings( $post_type ); + // Determine scope of query focus, based on specified slug. + $slug = $params['slug'] ?? 'personal'; + $focus_id = $params['focus_id'] ?? 0; + if ( ( $post_type === 'contacts' ) && ( $slug === 'personal' ) ) { + $user_contact_id = Disciple_Tools_Users::get_contact_for_user( wp_get_current_user()->ID ); + if ( intval( $user_contact_id ) ){ + $focus_id = $user_contact_id; + } + } + $filters = [ + 'slug' => $slug, 'post_type' => $post_type, 'show_archived' => $params['show_archived'] ?? false, 'status_key' => $post_settings['status_field']['status_key'] ?? '', @@ -71,7 +82,7 @@ public function tree( WP_REST_Request $request ) { ]; $query = $this->get_query( $post_type, $params['p2p_type'], $params['p2p_direction'], $filters ); - return $this->get_genmap( $query, $params['gen_depth_limit'] ?? 100, $params['focus_id'] ?? 0, $filters ); + return $this->get_genmap( $query, $params['gen_depth_limit'] ?? 100, $focus_id, $filters ); } public function scripts() { @@ -162,14 +173,50 @@ public function get_query( $post_type, $p2p_type, $p2p_direction, $filters = [] } $user = wp_get_current_user(); - $user_contact_id = Disciple_Tools_Users::get_contact_for_user( $user->ID ); - if ( ( $post_type !== 'contacts' ) || ! intval( $user_contact_id ) ) { - $user_contact_id = 0; - } // Determine archived meta values. $status_key = $filters['status_key'] ?? ''; - $query = $wpdb->get_results( $wpdb->prepare( " + + // Determine sql shape to be adopted, based on specified slug. + if ( ( $filters['slug'] ?? 'personal' ) === 'records' ) { + $prepared_query = $wpdb->prepare( " + SELECT + a.ID as id, + 0 as parent_id, + a.post_title as name, + ( SELECT p_status.meta_value FROM $wpdb->postmeta as p_status WHERE ( p_status.post_id = a.ID ) AND ( p_status.meta_key = %s ) ) as status, + ( SELECT EXISTS( SELECT p_shared.user_id FROM $wpdb->dt_share as p_shared WHERE p_shared.user_id = %d AND p_shared.post_id = a.ID ) ) as shared + FROM $wpdb->posts as a + WHERE a.post_type = %s + AND a.ID %1s IN ( + SELECT DISTINCT (p2p_from) + FROM $wpdb->p2p + WHERE p2p_type = %s + GROUP BY p2p_from + ) + AND a.ID %1s IN ( + SELECT DISTINCT (p2p_to) + FROM $wpdb->p2p + WHERE p2p_type = %s + GROUP BY p2p_to + ) + UNION + SELECT + p.%1s as id, + p.%1s as parent_id, + (SELECT sub.post_title FROM $wpdb->posts as sub WHERE sub.ID = p.%1s ) as name, + ( SELECT u_status.meta_value FROM $wpdb->postmeta as u_status WHERE ( u_status.post_id = p.%1s ) AND ( u_status.meta_key = %s ) ) as status, + ( SELECT EXISTS( SELECT u_shared.user_id FROM $wpdb->dt_share as u_shared WHERE u_shared.user_id = %d AND u_shared.post_id = p.%1s ) ) as shared + FROM $wpdb->p2p as p + WHERE p.p2p_type = %s; + ", $status_key, $user->ID, $post_type, $not_from, $p2p_type, $not_to, $p2p_type, $select_id, $select_parent_id, $select_id, $select_id, $status_key, $user->ID, $select_id, $p2p_type ); + } else { + $user_contact_id = Disciple_Tools_Users::get_contact_for_user( $user->ID ); + if ( ( $post_type !== 'contacts' ) || ! intval( $user_contact_id ) ) { + $user_contact_id = 0; + } + + $prepared_query = $wpdb->prepare( " SELECT a.ID as id, 0 as parent_id, @@ -202,9 +249,12 @@ public function get_query( $post_type, $p2p_type, $p2p_direction, $filters = [] ( SELECT EXISTS( SELECT u_shared.user_id FROM $wpdb->dt_share as u_shared WHERE u_shared.user_id = %d AND u_shared.post_id = p.%1s ) ) as shared FROM $wpdb->p2p as p WHERE p.p2p_type = %s; - ", $status_key, $user->ID, $post_type, ( 'user-' . $user->ID ), $user_contact_id, $not_from, $p2p_type, $not_to, $p2p_type, $select_id, $select_parent_id, $select_id, $select_id, $status_key, $user->ID, $select_id, $p2p_type ), ARRAY_A ); + ", $status_key, $user->ID, $post_type, ( 'user-' . $user->ID ), $user_contact_id, $not_from, $p2p_type, $not_to, $p2p_type, $select_id, $select_parent_id, $select_id, $select_id, $status_key, $user->ID, $select_id, $p2p_type ); + } - return $query; + //phpcs:disable + return $wpdb->get_results( $prepared_query, ARRAY_A ); + //phpcs:enable } public function get_genmap( $query, $depth_limit, $focus_id, $filters = [] ) { From 75f56d575c39c1bf15b0548e166e28e03767ca6c Mon Sep 17 00:00:00 2001 From: kodinkat Date: Tue, 2 Jul 2024 13:19:09 +0100 Subject: [PATCH 3/6] Simplified query results generation logic --- dt-metrics/records/genmap.php | 119 ++++++++++++---------------------- 1 file changed, 43 insertions(+), 76 deletions(-) diff --git a/dt-metrics/records/genmap.php b/dt-metrics/records/genmap.php index 54dbc0b5b9..7a1fe7e427 100644 --- a/dt-metrics/records/genmap.php +++ b/dt-metrics/records/genmap.php @@ -60,6 +60,7 @@ public function tree( WP_REST_Request $request ) { return new WP_Error( __METHOD__, 'Missing parameters! [Required: p2p_type, p2p_direction, post_type ]', [ 'status' => 400 ] ); } + $user = wp_get_current_user(); $post_type = $params['post_type']; $post_settings = DT_Posts::get_post_settings( $post_type ); @@ -67,7 +68,7 @@ public function tree( WP_REST_Request $request ) { $slug = $params['slug'] ?? 'personal'; $focus_id = $params['focus_id'] ?? 0; if ( ( $post_type === 'contacts' ) && ( $slug === 'personal' ) ) { - $user_contact_id = Disciple_Tools_Users::get_contact_for_user( wp_get_current_user()->ID ); + $user_contact_id = Disciple_Tools_Users::get_contact_for_user( $user->ID ); if ( intval( $user_contact_id ) ){ $focus_id = $user_contact_id; } @@ -81,8 +82,15 @@ public function tree( WP_REST_Request $request ) { 'archived_key' => $post_settings['status_field']['archived_key'] ?? '' ]; $query = $this->get_query( $post_type, $params['p2p_type'], $params['p2p_direction'], $filters ); + $generated_genmap = $this->get_genmap( $query, $params['gen_depth_limit'] ?? 100, $focus_id, $filters ); - return $this->get_genmap( $query, $params['gen_depth_limit'] ?? 100, $focus_id, $filters ); + // Ensure empty hits on personal based slugs, still ensure user node is accessible. + if ( ( $focus_id !== 0 ) && !$generated_genmap['shared'] && empty( $generated_genmap['children'] ) ) { + $generated_genmap['shared'] = 1; + $generated_genmap['name'] = $user->display_name; + } + + return $generated_genmap; } public function scripts() { @@ -177,80 +185,38 @@ public function get_query( $post_type, $p2p_type, $p2p_direction, $filters = [] // Determine archived meta values. $status_key = $filters['status_key'] ?? ''; - // Determine sql shape to be adopted, based on specified slug. - if ( ( $filters['slug'] ?? 'personal' ) === 'records' ) { - $prepared_query = $wpdb->prepare( " - SELECT - a.ID as id, - 0 as parent_id, - a.post_title as name, - ( SELECT p_status.meta_value FROM $wpdb->postmeta as p_status WHERE ( p_status.post_id = a.ID ) AND ( p_status.meta_key = %s ) ) as status, - ( SELECT EXISTS( SELECT p_shared.user_id FROM $wpdb->dt_share as p_shared WHERE p_shared.user_id = %d AND p_shared.post_id = a.ID ) ) as shared - FROM $wpdb->posts as a - WHERE a.post_type = %s - AND a.ID %1s IN ( - SELECT DISTINCT (p2p_from) - FROM $wpdb->p2p - WHERE p2p_type = %s - GROUP BY p2p_from - ) - AND a.ID %1s IN ( - SELECT DISTINCT (p2p_to) - FROM $wpdb->p2p - WHERE p2p_type = %s - GROUP BY p2p_to - ) - UNION - SELECT - p.%1s as id, - p.%1s as parent_id, - (SELECT sub.post_title FROM $wpdb->posts as sub WHERE sub.ID = p.%1s ) as name, - ( SELECT u_status.meta_value FROM $wpdb->postmeta as u_status WHERE ( u_status.post_id = p.%1s ) AND ( u_status.meta_key = %s ) ) as status, - ( SELECT EXISTS( SELECT u_shared.user_id FROM $wpdb->dt_share as u_shared WHERE u_shared.user_id = %d AND u_shared.post_id = p.%1s ) ) as shared - FROM $wpdb->p2p as p - WHERE p.p2p_type = %s; - ", $status_key, $user->ID, $post_type, $not_from, $p2p_type, $not_to, $p2p_type, $select_id, $select_parent_id, $select_id, $select_id, $status_key, $user->ID, $select_id, $p2p_type ); - } else { - $user_contact_id = Disciple_Tools_Users::get_contact_for_user( $user->ID ); - if ( ( $post_type !== 'contacts' ) || ! intval( $user_contact_id ) ) { - $user_contact_id = 0; - } - - $prepared_query = $wpdb->prepare( " - SELECT - a.ID as id, - 0 as parent_id, - a.post_title as name, - ( SELECT p_status.meta_value FROM $wpdb->postmeta as p_status WHERE ( p_status.post_id = a.ID ) AND ( p_status.meta_key = %s ) ) as status, - ( SELECT EXISTS( SELECT p_shared.user_id FROM $wpdb->dt_share as p_shared WHERE p_shared.user_id = %d AND p_shared.post_id = a.ID ) ) as shared - FROM $wpdb->posts as a - LEFT JOIN $wpdb->postmeta AS pm_assigned ON ( a.ID = pm_assigned.post_id AND pm_assigned.meta_key = 'assigned_to' ) - LEFT JOIN $wpdb->p2p AS p2p_subassigned ON ( a.ID = p2p_subassigned.p2p_to AND p2p_subassigned.p2p_type = 'contacts_to_subassigned' ) - WHERE a.post_type = %s - AND ( pm_assigned.meta_value = %s OR p2p_subassigned.p2p_from = %d ) - AND a.ID %1s IN ( - SELECT DISTINCT (p2p_from) - FROM $wpdb->p2p - WHERE p2p_type = %s - GROUP BY p2p_from - ) - AND a.ID %1s IN ( - SELECT DISTINCT (p2p_to) - FROM $wpdb->p2p - WHERE p2p_type = %s - GROUP BY p2p_to - ) - UNION - SELECT - p.%1s as id, - p.%1s as parent_id, - (SELECT sub.post_title FROM $wpdb->posts as sub WHERE sub.ID = p.%1s ) as name, - ( SELECT u_status.meta_value FROM $wpdb->postmeta as u_status WHERE ( u_status.post_id = p.%1s ) AND ( u_status.meta_key = %s ) ) as status, - ( SELECT EXISTS( SELECT u_shared.user_id FROM $wpdb->dt_share as u_shared WHERE u_shared.user_id = %d AND u_shared.post_id = p.%1s ) ) as shared - FROM $wpdb->p2p as p - WHERE p.p2p_type = %s; - ", $status_key, $user->ID, $post_type, ( 'user-' . $user->ID ), $user_contact_id, $not_from, $p2p_type, $not_to, $p2p_type, $select_id, $select_parent_id, $select_id, $select_id, $status_key, $user->ID, $select_id, $p2p_type ); - } + // Prepare sql shape to be executed. + $prepared_query = $wpdb->prepare( " + SELECT + a.ID as id, + 0 as parent_id, + a.post_title as name, + ( SELECT p_status.meta_value FROM $wpdb->postmeta as p_status WHERE ( p_status.post_id = a.ID ) AND ( p_status.meta_key = %s ) ) as status, + ( SELECT EXISTS( SELECT p_shared.user_id FROM $wpdb->dt_share as p_shared WHERE p_shared.user_id = %d AND p_shared.post_id = a.ID ) ) as shared + FROM $wpdb->posts as a + WHERE a.post_type = %s + AND a.ID %1s IN ( + SELECT DISTINCT (p2p_from) + FROM $wpdb->p2p + WHERE p2p_type = %s + GROUP BY p2p_from + ) + AND a.ID %1s IN ( + SELECT DISTINCT (p2p_to) + FROM $wpdb->p2p + WHERE p2p_type = %s + GROUP BY p2p_to + ) + UNION + SELECT + p.%1s as id, + p.%1s as parent_id, + (SELECT sub.post_title FROM $wpdb->posts as sub WHERE sub.ID = p.%1s ) as name, + ( SELECT u_status.meta_value FROM $wpdb->postmeta as u_status WHERE ( u_status.post_id = p.%1s ) AND ( u_status.meta_key = %s ) ) as status, + ( SELECT EXISTS( SELECT u_shared.user_id FROM $wpdb->dt_share as u_shared WHERE u_shared.user_id = %d AND u_shared.post_id = p.%1s ) ) as shared + FROM $wpdb->p2p as p + WHERE p.p2p_type = %s; + ", $status_key, $user->ID, $post_type, $not_from, $p2p_type, $not_to, $p2p_type, $select_id, $select_parent_id, $select_id, $select_id, $status_key, $user->ID, $select_id, $p2p_type ); //phpcs:disable return $wpdb->get_results( $prepared_query, ARRAY_A ); @@ -267,6 +233,7 @@ public function get_genmap( $query, $depth_limit, $focus_id, $filters = [] ) { } $menu_data = $this->prepare_menu_array( $query ); + //dt_write_log( $menu_data ); return $this->build_array( $focus_id ?? 0, $menu_data, 0, $depth_limit, $filters ); } From 6ed64645efcd053f23dba0fa7c4287b80667b72b Mon Sep 17 00:00:00 2001 From: kodinkat Date: Tue, 2 Jul 2024 13:21:11 +0100 Subject: [PATCH 4/6] Removed unwanted write log statement --- dt-metrics/records/genmap.php | 1 - 1 file changed, 1 deletion(-) diff --git a/dt-metrics/records/genmap.php b/dt-metrics/records/genmap.php index 7a1fe7e427..6f787c1c29 100644 --- a/dt-metrics/records/genmap.php +++ b/dt-metrics/records/genmap.php @@ -233,7 +233,6 @@ public function get_genmap( $query, $depth_limit, $focus_id, $filters = [] ) { } $menu_data = $this->prepare_menu_array( $query ); - //dt_write_log( $menu_data ); return $this->build_array( $focus_id ?? 0, $menu_data, 0, $depth_limit, $filters ); } From 249d05ce559adadd623b3ed85b3bee911dd6dd09 Mon Sep 17 00:00:00 2001 From: kodinkat Date: Wed, 3 Jul 2024 17:03:54 +0100 Subject: [PATCH 5/6] Ensure record node shares are forced for administrators --- dt-metrics/records/genmap.php | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/dt-metrics/records/genmap.php b/dt-metrics/records/genmap.php index 6f787c1c29..c1f6ec8cef 100644 --- a/dt-metrics/records/genmap.php +++ b/dt-metrics/records/genmap.php @@ -85,7 +85,7 @@ public function tree( WP_REST_Request $request ) { $generated_genmap = $this->get_genmap( $query, $params['gen_depth_limit'] ?? 100, $focus_id, $filters ); // Ensure empty hits on personal based slugs, still ensure user node is accessible. - if ( ( $focus_id !== 0 ) && !$generated_genmap['shared'] && empty( $generated_genmap['children'] ) ) { + if ( ( $focus_id !== 0 ) && empty( $generated_genmap['children'] ) ) { $generated_genmap['shared'] = 1; $generated_genmap['name'] = $user->display_name; } @@ -263,7 +263,11 @@ public function build_array( $parent_id, $menu_data, $gen, $depth_limit, $filter } } + // Ensure to force a record node share for administrators. $shared = intval( $menu_data['items'][ $parent_id ]['shared'] ?? 0 ); + if ( dt_is_administrator() || current_user_can( 'manage_dt' ) || ( isset( $filters['post_type'] ) && current_user_can( 'access_' . $filters['post_type'] ) ) ) { + $shared = 1; + } $array = [ 'id' => $parent_id, 'name' => ( ( $shared === 1 ) || ( $gen === 0 ) ) ? ( $menu_data['items'][ $parent_id ]['name'] ?? 'SYSTEM' ) : '', From 55f2005f6106d3f0d9429e50a50818222bc7b9eb Mon Sep 17 00:00:00 2001 From: corsac Date: Tue, 9 Jul 2024 13:10:55 +0100 Subject: [PATCH 6/6] Access to view all records can view entire tree. Multipliers can see the name of their own record. --- dt-metrics/records/genmap.php | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/dt-metrics/records/genmap.php b/dt-metrics/records/genmap.php index c1f6ec8cef..d767acb657 100644 --- a/dt-metrics/records/genmap.php +++ b/dt-metrics/records/genmap.php @@ -82,7 +82,12 @@ public function tree( WP_REST_Request $request ) { 'archived_key' => $post_settings['status_field']['archived_key'] ?? '' ]; $query = $this->get_query( $post_type, $params['p2p_type'], $params['p2p_direction'], $filters ); - $generated_genmap = $this->get_genmap( $query, $params['gen_depth_limit'] ?? 100, $focus_id, $filters ); + + $can_list_all = current_user_can( 'list_all_' . $post_type ); + if ( $post_type === 'contacts' && current_user_can( 'dt_all_access_contacts' ) ){ + $can_list_all = true; + } + $generated_genmap = $this->get_genmap( $query, $params['gen_depth_limit'] ?? 100, $focus_id, $filters, $can_list_all ); // Ensure empty hits on personal based slugs, still ensure user node is accessible. if ( ( $focus_id !== 0 ) && empty( $generated_genmap['children'] ) ) { @@ -223,7 +228,7 @@ public function get_query( $post_type, $p2p_type, $p2p_direction, $filters = [] //phpcs:enable } - public function get_genmap( $query, $depth_limit, $focus_id, $filters = [] ) { + public function get_genmap( $query, $depth_limit, $focus_id, $filters = [], $can_list_all = false ){ if ( is_wp_error( $query ) ){ return $this->_circular_structure_error( $query ); @@ -233,7 +238,9 @@ public function get_genmap( $query, $depth_limit, $focus_id, $filters = [] ) { } $menu_data = $this->prepare_menu_array( $query ); - return $this->build_array( $focus_id ?? 0, $menu_data, 0, $depth_limit, $filters ); + $user_contact_id = Disciple_Tools_Users::get_contact_for_user( get_current_user_id() ); + + return $this->build_array( $focus_id ?? 0, $menu_data, 0, $depth_limit, $filters, $can_list_all, $user_contact_id ); } public function prepare_menu_array( $query ) { @@ -251,7 +258,7 @@ public function prepare_menu_array( $query ) { return $menu_data; } - public function build_array( $parent_id, $menu_data, $gen, $depth_limit, $filters = [] ) { + public function build_array( $parent_id, $menu_data, $gen, $depth_limit, $filters = [], $can_list_all = false, $user_contact_id = null ) { $children = []; if ( isset( $menu_data['parents'][$parent_id] ) && ( $gen < $depth_limit ) ) { @@ -259,13 +266,13 @@ public function build_array( $parent_id, $menu_data, $gen, $depth_limit, $filter foreach ( $menu_data['parents'][$parent_id] as $item_id ) { - $children[] = $this->build_array( $item_id, $menu_data, $next_gen, $depth_limit, $filters ); + $children[] = $this->build_array( $item_id, $menu_data, $next_gen, $depth_limit, $filters, $can_list_all, $user_contact_id ); } } // Ensure to force a record node share for administrators. $shared = intval( $menu_data['items'][ $parent_id ]['shared'] ?? 0 ); - if ( dt_is_administrator() || current_user_can( 'manage_dt' ) || ( isset( $filters['post_type'] ) && current_user_can( 'access_' . $filters['post_type'] ) ) ) { + if ( $parent_id === $user_contact_id ){ $shared = 1; } $array = [