-
Notifications
You must be signed in to change notification settings - Fork 205
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
feat: Dokan Data Store #2346
base: develop
Are you sure you want to change the base?
feat: Dokan Data Store #2346
Changes from 5 commits
ea2a6e9
1628844
40e5ecb
a216c96
7e681f9
f583f2c
73b289d
c8b207c
aae536f
9b5aa1c
80b6bee
fc33dc8
a07efbf
afaeb93
be45417
a47f411
f57f2fa
7d4b345
d348e0c
45965a3
a8ce67d
59ea07f
d504acb
b950b9c
774843d
8417e49
cb6b364
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change | ||||
---|---|---|---|---|---|---|
@@ -0,0 +1,83 @@ | ||||||
<?php | ||||||
|
||||||
namespace WeDevs\Dokan\Models; | ||||||
|
||||||
use WC_Data; | ||||||
|
||||||
abstract class BaseModel extends WC_Data { | ||||||
/** | ||||||
* Save should create or update based on object existence. | ||||||
* | ||||||
* @return int | ||||||
*/ | ||||||
public function save() { | ||||||
// wc_get_product() | ||||||
if ( ! $this->data_store ) { | ||||||
return $this->get_id(); | ||||||
} | ||||||
|
||||||
/** | ||||||
* Trigger action before saving to the DB. Allows you to adjust object props before save. | ||||||
* | ||||||
* @param WC_Data $this The object being saved. | ||||||
* @param WC_Data_Store_WP $data_store THe data store persisting the data. | ||||||
*/ | ||||||
do_action( 'dokan_before_' . $this->object_type . '_object_save', $this, $this->data_store ); | ||||||
|
||||||
if ( $this->get_id() ) { | ||||||
$this->data_store->update( $this ); | ||||||
} else { | ||||||
$this->data_store->create( $this ); | ||||||
} | ||||||
|
||||||
/** | ||||||
* Trigger action after saving to the DB. | ||||||
* | ||||||
* @param WC_Data $this The object being saved. | ||||||
* @param WC_Data_Store_WP $data_store THe data store persisting the data. | ||||||
*/ | ||||||
do_action( 'dokan_after_' . $this->object_type . '_object_save', $this, $this->data_store ); | ||||||
|
||||||
return $this->get_id(); | ||||||
} | ||||||
|
||||||
/** | ||||||
* Delete an object, set the ID to 0, and return result. | ||||||
* | ||||||
* @param bool $force_delete Should the date be deleted permanently. | ||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Fix typo in parameter description of In the docblock for the Apply this diff to correct the typo: - * @param bool $force_delete Should the date be deleted permanently.
+ * @param bool $force_delete Should the data be deleted permanently. 📝 Committable suggestion
Suggested change
|
||||||
* @return bool result | ||||||
*/ | ||||||
public function delete( $force_delete = false ) { | ||||||
/** | ||||||
* Filters whether an object deletion should take place. Equivalent to `pre_delete_post`. | ||||||
* | ||||||
* @param mixed $check Whether to go ahead with deletion. | ||||||
* @param Data $this The data object being deleted. | ||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Ensure consistency in parameter types in docblocks. At line 55, the parameter type for Apply this diff to correct the parameter type: - * @param Data $this The data object being deleted.
+ * @param WC_Data $this The data object being deleted. 📝 Committable suggestion
Suggested change
|
||||||
* @param bool $force_delete Whether to bypass the trash. | ||||||
* | ||||||
* @since 8.1.0. | ||||||
*/ | ||||||
$check = apply_filters( "dokan_pre_delete_$this->object_type", null, $this, $force_delete ); | ||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Fix variable interpolation in When interpolating object properties within double-quoted strings, you need to enclose the property in braces to ensure correct parsing. Without braces, PHP may not parse the variable correctly. Apply this diff to fix the variable interpolation: - $check = apply_filters( "dokan_pre_delete_$this->object_type", null, $this, $force_delete );
+ $check = apply_filters( "dokan_pre_delete_{$this->object_type}", null, $this, $force_delete ); 📝 Committable suggestion
Suggested change
|
||||||
|
||||||
if ( null !== $check ) { | ||||||
return $check; | ||||||
} | ||||||
|
||||||
if ( $this->data_store ) { | ||||||
$this->data_store->delete( $this, array( 'force_delete' => $force_delete ) ); | ||||||
$this->set_id( 0 ); | ||||||
return true; | ||||||
} | ||||||
|
||||||
return false; | ||||||
} | ||||||
|
||||||
/** | ||||||
* Prefix for action and filter hooks on data. | ||||||
* | ||||||
* @return string | ||||||
*/ | ||||||
protected function get_hook_prefix() { | ||||||
return 'dokan_' . $this->object_type . '_get_'; | ||||||
} | ||||||
} |
Original file line number | Diff line number | Diff line change | ||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
@@ -0,0 +1,290 @@ | ||||||||||||||||||||||||||||||||||||||||||||||
<?php | ||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||
namespace WeDevs\Dokan\Models\DataStore; | ||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||
use Automattic\WooCommerce\Admin\API\Reports\SqlQuery; | ||||||||||||||||||||||||||||||||||||||||||||||
use Automattic\WooCommerce\Pinterest\API\Base; | ||||||||||||||||||||||||||||||||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Remove unused import The -use Automattic\WooCommerce\Pinterest\API\Base; 📝 Committable suggestion
Suggested change
|
||||||||||||||||||||||||||||||||||||||||||||||
use Exception; | ||||||||||||||||||||||||||||||||||||||||||||||
use WeDevs\Dokan\Models\BaseModel; | ||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||
abstract class BaseDataStore extends SqlQuery implements DataStoreInterface { | ||||||||||||||||||||||||||||||||||||||||||||||
protected $selected_columns = [ '*' ]; | ||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||
/** | ||||||||||||||||||||||||||||||||||||||||||||||
* Get the fields with format as an array where key is the db field name and value is the format. | ||||||||||||||||||||||||||||||||||||||||||||||
* | ||||||||||||||||||||||||||||||||||||||||||||||
* @return array | ||||||||||||||||||||||||||||||||||||||||||||||
*/ | ||||||||||||||||||||||||||||||||||||||||||||||
abstract protected function get_fields_with_format(): array; | ||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||
/** | ||||||||||||||||||||||||||||||||||||||||||||||
* Get the table name with or without prefix | ||||||||||||||||||||||||||||||||||||||||||||||
* | ||||||||||||||||||||||||||||||||||||||||||||||
* @return string | ||||||||||||||||||||||||||||||||||||||||||||||
*/ | ||||||||||||||||||||||||||||||||||||||||||||||
abstract public function get_table_name(): string; | ||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||
/** | ||||||||||||||||||||||||||||||||||||||||||||||
* Create a new record in the database using the provided model data. | ||||||||||||||||||||||||||||||||||||||||||||||
* | ||||||||||||||||||||||||||||||||||||||||||||||
* @param BaseModel $model The model object containing the data to be inserted. | ||||||||||||||||||||||||||||||||||||||||||||||
*/ | ||||||||||||||||||||||||||||||||||||||||||||||
public function create( BaseModel &$model ) { | ||||||||||||||||||||||||||||||||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 🛠️ Refactor suggestion Remove unnecessary passing of objects by reference In the methods Apply this diff to remove the unnecessary reference operator: - public function create( BaseModel &$model ) {
+ public function create( BaseModel $model ) {
- public function read( BaseModel &$model ) {
+ public function read( BaseModel $model ) {
- public function update( BaseModel &$model ) {
+ public function update( BaseModel $model ) {
- public function delete( BaseModel &$model, $args = array() ) {
+ public function delete( BaseModel $model, $args = array() ) { Also applies to: 42-42, 87-87, 117-117 |
||||||||||||||||||||||||||||||||||||||||||||||
$data = $this->get_fields_data( $model ); | ||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||
$inserted_id = $this->insert( $data ); | ||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||
if ( $inserted_id ) { | ||||||||||||||||||||||||||||||||||||||||||||||
$model->set_id( $inserted_id ); | ||||||||||||||||||||||||||||||||||||||||||||||
$model->apply_changes(); | ||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||
do_action( $this->get_hook_prefix() . 'created', $inserted_id, $data ); | ||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||
return $inserted_id; | ||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||
/** | ||||||||||||||||||||||||||||||||||||||||||||||
* Method to read a download permission from the database. | ||||||||||||||||||||||||||||||||||||||||||||||
* | ||||||||||||||||||||||||||||||||||||||||||||||
* @param BaseModel $model BaseModel object. | ||||||||||||||||||||||||||||||||||||||||||||||
* | ||||||||||||||||||||||||||||||||||||||||||||||
* @phpcs:ignore WordPress.DB.PreparedSQL.InterpolatedNotPrepared | ||||||||||||||||||||||||||||||||||||||||||||||
* | ||||||||||||||||||||||||||||||||||||||||||||||
* @throws Exception Throw exception if invalid entity is passed. | ||||||||||||||||||||||||||||||||||||||||||||||
*/ | ||||||||||||||||||||||||||||||||||||||||||||||
public function read( BaseModel &$model ) { | ||||||||||||||||||||||||||||||||||||||||||||||
global $wpdb; | ||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||
if ( ! $model->get_id() ) { | ||||||||||||||||||||||||||||||||||||||||||||||
$message = $this->get_hook_prefix() . ' : ' . __( 'Invalid entity item.', 'dokan-lite' ); | ||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||
throw new Exception( esc_html( $message ) ); | ||||||||||||||||||||||||||||||||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Avoid using The Remove if ( ! $model->get_id() ) {
$message = $this->get_hook_prefix() . ' : ' . __( 'Invalid entity item.', 'dokan-lite' );
- throw new Exception( esc_html( $message ) );
+ throw new Exception( $message );
}
---
if ( ! $raw_item ) {
$message = $this->get_hook_prefix() . ' : ' . __( 'Invalid entity item.', 'dokan-lite' );
- throw new Exception( esc_html( $message ) );
+ throw new Exception( $message );
} Exception messages should be plain strings since they are not rendered in a browser context. Also applies to: 90-90 |
||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||
$model->set_defaults(); | ||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||
$id_field_name = $this->get_id_field_name(); | ||||||||||||||||||||||||||||||||||||||||||||||
$format = $this->get_id_field_format(); | ||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||
$this->clear_all_clauses(); | ||||||||||||||||||||||||||||||||||||||||||||||
$this->add_sql_clause( 'select', $this->get_selected_columns() ); | ||||||||||||||||||||||||||||||||||||||||||||||
$this->add_sql_clause( 'from', $this->get_table_name_with_prefix() ); | ||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||
$this->add_sql_clause( | ||||||||||||||||||||||||||||||||||||||||||||||
'where', | ||||||||||||||||||||||||||||||||||||||||||||||
$wpdb->prepare( | ||||||||||||||||||||||||||||||||||||||||||||||
"{$id_field_name} = $format", | ||||||||||||||||||||||||||||||||||||||||||||||
Check failure on line 78 in includes/Models/DataStore/BaseDataStore.php GitHub Actions / Run PHPCS inspection
Check failure on line 78 in includes/Models/DataStore/BaseDataStore.php GitHub Actions / Run PHPCS inspection
|
||||||||||||||||||||||||||||||||||||||||||||||
$model->get_id() | ||||||||||||||||||||||||||||||||||||||||||||||
) | ||||||||||||||||||||||||||||||||||||||||||||||
); | ||||||||||||||||||||||||||||||||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Fix potential SQL injection vulnerability in query preparation The SQL query in the Apply this diff to properly prepare the SQL statement using placeholders: $this->add_sql_clause(
'where',
- $wpdb->prepare(
- "{$id_field_name} = $format",
+ $wpdb->prepare(
+ "{$id_field_name} = %s",
$model->get_id()
)
); Note: Since
🧰 Tools🪛 GitHub Check: Run PHPCS inspection
|
||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||
$raw_item = $wpdb->get_row( | ||||||||||||||||||||||||||||||||||||||||||||||
$this->get_query_statement() | ||||||||||||||||||||||||||||||||||||||||||||||
Check warning on line 84 in includes/Models/DataStore/BaseDataStore.php GitHub Actions / Run PHPCS inspection
|
||||||||||||||||||||||||||||||||||||||||||||||
); | ||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||
if ( ! $raw_item ) { | ||||||||||||||||||||||||||||||||||||||||||||||
$message = $this->get_hook_prefix() . ' : ' . __( 'Invalid entity item.', 'dokan-lite' ); | ||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||
throw new Exception( esc_html( $message ) ); | ||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||
$model->set_props( $this->format_raw_data( $raw_item ) ); | ||||||||||||||||||||||||||||||||||||||||||||||
$model->set_object_read( true ); | ||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||
return $raw_item; | ||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Fix SQL injection vulnerability in read() method The SQL query construction in the read method is vulnerable to SQL injection. While the ID value is properly prepared, the field name and format are directly interpolated into the query string. - $wpdb->prepare(
- "{$id_field_name} = $format",
- $model->get_id()
- )
+ $wpdb->prepare(
+ $wpdb->prepare( '%s = %d', $id_field_name, $model->get_id() )
+ ) Additionally, consider validating
🧰 Tools🪛 GitHub Check: Run PHPCS inspection
|
||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||
/** | ||||||||||||||||||||||||||||||||||||||||||||||
* Method to update a download in the database. | ||||||||||||||||||||||||||||||||||||||||||||||
* | ||||||||||||||||||||||||||||||||||||||||||||||
* @param BaseModel $model WC_Customer_Download object. | ||||||||||||||||||||||||||||||||||||||||||||||
*/ | ||||||||||||||||||||||||||||||||||||||||||||||
public function update( BaseModel &$model ) { | ||||||||||||||||||||||||||||||||||||||||||||||
global $wpdb; | ||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||
$data = $this->get_fields_data( $model ); | ||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||
$format = $this->get_fields_format(); | ||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||
$result = $wpdb->update( | ||||||||||||||||||||||||||||||||||||||||||||||
$this->get_table_name_with_prefix(), | ||||||||||||||||||||||||||||||||||||||||||||||
$data, | ||||||||||||||||||||||||||||||||||||||||||||||
array( | ||||||||||||||||||||||||||||||||||||||||||||||
$this->get_id_field_name() => $model->get_id(), | ||||||||||||||||||||||||||||||||||||||||||||||
), | ||||||||||||||||||||||||||||||||||||||||||||||
$format | ||||||||||||||||||||||||||||||||||||||||||||||
); | ||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||
$model->apply_changes(); | ||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||
return $result; | ||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||
/** | ||||||||||||||||||||||||||||||||||||||||||||||
* Method to delete a download permission from the database. | ||||||||||||||||||||||||||||||||||||||||||||||
* | ||||||||||||||||||||||||||||||||||||||||||||||
* @param BaseModel $model BaseModel object. | ||||||||||||||||||||||||||||||||||||||||||||||
* @param array $args Array of args to pass to the delete method. | ||||||||||||||||||||||||||||||||||||||||||||||
*/ | ||||||||||||||||||||||||||||||||||||||||||||||
public function delete( BaseModel &$model, $args = array() ) { | ||||||||||||||||||||||||||||||||||||||||||||||
$model_id = $model->get_id(); | ||||||||||||||||||||||||||||||||||||||||||||||
$this->delete_by_id( $model_id ); | ||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||
$model->set_id( 0 ); | ||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||
/** | ||||||||||||||||||||||||||||||||||||||||||||||
* Method to delete a download permission from the database by ID. | ||||||||||||||||||||||||||||||||||||||||||||||
* | ||||||||||||||||||||||||||||||||||||||||||||||
* @param int $id permission_id of the download to be deleted. | ||||||||||||||||||||||||||||||||||||||||||||||
* | ||||||||||||||||||||||||||||||||||||||||||||||
* @phpcs:ignore WordPress.DB.PreparedSQL.InterpolatedNotPrepared | ||||||||||||||||||||||||||||||||||||||||||||||
*/ | ||||||||||||||||||||||||||||||||||||||||||||||
public function delete_by_id( $id ) { | ||||||||||||||||||||||||||||||||||||||||||||||
global $wpdb; | ||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||
$table_name = $this->get_table_name_with_prefix(); | ||||||||||||||||||||||||||||||||||||||||||||||
$id_field_name = $this->get_id_field_name(); | ||||||||||||||||||||||||||||||||||||||||||||||
$format = $this->get_id_field_format(); | ||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||
$result = $wpdb->query( | ||||||||||||||||||||||||||||||||||||||||||||||
$wpdb->prepare( | ||||||||||||||||||||||||||||||||||||||||||||||
"DELETE FROM {$table_name} | ||||||||||||||||||||||||||||||||||||||||||||||
WHERE $id_field_name = $format", | ||||||||||||||||||||||||||||||||||||||||||||||
Check failure on line 155 in includes/Models/DataStore/BaseDataStore.php GitHub Actions / Run PHPCS inspection
Check failure on line 155 in includes/Models/DataStore/BaseDataStore.php GitHub Actions / Run PHPCS inspection
|
||||||||||||||||||||||||||||||||||||||||||||||
$id | ||||||||||||||||||||||||||||||||||||||||||||||
) | ||||||||||||||||||||||||||||||||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Fix potential SQL injection vulnerability in deletion query In the Refactor the code to use - $result = $wpdb->query(
- $wpdb->prepare(
- "DELETE FROM {$table_name}
- WHERE $id_field_name = $format",
- $id
- )
- );
+ $result = $wpdb->delete(
+ $table_name,
+ array( $id_field_name => $id ),
+ array( $format )
+ ); This approach ensures that the table name and where clause are handled safely, preventing SQL injection. 📝 Committable suggestion
Suggested change
🧰 Tools🪛 GitHub Check: Run PHPCS inspection
|
||||||||||||||||||||||||||||||||||||||||||||||
); | ||||||||||||||||||||||||||||||||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Fix potential SQL injection vulnerability in In the Refactor the code to use $table_name = $this->get_table_name_with_prefix();
$id_field_name = $this->get_id_field_name();
$format = $this->get_id_field_format();
- $result = $wpdb->query(
- $wpdb->prepare(
- "DELETE FROM {$table_name}
- WHERE $id_field_name = $format",
- $id
- )
- );
+ $result = $wpdb->delete(
+ $table_name,
+ [ $id_field_name => $id ],
+ [ $format ]
+ ); Using 📝 Committable suggestion
Suggested change
🧰 Tools🪛 GitHub Check: Run PHPCS inspection
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Fix potential SQL injection vulnerability in Interpolating variables directly into the SQL query can lead to SQL injection vulnerabilities. Specifically, using Refactor the code to use - $result = $wpdb->query(
- $wpdb->prepare(
- "DELETE FROM {$table_name}
- WHERE $id_field_name = $format",
- $id
- )
- );
+ $result = $wpdb->delete(
+ $table_name,
+ array( $id_field_name => $id ),
+ array( $format )
+ ); This approach ensures that the table name and where clause are handled safely, preventing SQL injection. 📝 Committable suggestion
Suggested change
🧰 Tools🪛 GitHub Check: Run PHPCS inspection
|
||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||
do_action( $this->get_hook_prefix() . 'deleted', $id, $result ); | ||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||
return $result; | ||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||
/** | ||||||||||||||||||||||||||||||||||||||||||||||
* Create download permission for a user, from an array of data. | ||||||||||||||||||||||||||||||||||||||||||||||
* Assumes that all the keys in the passed data are valid. | ||||||||||||||||||||||||||||||||||||||||||||||
* | ||||||||||||||||||||||||||||||||||||||||||||||
* @param array $data Data to create the permission for. | ||||||||||||||||||||||||||||||||||||||||||||||
* @return int The database id of the created permission, or false if the permission creation failed. | ||||||||||||||||||||||||||||||||||||||||||||||
*/ | ||||||||||||||||||||||||||||||||||||||||||||||
protected function insert( array $data ) { | ||||||||||||||||||||||||||||||||||||||||||||||
global $wpdb; | ||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||
$format = $this->get_fields_format(); | ||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||
$table_name = $this->get_table_name_with_prefix(); | ||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||
$hook_prefix = $this->get_hook_prefix(); | ||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||
$result = $wpdb->insert( | ||||||||||||||||||||||||||||||||||||||||||||||
$table_name, | ||||||||||||||||||||||||||||||||||||||||||||||
apply_filters( $hook_prefix . 'insert_data', $data ), | ||||||||||||||||||||||||||||||||||||||||||||||
apply_filters( $hook_prefix . 'insert_data_format', $format, $data ) | ||||||||||||||||||||||||||||||||||||||||||||||
); | ||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||
do_action( $hook_prefix . 'after_insert', $result, $data ); | ||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||
return $result ? $wpdb->insert_id : 0; | ||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||
protected function get_fields_data( BaseModel &$model ): array { | ||||||||||||||||||||||||||||||||||||||||||||||
$data = array(); | ||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||
foreach ( $this->get_fields() as $db_field_name ) { | ||||||||||||||||||||||||||||||||||||||||||||||
if ( method_exists( $this, 'get_' . $db_field_name ) ) { | ||||||||||||||||||||||||||||||||||||||||||||||
$data[ $db_field_name ] = call_user_func( array( $this, 'get_' . $db_field_name ), $model, 'edit' ); | ||||||||||||||||||||||||||||||||||||||||||||||
} else { | ||||||||||||||||||||||||||||||||||||||||||||||
$data[ $db_field_name ] = call_user_func( array( $model, 'get_' . $db_field_name ), 'edit' ); | ||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||
return $data; | ||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||
/** | ||||||||||||||||||||||||||||||||||||||||||||||
* Returns a list of columns selected by the query_args formatted as a comma separated string. | ||||||||||||||||||||||||||||||||||||||||||||||
* | ||||||||||||||||||||||||||||||||||||||||||||||
* @return string | ||||||||||||||||||||||||||||||||||||||||||||||
*/ | ||||||||||||||||||||||||||||||||||||||||||||||
protected function get_selected_columns(): string { | ||||||||||||||||||||||||||||||||||||||||||||||
$selections = apply_filters( $this->get_hook_prefix() . 'selected_columns', $this->selected_columns ); | ||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||
$selections = implode( ', ', $selections ); | ||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||
return $selections; | ||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||
protected function format_raw_data( $raw_data ): array { | ||||||||||||||||||||||||||||||||||||||||||||||
$data = array(); | ||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||
foreach ( $this->get_fields() as $db_field_name ) { | ||||||||||||||||||||||||||||||||||||||||||||||
$data[ $db_field_name ] = $raw_data->{$db_field_name}; | ||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||
return apply_filters( $this->get_hook_prefix() . 'format_raw_data', $data, $raw_data ); | ||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Add property existence check in format_raw_data() The method directly accesses object properties without checking their existence, which could lead to PHP notices or errors. protected function format_raw_data( $raw_data ): array {
$data = array();
foreach ( $this->get_fields() as $db_field_name ) {
- $data[ $db_field_name ] = $raw_data->{$db_field_name};
+ $data[ $db_field_name ] = property_exists( $raw_data, $db_field_name )
+ ? $raw_data->{$db_field_name}
+ : null;
}
return apply_filters( $this->get_hook_prefix() . 'format_raw_data', $data, $raw_data );
} 📝 Committable suggestion
Suggested change
|
||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||
protected function get_hook_prefix(): string { | ||||||||||||||||||||||||||||||||||||||||||||||
global $wpdb; | ||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||
$table_name = $this->get_table_name(); | ||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||
$hook_prefix = str_replace( $wpdb->prefix, '', $table_name ); | ||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||
return "dokan_{$hook_prefix}_"; | ||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||
protected function get_table_name_with_prefix(): string { | ||||||||||||||||||||||||||||||||||||||||||||||
global $wpdb; | ||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||
$table_name = $this->get_table_name(); | ||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||
if ( ! str_starts_with( $table_name, $wpdb->prefix ) ) { | ||||||||||||||||||||||||||||||||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Ensure PHP version compatibility when using The function Replace protected function get_table_name_with_prefix(): string {
global $wpdb;
$table_name = $this->get_table_name();
- if ( ! str_starts_with( $table_name, $wpdb->prefix ) ) {
+ if ( strpos( $table_name, $wpdb->prefix ) !== 0 ) {
$table_name = $wpdb->prefix . $table_name;
}
return $table_name;
} This change maintains the same functionality while ensuring compatibility with PHP versions prior to 8.0. 📝 Committable suggestion
Suggested change
|
||||||||||||||||||||||||||||||||||||||||||||||
$table_name = $wpdb->prefix . $table_name; | ||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||
Comment on lines
+394
to
+396
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Ensure compatibility with PHP versions when using The function Replace - if ( ! str_starts_with( $table_name, $wpdb->prefix ) ) {
+ if ( strpos( $table_name, $wpdb->prefix ) !== 0 ) { This change maintains the same functionality while ensuring compatibility with PHP versions prior to 8.0. 📝 Committable suggestion
Suggested change
|
||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||
return $table_name; | ||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||
Comment on lines
+389
to
+399
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 🛠️ Refactor suggestion Add table name validation The table name should be validated to prevent potential security issues and ensure it follows WordPress naming conventions. protected function get_table_name_with_prefix(): string {
global $wpdb;
$table_name = $this->get_table_name();
+ // Validate table name format
+ if ( ! preg_match('/^[a-zA-Z0-9_]+$/', $table_name) ) {
+ throw new Exception( __( 'Invalid table name format', 'dokan-lite' ) );
+ }
+
if ( ! str_starts_with( $table_name, $wpdb->prefix ) ) {
$table_name = $wpdb->prefix . $table_name;
}
return $table_name;
}
|
||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||
protected function get_id_field_name(): string { | ||||||||||||||||||||||||||||||||||||||||||||||
return apply_filters( $this->get_hook_prefix() . 'id_field_name', 'id' ); // 'id'; | ||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||
protected function get_id_field_format(): string { | ||||||||||||||||||||||||||||||||||||||||||||||
return apply_filters( $this->get_hook_prefix() . 'id_field_format', '%d' ); // 'id'; | ||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||
/** | ||||||||||||||||||||||||||||||||||||||||||||||
* Get the fields. | ||||||||||||||||||||||||||||||||||||||||||||||
* | ||||||||||||||||||||||||||||||||||||||||||||||
* @return array The filtered array of fields. | ||||||||||||||||||||||||||||||||||||||||||||||
*/ | ||||||||||||||||||||||||||||||||||||||||||||||
protected function get_fields(): array { | ||||||||||||||||||||||||||||||||||||||||||||||
$fields = array_keys( $this->get_fields_with_format() ); | ||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||
return apply_filters( | ||||||||||||||||||||||||||||||||||||||||||||||
$this->get_hook_prefix() . 'fields', | ||||||||||||||||||||||||||||||||||||||||||||||
$fields, | ||||||||||||||||||||||||||||||||||||||||||||||
$this->get_fields_with_format() | ||||||||||||||||||||||||||||||||||||||||||||||
); | ||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||
/** | ||||||||||||||||||||||||||||||||||||||||||||||
* Get the fields with format. | ||||||||||||||||||||||||||||||||||||||||||||||
* | ||||||||||||||||||||||||||||||||||||||||||||||
* @return array The filtered array of format of the fields. | ||||||||||||||||||||||||||||||||||||||||||||||
*/ | ||||||||||||||||||||||||||||||||||||||||||||||
protected function get_fields_format(): array { | ||||||||||||||||||||||||||||||||||||||||||||||
$format = array_values( $this->get_fields_with_format() ); | ||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||
return apply_filters( | ||||||||||||||||||||||||||||||||||||||||||||||
$this->get_hook_prefix() . 'fields_format', | ||||||||||||||||||||||||||||||||||||||||||||||
$format, | ||||||||||||||||||||||||||||||||||||||||||||||
$this->get_fields_with_format() | ||||||||||||||||||||||||||||||||||||||||||||||
); | ||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Correct capitalization in parameter descriptions.
In the docblocks for
$data_store
at lines 23 and 37, "THe data store persisting the data." should be "The data store persisting the data."Apply this diff to fix the typos:
Also applies to: 37-37