From 3bae0bdc41b5a2fa40ca8f9230b3c755a3eb29a2 Mon Sep 17 00:00:00 2001 From: Alex Kirk Date: Wed, 11 Oct 2023 10:18:24 +0200 Subject: [PATCH 1/6] Join the meta table --- classes/class-query.php | 42 ++++++++++++++++++++++++++++++++++++++--- 1 file changed, 39 insertions(+), 3 deletions(-) diff --git a/classes/class-query.php b/classes/class-query.php index a05f8b903..1a7d92ecf 100644 --- a/classes/class-query.php +++ b/classes/class-query.php @@ -219,6 +219,9 @@ public function query( $args ) { $selects[] = "$wpdb->stream.*"; } + $join = "LEFT JOIN $wpdb->streammeta ON $wpdb->stream.ID = $wpdb->streammeta.record_id"; + $selects[] = "$wpdb->streammeta.meta_key"; + $selects[] = "$wpdb->streammeta.meta_value"; $select = implode( ', ', $selects ); /** @@ -231,6 +234,23 @@ public function query( $args ) { */ $where = apply_filters( 'wp_stream_db_query_where', $where ); + /** + * Build the query but just to get the IDs + */ + $query = "SELECT ID + FROM $wpdb->stream + WHERE 1=1 {$where} + {$orderby} + {$limits}"; + + $ids = $wpdb->get_col( $query ); // phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared + + if ( $ids ) { + $where .= $wpdb->prepare( " AND $wpdb->stream.ID IN (%d" . str_repeat( ', %d', count( $ids ) - 1 ) . ')', $ids ); + } else { + $where .= ' AND 0 = 1'; + } + /** * BUILD THE FINAL QUERY */ @@ -238,8 +258,7 @@ public function query( $args ) { FROM $wpdb->stream {$join} WHERE 1=1 {$where} - {$orderby} - {$limits}"; + {$orderby}"; /** * Filter allows the final query to be modified before execution @@ -267,11 +286,28 @@ public function query( $args ) { */ $count_query = apply_filters( 'wp_stream_db_count_query', $count_query, $args ); + $items = array(); + foreach ( $wpdb->get_results( $query ) as $item ) { // phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared + if ( ! isset( $items[ $item->ID ] ) ) { + $items[ $item->ID ] = clone $item; + $items[ $item->ID ]->meta = array(); + unset( $items[ $item->ID ]->meta_key ); + unset( $items[ $item->ID ]->meta_value ); + } + if ( isset( $items[ $item->ID ]->meta[ $item->meta_key ] ) ) { + if ( ! is_array( $items[ $item->ID ]->meta[ $item->meta_key ] ) ) { + $items[ $item->ID ]->meta[ $item->meta_key ] = array( $items[ $item->ID ]->meta[ $item->meta_key ] ); + } + $items[ $item->ID ]->meta[ $item->meta_key ][] = $item->meta_value; + } else { + $items[ $item->ID ]->meta[ $item->meta_key ] = $item->meta_value; + } + } /** * QUERY THE DATABASE FOR RESULTS */ $result = array( - 'items' => $wpdb->get_results( $query ), // phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared + 'items' => $items, 'count' => absint( $wpdb->get_var( $count_query ) ), // phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared ); From 2d2cfb650090d899f60c5e77ed4a6c906b5343b7 Mon Sep 17 00:00:00 2001 From: Alex Kirk Date: Wed, 11 Oct 2023 10:21:34 +0200 Subject: [PATCH 2/6] Show metadata in table --- classes/class-list-table.php | 3 +++ 1 file changed, 3 insertions(+) diff --git a/classes/class-list-table.php b/classes/class-list-table.php index d22133775..7045cfbb2 100644 --- a/classes/class-list-table.php +++ b/classes/class-list-table.php @@ -333,6 +333,9 @@ public function column_default( $item, $column_name ) { esc_attr( $view_all_text ) ); } + if ( $record->meta ) { + $out .= '
' . esc_html__( 'Metadata', 'stream' ) . '
' . print_r( $record->meta, true ) . '
'; + } $out .= $this->get_action_links( $record ); break; From f69db4dc544c4f49b90ac5c0bb0613462215cea6 Mon Sep 17 00:00:00 2001 From: Alex Kirk Date: Wed, 11 Oct 2023 12:17:55 +0200 Subject: [PATCH 3/6] Fix whitespace --- classes/class-query.php | 58 ++++++++++++++++++++--------------------- 1 file changed, 29 insertions(+), 29 deletions(-) diff --git a/classes/class-query.php b/classes/class-query.php index 1a7d92ecf..704bf8648 100644 --- a/classes/class-query.php +++ b/classes/class-query.php @@ -234,22 +234,22 @@ public function query( $args ) { */ $where = apply_filters( 'wp_stream_db_query_where', $where ); - /** - * Build the query but just to get the IDs - */ - $query = "SELECT ID - FROM $wpdb->stream - WHERE 1=1 {$where} - {$orderby} - {$limits}"; - - $ids = $wpdb->get_col( $query ); // phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared - - if ( $ids ) { - $where .= $wpdb->prepare( " AND $wpdb->stream.ID IN (%d" . str_repeat( ', %d', count( $ids ) - 1 ) . ')', $ids ); - } else { - $where .= ' AND 0 = 1'; - } + /** + * Build the query but just to get the IDs + */ + $query = "SELECT ID + FROM $wpdb->stream + WHERE 1=1 {$where} + {$orderby} + {$limits}"; + + $ids = $wpdb->get_col( $query ); // phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared + + if ( $ids ) { + $where .= $wpdb->prepare( " AND $wpdb->stream.ID IN (%d" . str_repeat( ', %d', count( $ids ) - 1 ) . ')', $ids ); + } else { + $where .= ' AND 0 = 1'; + } /** * BUILD THE FINAL QUERY @@ -288,20 +288,20 @@ public function query( $args ) { $items = array(); foreach ( $wpdb->get_results( $query ) as $item ) { // phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared - if ( ! isset( $items[ $item->ID ] ) ) { - $items[ $item->ID ] = clone $item; - $items[ $item->ID ]->meta = array(); - unset( $items[ $item->ID ]->meta_key ); - unset( $items[ $item->ID ]->meta_value ); - } - if ( isset( $items[ $item->ID ]->meta[ $item->meta_key ] ) ) { - if ( ! is_array( $items[ $item->ID ]->meta[ $item->meta_key ] ) ) { - $items[ $item->ID ]->meta[ $item->meta_key ] = array( $items[ $item->ID ]->meta[ $item->meta_key ] ); - } - $items[ $item->ID ]->meta[ $item->meta_key ][] = $item->meta_value; - } else { - $items[ $item->ID ]->meta[ $item->meta_key ] = $item->meta_value; + if ( ! isset( $items[ $item->ID ] ) ) { + $items[ $item->ID ] = clone $item; + $items[ $item->ID ]->meta = array(); + unset( $items[ $item->ID ]->meta_key ); + unset( $items[ $item->ID ]->meta_value ); + } + if ( isset( $items[ $item->ID ]->meta[ $item->meta_key ] ) ) { + if ( ! is_array( $items[ $item->ID ]->meta[ $item->meta_key ] ) ) { + $items[ $item->ID ]->meta[ $item->meta_key ] = array( $items[ $item->ID ]->meta[ $item->meta_key ] ); } + $items[ $item->ID ]->meta[ $item->meta_key ][] = $item->meta_value; + } else { + $items[ $item->ID ]->meta[ $item->meta_key ] = $item->meta_value; + } } /** * QUERY THE DATABASE FOR RESULTS From cdfd9644e4050bb095e49c6b55500945ae197cd8 Mon Sep 17 00:00:00 2001 From: Alex Kirk Date: Wed, 11 Oct 2023 14:37:21 +0200 Subject: [PATCH 4/6] Escaping --- classes/class-list-table.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/classes/class-list-table.php b/classes/class-list-table.php index 7045cfbb2..40d0093e7 100644 --- a/classes/class-list-table.php +++ b/classes/class-list-table.php @@ -334,7 +334,7 @@ public function column_default( $item, $column_name ) { ); } if ( $record->meta ) { - $out .= '
' . esc_html__( 'Metadata', 'stream' ) . '
' . print_r( $record->meta, true ) . '
'; + $out .= '
' . esc_html__( 'Metadata', 'stream' ) . '
' . esc_html( print_r( $record->meta, true ) ) . '
'; } $out .= $this->get_action_links( $record ); break; From ca4b9a31cf9f3accbbe54ac9c77cd6d09b7afda3 Mon Sep 17 00:00:00 2001 From: Alex Kirk Date: Thu, 12 Oct 2023 10:41:39 +0200 Subject: [PATCH 5/6] Fix meta array storage and output --- classes/class-connector.php | 1 + classes/class-db-driver-wpdb.php | 13 ++++++++++--- classes/class-list-table.php | 15 ++++++++++++++- 3 files changed, 25 insertions(+), 4 deletions(-) diff --git a/classes/class-connector.php b/classes/class-connector.php index 171f32f62..b8f92dcb9 100644 --- a/classes/class-connector.php +++ b/classes/class-connector.php @@ -214,6 +214,7 @@ public function delayed_log_commit() { /** * Compare two values and return changed keys if they are arrays + * x * * @param mixed $old_value Value before change. * @param mixed $new_value Value after change. diff --git a/classes/class-db-driver-wpdb.php b/classes/class-db-driver-wpdb.php index 3fb53186a..c1224e4ff 100755 --- a/classes/class-db-driver-wpdb.php +++ b/classes/class-db-driver-wpdb.php @@ -79,10 +79,17 @@ public function insert_record( $data ) { $record_id = $wpdb->insert_id; // Insert record meta. - foreach ( (array) $meta as $key => $vals ) { - foreach ( (array) $vals as $val ) { + foreach ( (array) $meta as $key => $val ) { + if ( is_array( $val ) ) { + $vals = $val; + foreach ( $vals as $k => $val ) { + if ( is_scalar( $val ) && '' !== $val ) { + $this->insert_meta( $record_id, $key . '[' . $k . ']', substr( $val, 0, 200 ) ); + } + } + } else { if ( is_scalar( $val ) && '' !== $val ) { - $this->insert_meta( $record_id, $key, $val ); + $this->insert_meta( $record_id, $key, substr( $val, 0, 200 ) ); } } } diff --git a/classes/class-list-table.php b/classes/class-list-table.php index 40d0093e7..ae32c10d3 100644 --- a/classes/class-list-table.php +++ b/classes/class-list-table.php @@ -334,7 +334,20 @@ public function column_default( $item, $column_name ) { ); } if ( $record->meta ) { - $out .= '
' . esc_html__( 'Metadata', 'stream' ) . '
' . esc_html( print_r( $record->meta, true ) ) . '
'; + $meta = array(); + foreach ( $record->meta as $key => $value ) { + if ( false === strpos( $key, '[' ) ) { + $meta[ $key ] = $value; + } else { + $main_key = substr( $key, 0, strpos( $key, '[' ) ); + $sub_key = substr( $key, strpos( $key, '[' ) + 1, - 1 ); + + $meta[ $main_key ][ $sub_key ] = $value; + } + } + $out .= '
' . esc_html__( 'Metadata', 'stream' ) . '
';
+					$out  .= esc_html( print_r( $meta, true ) );
+					 $out .= '
'; } $out .= $this->get_action_links( $record ); break; From 5838f7ba7667bff923b54a56b690da59a4b2e48b Mon Sep 17 00:00:00 2001 From: Alex Kirk Date: Thu, 12 Oct 2023 15:33:43 +0200 Subject: [PATCH 6/6] Fix count query --- classes/class-connector.php | 1 - classes/class-query.php | 9 ++++----- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/classes/class-connector.php b/classes/class-connector.php index b8f92dcb9..171f32f62 100644 --- a/classes/class-connector.php +++ b/classes/class-connector.php @@ -214,7 +214,6 @@ public function delayed_log_commit() { /** * Compare two values and return changed keys if they are arrays - * x * * @param mixed $old_value Value before change. * @param mixed $new_value Value after change. diff --git a/classes/class-query.php b/classes/class-query.php index 704bf8648..04053fdd2 100644 --- a/classes/class-query.php +++ b/classes/class-query.php @@ -219,10 +219,10 @@ public function query( $args ) { $selects[] = "$wpdb->stream.*"; } - $join = "LEFT JOIN $wpdb->streammeta ON $wpdb->stream.ID = $wpdb->streammeta.record_id"; + $join = "LEFT JOIN $wpdb->streammeta ON $wpdb->stream.ID = $wpdb->streammeta.record_id"; $selects[] = "$wpdb->streammeta.meta_key"; $selects[] = "$wpdb->streammeta.meta_value"; - $select = implode( ', ', $selects ); + $select = implode( ', ', $selects ); /** * Filters query WHERE statement as an alternative to filtering @@ -237,7 +237,7 @@ public function query( $args ) { /** * Build the query but just to get the IDs */ - $query = "SELECT ID + $query = "SELECT $wpdb->stream.ID FROM $wpdb->stream WHERE 1=1 {$where} {$orderby} @@ -273,7 +273,6 @@ public function query( $args ) { // Build result count query. $count_query = "SELECT COUNT(*) as found FROM $wpdb->stream - {$join} WHERE 1=1 {$where}"; /** @@ -289,7 +288,7 @@ public function query( $args ) { $items = array(); foreach ( $wpdb->get_results( $query ) as $item ) { // phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared if ( ! isset( $items[ $item->ID ] ) ) { - $items[ $item->ID ] = clone $item; + $items[ $item->ID ] = clone $item; $items[ $item->ID ]->meta = array(); unset( $items[ $item->ID ]->meta_key ); unset( $items[ $item->ID ]->meta_value );