3446 lines
137 KiB
PHP
3446 lines
137 KiB
PHP
<?php
|
|
/**
|
|
* MainWP Database Controller
|
|
*
|
|
* This file handles all interactions with the DB.
|
|
*
|
|
* @package MainWP/Dashboard
|
|
*/
|
|
|
|
namespace MainWP\Dashboard;
|
|
|
|
/**
|
|
* Class MainWP_DB
|
|
*
|
|
* @package MainWP\Dashboard
|
|
*
|
|
* @uses \MainWP\Dashboard\MainWP_DB_Base
|
|
*/
|
|
class MainWP_DB extends MainWP_DB_Base { // phpcs:ignore Generic.Classes.OpeningBraceSameLine.ContentAfterBrace -- NOSONAR.
|
|
|
|
// phpcs:disable WordPress.DB.RestrictedFunctions, WordPress.DB.PreparedSQL.NotPrepared, Generic.Metrics.CyclomaticComplexity -- This is the only way to achieve desired results, pull request solutions appreciated.
|
|
|
|
/**
|
|
* Private static variable to hold the single instance of the class.
|
|
*
|
|
* @static
|
|
*
|
|
* @var mixed Default null
|
|
*/
|
|
private static $instance = null;
|
|
|
|
/**
|
|
* Private static variable to hold the single instance.
|
|
*
|
|
* @static
|
|
*
|
|
* @var mixed Default null
|
|
*/
|
|
private static $general_options = null;
|
|
|
|
/**
|
|
* Possible options.
|
|
*
|
|
* @var array $possible_options
|
|
*/
|
|
private static $possible_options = array(
|
|
'plugin_upgrades',
|
|
'theme_upgrades',
|
|
'premium_upgrades',
|
|
'plugins',
|
|
'themes',
|
|
'dtsSync',
|
|
'version',
|
|
'sync_errors',
|
|
'ignored_plugins',
|
|
'wp_upgrades',
|
|
'site_info',
|
|
'client',
|
|
'signature_algo',
|
|
'verify_method',
|
|
'pubkey',
|
|
);
|
|
|
|
/**
|
|
* Create public static instance.
|
|
*
|
|
* @static
|
|
*
|
|
* @return MainWP_DB
|
|
*/
|
|
public static function instance() {
|
|
if ( null === static::$instance ) {
|
|
static::$instance = new self();
|
|
}
|
|
|
|
static::$instance->test_connection();
|
|
|
|
return static::$instance;
|
|
}
|
|
|
|
/**
|
|
* Get wp_options database table view.
|
|
*
|
|
* @param array $fields Extra option fields.
|
|
* @param string $view_query view query.
|
|
*
|
|
* @return array wp_options view.
|
|
*/
|
|
public function get_option_view( $fields = array(), $view_query = 'default' ) {
|
|
|
|
if ( ! is_array( $fields ) ) {
|
|
$fields = array();
|
|
}
|
|
|
|
$view = '(SELECT intwp.id AS wpid ';
|
|
|
|
$included_opts = array();
|
|
|
|
if ( empty( $fields ) || 'default' === $view_query || 'manage_site' === $view_query ) {
|
|
$view .= ',(SELECT recent_comments.value FROM ' . $this->table_name( 'wp_options' ) . ' recent_comments WHERE recent_comments.wpid = intwp.id AND recent_comments.name = "recent_comments" LIMIT 1) AS recent_comments,
|
|
(SELECT recent_posts.value FROM ' . $this->table_name( 'wp_options' ) . ' recent_posts WHERE recent_posts.wpid = intwp.id AND recent_posts.name = "recent_posts" LIMIT 1) AS recent_posts,
|
|
(SELECT recent_pages.value FROM ' . $this->table_name( 'wp_options' ) . ' recent_pages WHERE recent_pages.wpid = intwp.id AND recent_pages.name = "recent_pages" LIMIT 1) AS recent_pages,
|
|
(SELECT phpversion.value FROM ' . $this->table_name( 'wp_options' ) . ' phpversion WHERE phpversion.wpid = intwp.id AND phpversion.name = "phpversion" LIMIT 1) AS phpversion,
|
|
(SELECT added_timestamp.value FROM ' . $this->table_name( 'wp_options' ) . ' added_timestamp WHERE added_timestamp.wpid = intwp.id AND added_timestamp.name = "added_timestamp" LIMIT 1) AS added_timestamp,
|
|
(SELECT wp_upgrades.value FROM ' . $this->table_name( 'wp_options' ) . ' wp_upgrades WHERE wp_upgrades.wpid = intwp.id AND wp_upgrades.name = "wp_upgrades" LIMIT 1) AS wp_upgrades ';
|
|
$included_opts = array( 'recent_comments', 'recent_posts', 'recent_pages', 'phpversion', 'added_timestamp', 'wp_upgrades' );
|
|
}
|
|
|
|
if ( ! in_array( 'signature_algo', $fields ) ) {
|
|
$fields[] = 'signature_algo';
|
|
}
|
|
|
|
if ( ! in_array( 'verify_method', $fields ) ) {
|
|
$fields[] = 'verify_method';
|
|
}
|
|
|
|
if ( ! in_array( 'cust_site_icon_info', $fields, true ) ) {
|
|
$fields[] = 'cust_site_icon_info';
|
|
}
|
|
|
|
if ( is_array( $fields ) ) {
|
|
foreach ( $fields as $field ) {
|
|
if ( empty( $field ) ) {
|
|
continue;
|
|
}
|
|
if ( in_array( $field, $included_opts ) ) {
|
|
continue;
|
|
}
|
|
$view .= ', ';
|
|
$view .= '(SELECT ' . $this->escape( $field ) . '.value FROM ' . $this->table_name( 'wp_options' ) . ' ' . $this->escape( $field ) . ' WHERE ' . $this->escape( $field ) . '.wpid = intwp.id AND ' . $this->escape( $field ) . '.name = "' . $this->escape( $field ) . '" LIMIT 1) AS ' . $this->escape( $field );
|
|
}
|
|
}
|
|
|
|
$view .= ' FROM ' . $this->table_name( 'wp' ) . ' intwp)';
|
|
|
|
return $view;
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
* Get SQL to get child sites for current user.
|
|
*
|
|
* @since 5.2.
|
|
* @param array $params other params.
|
|
*
|
|
* @return object|null Database query results or null on failure.
|
|
*/
|
|
public function get_sql_websites_for_current_user_by_params( $params = array() ) { // phpcs:ignore -- NOSONAR - complex.
|
|
|
|
if ( ! is_array( $params ) ) {
|
|
$params = array();
|
|
}
|
|
|
|
/**
|
|
* The hook mainwp_get_sql_websites_by_params
|
|
*
|
|
* @since 5.5
|
|
*/
|
|
$params = apply_filters( 'mainwp_get_sql_websites_by_params', $params );
|
|
|
|
$view = isset( $params['view'] ) ? $params['view'] : 'default';
|
|
$with_clients = isset( $params['with_clients'] ) && $params['with_clients'] ? true : false;
|
|
|
|
// legacy support.
|
|
$selectgroups = isset( $params['with_tags'] ) && $params['with_tags'] ? true : false;
|
|
$orderBy = isset( $params['orderby'] ) ? $params['orderby'] : 'wp.url';
|
|
$offset = isset( $params['offset'] ) ? intval( $params['offset'] ) : false;
|
|
$rowcount = isset( $params['rowcount'] ) && $params['rowcount'] ? true : false;
|
|
$extraWhere = isset( $params['where'] ) ? $params['where'] : null; // NOTE: without 'AND' at begining and ending of 'where'.
|
|
$for_manager = isset( $params['for_manager'] ) && $params['for_manager'] ? true : false;
|
|
$others_fields = isset( $params['others_fields'] ) && is_array( $params['others_fields'] ) ? $params['others_fields'] : array( 'favi_icon' );
|
|
$is_staging = isset( $params['is_staging'] ) && in_array( $params['is_staging'], array( 'yes', 'no' ) ) ? $params['is_staging'] : 'no';
|
|
$limit = isset( $params['limit'] ) ? intval( $params['limit'] ) : '';
|
|
|
|
$s = isset( $params['s'] ) ? $params['s'] : '';
|
|
$exclude = isset( $params['exclude'] ) ? wp_parse_id_list( $params['exclude'] ) : array();
|
|
$include = isset( $params['include'] ) ? wp_parse_id_list( $params['include'] ) : array();
|
|
$status = isset( $params['status'] ) ? wp_parse_list( $params['status'] ) : array();
|
|
$page = isset( $params['page'] ) ? intval( $params['page'] ) : false;
|
|
$per_page = isset( $params['per_page'] ) ? intval( $params['per_page'] ) : false;
|
|
|
|
$where = '';
|
|
|
|
if ( ! empty( $extraWhere ) ) {
|
|
$where .= ' AND ' . $extraWhere;
|
|
}
|
|
|
|
if ( ! $for_manager ) {
|
|
$where .= $this->get_sql_where_allow_access_sites( 'wp', $is_staging );
|
|
}
|
|
|
|
$connected_sql = '';
|
|
|
|
if ( is_array( $params ) && isset( $params['connected'] ) && 'yes' === $params['connected'] ) {
|
|
$connected_sql = ' AND wp_sync.sync_errors = "" ';
|
|
} elseif ( is_array( $params ) && isset( $params['connected'] ) && 'no' === $params['connected'] ) {
|
|
$connected_sql = ' AND wp_sync.sync_errors <> "" ';
|
|
}
|
|
|
|
if ( ! empty( $s ) ) {
|
|
$where .= ' AND ( wp.id LIKE "%' . $this->escape( $s ) . '%" OR wp.name LIKE "%' . $this->escape( $s ) . '%" OR wp.url LIKE "%' . $this->escape( $s ) . '%" ) ';
|
|
}
|
|
|
|
if ( ! empty( $exclude ) ) {
|
|
$where .= ' AND wp.id NOT IN (' . implode( ',', $exclude ) . ') ';
|
|
}
|
|
|
|
if ( ! empty( $include ) ) {
|
|
$where .= ' AND wp.id IN (' . implode( ',', $include ) . ') ';
|
|
}
|
|
|
|
// any, connected, disconnected, suspended, available_update.
|
|
if ( ! empty( $status ) && is_array( $status ) && ! in_array( 'any', $status ) ) {
|
|
$status_conds = array();
|
|
if ( in_array( 'available_update', $status ) ) {
|
|
$available_sql = " ( wp.plugin_upgrades <> '' && wp.plugin_upgrades <> '[]' ) OR ( wp.theme_upgrades <> '' && wp.theme_upgrades <> '[]' ) OR ( wp.translation_upgrades <> '' && wp.translation_upgrades <> '[]' ) OR ( wp.premium_upgrades <> '' && wp.premium_upgrades <> '[]' ) ";
|
|
$table_name = esc_sql( $this->table_name( 'wp_options' ) );
|
|
$results = $this->wpdb->get_results( "SELECT wpid FROM {$table_name} WHERE name = 'wp_upgrades' AND value <> '' AND value <> '[]'" );
|
|
if ( $results ) {
|
|
$wp_ids = array();
|
|
foreach ( $results as $item ) {
|
|
if ( ! empty( $item->wpid ) ) {
|
|
$wp_ids[] = $item->wpid;
|
|
}
|
|
}
|
|
$wp_ids = ! empty( $wp_ids ) ? array_unique( $wp_ids ) : array();
|
|
if ( ! empty( $wp_ids ) ) {
|
|
$available_sql .= ' OR wp.id IN ( ' . implode( ',', $wp_ids ) . ' )';
|
|
}
|
|
}
|
|
$status_conds[] = ' ( ' . $available_sql . ') ';
|
|
}
|
|
|
|
if ( in_array( 'connected', $status ) ) {
|
|
$status_conds[] = ' ( wp_sync.sync_errors == "" ) ';
|
|
}
|
|
if ( in_array( 'disconnected', $status ) ) {
|
|
$status_conds[] = " wp_sync.sync_errors <> '' ";
|
|
}
|
|
|
|
if ( in_array( 'suspended', $status ) ) {
|
|
$status_conds[] = ' wp.suspended = 1 ';
|
|
}
|
|
|
|
if ( ! empty( $status_conds ) ) {
|
|
$where .= ' AND ( ' . implode( ' OR ', $status_conds ) . ' ) ';
|
|
}
|
|
|
|
if ( in_array( 'unsuspended', $status ) && ! in_array( 'suspended', $status ) ) { // to sure not conflict the suspended status.
|
|
$where .= ' AND wp.suspended = 0 ';
|
|
}
|
|
}
|
|
|
|
if ( ! empty( $page ) && ! empty( $per_page ) ) {
|
|
$limit = ( $page - 1 ) * $per_page . ',' . $per_page;
|
|
}
|
|
|
|
if ( 'wp.url' === $orderBy ) {
|
|
$orderBy = "replace(replace(replace(replace(replace(wp.url, 'https://www.',''), 'http://www.',''), 'https://', ''), 'http://', ''), 'www.', '')";
|
|
}
|
|
|
|
$select_clients = '';
|
|
$join_clients = '';
|
|
|
|
if ( $with_clients ) {
|
|
$select_clients = ', wpclient.name as client_name ';
|
|
$clients_table = esc_sql( $this->table_name( 'wp_clients' ) );
|
|
$join_clients = " LEFT JOIN {$clients_table} wpclient ON wp.client_id = wpclient.client_id ";
|
|
}
|
|
|
|
$base_fields = array(
|
|
'wp.id',
|
|
'wp.url',
|
|
'wp.name',
|
|
'wp.client_id',
|
|
'wp.verify_certificate',
|
|
'wp.http_user',
|
|
'wp.http_pass',
|
|
'wp.ssl_version',
|
|
'wp.adminname',
|
|
'wp.privkey',
|
|
'wp.pubkey',
|
|
'wp.wpe',
|
|
'wp.is_staging',
|
|
'wp.pubkey',
|
|
'wp.force_use_ipv4',
|
|
'wp.siteurl',
|
|
'wp.suspended',
|
|
'wp.mainwpdir',
|
|
'wp.is_ignoreCoreUpdates',
|
|
'wp.is_ignorePluginUpdates',
|
|
'wp.is_ignoreThemeUpdates',
|
|
'wp_sync.sync_errors',
|
|
'wp.backup_before_upgrade',
|
|
'wp.userid',
|
|
'wp.plugins',
|
|
'wp.themes',
|
|
'wp.offline_check_result', // 1 - online, -1 offline.
|
|
);
|
|
|
|
$select = ' wp.*,wp_sync.* ';
|
|
if ( 'base_view' === $view ) {
|
|
$select = implode( ',', $base_fields );
|
|
} elseif ( 'updates_view' === $view ) {
|
|
$updates_fields = array(
|
|
'wp.plugin_upgrades',
|
|
'wp.theme_upgrades',
|
|
'wp.translation_upgrades',
|
|
'wp.premium_upgrades',
|
|
'wp.ignored_themes',
|
|
'wp.ignored_plugins',
|
|
);
|
|
$select = implode( ',', array_merge( $updates_fields, $base_fields ) );
|
|
}
|
|
|
|
$select .= ',wp_optionview.* '; // to fix bug.
|
|
|
|
// wpgroups to fix issue for mysql 8.0, as groups will generate error syntax.
|
|
if ( $selectgroups ) {
|
|
$qry = 'SELECT ' . $select . ', GROUP_CONCAT(gr.name ORDER BY gr.name SEPARATOR ",") as wpgroups, GROUP_CONCAT(gr.id ORDER BY gr.name SEPARATOR ",") as wpgroupids, GROUP_CONCAT(gr.color ORDER BY gr.name SEPARATOR ",") as wpgroups_colors,
|
|
' . $select_clients . '
|
|
FROM ' . $this->table_name( 'wp' ) . ' wp
|
|
LEFT JOIN ' . $this->table_name( 'wp_group' ) . ' wpgr ON wp.id = wpgr.wpid
|
|
LEFT JOIN ' . $this->table_name( 'group' ) . ' gr ON wpgr.groupid = gr.id
|
|
' . $join_clients . '
|
|
JOIN ' . $this->table_name( 'wp_sync' ) . ' wp_sync ON wp.id = wp_sync.wpid
|
|
JOIN ' . $this->get_option_view_by( $view, $others_fields ) . ' wp_optionview ON wp.id = wp_optionview.wpid
|
|
WHERE 1 ' . $where . $connected_sql . '
|
|
GROUP BY wp.id, wp_sync.sync_id
|
|
ORDER BY ' . $orderBy;
|
|
} else {
|
|
$qry = 'SELECT ' . $select .
|
|
$select_clients . '
|
|
FROM ' . $this->table_name( 'wp' ) . ' wp
|
|
' . $join_clients . '
|
|
JOIN ' . $this->table_name( 'wp_sync' ) . ' wp_sync ON wp.id = wp_sync.wpid
|
|
JOIN ' . $this->get_option_view_by( $view, $others_fields ) . ' wp_optionview ON wp.id = wp_optionview.wpid
|
|
WHERE 1 ' . $where . $connected_sql . '
|
|
GROUP BY wp.id, wp_sync.sync_id
|
|
ORDER BY ' . $orderBy;
|
|
}
|
|
|
|
if ( ( false !== $offset ) && ( false !== $rowcount ) ) {
|
|
$qry .= ' LIMIT ' . $offset . ', ' . $rowcount;
|
|
} elseif ( false !== $rowcount ) {
|
|
$qry .= ' LIMIT ' . $rowcount;
|
|
} elseif ( ! empty( $limit ) ) {
|
|
$qry .= ' LIMIT ' . $limit;
|
|
} else {
|
|
// load all sites so check to support limit sites loading.
|
|
$limit_sites = ! empty( $params['limit_sites'] ) ? intval( $params['limit_sites'] ) : 0;
|
|
if ( ! empty( $limit_sites ) ) {
|
|
$current_page = (int) get_option( 'mainwp_manage_updates_limit_current_page', 0 );
|
|
$current_page = $current_page > 0 ? $current_page - 1 : 0;
|
|
$start = $current_page * $limit_sites;
|
|
$qry .= ' LIMIT ' . intval( $start ) . ', ' . intval( $limit_sites );
|
|
}
|
|
}
|
|
|
|
return $qry;
|
|
}
|
|
|
|
/**
|
|
* Get wp_options database table view.
|
|
*
|
|
* @param array $view Option view.
|
|
* @param array $other_fields Extra option fields.
|
|
*
|
|
* @return array wp_options view.
|
|
*/
|
|
public function get_option_view_by( $view = '', $other_fields = array() ) {
|
|
|
|
$default = array(
|
|
'recent_comments',
|
|
'recent_posts',
|
|
'recent_pages',
|
|
'phpversion',
|
|
'added_timestamp',
|
|
'wp_upgrades',
|
|
);
|
|
|
|
if ( 'updates_view' === $view ) {
|
|
$fields = array(
|
|
'wp_upgrades',
|
|
'ignored_wp_upgrades',
|
|
);
|
|
} elseif ( in_array( $view, array( 'simple_view', 'base_view', 'monitor_view', 'ping_view', 'uptime_notification' ) ) ) {
|
|
$fields = array();
|
|
if ( 'monitor_view' === $view ) {
|
|
$fields[] = 'health_site_status';
|
|
}
|
|
} else {
|
|
$fields = $default;
|
|
}
|
|
|
|
if ( is_array( $other_fields ) && ! empty( $other_fields ) ) {
|
|
$fields = array_unique( array_merge( $fields, $other_fields ) );
|
|
}
|
|
|
|
$view_query = '(SELECT intwp.id AS wpid ';
|
|
|
|
if ( ! in_array( 'signature_algo', $fields ) ) {
|
|
$fields[] = 'signature_algo';
|
|
}
|
|
|
|
if ( ! in_array( 'verify_method', $fields ) ) {
|
|
$fields[] = 'verify_method';
|
|
}
|
|
|
|
foreach ( $fields as $field ) {
|
|
|
|
if ( empty( $field ) ) {
|
|
continue;
|
|
}
|
|
|
|
$view_query .= ', ';
|
|
$view_query .= '(SELECT ' . $this->escape( $field ) . '.value FROM ' . $this->table_name( 'wp_options' ) . ' ' . $this->escape( $field ) . ' WHERE ' . $this->escape( $field ) . '.wpid = intwp.id AND ' . $this->escape( $field ) . '.name = "' . $this->escape( $field ) . '" LIMIT 1) AS ' . $this->escape( $field );
|
|
}
|
|
|
|
$view_query .= ' FROM ' . $this->table_name( 'wp' ) . ' intwp)';
|
|
|
|
return $view_query;
|
|
}
|
|
|
|
/**
|
|
* Method get_select_groups_belong().
|
|
*
|
|
* @return string sql.
|
|
*/
|
|
public function get_select_groups_belong() {
|
|
return ', ( SELECT GROUP_CONCAT(grbl.name ORDER BY grbl.name SEPARATOR ",")
|
|
FROM ' . $this->table_name( 'wp_group' ) . ' wpgrbl
|
|
JOIN ' . $this->table_name( 'group' ) . ' grbl ON grbl.id = wpgrbl.groupid WHERE wpgrbl.wpid = wp.id ) as wpgroups_belong,
|
|
( SELECT GROUP_CONCAT(grbl.id ORDER BY grbl.name SEPARATOR ",") FROM ' . $this->table_name( 'wp_group' ) . ' wpgrbl
|
|
JOIN ' . $this->table_name( 'group' ) . ' grbl ON grbl.id = wpgrbl.groupid WHERE wpgrbl.wpid = wp.id ) as wpgroupids_belong,
|
|
( SELECT GROUP_CONCAT(grbl.color ORDER BY grbl.name SEPARATOR ",") FROM ' . $this->table_name( 'wp_group' ) . ' wpgrbl
|
|
JOIN ' . $this->table_name( 'group' ) . ' grbl ON grbl.id = wpgrbl.groupid WHERE wpgrbl.wpid = wp.id ) as wpgroupcolors_belong ';
|
|
}
|
|
|
|
/**
|
|
* Get connected child sites.
|
|
*
|
|
* @param array $sites_ids Websites ids - option field.
|
|
*
|
|
* @return array $connected_sites Array of connected sites.
|
|
*/
|
|
public function get_connected_websites( $sites_ids = false ) {
|
|
$where = $this->get_sql_where_allow_access_sites( 'wp' );
|
|
$wp_table = esc_sql( $this->table_name( 'wp' ) );
|
|
$wp_sync_table = esc_sql( $this->table_name( 'wp_sync' ) );
|
|
|
|
$sql = "SELECT wp.*,wp_sync.*
|
|
FROM {$wp_table} wp
|
|
JOIN {$wp_sync_table} wp_sync
|
|
ON wp.id = wp_sync.wpid
|
|
WHERE (wp_sync.sync_errors IS NOT NULL) AND (wp_sync.sync_errors = \"\") " .
|
|
$where;
|
|
|
|
$websites = $this->wpdb->get_results( $sql ); // phpcs:ignore PluginCheck.Security.DirectDB.UnescapedDBParameter -- Query is fully escaped: table names via esc_sql(), WHERE fragment from validated get_sql_where_allow_access_sites()
|
|
$connected_sites = array();
|
|
if ( $websites ) {
|
|
foreach ( $websites as $website ) {
|
|
|
|
if ( ! empty( $sites_ids ) && ! in_array( $website->id, $sites_ids ) ) {
|
|
continue;
|
|
}
|
|
|
|
$connected_sites[] = array(
|
|
'id' => $website->id,
|
|
'name' => $website->name,
|
|
'url' => $website->url,
|
|
);
|
|
}
|
|
}
|
|
return $connected_sites;
|
|
}
|
|
|
|
/**
|
|
* Get disconnected child sites.
|
|
*
|
|
* @param array $sites_ids Websites ids - option field.
|
|
*
|
|
* @return array $disc_sites Array of disonnected sites.
|
|
*/
|
|
public function get_disconnected_websites( $sites_ids = false ) {
|
|
$where = $this->get_sql_where_allow_access_sites( 'wp' );
|
|
$wp_table = esc_sql( $this->table_name( 'wp' ) );
|
|
$wp_sync_table = esc_sql( $this->table_name( 'wp_sync' ) );
|
|
|
|
$sql = "SELECT wp.*,wp_sync.*
|
|
FROM {$wp_table} wp
|
|
JOIN {$wp_sync_table} wp_sync
|
|
ON wp.id = wp_sync.wpid
|
|
WHERE (wp_sync.sync_errors IS NOT NULL) AND (wp_sync.sync_errors <> \"\") " .
|
|
$where;
|
|
|
|
$websites = $this->wpdb->get_results( $sql ); // phpcs:ignore PluginCheck.Security.DirectDB.UnescapedDBParameter -- Query is fully escaped: table names via esc_sql(), WHERE fragment from validated get_sql_where_allow_access_sites()
|
|
$disc_sites = array();
|
|
if ( $websites ) {
|
|
foreach ( $websites as $website ) {
|
|
|
|
if ( ! empty( $sites_ids ) && ! in_array( $website->id, $sites_ids ) ) {
|
|
continue;
|
|
}
|
|
|
|
$disc_sites[] = array(
|
|
'id' => $website->id,
|
|
'name' => $website->name,
|
|
'url' => $website->url,
|
|
);
|
|
}
|
|
}
|
|
return $disc_sites;
|
|
}
|
|
|
|
/**
|
|
* Get child site count.
|
|
*
|
|
* @param null $userId Current user ID.
|
|
* @param bool $all_access Check if user has access to all sites.
|
|
*
|
|
* @return int Child site count.
|
|
*
|
|
* @uses \MainWP\Dashboard\MainWP_System::is_multi_user()
|
|
*/
|
|
public function get_websites_count( $userId = null, $all_access = false ) {
|
|
static $total_sites;
|
|
if ( null !== $total_sites ) { // NOSONAR -- static value.
|
|
return $total_sites;
|
|
}
|
|
if ( ( null === $userId ) && MainWP_System::instance()->is_multi_user() ) {
|
|
|
|
/**
|
|
* Current user global.
|
|
*
|
|
* @global string
|
|
*/
|
|
global $current_user;
|
|
|
|
$userId = $current_user->ID;
|
|
}
|
|
$where = ( null === $userId ? '' : ' wp.userid = ' . intval( $userId ) );
|
|
if ( ! $all_access ) {
|
|
$where .= $this->get_sql_where_allow_access_sites( 'wp' );
|
|
}
|
|
$table_name = esc_sql( $this->table_name( 'wp' ) );
|
|
$qry = "SELECT COUNT(wp.id) FROM {$table_name} wp WHERE 1 {$where}";
|
|
|
|
$total = $this->wpdb->get_var( $qry ); // phpcs:ignore PluginCheck.Security.DirectDB.UnescapedDBParameter -- Query is fully escaped: table names via esc_sql(), WHERE fragment from validated get_sql_where_allow_access_sites()
|
|
$total_sites = $total;// NOSONAR -- static value.
|
|
return $total;
|
|
}
|
|
|
|
|
|
/**
|
|
* Get child sites stats count.
|
|
*
|
|
* @param array $params Params.
|
|
*/
|
|
public function get_websites_stats_count( $params = array() ) {
|
|
if ( ! is_array( $params ) ) {
|
|
$params = array();
|
|
}
|
|
|
|
if ( isset( $params['all_access'] ) ) {
|
|
$all_access = ! empty( $params['all_access'] ) ? true : false;
|
|
} else {
|
|
$all_access = true;
|
|
}
|
|
|
|
$where = '';
|
|
if ( ! $all_access ) {
|
|
$where .= $this->get_sql_where_allow_access_sites( 'wp' );
|
|
}
|
|
|
|
$select_stats = ' ( SELECT COUNT(wp.id) as count_all ';
|
|
if ( ! empty( $params['count_disconnected'] ) ) {
|
|
$select_stats .= ',( SELECT COUNT(wp_disconnected.id) FROM ' . $this->table_name( 'wp' ) . ' wp_disconnected LEFT JOIN ' . $this->table_name( 'wp_sync' ) . ' as wp_sync ';
|
|
$select_stats .= ' ON wp_disconnected.id = wp_sync.wpid WHERE wp_sync.sync_errors != "" ) as count_disconnected ';
|
|
}
|
|
if ( ! empty( $params['count_suspended'] ) ) {
|
|
$select_stats .= ',( SELECT COUNT(wp_suspended.id) FROM ' . $this->table_name( 'wp' ) . ' wp_suspended WHERE wp_suspended.suspended = 1 ) as count_suspended ';
|
|
}
|
|
$qry = 'SELECT * FROM ' . $select_stats;
|
|
$qry .= ' FROM ' . $this->table_name( 'wp' ) . ' wp ' . $where . ' ) as wp_stats ';
|
|
|
|
return $this->wpdb->get_row( $qry, ARRAY_A ); //phpcs:ignore -- ok.
|
|
}
|
|
|
|
/**
|
|
* Get Child site wp_options database table.
|
|
*
|
|
* @param array $website Child Site array.
|
|
* @param mixed $option Child Site wp_options table name.
|
|
* @param mixed $default_value default value.
|
|
* @param mixed $json_format Is json format value.
|
|
*
|
|
* @return string|null Database query result (as string), or null on failure.
|
|
*/
|
|
public function get_website_option( $website, $option, $default_value = null, $json_format = false ) { //phpcs:ignore -- NOSONAR - complex.
|
|
|
|
if ( is_array( $website ) ) {
|
|
if ( isset( $website[ $option ] ) ) {
|
|
$value = $website[ $option ];
|
|
if ( true === $json_format ) {
|
|
$value = ! empty( $value ) ? json_decode( $value, true ) : array();
|
|
return is_array( $value ) ? $value : array();
|
|
} else {
|
|
return $value;
|
|
}
|
|
}
|
|
$site_id = $website['id'];
|
|
} elseif ( is_object( $website ) ) {
|
|
if ( property_exists( $website, $option ) ) {
|
|
$value = $website->{$option};
|
|
if ( true === $json_format ) {
|
|
$value = ! empty( $value ) ? json_decode( $value, true ) : array();
|
|
return is_array( $value ) ? $value : array();
|
|
} else {
|
|
return $value;
|
|
}
|
|
}
|
|
$site_id = $website->id;
|
|
} elseif ( is_numeric( $website ) ) { // to support $site_id = 0, for global options.
|
|
$site_id = $website;
|
|
} else {
|
|
return false;
|
|
}
|
|
|
|
$table_name = esc_sql( $this->table_name( 'wp_options' ) );
|
|
$value = $this->wpdb->get_var( $this->wpdb->prepare( "SELECT value FROM {$table_name} WHERE wpid = %d AND name = %s", $site_id, $option ) );
|
|
|
|
if ( null === $value && null !== $default_value ) {
|
|
return $default_value;
|
|
}
|
|
|
|
if ( true === $json_format ) {
|
|
$value = ! empty( $value ) ? json_decode( $value, true ) : array();
|
|
return is_array( $value ) ? $value : array();
|
|
} else {
|
|
return $value;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Get Child site wp_options json value.
|
|
*
|
|
* @since 5.1.1
|
|
*
|
|
* @param array $website Child Site array.
|
|
* @param mixed $option Child Site wp_options table name.
|
|
* @param mixed $default_value default value.
|
|
*
|
|
* @return string|null Database query result (as string), or null on failure.
|
|
*/
|
|
public function get_json_website_option( $website, $option, $default_value = null ) {
|
|
return $this->get_website_option( $website, $option, $default_value, true );
|
|
}
|
|
|
|
/**
|
|
* Get child site options.
|
|
*
|
|
* @param array $website Child site.
|
|
* @param mixed $options Child site options name.
|
|
*
|
|
* @return string|null Database query result (as string), or null on failure.
|
|
*/
|
|
public function get_website_options_array( &$website, $options ) { // phpcs:ignore -- NOSONAR - complex.
|
|
|
|
if ( ! is_array( $options ) || empty( $options ) ) {
|
|
return array();
|
|
}
|
|
|
|
if ( is_array( $website ) ) {
|
|
$site_id = $website['id'];
|
|
} elseif ( is_object( $website ) ) {
|
|
$site_id = $website->id;
|
|
} elseif ( is_numeric( $website ) ) { // to support $site_id = 0 for global options.
|
|
$site_id = $website;
|
|
} else {
|
|
return array();
|
|
}
|
|
|
|
$arr_options = array();
|
|
$get_options = array();
|
|
|
|
foreach ( $options as $option ) {
|
|
if ( is_array( $website ) ) {
|
|
if ( isset( $website[ $option ] ) ) {
|
|
$arr_options[ $option ] = $website[ $option ];
|
|
} else {
|
|
$get_options[] = $option;
|
|
}
|
|
} elseif ( is_object( $website ) ) {
|
|
if ( property_exists( $website, $option ) ) {
|
|
$arr_options[ $option ] = $website->{$option};
|
|
} else {
|
|
$get_options[] = $option;
|
|
}
|
|
} else {
|
|
$get_options[] = $option;
|
|
}
|
|
}
|
|
|
|
if ( empty( $get_options ) ) {
|
|
return $arr_options; // all options.
|
|
}
|
|
|
|
$table_name = esc_sql( $this->table_name( 'wp_options' ) );
|
|
$placeholders = implode( ',', array_fill( 0, count( $get_options ), '%s' ) );
|
|
$options_db = $this->wpdb->get_results( $this->wpdb->prepare( "SELECT name, value FROM {$table_name} WHERE wpid = %d AND name IN ({$placeholders})", array_merge( array( $site_id ), $get_options ) ) );
|
|
|
|
$fill_options = array(
|
|
'primary_lasttime_backup',
|
|
);
|
|
|
|
foreach ( (array) $options_db as $o ) {
|
|
$arr_options[ $o->name ] = $o->value;
|
|
if ( in_array( $o->name, $fill_options ) ) {
|
|
if ( is_array( $website ) ) {
|
|
if ( ! isset( $website[ $o->name ] ) ) {
|
|
$website[ $o->name ] = $o->value;
|
|
}
|
|
} elseif ( is_object( $website ) ) {
|
|
if ( ! property_exists( $website, $o->name ) ) {
|
|
$website->{$o->name} = $o->value;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
return $arr_options;
|
|
}
|
|
|
|
/**
|
|
* Update child site options.
|
|
*
|
|
* @param object $website Child site object.
|
|
* @param mixed $option Option to update.
|
|
* @param mixed $value Value to update with.
|
|
*/
|
|
public function update_website_option( $website, $option, $value ) {
|
|
|
|
if ( is_numeric( $website ) ) {
|
|
$site_id = intval( $website );
|
|
} else {
|
|
$site_id = $website->id;
|
|
}
|
|
|
|
$table_name = esc_sql( $this->table_name( 'wp_options' ) );
|
|
$rslt = $this->wpdb->get_results( $this->wpdb->prepare( "SELECT name FROM {$table_name} WHERE wpid = %d AND name = %s", $site_id, $option ) );
|
|
if ( empty( $rslt ) ) {
|
|
$this->wpdb->insert(
|
|
$this->table_name( 'wp_options' ),
|
|
array(
|
|
'wpid' => $site_id,
|
|
'name' => $option,
|
|
'value' => $value,
|
|
)
|
|
);
|
|
} else {
|
|
$this->wpdb->update(
|
|
$this->table_name( 'wp_options' ),
|
|
array( 'value' => $value ),
|
|
array(
|
|
'wpid' => $site_id,
|
|
'name' => $option,
|
|
)
|
|
);
|
|
}
|
|
}
|
|
|
|
|
|
/**
|
|
* Remove child site options.
|
|
*
|
|
* @param object $website Child site object.
|
|
* @param mixed $options Option to update.
|
|
*/
|
|
public function remove_website_option( $website, $options ) {
|
|
|
|
if ( empty( $options ) ) {
|
|
return;
|
|
}
|
|
|
|
if ( is_numeric( $website ) ) {
|
|
$site_id = intval( $website );
|
|
} else {
|
|
$site_id = $website->id;
|
|
}
|
|
|
|
if ( ! is_array( $options ) ) {
|
|
$options = (array) $options;
|
|
}
|
|
|
|
$table_name = esc_sql( $this->table_name( 'wp_options' ) );
|
|
foreach ( $options as $opt ) {
|
|
$this->wpdb->query( $this->wpdb->prepare( "DELETE FROM {$table_name} WHERE wpid=%d AND name=%s", $site_id, $opt ) );
|
|
}
|
|
}
|
|
|
|
|
|
/**
|
|
* Get general Child site option.
|
|
*
|
|
* @param mixed $option Child Site option name.
|
|
*
|
|
* @return string|null Database query result (as string), or null on failure.
|
|
*/
|
|
private function get_general_website_option( $option ) {
|
|
|
|
if ( null !== static::$general_options ) {
|
|
if ( isset( static::$general_options[ $option ] ) ) {
|
|
return static::$general_options[ $option ];
|
|
}
|
|
} else {
|
|
static::$general_options[] = array();
|
|
}
|
|
|
|
$table_name = esc_sql( $this->table_name( 'wp_options' ) );
|
|
$val = $this->wpdb->get_var( $this->wpdb->prepare( "SELECT value FROM {$table_name} WHERE wpid = %d AND name = %s", 0, $option ) );
|
|
|
|
static::$general_options[ $option ] = $val;
|
|
return $val;
|
|
}
|
|
|
|
/**
|
|
* Get child site options.
|
|
*
|
|
* @param mixed $options Child site options name.
|
|
*
|
|
* @return string|null Database query result (as string), or null on failure.
|
|
*/
|
|
public function get_general_options_array( $options ) {
|
|
|
|
if ( ! is_array( $options ) || empty( $options ) ) {
|
|
return array();
|
|
}
|
|
|
|
$return_options = array();
|
|
if ( null !== static::$general_options ) {
|
|
foreach ( static::$general_options as $opt => $val ) {
|
|
if ( in_array( $opt, $options ) ) {
|
|
$return_options[ $opt ] = $val;
|
|
}
|
|
}
|
|
} else {
|
|
static::$general_options[] = array();
|
|
}
|
|
|
|
$diff_options = array();
|
|
foreach ( $options as $opt ) {
|
|
if ( ! isset( $return_options[ $opt ] ) ) {
|
|
$diff_options[] = $opt;
|
|
}
|
|
}
|
|
|
|
if ( empty( $diff_options ) ) {
|
|
return $return_options;
|
|
}
|
|
|
|
$table_name = esc_sql( $this->table_name( 'wp_options' ) );
|
|
$placeholders = implode( ',', array_fill( 0, count( $diff_options ), '%s' ) );
|
|
$options_db = $this->wpdb->get_results( $this->wpdb->prepare( "SELECT name, value FROM {$table_name} WHERE wpid = %d AND name IN ({$placeholders})", array_merge( array( 0 ), $diff_options ) ) );
|
|
|
|
foreach ( (array) $options_db as $o ) {
|
|
$return_options[ $o->name ] = $o->value;
|
|
static::$general_options[ $o->name ] = $o->value;
|
|
}
|
|
return $return_options;
|
|
}
|
|
|
|
/**
|
|
* Update general site options.
|
|
*
|
|
* @param mixed $option Option to update.
|
|
* @param mixed $value Value to update with.
|
|
* @param string $type_value Type values: single|array.
|
|
*/
|
|
public function update_general_option( $option, $value, $type_value = 'single' ) {
|
|
|
|
if ( 'array' === $type_value ) {
|
|
if ( empty( $value ) ) {
|
|
$value = array();
|
|
} elseif ( ! is_array( $value ) ) {
|
|
return false;
|
|
}
|
|
$value = wp_json_encode( $value );
|
|
}
|
|
|
|
if ( null === static::$general_options ) {
|
|
static::$general_options[] = array();
|
|
}
|
|
static::$general_options[ $option ] = $value;
|
|
|
|
$table_name = esc_sql( $this->table_name( 'wp_options' ) );
|
|
$rslt = $this->wpdb->get_results( $this->wpdb->prepare( "SELECT name FROM {$table_name} WHERE wpid = %d AND name = %s", 0, $option ) );
|
|
|
|
if ( empty( $rslt ) ) {
|
|
$this->wpdb->insert(
|
|
$this->table_name( 'wp_options' ),
|
|
array(
|
|
'wpid' => 0,
|
|
'name' => $option,
|
|
'value' => $value,
|
|
)
|
|
);
|
|
} else {
|
|
$this->wpdb->update(
|
|
$this->table_name( 'wp_options' ),
|
|
array( 'value' => $value ),
|
|
array(
|
|
'wpid' => 0,
|
|
'name' => $option,
|
|
)
|
|
);
|
|
}
|
|
return true;
|
|
}
|
|
|
|
/**
|
|
* Get general Child site option.
|
|
*
|
|
* @param mixed $opt Child Site option name.
|
|
* @param string $type_value Type values: single|array.
|
|
*
|
|
* @return string|null Database query result (as string), or null on failure.
|
|
*/
|
|
public function get_general_option( $opt, $type_value = 'single' ) {
|
|
if ( 'single' === $type_value ) {
|
|
return $this->get_general_website_option( $opt );
|
|
} elseif ( 'array' === $type_value ) {
|
|
$json_value = $this->get_general_website_option( $opt );
|
|
if ( empty( $json_value ) ) {
|
|
return array();
|
|
}
|
|
return json_decode( $json_value, true );
|
|
}
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* Get child sites by user ID.
|
|
*
|
|
* @param int $userid User ID.
|
|
* @param bool $selectgroups Selected groups.
|
|
* @param null $search_site Site search field value.
|
|
* @param string $orderBy Order list by. Default: URL.
|
|
*
|
|
* @return array|object|null Database query results or null on failer.
|
|
*/
|
|
public function get_websites_by_user_id( $userid, $selectgroups = false, $search_site = null, $orderBy = 'wp.url' ) {
|
|
return $this->get_results_result( $this->get_sql_websites_by_user_id( $userid, $selectgroups, $search_site, $orderBy ) );
|
|
}
|
|
|
|
/**
|
|
* Get child sites.
|
|
*
|
|
* @return string SQL string.
|
|
*/
|
|
public function get_sql_websites() {
|
|
$where = $this->get_sql_where_allow_access_sites( 'wp' );
|
|
|
|
return 'SELECT wp.*,wp_sync.*,wp_optionview.*
|
|
FROM ' . $this->table_name( 'wp' ) . ' wp
|
|
JOIN ' . $this->table_name( 'wp_sync' ) . ' wp_sync ON wp.id = wp_sync.wpid
|
|
JOIN ' . $this->get_option_view() . ' wp_optionview ON wp.id = wp_optionview.wpid
|
|
WHERE 1 ' . $where;
|
|
}
|
|
|
|
/**
|
|
* Get child sites by user id via SQL.
|
|
*
|
|
* @param int $userid Given user ID.
|
|
* @param bool $selectgroups Selected groups. Default: false.
|
|
* @param null $search_site Site search field value. Default: null.
|
|
* @param string $orderBy Order list by. Default: URL.
|
|
* @param bool $offset Query offset. Default: false.
|
|
* @param bool $rowcount Row count. Default: falese.
|
|
*
|
|
* @return object|null Return database query or null on failure.
|
|
*
|
|
* @uses \MainWP\Dashboard\MainWP_Utility::ctype_digit()
|
|
*/
|
|
public function get_sql_websites_by_user_id( $userid, $selectgroups = false, $search_site = null, $orderBy = 'wp.url', $offset = false, $rowcount = false ) {
|
|
if ( MainWP_Utility::ctype_digit( $userid ) ) {
|
|
$where = '';
|
|
if ( null !== $search_site ) {
|
|
$search_site = trim( $search_site );
|
|
$where = ' AND (wp.name LIKE "%' . $search_site . '%" OR wp.url LIKE "%' . $search_site . '%") ';
|
|
}
|
|
|
|
$where .= $this->get_sql_where_allow_access_sites( 'wp' );
|
|
|
|
if ( $selectgroups ) {
|
|
$qry = 'SELECT wp.*,wp_sync.*,wp_optionview.*, GROUP_CONCAT(gr.name ORDER BY gr.name SEPARATOR ",") as wpgroups, GROUP_CONCAT(gr.id ORDER BY gr.name SEPARATOR ",") as wpgroupids, GROUP_CONCAT(gr.color ORDER BY gr.name SEPARATOR ",") as wpgroups_colors
|
|
FROM ' . $this->table_name( 'wp' ) . ' wp
|
|
LEFT JOIN ' . $this->table_name( 'wp_group' ) . ' wpgr ON wp.id = wpgr.wpid
|
|
LEFT JOIN ' . $this->table_name( 'group' ) . ' gr ON wpgr.groupid = gr.id
|
|
JOIN ' . $this->table_name( 'wp_sync' ) . ' wp_sync ON wp.id = wp_sync.wpid
|
|
JOIN ' . $this->get_option_view() . ' wp_optionview ON wp.id = wp_optionview.wpid
|
|
WHERE wp.userid = ' . $userid . "
|
|
$where
|
|
GROUP BY wp.id, wp_sync.sync_id
|
|
ORDER BY " . $orderBy;
|
|
} else {
|
|
$qry = 'SELECT wp.*,wp_sync.*,wp_optionview.*
|
|
FROM ' . $this->table_name( 'wp' ) . ' wp
|
|
JOIN ' . $this->table_name( 'wp_sync' ) . ' wp_sync ON wp.id = wp_sync.wpid
|
|
JOIN ' . $this->get_option_view() . ' wp_optionview ON wp.id = wp_optionview.wpid
|
|
WHERE wp.userid = ' . $userid . "
|
|
$where
|
|
ORDER BY " . $orderBy;
|
|
}
|
|
|
|
if ( ( false !== $offset ) && ( false !== $rowcount ) ) {
|
|
$qry .= ' LIMIT ' . $offset . ', ' . $rowcount;
|
|
} elseif ( false !== $rowcount ) {
|
|
$qry .= ' LIMIT ' . $rowcount;
|
|
}
|
|
|
|
return $qry;
|
|
}
|
|
|
|
return null;
|
|
}
|
|
|
|
/**
|
|
* Get SQL to get child sites for current user.
|
|
*
|
|
* @param bool $selectgroups Selected groups. Default: false.
|
|
* @param null $search_site Site search field value. Default: null.
|
|
* @param string $orderBy Order list by. Default: URL.
|
|
* @param bool $offset Query offset. Default: false.
|
|
* @param bool $rowcount Row count. Default: false.
|
|
* @param null $extraWhere Extra WHERE. Default: null.
|
|
* @param bool $for_manager For role manager. Default: false.
|
|
* @param mixed $extra_view Extra view. Default favi_icon.
|
|
* @param string $is_staging yes|no Is child site a staging site.
|
|
* @param array $params other params.
|
|
*
|
|
* @return object|null Database query results or null on failure.
|
|
*
|
|
* @uses \MainWP\Dashboard\MainWP_System::is_multi_user()
|
|
*/
|
|
public function get_sql_websites_for_current_user( // phpcs:ignore -- NOSONAR - complex.
|
|
$selectgroups = false,
|
|
$search_site = null,
|
|
$orderBy = 'wp.url',
|
|
$offset = false,
|
|
$rowcount = false,
|
|
$extraWhere = null,
|
|
$for_manager = false,
|
|
$extra_view = array( 'favi_icon' ),
|
|
$is_staging = 'no',
|
|
$params = array()
|
|
) {
|
|
|
|
/**
|
|
* The hook mainwp_get_sql_websites
|
|
*
|
|
* @since 5.5
|
|
*/
|
|
$params = apply_filters( 'mainwp_get_sql_websites', $params, $selectgroups, $search_site, $orderBy, $offset, $rowcount, $extraWhere, $for_manager, $extra_view, $is_staging );
|
|
|
|
$where = '';
|
|
if ( MainWP_System::instance()->is_multi_user() ) {
|
|
|
|
/**
|
|
* Current user global.
|
|
*
|
|
* @global string
|
|
*/
|
|
global $current_user;
|
|
|
|
$where .= ' AND wp.userid = ' . $current_user->ID . ' ';
|
|
}
|
|
|
|
if ( null !== $search_site ) {
|
|
$search_site = trim( $search_site );
|
|
$where .= ' AND (wp.name LIKE "%' . $search_site . '%" OR wp.url LIKE "%' . $search_site . '%") ';
|
|
}
|
|
|
|
if ( ! empty( $extraWhere ) ) {
|
|
$where .= ' AND ' . $extraWhere . ' ';
|
|
}
|
|
|
|
if ( ! $for_manager ) {
|
|
$where .= $this->get_sql_where_allow_access_sites( 'wp', $is_staging );
|
|
}
|
|
|
|
$connected_sql = '';
|
|
|
|
if ( is_array( $params ) && isset( $params['connected'] ) && 'yes' === $params['connected'] ) {
|
|
$connected_sql = ' AND wp_sync.sync_errors = "" ';
|
|
} elseif ( is_array( $params ) && isset( $params['connected'] ) && 'no' === $params['connected'] ) {
|
|
$connected_sql = ' AND wp_sync.sync_errors <> "" ';
|
|
}
|
|
|
|
$limit = '';
|
|
if ( $params && is_array( $params ) ) {
|
|
$s = isset( $params['s'] ) ? $params['s'] : '';
|
|
$exclude = isset( $params['exclude'] ) ? wp_parse_id_list( $params['exclude'] ) : array();
|
|
$include = isset( $params['include'] ) ? wp_parse_id_list( $params['include'] ) : array();
|
|
$status = isset( $params['status'] ) ? wp_parse_list( $params['status'] ) : array();
|
|
$page = isset( $params['page'] ) ? intval( $params['page'] ) : false;
|
|
$per_page = isset( $params['per_page'] ) ? intval( $params['per_page'] ) : false;
|
|
|
|
if ( ! empty( $s ) ) {
|
|
$where .= ' AND ( wp.id LIKE "%' . $this->escape( $s ) . '%" OR wp.name LIKE "%' . $this->escape( $s ) . '%" OR wp.url LIKE "%' . $this->escape( $s ) . '%" ) ';
|
|
}
|
|
|
|
if ( ! empty( $exclude ) ) {
|
|
$where .= ' AND wp.id NOT IN (' . implode( ',', $exclude ) . ') ';
|
|
}
|
|
|
|
if ( ! empty( $include ) ) {
|
|
$where .= ' AND wp.id IN (' . implode( ',', $include ) . ') ';
|
|
}
|
|
|
|
// any, connected, disconnected, suspended, available_update.
|
|
if ( ! empty( $status ) && is_array( $status ) && ! in_array( 'any', $status ) ) {
|
|
$status_conds = array();
|
|
if ( in_array( 'available_update', $status ) ) {
|
|
$available_sql = " ( wp.plugin_upgrades <> '' && wp.plugin_upgrades <> '[]' ) OR ( wp.theme_upgrades <> '' && wp.theme_upgrades <> '[]' ) OR ( wp.translation_upgrades <> '' && wp.translation_upgrades <> '[]' ) OR ( wp.premium_upgrades <> '' && wp.premium_upgrades <> '[]' ) ";
|
|
$options_table = esc_sql( $this->table_name( 'wp_options' ) );
|
|
$results = $this->wpdb->get_results( "SELECT wpid FROM {$options_table} WHERE name = 'wp_upgrades' AND value <> '' AND value <> '[]'" );
|
|
if ( $results ) {
|
|
$wp_ids = array();
|
|
foreach ( $results as $item ) {
|
|
if ( ! empty( $item->wpid ) ) {
|
|
$wp_ids[] = $item->wpid;
|
|
}
|
|
}
|
|
$wp_ids = ! empty( $wp_ids ) ? array_unique( $wp_ids ) : array();
|
|
if ( ! empty( $wp_ids ) ) {
|
|
$available_sql .= ' OR wp.id IN ( ' . implode( ',', $wp_ids ) . ' )';
|
|
}
|
|
}
|
|
$status_conds[] = ' ( ' . $available_sql . ') ';
|
|
}
|
|
|
|
if ( in_array( 'connected', $status ) ) {
|
|
$status_conds[] = ' ( wp_sync.sync_errors == "" ) ';
|
|
}
|
|
if ( in_array( 'disconnected', $status ) ) {
|
|
$status_conds[] = " wp_sync.sync_errors <> '' ";
|
|
}
|
|
|
|
if ( in_array( 'suspended', $status ) ) {
|
|
$status_conds[] = ' wp.suspended = 1 ';
|
|
}
|
|
|
|
if ( ! empty( $status_conds ) ) {
|
|
$where .= ' AND ( ' . implode( ' OR ', $status_conds ) . ' ) ';
|
|
}
|
|
|
|
if ( in_array( 'unsuspended', $status ) && ! in_array( 'suspended', $status ) ) { // to sure not conflict the suspended status.
|
|
$where .= ' AND wp.suspended = 0 ';
|
|
}
|
|
}
|
|
|
|
if ( ! empty( $page ) && ! empty( $per_page ) ) {
|
|
$limit = ( $page - 1 ) * $per_page . ',' . $per_page;
|
|
}
|
|
}
|
|
|
|
if ( 'wp.url' === $orderBy ) {
|
|
$orderBy = "replace(replace(replace(replace(replace(wp.url, 'https://www.',''), 'http://www.',''), 'https://', ''), 'http://', ''), 'www.', '')";
|
|
}
|
|
|
|
// wpgroups to fix issue for mysql 8.0, as groups will generate error syntax.
|
|
if ( $selectgroups ) {
|
|
$qry = 'SELECT wp.*,wp_sync.*,wp_optionview.*, GROUP_CONCAT(gr.name ORDER BY gr.name SEPARATOR ",") as wpgroups, GROUP_CONCAT(gr.id ORDER BY gr.name SEPARATOR ",") as wpgroupids, GROUP_CONCAT(gr.color ORDER BY gr.name SEPARATOR ",") as wpgroups_colors,
|
|
wpclient.name as client_name
|
|
FROM ' . $this->table_name( 'wp' ) . ' wp
|
|
LEFT JOIN ' . $this->table_name( 'wp_group' ) . ' wpgr ON wp.id = wpgr.wpid
|
|
LEFT JOIN ' . $this->table_name( 'group' ) . ' gr ON wpgr.groupid = gr.id
|
|
LEFT JOIN ' . $this->table_name( 'wp_clients' ) . ' wpclient ON wp.client_id = wpclient.client_id
|
|
JOIN ' . $this->table_name( 'wp_sync' ) . ' wp_sync ON wp.id = wp_sync.wpid
|
|
JOIN ' . $this->get_option_view( $extra_view ) . ' wp_optionview ON wp.id = wp_optionview.wpid
|
|
WHERE 1 ' . $where . $connected_sql . '
|
|
GROUP BY wp.id, wp_sync.sync_id
|
|
ORDER BY ' . $orderBy;
|
|
} else {
|
|
$qry = 'SELECT wp.*,wp_sync.*,wp_optionview.*, wpclient.name as client_name
|
|
FROM ' . $this->table_name( 'wp' ) . ' wp
|
|
LEFT JOIN ' . $this->table_name( 'wp_clients' ) . ' wpclient ON wp.client_id = wpclient.client_id
|
|
JOIN ' . $this->table_name( 'wp_sync' ) . ' wp_sync ON wp.id = wp_sync.wpid
|
|
JOIN ' . $this->get_option_view( $extra_view ) . ' wp_optionview ON wp.id = wp_optionview.wpid
|
|
WHERE 1 ' . $where . $connected_sql . '
|
|
GROUP BY wp.id, wp_sync.sync_id
|
|
ORDER BY ' . $orderBy;
|
|
}
|
|
|
|
if ( ( false !== $offset ) && ( false !== $rowcount ) ) {
|
|
$qry .= ' LIMIT ' . $offset . ', ' . $rowcount;
|
|
} elseif ( false !== $rowcount ) {
|
|
$qry .= ' LIMIT ' . $rowcount;
|
|
} elseif ( ! empty( $limit ) ) {
|
|
$qry .= ' LIMIT ' . $limit;
|
|
} else {
|
|
// load all sites so check to support limit sites loading.
|
|
$limit_sites = ! empty( $params['limit_sites'] ) ? intval( $params['limit_sites'] ) : 0;
|
|
if ( ! empty( $limit_sites ) ) {
|
|
$current_page = (int) get_option( 'mainwp_manage_updates_limit_current_page', 0 );
|
|
$current_page = $current_page > 0 ? $current_page - 1 : 0;
|
|
$start = $current_page * $limit_sites;
|
|
$qry .= ' LIMIT ' . intval( $start ) . ', ' . intval( $limit_sites );
|
|
}
|
|
}
|
|
|
|
return $qry;
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
* Get SQL to get wp child sites for current user.
|
|
*
|
|
* @since 4.3
|
|
*
|
|
* @param array $params params .
|
|
*
|
|
* @return object|null Database query results or null on failure.
|
|
*/
|
|
public function get_sql_wp_for_current_user( $params = array() ) { // phpcs:ignore -- NOSONAR - complex.
|
|
if ( ! is_array( $params ) ) {
|
|
$params = array();
|
|
}
|
|
|
|
$selectgroups = ! empty( $params['select_groups'] ) ? true : false;
|
|
$search_site = isset( $params['search_site'] ) && ! empty( $params['search_site'] ) ? $params['search_site'] : null;
|
|
$orderBy = isset( $params['order_by'] ) && ! empty( $params['order_by'] ) ? $params['order_by'] : 'wp.url';
|
|
$offset = isset( $params['offset'] ) ? $params['offset'] : false;
|
|
$rowcount = isset( $params['row_count'] ) ? $params['row_count'] : false;
|
|
$for_manager = isset( $params['for_manager'] ) ? $params['for_manager'] : false;
|
|
$extraWhere = isset( $params['extra_where'] ) && ! empty( $params['extra_where'] ) ? $params['extra_where'] : null;
|
|
$extra_view = isset( $params['extra_view'] ) && is_array( $params['extra_view'] ) && ! empty( $params['extra_view'] ) ? $params['extra_view'] : array( 'favi_icon' );
|
|
$extra_join = isset( $params['extra_join'] ) ? $params['extra_join'] : '';
|
|
|
|
$extra_select_wp_fields = isset( $params['extra_select_wp_fields'] ) && is_array( $params['extra_select_wp_fields'] ) && ! empty( $params['extra_select_wp_fields'] ) ? $params['extra_select_wp_fields'] : array();
|
|
$extra_select_sql_fields = isset( $params['extra_select_sql_fields'] ) && ! empty( $params['extra_select_sql_fields'] ) ? $params['extra_select_sql_fields'] : '';
|
|
|
|
$is_staging = isset( $params['is_staging'] ) && 'yes' === $params['is_staging'] ? 'yes' : 'no';
|
|
$count_only = isset( $params['count_only'] ) && $params['count_only'] ? true : false;
|
|
|
|
$where = '';
|
|
|
|
if ( null !== $search_site ) {
|
|
$search_site = trim( $search_site );
|
|
$where .= ' AND (wp.name LIKE "%' . $this->escape( $search_site ) . '%" OR wp.url LIKE "%' . $this->escape( $search_site ) . '%") ';
|
|
}
|
|
|
|
if ( null !== $extraWhere ) {
|
|
$where .= ' AND ' . $extraWhere;
|
|
}
|
|
|
|
if ( ! $for_manager ) {
|
|
$where .= $this->get_sql_where_allow_access_sites( 'wp', $is_staging );
|
|
}
|
|
|
|
if ( 'wp.url' === $orderBy ) {
|
|
$orderBy = "replace(replace(replace(replace(replace(wp.url, 'https://www.',''), 'http://www.',''), 'https://', ''), 'http://', ''), 'www.', '')";
|
|
}
|
|
|
|
$select_wp_fields = $this->get_sql_select_wp_valid_fields( $extra_select_wp_fields );
|
|
|
|
if ( ! empty( $extra_select_sql_fields ) ) {
|
|
$extra_select_sql_fields = ',' . $extra_select_sql_fields;
|
|
}
|
|
|
|
// wpgroups to fix issue for mysql 8.0, as groups will generate error syntax.
|
|
if ( $selectgroups ) {
|
|
if ( $count_only ) {
|
|
$select = ' COUNT(DISTINCT(wp.id)) ';
|
|
} else {
|
|
$select = $select_wp_fields . '
|
|
' . $extra_select_sql_fields . '
|
|
,wp_sync.sync_errors,wp_optionview.*, GROUP_CONCAT(gr.name ORDER BY gr.name SEPARATOR ",") as wpgroups, GROUP_CONCAT(gr.id ORDER BY gr.name SEPARATOR ",") as wpgroupids, GROUP_CONCAT(gr.color ORDER BY gr.name SEPARATOR ",") as wpgroups_colors, wpclient.name as client_name ';
|
|
}
|
|
$qry = 'SELECT ' . $select . '
|
|
FROM ' . $this->table_name( 'wp' ) . ' wp
|
|
LEFT JOIN ' . $this->table_name( 'wp_group' ) . ' wpgr ON wp.id = wpgr.wpid
|
|
LEFT JOIN ' . $this->table_name( 'group' ) . ' gr ON wpgr.groupid = gr.id
|
|
LEFT JOIN ' . $this->table_name( 'wp_clients' ) . ' wpclient ON wp.client_id = wpclient.client_id
|
|
JOIN ' . $this->table_name( 'wp_sync' ) . ' wp_sync ON wp.id = wp_sync.wpid
|
|
JOIN ' . $this->get_option_view( $extra_view ) . ' wp_optionview ON wp.id = wp_optionview.wpid ' .
|
|
$extra_join . '
|
|
WHERE 1 ' . $where;
|
|
if ( ! $count_only ) {
|
|
$qry .= ' GROUP BY wp.id, wp_sync.sync_id';
|
|
}
|
|
$qry .= ' ORDER BY ' . $orderBy;
|
|
} else {
|
|
if ( $count_only ) {
|
|
$select = ' COUNT(DISTINCT(wp.id)) ';
|
|
} else {
|
|
$select = $select_wp_fields . '
|
|
' . $extra_select_sql_fields . '
|
|
,wp_sync.sync_errors,wp_optionview.*, wpclient.name as client_name ';
|
|
}
|
|
$qry = 'SELECT ' . $select . '
|
|
FROM ' . $this->table_name( 'wp' ) . ' wp
|
|
LEFT JOIN ' . $this->table_name( 'wp_clients' ) . ' wpclient ON wp.client_id = wpclient.client_id
|
|
JOIN ' . $this->table_name( 'wp_sync' ) . ' wp_sync ON wp.id = wp_sync.wpid
|
|
JOIN ' . $this->get_option_view( $extra_view ) . ' wp_optionview ON wp.id = wp_optionview.wpid ' .
|
|
$extra_join . '
|
|
WHERE 1 ' . $where;
|
|
if ( ! $count_only ) {
|
|
$qry .= ' GROUP BY wp.id, wp_sync.sync_id';
|
|
}
|
|
$qry .= ' ORDER BY ' . $orderBy;
|
|
}
|
|
|
|
if ( ! $count_only ) {
|
|
if ( ( false !== $offset ) && ( false !== $rowcount ) ) {
|
|
$qry .= ' LIMIT ' . intval( $offset ) . ', ' . intval( $rowcount );
|
|
} elseif ( false !== $rowcount ) {
|
|
$qry .= ' LIMIT ' . intval( $rowcount );
|
|
}
|
|
}
|
|
return $qry;
|
|
}
|
|
/**
|
|
* Get SQL select websites fields.
|
|
*
|
|
* @since 4.3
|
|
*
|
|
* @param array $other_fields extra select wp fields .
|
|
*
|
|
* @return string sql string.
|
|
*/
|
|
public function get_sql_select_wp_valid_fields( $other_fields = array() ) {
|
|
|
|
$allow_other_fields = array(
|
|
'offline_checks_last',
|
|
'offline_check_result', // 1 - online, -1 offline.
|
|
'http_response_code',
|
|
'disable_health_check',
|
|
'health_threshold',
|
|
'note',
|
|
'statsUpdate',
|
|
'directories',
|
|
'plugin_upgrades',
|
|
'theme_upgrades',
|
|
'translation_upgrades',
|
|
'premium_upgrades',
|
|
'securityIssues',
|
|
'themes',
|
|
'ignored_themes',
|
|
'plugins',
|
|
'ignored_plugins',
|
|
'users',
|
|
'categories',
|
|
'pluginDir',
|
|
'automatic_update',
|
|
'backup_before_upgrade',
|
|
'mainwpdir',
|
|
'is_ignoreCoreUpdates',
|
|
'is_ignorePluginUpdates',
|
|
'is_ignoreThemeUpdates',
|
|
'verify_certificate',
|
|
'force_use_ipv4',
|
|
'ssl_version',
|
|
'http_user',
|
|
'http_pass',
|
|
'wpe',
|
|
'is_staging',
|
|
'client_id',
|
|
);
|
|
|
|
$default_fields = array( 'id', 'url', 'name', 'adminname', 'verify_certificate', 'ssl_version', 'http_user', 'http_pass', 'suspended' );
|
|
|
|
$select = ' ';
|
|
|
|
foreach ( $default_fields as $field ) {
|
|
$select .= 'wp.' . $this->escape( $field ) . ',';
|
|
}
|
|
foreach ( $other_fields as $field ) {
|
|
if ( ! in_array( $field, $allow_other_fields ) ) {
|
|
continue;
|
|
}
|
|
if ( in_array( $field, $default_fields ) ) {
|
|
continue;
|
|
}
|
|
$select .= 'wp.' . $this->escape( $field ) . ',';
|
|
}
|
|
$select = rtrim( $select, ',' );
|
|
return $select;
|
|
}
|
|
|
|
/**
|
|
* Get child sites for current user.
|
|
*
|
|
* @param array $params to get sites. Default: array().
|
|
*
|
|
* @return array Results or null on failure.
|
|
*
|
|
* @uses \MainWP\Dashboard\MainWP_Utility::map_site()
|
|
*/
|
|
public function get_websites_for_current_user( $params = array() ) { // phpcs:ignore -- NOSONAR - complex.
|
|
if ( ! is_array( $params ) ) {
|
|
$params = array();
|
|
}
|
|
|
|
$selectgroups = isset( $params['selectgroups'] ) ? $params['selectgroups'] : false;
|
|
$search_site = isset( $params['search_site'] ) ? $params['search_site'] : null;
|
|
$orderBy = isset( $params['order_by'] ) ? $params['order_by'] : 'wp.url';
|
|
$offset = isset( $params['offset'] ) ? $params['offset'] : false;
|
|
$rowcount = isset( $params['rowcount'] ) ? $params['rowcount'] : false;
|
|
$extraWhere = isset( $params['where'] ) ? $params['where'] : null;
|
|
$extra_view = isset( $params['extra_view'] ) && is_array( $params['extra_view'] ) ? $params['extra_view'] : array( 'favi_icon' );
|
|
$is_staging = isset( $params['is_staging'] ) ? $params['is_staging'] : 'no';
|
|
$full_data = isset( $params['full_data'] ) && $params['full_data'] && ( 'no' !== $params['full_data'] ) ? true : false;
|
|
$select_data = isset( $params['select_data'] ) && is_array( $params['select_data'] ) ? $params['select_data'] : false;
|
|
$format = isset( $params['format'] ) ? $params['format'] : '';
|
|
$clients = isset( $params['client'] ) ? $params['client'] : '';
|
|
$fields = isset( $params['fields'] ) && is_array( $params['fields'] ) ? $params['fields'] : array();
|
|
|
|
$for_manager = false;
|
|
|
|
$urlsWhere = '';
|
|
|
|
if ( isset( $params['urls'] ) && ! empty( $params['urls'] ) ) {
|
|
$urls = explode( ';', $params['urls'] );
|
|
foreach ( $urls as $url ) {
|
|
$url = str_replace( array( 'https://www.', 'http://www.', 'https://', 'http://', 'www.' ), array( '', '', '', '', '' ), $url );
|
|
if ( '/' !== substr( $url, - 1 ) ) {
|
|
$url .= '/';
|
|
}
|
|
$urlsWhere .= '"' . $this->escape( $url ) . '", ';
|
|
}
|
|
$urlsWhere = rtrim( $urlsWhere, ', ' );
|
|
}
|
|
|
|
if ( ! empty( $urlsWhere ) ) {
|
|
$urlsWhere = " ( replace(replace(replace(replace(replace(wp.url, 'https://www.',''), 'http://www.',''), 'https://', ''), 'http://', ''), 'www.', '') IN ( " . $urlsWhere . ') ) ';
|
|
|
|
if ( empty( $extraWhere ) ) {
|
|
$extraWhere = $urlsWhere;
|
|
} else {
|
|
$extraWhere = $extraWhere . ' AND ' . $urlsWhere;
|
|
}
|
|
}
|
|
|
|
$clientWhere = '';
|
|
if ( ! empty( $clients ) ) {
|
|
$clients = explode( ';', $clients );
|
|
foreach ( $clients as $client ) {
|
|
if ( is_numeric( $client ) ) {
|
|
$clientWhere .= intval( $client ) . ', ';
|
|
}
|
|
}
|
|
$clientWhere = rtrim( $clientWhere, ', ' );
|
|
}
|
|
|
|
if ( ! empty( $clientWhere ) ) {
|
|
$clientWhere = ' ( wp.client_id IN ( ' . $clientWhere . ') ) ';
|
|
if ( empty( $extraWhere ) ) {
|
|
$extraWhere = $clientWhere;
|
|
} else {
|
|
$extraWhere = $extraWhere . ' AND ' . $clientWhere;
|
|
}
|
|
}
|
|
|
|
$args = array(
|
|
's' => isset( $params['s'] ) ? $params['s'] : '',
|
|
'exclude' => isset( $params['exclude'] ) && ! empty( $params['exclude'] ) ? wp_parse_id_list( $params['exclude'] ) : array(),
|
|
'include' => isset( $params['include'] ) && ! empty( $params['include'] ) ? wp_parse_id_list( $params['include'] ) : array(),
|
|
'status' => isset( $params['status'] ) && ! empty( $params['status'] ) ? wp_parse_list( $params['status'] ) : '',
|
|
'page' => isset( $params['paged'] ) ? intval( $params['paged'] ) : false,
|
|
'per_page' => isset( $params['items_per_page'] ) ? intval( $params['items_per_page'] ) : false,
|
|
);
|
|
|
|
$data = array( 'id', 'url', 'name', 'client_id' );
|
|
|
|
if ( $full_data ) {
|
|
$data = array(
|
|
'id',
|
|
'url',
|
|
'name',
|
|
'offline_checks_last',
|
|
'offline_check_result', // 1 - online, -1 offline.
|
|
'http_response_code',
|
|
'disable_health_check',
|
|
'health_threshold',
|
|
'note',
|
|
'dbsize',
|
|
'plugin_upgrades',
|
|
'theme_upgrades',
|
|
'translation_upgrades',
|
|
'securityIssues',
|
|
'themes',
|
|
'plugins',
|
|
'automatic_update',
|
|
'sync_errors',
|
|
'dtsAutomaticSync',
|
|
'dtsAutomaticSyncStart',
|
|
'dtsSync',
|
|
'dtsSyncStart',
|
|
'last_post_gmt',
|
|
'health_value',
|
|
'phpversion',
|
|
'wp_upgrades',
|
|
'security_stats',
|
|
'client_id',
|
|
'adminname',
|
|
'privkey',
|
|
'http_user',
|
|
'http_pass',
|
|
'ssl_version',
|
|
'signature_algo',
|
|
'verify_method',
|
|
'verify_certificate',
|
|
'suspended',
|
|
);
|
|
|
|
if ( ! in_array( 'security_stats', $extra_view ) ) {
|
|
$extra_view[] = 'security_stats';
|
|
}
|
|
}
|
|
|
|
if ( ! empty( $select_data ) && is_array( $select_data ) ) {
|
|
$data = $select_data;
|
|
}
|
|
|
|
if ( $selectgroups ) {
|
|
$data[] = 'wpgroups';
|
|
$data[] = 'wpgroupids';
|
|
}
|
|
|
|
if ( ! empty( $fields ) ) {
|
|
$data = array_unique( array_merge( $fields, $data ) ); // to prevent difference fields name.
|
|
}
|
|
|
|
$dbwebsites = array();
|
|
|
|
$sql = $this->get_sql_websites_for_current_user( $selectgroups, $search_site, $orderBy, $offset, $rowcount, $extraWhere, $for_manager, $extra_view, $is_staging, $args );
|
|
$websites = $this->query( $sql );
|
|
|
|
while ( $websites && ( $website = static::fetch_object( $websites ) ) ) {
|
|
|
|
$obj_data = MainWP_Utility::map_site( $website, $data );
|
|
|
|
if ( $full_data ) {
|
|
$sum_upgrades = 0;
|
|
if ( '' !== $obj_data->plugin_upgrades ) {
|
|
$plugin_upgrades = json_decode( $obj_data->plugin_upgrades, true );
|
|
if ( is_array( $plugin_upgrades ) ) {
|
|
$sum_upgrades += count( $plugin_upgrades );
|
|
}
|
|
}
|
|
|
|
if ( '' !== $obj_data->theme_upgrades ) {
|
|
$theme_upgrades = json_decode( $obj_data->theme_upgrades, true );
|
|
if ( is_array( $theme_upgrades ) ) {
|
|
$sum_upgrades += count( $theme_upgrades );
|
|
}
|
|
}
|
|
|
|
if ( '' !== $obj_data->wp_upgrades ) {
|
|
$wp_upgrades = json_decode( $obj_data->wp_upgrades, true );
|
|
if ( is_array( $wp_upgrades ) ) {
|
|
$sum_upgrades += count( $wp_upgrades );
|
|
}
|
|
}
|
|
$obj_data->sum_of_upgrades = $sum_upgrades;
|
|
}
|
|
|
|
if ( 'array' === $format ) {
|
|
$dbwebsites[] = $obj_data;
|
|
} else {
|
|
$dbwebsites[ $website->id ] = $obj_data;
|
|
}
|
|
}
|
|
static::free_result( $websites );
|
|
return $dbwebsites;
|
|
}
|
|
|
|
/**
|
|
* Get the child sites the current user has searched for.
|
|
*
|
|
* @param array $params Query parameters.
|
|
*
|
|
* @return boolean|null $qry Database query results or null on failure.
|
|
*
|
|
* @uses \MainWP\Dashboard\MainWP_System::is_multi_user()
|
|
*/
|
|
public function get_sql_search_websites_for_current_user( $params ) { // phpcs:ignore -- NOSONAR - complex.
|
|
|
|
if ( ! is_array( $params ) ) {
|
|
$params = array();
|
|
}
|
|
|
|
$view = isset( $params['view'] ) ? $params['view'] : 'default'; // must be default to compatible with get_option_view().
|
|
$selectgroups = isset( $params['selectgroups'] ) && $params['selectgroups'] ? true : false;
|
|
$search_site = isset( $params['search'] ) ? $this->escape( trim( $params['search'] ) ) : null;
|
|
$orderBy = isset( $params['orderby'] ) ? $params['orderby'] : 'wp.url';
|
|
$offset = isset( $params['offset'] ) ? intval( $params['offset'] ) : false;
|
|
$rowcount = isset( $params['rowcount'] ) ? intval( $params['rowcount'] ) : false;
|
|
$extraWhere = isset( $params['extra_where'] ) ? $params['extra_where'] : null; // without AND prefix.
|
|
$for_manager = isset( $params['for_manager'] ) && $params['for_manager'] ? true : false;
|
|
$extra_view = isset( $params['extra_view'] ) ? $params['extra_view'] : array( 'favi_icon' );
|
|
$is_staging = isset( $params['is_staging'] ) && 'yes' === $params['is_staging'] ? 'yes' : 'no';
|
|
$is_count = isset( $params['count_only'] ) && $params['count_only'] ? true : false;
|
|
$group_ids = isset( $params['group_id'] ) && ! empty( $params['group_id'] ) ? $params['group_id'] : array();
|
|
$client_ids = isset( $params['client_id'] ) && ! empty( $params['client_id'] ) ? $params['client_id'] : array();
|
|
$group_logic = ( isset( $params['group_logic'] ) && 'and' === $params['group_logic'] ) ? 'and' : 'or';
|
|
$is_not = isset( $params['isnot'] ) && ! empty( $params['isnot'] ) ? true : false;
|
|
$selected_sites = isset( $params['selected_sites'] ) ? $params['selected_sites'] : array();
|
|
|
|
if ( ! is_array( $group_ids ) ) {
|
|
$group_ids = array();
|
|
}
|
|
|
|
// valid group ids.
|
|
$group_ids = array_filter(
|
|
$group_ids,
|
|
function ( $e ) {
|
|
if ( 'nogroups' === $e ) {
|
|
return true;
|
|
}
|
|
return ( is_numeric( $e ) && 0 < $e ) ? true : false;
|
|
}
|
|
);
|
|
|
|
if ( ! is_array( $client_ids ) ) {
|
|
$client_ids = array();
|
|
}
|
|
|
|
// valid group ids.
|
|
$client_ids = array_filter(
|
|
$client_ids,
|
|
function ( $e ) {
|
|
if ( 'noclients' === $e ) {
|
|
return true;
|
|
}
|
|
return is_numeric( $e ) && ! empty( $e ) ? true : false; // to valid client ids.
|
|
}
|
|
);
|
|
|
|
if ( $selectgroups ) {
|
|
$staging_group = get_option( 'mainwp_stagingsites_group_id' );
|
|
if ( $staging_group && in_array( $staging_group, $group_ids ) ) {
|
|
if ( empty( $group_ids ) ) {
|
|
$is_staging = 'yes';
|
|
} else {
|
|
$is_staging = 'nocheckstaging';
|
|
}
|
|
}
|
|
}
|
|
|
|
if ( ! is_array( $selected_sites ) ) {
|
|
$selected_sites = array();
|
|
}
|
|
$selected_sites = MainWP_Utility::array_numeric_filter( $selected_sites );
|
|
|
|
$where = '';
|
|
if ( MainWP_System::instance()->is_multi_user() ) {
|
|
|
|
/**
|
|
* Current user global.
|
|
*
|
|
* @global string
|
|
*/
|
|
global $current_user;
|
|
|
|
$where .= ' AND wp.userid = ' . $current_user->ID . ' ';
|
|
}
|
|
|
|
if ( ! empty( $selected_sites ) ) {
|
|
$where .= ' AND wp.id IN (' . implode( ',', $selected_sites ) . ') ';
|
|
}
|
|
|
|
// for searching.
|
|
if ( null !== $search_site && '' !== $search_site ) {
|
|
$where .= ' AND (wp.name LIKE "%' . $search_site . '%" OR wp.url LIKE "%' . $search_site . '%") ';
|
|
}
|
|
|
|
if ( null !== $extraWhere ) {
|
|
$where .= ' AND ' . $extraWhere;
|
|
}
|
|
|
|
$staging_enabled = is_plugin_active( 'mainwp-staging-extension/mainwp-staging-extension.php' ) || is_plugin_active( 'mainwp-timecapsule-extension/mainwp-timecapsule-extension.php' );
|
|
if ( ! $staging_enabled ) {
|
|
$is_staging = 'no';
|
|
}
|
|
|
|
if ( ! $for_manager ) {
|
|
$where .= $this->get_sql_where_allow_access_sites( 'wp', $is_staging );
|
|
}
|
|
|
|
if ( $is_count ) {
|
|
$orderBy = '';
|
|
} elseif ( 'wp.url' === $orderBy ) {
|
|
$orderBy = "replace(replace(replace(replace(replace(wp.url, 'https://www.',''), 'http://www.',''), 'https://', ''), 'http://', ''), 'www.', '')";
|
|
}
|
|
|
|
if ( ! empty( $orderBy ) ) {
|
|
$orderBy = ' ORDER BY ' . $orderBy;
|
|
}
|
|
|
|
$join_group = '';
|
|
$where_group = '';
|
|
$having_group = '';
|
|
|
|
if ( in_array( 'nogroups', $group_ids ) ) {
|
|
$join_group = ' LEFT JOIN ' . $this->table_name( 'wp_group' ) . ' wpgroup ON wp.id = wpgroup.wpid ';
|
|
$group_ids = array_filter(
|
|
$group_ids,
|
|
function ( $e ) {
|
|
return 'nogroups' !== $e;
|
|
}
|
|
);
|
|
if ( ! empty( $group_ids ) ) {
|
|
$groups = implode( ',', $group_ids );
|
|
$groups_count = count( $group_ids );
|
|
if ( $is_not ) {
|
|
$where_group = ' AND wpgroup.groupid IS NOT NULL ';
|
|
if ( 'and' === $group_logic ) {
|
|
$sub_select_match_all = ' SELECT wpand.id FROM ' . $this->table_name( 'wp' ) . ' wpand JOIN ' . $this->table_name( 'wp_group' ) . ' wpgroup_and ON wpand.id = wpgroup_and.wpid WHERE wpgroup_and.groupid IN (' . $groups . ') GROUP BY wpand.id HAVING COUNT(DISTINCT wpgroup_and.groupid) = ' . $groups_count . ' ';
|
|
$where_group .= ' AND wp.id NOT IN ( ' . $sub_select_match_all . ' ) ';
|
|
} else {
|
|
$sub_select_is_not = ' SELECT wp_or.id FROM ' . $this->table_name( 'wp' ) . ' wp_or JOIN ' . $this->table_name( 'wp_group' ) . ' wpgroup_or ON wp_or.id = wpgroup_or.wpid WHERE wpgroup_or.groupid IN (' . $groups . ') ';
|
|
$where_group .= ' AND wp.id NOT IN ( ' . $sub_select_is_not . ' ) ';
|
|
}
|
|
} elseif ( 'and' === $group_logic ) {
|
|
$where_group = ' AND 1 = 0 ';
|
|
} else {
|
|
$where_group = ' AND ( wpgroup.groupid IS NULL OR wpgroup.groupid IN (' . $groups . ') ) ';
|
|
}
|
|
} elseif ( $is_not ) {
|
|
$where_group = ' AND wpgroup.groupid IS NOT NULL ';
|
|
} else {
|
|
$where_group = ' AND wpgroup.groupid IS NULL ';
|
|
}
|
|
} elseif ( $group_ids ) {
|
|
$groups = implode( ',', $group_ids );
|
|
$groups_count = count( $group_ids );
|
|
if ( $is_not ) {
|
|
$join_group = ' LEFT JOIN ' . $this->table_name( 'wp_group' ) . ' wpgroup ON wp.id = wpgroup.wpid ';
|
|
$where_group = '';
|
|
if ( 'and' === $group_logic ) {
|
|
$sub_select_match_all = ' SELECT wpand.id FROM ' . $this->table_name( 'wp' ) . ' wpand JOIN ' . $this->table_name( 'wp_group' ) . ' wpgroup_and ON wpand.id = wpgroup_and.wpid WHERE wpgroup_and.groupid IN (' . $groups . ') GROUP BY wpand.id HAVING COUNT(DISTINCT wpgroup_and.groupid) = ' . $groups_count . ' ';
|
|
$where_group .= ' AND wp.id NOT IN ( ' . $sub_select_match_all . ' ) ';
|
|
} else {
|
|
$sub_select_is_not = ' SELECT wp_or.id FROM ' . $this->table_name( 'wp' ) . ' wp_or JOIN ' . $this->table_name( 'wp_group' ) . ' wpgroup_or ON wp_or.id = wpgroup_or.wpid WHERE wpgroup_or.groupid IN (' . $groups . ') ';
|
|
$where_group .= ' AND wp.id NOT IN ( ' . $sub_select_is_not . ' ) ';
|
|
}
|
|
} else {
|
|
$join_group = ' JOIN ' . $this->table_name( 'wp_group' ) . ' wpgroup ON wp.id = wpgroup.wpid ';
|
|
$where_group = ' AND wpgroup.groupid IN (' . $groups . ') ';
|
|
if ( 'and' === $group_logic ) {
|
|
$having_group = 'COUNT(DISTINCT wpgroup.groupid) = ' . $groups_count;
|
|
}
|
|
}
|
|
}
|
|
|
|
$select_groups_belong = '';
|
|
|
|
if ( ! $is_count && $group_ids ) {
|
|
$select_groups_belong = $this->get_select_groups_belong();
|
|
}
|
|
|
|
$join_client = '';
|
|
$where_client = '';
|
|
$group_by = ' GROUP BY wp.id, wp_sync.sync_id';
|
|
if ( ! empty( $having_group ) ) {
|
|
$group_by .= ' HAVING ' . $having_group;
|
|
}
|
|
$group_by = ' GROUP BY wp.id, wp_sync.sync_id';
|
|
if ( ! empty( $having_group ) ) {
|
|
$group_by .= ' HAVING ' . $having_group;
|
|
}
|
|
|
|
if ( in_array( 'noclients', $client_ids ) ) {
|
|
$join_client = ' LEFT JOIN ' . $this->table_name( 'wp_clients' ) . ' wpclient ON wp.client_id = wpclient.client_id ';
|
|
$client_ids = array_filter(
|
|
$client_ids,
|
|
function ( $e ) {
|
|
return 'noclients' !== $e;
|
|
}
|
|
);
|
|
if ( ! empty( $client_ids ) ) {
|
|
$clients = implode( ',', $client_ids );
|
|
if ( $is_not ) {
|
|
$where_client = ' AND wpclient.client_id IS NOT NULL AND wp.client_id NOT IN (' . $clients . ') ';
|
|
} else {
|
|
$where_client = ' AND wpclient.client_id IN (' . $clients . ') ';
|
|
}
|
|
} elseif ( $is_not ) {
|
|
$where_client = ' AND wpclient.client_id IS NOT NULL ';
|
|
} else {
|
|
$where_client = ' AND wpclient.client_id IS NULL ';
|
|
}
|
|
} elseif ( $client_ids && ! empty( $client_ids ) ) {
|
|
$clients = implode( ',', $client_ids );
|
|
if ( $is_not ) {
|
|
$join_client = ' LEFT JOIN ' . $this->table_name( 'wp_clients' ) . ' wpclient ON wp.client_id = wpclient.client_id ';
|
|
$where_client = ' AND ( wpclient.client_id NOT IN (' . $clients . ') OR wpclient.client_id IS NULL ) ';
|
|
} else {
|
|
$join_client = ' JOIN ' . $this->table_name( 'wp_clients' ) . ' wpclient ON wp.client_id = wpclient.client_id ';
|
|
$where_client = ' AND wpclient.client_id IN (' . $clients . ') ';
|
|
}
|
|
}
|
|
|
|
if ( '' === $join_client ) {
|
|
$join_client = ' LEFT JOIN ' . $this->table_name( 'wp_clients' ) . ' wpclient ON wp.client_id = wpclient.client_id ';
|
|
}
|
|
|
|
$light_fields = array(
|
|
'wp.id',
|
|
'wp.url',
|
|
'wp.name',
|
|
'wp.client_id',
|
|
'wp.verify_certificate',
|
|
'wp.http_user',
|
|
'wp.http_pass',
|
|
'wp.ssl_version',
|
|
'wp.adminname',
|
|
'wp.privkey',
|
|
'wp.pubkey',
|
|
'wp.wpe',
|
|
'wp.is_staging',
|
|
'wp.pubkey',
|
|
'wp.force_use_ipv4',
|
|
'wp.siteurl',
|
|
'wp.suspended',
|
|
'wp.mainwpdir',
|
|
'wp.is_ignoreCoreUpdates',
|
|
'wp.is_ignorePluginUpdates',
|
|
'wp.is_ignoreThemeUpdates',
|
|
'wp.backup_before_upgrade',
|
|
'wp.userid',
|
|
'wp_sync.sync_errors',
|
|
);
|
|
|
|
$legacy_status_fields = array(
|
|
'wp.offline_check_result', // 1 - online, -1 offline.
|
|
'wp.http_response_code',
|
|
'wp.offline_checks_last',
|
|
);
|
|
|
|
$light_fields = array_merge( $light_fields, $legacy_status_fields );
|
|
|
|
$join_monitors = '';
|
|
|
|
$select_fields = array(
|
|
'wp.*',
|
|
'wp_sync.*',
|
|
);
|
|
|
|
if ( 'light_view' === $view ) {
|
|
$select_fields = $light_fields;
|
|
} elseif ( 'monitor_view' === $view ) {
|
|
$select_fields = $light_fields;
|
|
$select_fields[] = 'mo.*';
|
|
$join_monitors = ' LEFT JOIN ' . $this->table_name( 'monitors' ) . ' mo ON wp.id = mo.wpid AND mo.issub = 0 ';
|
|
} elseif ( 'manage_site' === $view ) {
|
|
$select_fields[] = 'mo.monitor_id';
|
|
$join_monitors = ' LEFT JOIN ' . $this->table_name( 'monitors' ) . ' mo ON wp.id = mo.wpid AND mo.issub = 0 ';
|
|
}
|
|
|
|
$select = implode( ',', $select_fields );
|
|
|
|
// wpgroups to fix issue for mysql 8.0, as groups will generate error syntax.
|
|
if ( $selectgroups ) {
|
|
|
|
if ( empty( $join_group ) ) {
|
|
$join_group = ' LEFT JOIN ' . $this->table_name( 'wp_group' ) . ' wpgroup ON wp.id = wpgroup.wpid ';
|
|
}
|
|
|
|
$qry = 'SELECT ' . $select . ', wp_optionview.*, GROUP_CONCAT(DISTINCT gr.name ORDER BY gr.name SEPARATOR ",") as wpgroups, GROUP_CONCAT(DISTINCT gr.id ORDER BY gr.name SEPARATOR ",") as wpgroupids, GROUP_CONCAT(DISTINCT gr.color ORDER BY gr.name SEPARATOR ",") as wpgroups_colors, wpclient.name as client_name ' .
|
|
$select_groups_belong . ' FROM ' . $this->table_name( 'wp' ) . ' wp ' .
|
|
$join_client . ' ' .
|
|
$join_group .
|
|
$join_monitors . '
|
|
LEFT JOIN ' . $this->table_name( 'group' ) . ' gr ON wpgroup.groupid = gr.id
|
|
|
|
JOIN ' . $this->table_name( 'wp_sync' ) . ' wp_sync ON wp.id = wp_sync.wpid
|
|
JOIN ' . $this->get_option_view( $extra_view, $view ) . ' wp_optionview ON wp.id = wp_optionview.wpid
|
|
WHERE 1 ' . $where . $where_group . $where_client . $group_by .
|
|
$orderBy;
|
|
} else {
|
|
$qry = 'SELECT ' . $select . ', wp_optionview.*, wpclient.name as client_name ' .
|
|
$select_groups_belong . ' FROM ' . $this->table_name( 'wp' ) . ' wp ' .
|
|
$join_group . ' ' .
|
|
$join_client .
|
|
$join_monitors . '
|
|
JOIN ' . $this->table_name( 'wp_sync' ) . ' wp_sync ON wp.id = wp_sync.wpid
|
|
JOIN ' . $this->get_option_view( $extra_view, $view ) . ' wp_optionview ON wp.id = wp_optionview.wpid
|
|
WHERE 1 ' . $where . $where_group . $where_client . $group_by .
|
|
$orderBy;
|
|
}
|
|
|
|
if ( ( false !== $offset ) && ( false !== $rowcount ) ) {
|
|
$qry .= ' LIMIT ' . $offset . ', ' . $rowcount;
|
|
} elseif ( false !== $rowcount ) {
|
|
$qry .= ' LIMIT ' . $rowcount;
|
|
}
|
|
|
|
if ( ! empty( $params['dev_log_query'] ) ) {
|
|
error_log( $qry ); //phpcs:ignore -- NOSONAR - for dev.
|
|
}
|
|
|
|
return $qry;
|
|
}
|
|
|
|
/**
|
|
* Get child sites where allowed access via SQL.
|
|
*
|
|
* @param string $site_table_alias Child site table alias.
|
|
* @param string $is_staging yes|no Is child site a staging site.
|
|
*
|
|
* @return boolean|null $_where Database query results or null on failure.
|
|
*/
|
|
public function get_sql_where_allow_access_sites( $site_table_alias = '', $is_staging = 'no' ) { // phpcs:ignore -- NOSONAR - complex.
|
|
|
|
if ( empty( $site_table_alias ) ) {
|
|
$site_table_alias = $this->table_name( 'wp' );
|
|
}
|
|
|
|
// check to filter the staging sites.
|
|
$where_staging = ' AND ' . $site_table_alias . '.is_staging = 0 ';
|
|
if ( 'no' === $is_staging ) {
|
|
$where_staging = ' AND ' . $site_table_alias . '.is_staging = 0 ';
|
|
} elseif ( 'yes' === $is_staging ) {
|
|
$where_staging = ' AND ' . $site_table_alias . '.is_staging = 1 ';
|
|
} elseif ( 'nocheckstaging' === $is_staging ) {
|
|
$where_staging = '';
|
|
}
|
|
// end staging filter.
|
|
|
|
$_where = $where_staging;
|
|
// To fix bug run from cron job.
|
|
if ( defined( 'DOING_CRON' ) && DOING_CRON ) {
|
|
return $_where;
|
|
}
|
|
|
|
// To fix bug run from wp cli.
|
|
if ( defined( 'WP_CLI' ) && WP_CLI ) {
|
|
return $_where;
|
|
}
|
|
|
|
// Run from Rest Api.
|
|
if ( defined( 'MAINWP_REST_API_DOING' ) && MAINWP_REST_API_DOING ) {
|
|
return $_where;
|
|
}
|
|
|
|
/**
|
|
* Filter: mainwp_currentuserallowedaccesssites
|
|
*
|
|
* Filters allowed sites for the current user.
|
|
*
|
|
* @since Unknown
|
|
*/
|
|
$allowed_sites = apply_filters( 'mainwp_currentuserallowedaccesssites', 'all' );
|
|
|
|
if ( 'all' === $allowed_sites ) {
|
|
return $_where;
|
|
}
|
|
|
|
if ( is_array( $allowed_sites ) && ! empty( $allowed_sites ) ) {
|
|
// valid group ids.
|
|
$allowed_sites = array_filter(
|
|
$allowed_sites,
|
|
function ( $e ) {
|
|
return is_numeric( $e ) ? true : false;
|
|
}
|
|
);
|
|
$_where .= ' AND ' . $site_table_alias . '.id IN (' . implode( ',', $allowed_sites ) . ') ';
|
|
} else {
|
|
$_where .= ' AND 0 ';
|
|
}
|
|
|
|
return $_where;
|
|
}
|
|
|
|
/**
|
|
* Get groupd where allowed access via SQL.
|
|
*
|
|
* @param string $group_table_alias Child site table alias.
|
|
* @param string $with_staging yes|no Is child site a staging site.
|
|
*
|
|
* @return boolean|null $_where Database query results or null on failer.
|
|
*/
|
|
public function get_sql_where_allow_groups( $group_table_alias = '', $with_staging = 'no' ) { // phpcs:ignore -- NOSONAR - complex.
|
|
|
|
if ( empty( $group_table_alias ) ) {
|
|
$group_table_alias = $this->table_name( 'group' );
|
|
}
|
|
|
|
// check to filter the staging group.
|
|
$where_staging_group = '';
|
|
$staging_group = get_option( 'mainwp_stagingsites_group_id' );
|
|
if ( $staging_group ) {
|
|
$where_staging_group = ' AND ' . $group_table_alias . '.id <> ' . $staging_group . ' ';
|
|
if ( 'yes' === $with_staging ) {
|
|
$where_staging_group = '';
|
|
}
|
|
}
|
|
|
|
// end staging filter.
|
|
$_where = $where_staging_group;
|
|
|
|
// To fix bug run from cron job.
|
|
if ( defined( 'DOING_CRON' ) && DOING_CRON ) {
|
|
return $_where;
|
|
}
|
|
|
|
// Run from wp cli.
|
|
if ( defined( 'WP_CLI' ) && WP_CLI ) {
|
|
return $_where;
|
|
}
|
|
|
|
// Run from Rest Api.
|
|
if ( defined( 'MAINWP_REST_API_DOING' ) && MAINWP_REST_API_DOING ) {
|
|
return $_where;
|
|
}
|
|
|
|
/**
|
|
* Filter: mainwp_currentuserallowedaccessgroups
|
|
*
|
|
* Filters allowed groups for the current user.
|
|
*
|
|
* @since Unknown
|
|
*/
|
|
$allowed_groups = apply_filters( 'mainwp_currentuserallowedaccessgroups', 'all' );
|
|
|
|
if ( 'all' === $allowed_groups ) {
|
|
return $_where;
|
|
}
|
|
|
|
if ( is_array( $allowed_groups ) && ! empty( $allowed_groups ) ) {
|
|
|
|
// valid group ids.
|
|
$allowed_groups = array_filter(
|
|
$allowed_groups,
|
|
function ( $e ) {
|
|
return is_numeric( $e ) ? true : false;
|
|
}
|
|
);
|
|
|
|
return ' AND ' . $group_table_alias . '.id IN (' . implode( ',', $allowed_groups ) . ') ' . $_where;
|
|
} else {
|
|
return ' AND 0 ';
|
|
}
|
|
}
|
|
|
|
|
|
/**
|
|
* Get child site by id and params.
|
|
*
|
|
* @param int $id Child site ID.
|
|
* @param array $params params.
|
|
* @param string $obj OBJECT|ARRAY_A.
|
|
*
|
|
* @return object|null Database query results or null on failure.
|
|
*/
|
|
public function get_website_by_id_params( $id, $params = array(), $obj = OBJECT ) {
|
|
return $this->get_row_result( $this->get_sql_website_by_params( $id, $params ), $obj );
|
|
}
|
|
|
|
/**
|
|
* Get sql child site by id and params.
|
|
*
|
|
* @param int $id Child site ID.
|
|
* @param array $params params.
|
|
*
|
|
* @return object|null Database query results or null on failure.
|
|
*/
|
|
public function get_sql_website_by_params( $id, $params = array() ) {
|
|
|
|
if ( ! is_array( $params ) ) {
|
|
$params = array();
|
|
}
|
|
|
|
$select_groups = ! empty( $params['select_groups'] ) ? true : false;
|
|
|
|
$view = ! empty( $params['view'] ) ? $params['view'] : 'simple_view';
|
|
$view_fields = isset( $params['view_fields'] ) ? $params['view_fields'] : array();
|
|
|
|
if ( is_string( $view_fields ) ) {
|
|
$view_fields = (array) $view_fields;
|
|
} elseif ( ! is_array( $view_fields ) ) {
|
|
$view_fields = array();
|
|
}
|
|
|
|
if ( MainWP_Utility::ctype_digit( $id ) ) {
|
|
$where = $this->get_sql_where_allow_access_sites( 'wp', 'nocheckstaging' );
|
|
if ( $select_groups ) {
|
|
return 'SELECT wp.*,wp_sync.*,wp_optionview.*, GROUP_CONCAT(gr.name ORDER BY gr.name SEPARATOR ",") as wpgroups, GROUP_CONCAT(gr.id ORDER BY gr.name SEPARATOR ",") as wpgroupids, GROUP_CONCAT(gr.color ORDER BY gr.name SEPARATOR ",") as wpgroups_colors
|
|
FROM ' . $this->table_name( 'wp' ) . ' wp
|
|
LEFT JOIN ' . $this->table_name( 'wp_group' ) . ' wpgr ON wp.id = wpgr.wpid
|
|
LEFT JOIN ' . $this->table_name( 'group' ) . ' gr ON wpgr.groupid = gr.id
|
|
JOIN ' . $this->table_name( 'wp_sync' ) . ' wp_sync ON wp.id = wp_sync.wpid
|
|
JOIN ' . $this->get_option_view_by( $view, $view_fields ) . ' wp_optionview ON wp.id = wp_optionview.wpid
|
|
WHERE wp.id = ' . $id . $where . '
|
|
GROUP BY wp.id, wp_sync.sync_id';
|
|
}
|
|
|
|
return 'SELECT wp.*,wp_sync.*,wp_optionview.*
|
|
FROM ' . $this->table_name( 'wp' ) . ' wp
|
|
JOIN ' . $this->table_name( 'wp_sync' ) . ' wp_sync ON wp.id = wp_sync.wpid
|
|
JOIN ' . $this->get_option_view_by( $view, $view_fields ) . ' wp_optionview ON wp.id = wp_optionview.wpid
|
|
WHERE id = ' . $id . $where;
|
|
}
|
|
return null;
|
|
}
|
|
|
|
/**
|
|
* Get child site by id.
|
|
*
|
|
* @param int $id Child site ID.
|
|
* @param array $selectGroups Select groups.
|
|
* @param array $extra_view Get extra option fields.
|
|
* @param int $obj OBJECT|ARRAY_A.
|
|
*
|
|
* @return object|null Database query results or null on failure.
|
|
*/
|
|
public function get_website_by_id( $id, $selectGroups = false, $extra_view = array(), $obj = OBJECT ) {
|
|
return $this->get_row_result( $this->get_sql_website_by_id( $id, $selectGroups, $extra_view ), $obj );
|
|
}
|
|
|
|
/**
|
|
* Get child site by id via SQL.
|
|
*
|
|
* @param int $id Child site ID.
|
|
* @param bool $selectGroups Selected groups.
|
|
* @param mixed $extra_view Extra view value.
|
|
*
|
|
* @return object|null Database query result or null on failure.
|
|
*
|
|
* @uses \MainWP\Dashboard\MainWP_Utility::ctype_digit()
|
|
*/
|
|
public function get_sql_website_by_id( $id, $selectGroups = false, $extra_view = array() ) {
|
|
|
|
if ( ! is_array( $extra_view ) || empty( $extra_view ) ) {
|
|
$extra_view = array( 'favi_icon', 'site_info' );
|
|
}
|
|
|
|
if ( MainWP_Utility::ctype_digit( $id ) ) {
|
|
$where = $this->get_sql_where_allow_access_sites( 'wp', 'nocheckstaging' );
|
|
if ( $selectGroups ) {
|
|
return 'SELECT wp.*,wp_sync.*,wp_optionview.*, GROUP_CONCAT(gr.name ORDER BY gr.name SEPARATOR ",") as wpgroups, GROUP_CONCAT(gr.id ORDER BY gr.name SEPARATOR ",") as wpgroupids, GROUP_CONCAT(gr.color ORDER BY gr.name SEPARATOR ",") as wpgroups_colors
|
|
FROM ' . $this->table_name( 'wp' ) . ' wp
|
|
LEFT JOIN ' . $this->table_name( 'wp_group' ) . ' wpgr ON wp.id = wpgr.wpid
|
|
LEFT JOIN ' . $this->table_name( 'group' ) . ' gr ON wpgr.groupid = gr.id
|
|
JOIN ' . $this->table_name( 'wp_sync' ) . ' wp_sync ON wp.id = wp_sync.wpid
|
|
JOIN ' . $this->get_option_view( $extra_view ) . ' wp_optionview ON wp.id = wp_optionview.wpid
|
|
WHERE wp.id = ' . $id . $where . '
|
|
GROUP BY wp.id, wp_sync.sync_id';
|
|
}
|
|
|
|
return 'SELECT wp.*,wp_sync.*,wp_optionview.*
|
|
FROM ' . $this->table_name( 'wp' ) . ' wp
|
|
JOIN ' . $this->table_name( 'wp_sync' ) . ' wp_sync ON wp.id = wp_sync.wpid
|
|
JOIN ' . $this->get_option_view( $extra_view ) . ' wp_optionview ON wp.id = wp_optionview.wpid
|
|
WHERE id = ' . $id . $where;
|
|
}
|
|
|
|
return null;
|
|
}
|
|
|
|
/**
|
|
* Method get_websites_by_ids()
|
|
*
|
|
* Get child sites by child site IDs.
|
|
*
|
|
* @param array $ids Child site IDs.
|
|
* @param int $userId User ID.
|
|
*
|
|
* @return object|null Database query result or null on failure.
|
|
*
|
|
* @uses \MainWP\Dashboard\MainWP_System::is_multi_user()
|
|
*/
|
|
public function get_websites_by_ids( $ids, $userId = null ) {
|
|
if ( ( null === $userId ) && MainWP_System::instance()->is_multi_user() ) {
|
|
|
|
/**
|
|
* Current user global.
|
|
*
|
|
* @global string
|
|
*/
|
|
global $current_user;
|
|
|
|
$userId = $current_user->ID;
|
|
}
|
|
|
|
// valid group ids.
|
|
$ids = array_filter(
|
|
$ids,
|
|
function ( $e ) {
|
|
return ( is_numeric( $e ) && 0 < $e ) ? true : false;
|
|
}
|
|
);
|
|
|
|
$where = $this->get_sql_where_allow_access_sites();
|
|
$table_name = esc_sql( $this->table_name( 'wp' ) );
|
|
$placeholders = implode( ',', array_fill( 0, count( $ids ), '%d' ) );
|
|
$sql = "SELECT * FROM {$table_name} WHERE id IN ({$placeholders})";
|
|
$params = $ids;
|
|
|
|
if ( null !== $userId ) {
|
|
$sql .= ' AND userid = %d';
|
|
$params[] = intval( $userId );
|
|
}
|
|
|
|
$sql .= ' ' . $where;
|
|
|
|
return $this->wpdb->get_results( $this->wpdb->prepare( $sql, ...$params ), OBJECT ); // phpcs:ignore PluginCheck.Security.DirectDB.UnescapedDBParameter -- $where fragment is from validated get_sql_where_access_sites() with numeric IDs
|
|
}
|
|
|
|
/**
|
|
* Get child sites by groups IDs.
|
|
*
|
|
* @param array $ids Groups IDs.
|
|
* @param int $userId User ID.
|
|
* @param array $fields array fields .
|
|
*
|
|
* @return object|null Database query result or null on failure.
|
|
*
|
|
* @uses \MainWP\Dashboard\MainWP_System::is_multi_user()
|
|
*/
|
|
public function get_websites_by_group_ids( $ids, $userId = null, $fields = array() ) {
|
|
if ( empty( $ids ) ) {
|
|
return array();
|
|
}
|
|
if ( ( null === $userId ) && MainWP_System::instance()->is_multi_user() ) {
|
|
|
|
/**
|
|
* Current user global.
|
|
*
|
|
* @global string
|
|
*/
|
|
global $current_user;
|
|
|
|
$userId = $current_user->ID;
|
|
}
|
|
|
|
// valid group ids.
|
|
$group_ids = array_filter(
|
|
$ids,
|
|
function ( $e ) {
|
|
return is_numeric( $e ) ? true : false;
|
|
}
|
|
);
|
|
|
|
$select = '*';
|
|
if ( ! empty( $fields ) && is_array( $fields ) ) {
|
|
$fields = array_filter( array_map( 'trim', $fields ) );
|
|
if ( $fields ) {
|
|
$select = '';
|
|
foreach ( $fields as $field ) {
|
|
$select .= $this->escape( $field ) . ',';
|
|
}
|
|
$select = rtrim( $select, ',' );
|
|
}
|
|
}
|
|
return $this->wpdb->get_results( 'SELECT ' . $select . ' FROM ' . $this->table_name( 'wp' ) . ' wp JOIN ' . $this->table_name( 'wp_group' ) . ' wpgroup ON wp.id = wpgroup.wpid WHERE wpgroup.groupid IN (' . implode( ',', $group_ids ) . ') ' . ( null !== $userId ? ' AND wp.userid = ' . intval( $userId ) : '' ), OBJECT );
|
|
}
|
|
|
|
/**
|
|
* Get child sites by group ID.
|
|
*
|
|
* @param int $id Group ID.
|
|
* @param bool $selectgroups Selected groups. Default: false.
|
|
* @param string $orderBy Order list by. Default: URL.
|
|
* @param bool $offset Query offset. Default: false.
|
|
* @param bool $rowcount Row count. Default: falese.
|
|
* @param null $where SQL WHERE value.
|
|
* @param null $search_site Site search field value. Default: null.
|
|
* @param array $others Others params.
|
|
*
|
|
* @return object|null Database query result or null on failure.
|
|
*/
|
|
public function get_websites_by_group_id( //phpcs:ignore -- NOSONAR -ok.
|
|
$id,
|
|
$selectgroups = false,
|
|
$orderBy = 'wp.url',
|
|
$offset = false,
|
|
$rowcount = false,
|
|
$where = null,
|
|
$search_site = null,
|
|
$others = array()
|
|
) {
|
|
return $this->get_results_result(
|
|
$this->get_sql_websites_by_group_id(
|
|
$id,
|
|
$selectgroups,
|
|
$orderBy,
|
|
$offset,
|
|
$rowcount,
|
|
$where,
|
|
$search_site,
|
|
$others
|
|
)
|
|
);
|
|
}
|
|
|
|
/**
|
|
* Get child sites by group id via SQL.
|
|
*
|
|
* @param int $id Group ID.
|
|
* @param bool $selectgroups Selected groups. Default: false.
|
|
* @param string $orderBy Order list by. Default: URL.
|
|
* @param bool $offset Query offset. Default: false.
|
|
* @param bool $rowcount Row count. Default: falese.
|
|
* @param null $where SQL WHERE value.
|
|
* @param null $search_site Site search field value. Default: null.
|
|
* @param array $others Others params.
|
|
*
|
|
* @return object|null Return database query or null on failure.
|
|
*
|
|
* @uses \MainWP\Dashboard\MainWP_Utility::ctype_digit()
|
|
*/
|
|
public function get_sql_websites_by_group_id( // phpcs:ignore -- NOSONAR - complex.
|
|
$id,
|
|
$selectgroups = false,
|
|
$orderBy = 'wp.url',
|
|
$offset = false,
|
|
$rowcount = false,
|
|
$where = null,
|
|
$search_site = null,
|
|
$others = array()
|
|
) {
|
|
|
|
$is_staging = 'no';
|
|
if ( $selectgroups ) {
|
|
$staging_group = get_option( 'mainwp_stagingsites_group_id' );
|
|
if ( $staging_group && $id === $staging_group ) {
|
|
$is_staging = 'yes';
|
|
}
|
|
}
|
|
|
|
$where_search = '';
|
|
if ( ! empty( $search_site ) ) {
|
|
$search_site = trim( $search_site );
|
|
$where_search .= ' AND (wp.name LIKE "%' . $this->escape( $search_site ) . '%" OR wp.url LIKE "%' . $this->escape( $search_site ) . '%") ';
|
|
}
|
|
|
|
$extra_view = is_array( $others ) && isset( $others['extra_view'] ) && is_array( $others['extra_view'] ) && ! empty( $others['extra_view'] ) ? $others['extra_view'] : array( 'site_info' );
|
|
|
|
$view_query = null;
|
|
if ( is_array( $others ) && ! empty( $others['view_query'] ) ) {
|
|
$view_query = $others['view_query'];
|
|
}
|
|
|
|
if ( MainWP_Utility::ctype_digit( $id ) ) {
|
|
$where_allowed = $this->get_sql_where_allow_access_sites( 'wp', $is_staging );
|
|
if ( $selectgroups ) {
|
|
if ( empty( $view_query ) ) {
|
|
$view_query = 'default'; // To compatible.
|
|
}
|
|
$qry = 'SELECT wp.*,wp_sync.*,wp_optionview.*, GROUP_CONCAT(gr.name ORDER BY gr.name SEPARATOR ",") as wpgroups, GROUP_CONCAT(gr.id ORDER BY gr.name SEPARATOR ",") as wpgroupids, GROUP_CONCAT(gr.color ORDER BY gr.name SEPARATOR ",") as wpgroups_colors
|
|
FROM ' . $this->table_name( 'wp' ) . ' wp
|
|
JOIN ' . $this->table_name( 'wp_group' ) . ' wpgroup ON wp.id = wpgroup.wpid
|
|
LEFT JOIN ' . $this->table_name( 'wp_group' ) . ' wpgr ON wp.id = wpgr.wpid
|
|
LEFT JOIN ' . $this->table_name( 'group' ) . ' gr ON wpgr.groupid = gr.id
|
|
JOIN ' . $this->table_name( 'wp_sync' ) . ' wp_sync ON wp.id = wp_sync.wpid
|
|
JOIN ' . $this->get_option_view( $extra_view, $view_query ) . ' wp_optionview ON wp.id = wp_optionview.wpid
|
|
WHERE wpgroup.groupid = ' . $id . ' ' .
|
|
( empty( $where ) ? '' : ' AND ' . $where ) . $where_allowed . $where_search . '
|
|
GROUP BY wp.id, wp_sync.sync_id
|
|
ORDER BY ' . $orderBy;
|
|
} else {
|
|
if ( empty( $view_query ) ) {
|
|
$view_query = 'group'; // To compatible.
|
|
}
|
|
$qry = 'SELECT wp.*,wp_optionview.*, wp_sync.* FROM ' . $this->table_name( 'wp' ) . ' wp
|
|
JOIN ' . $this->table_name( 'wp_group' ) . ' wpgroup ON wp.id = wpgroup.wpid
|
|
JOIN ' . $this->table_name( 'wp_sync' ) . ' wp_sync ON wp.id = wp_sync.wpid
|
|
JOIN ' . $this->get_option_view( $extra_view, $view_query ) . ' wp_optionview ON wp.id = wp_optionview.wpid
|
|
WHERE wpgroup.groupid = ' . $id . ' ' . $where_allowed . $where_search .
|
|
( empty( $where ) ? '' : ' AND ' . $where ) . ' ORDER BY ' . $orderBy;
|
|
}
|
|
if ( ( false !== $offset ) && ( false !== $rowcount ) ) {
|
|
$qry .= ' LIMIT ' . $offset . ', ' . $rowcount;
|
|
} elseif ( false !== $rowcount ) {
|
|
$qry .= ' LIMIT ' . $rowcount;
|
|
}
|
|
|
|
return $qry;
|
|
}
|
|
|
|
return null;
|
|
}
|
|
|
|
/**
|
|
* Get child sites by group name.
|
|
*
|
|
* @param int $userid Current user ID.
|
|
* @param string $groupname Group name.
|
|
*
|
|
* @return object|null Database query result or null on failure.
|
|
*/
|
|
public function get_websites_by_group_name( $userid, $groupname ) {
|
|
return $this->get_results_result( $this->get_sql_websites_by_group_name( $groupname, $userid ) );
|
|
}
|
|
|
|
/**
|
|
* Get child sites by group name.
|
|
*
|
|
* @param string $groupname Group name.
|
|
* @param int $userid Current user ID.
|
|
*
|
|
* @return object|null Database query result or null on failure.
|
|
*
|
|
* @uses \MainWP\Dashboard\MainWP_System::is_multi_user()
|
|
*/
|
|
public function get_sql_websites_by_group_name( $groupname, $userid = null ) {
|
|
if ( ( null === $userid ) && MainWP_System::instance()->is_multi_user() ) {
|
|
|
|
/**
|
|
* Current user global.
|
|
*
|
|
* @global string
|
|
*/
|
|
global $current_user;
|
|
|
|
$userid = $current_user->ID;
|
|
}
|
|
|
|
$sql = 'SELECT wp.*,wp_sync.*,wp_optionview.* FROM ' . $this->table_name( 'wp' ) . ' wp
|
|
INNER JOIN ' . $this->table_name( 'wp_group' ) . ' wpgroup ON wp.id = wpgroup.wpid
|
|
JOIN ' . $this->table_name( 'group' ) . ' g ON wpgroup.groupid = g.id
|
|
JOIN ' . $this->table_name( 'wp_sync' ) . ' wp_sync ON wp.id = wp_sync.wpid
|
|
JOIN ' . $this->get_option_view() . ' wp_optionview ON wp.id = wp_optionview.wpid
|
|
WHERE g.name="' . $this->escape( $groupname ) . '"';
|
|
if ( null !== $userid ) {
|
|
$sql .= ' AND g.userid = "' . intval( $userid ) . '"';
|
|
}
|
|
|
|
return $sql;
|
|
}
|
|
|
|
/**
|
|
* Get child site IP address.
|
|
*
|
|
* @param int $wpid Child site ID.
|
|
*
|
|
* @return string|null Child site IP address or null on failure.
|
|
*/
|
|
public function get_wp_ip( $wpid ) {
|
|
$table_name = esc_sql( $this->table_name( 'request_log' ) );
|
|
return $this->wpdb->get_var( $this->wpdb->prepare( "SELECT ip FROM {$table_name} WHERE wpid = %d", $wpid ) );
|
|
}
|
|
|
|
/**
|
|
* Add website to the MainWP Dashboard.
|
|
*
|
|
* @param int $userid Current user ID.
|
|
* @param string $name Child site name.
|
|
* @param string $url Child site URL.
|
|
* @param string $admin Child site administrator username.
|
|
* @param string $pubkey OpenSSL public key.
|
|
* @param string $privkey OpenSSL private key.
|
|
* @param array $params Other params.
|
|
*
|
|
* @return int|false Child site ID or false on failure.
|
|
*
|
|
* @uses \MainWP\Dashboard\MainWP_Utility::ctype_digit()
|
|
*/
|
|
public function add_website( // phpcs:ignore -- NOSONAR - complex.
|
|
$userid,
|
|
$name,
|
|
$url,
|
|
$admin,
|
|
$pubkey,
|
|
$privkey,
|
|
$params = array()
|
|
) {
|
|
|
|
if ( ! is_array( $params ) ) {
|
|
$params = array();
|
|
}
|
|
|
|
$groupids = isset( $params['groupids'] ) ? $params['groupids'] : array();
|
|
$groupnames = isset( $params['groupnames'] ) ? $params['groupnames'] : array();
|
|
$verifyCertificate = isset( $params['verifyCertificate'] ) ? (int) $params['verifyCertificate'] : 2;
|
|
$uniqueId = isset( $params['uniqueId'] ) ? $params['uniqueId'] : '';
|
|
$http_user = isset( $params['http_user'] ) ? $params['http_user'] : null;
|
|
$http_pass = isset( $params['http_pass'] ) ? $params['http_pass'] : null;
|
|
$sslVersion = isset( $params['sslVersion'] ) ? $params['sslVersion'] : 0;
|
|
$wpe = isset( $params['wpe'] ) ? $params['wpe'] : 0;
|
|
$isStaging = isset( $params['isStaging'] ) ? $params['isStaging'] : 0;
|
|
|
|
if ( MainWP_Utility::ctype_digit( $userid ) ) {
|
|
if ( '/' !== substr( $url, - 1 ) ) {
|
|
$url .= '/';
|
|
}
|
|
|
|
$en_pk_data = MainWP_Encrypt_Data_Lib::instance()->encrypt_privkey( base64_decode( $privkey ) ); // phpcs:ignore -- NOSONAR - base64_encode trust.
|
|
$en_privkey = isset( $en_pk_data['en_data'] ) ? $en_pk_data['en_data'] : '';
|
|
|
|
$values = array(
|
|
'userid' => $userid,
|
|
'adminname' => $this->escape( $admin ),
|
|
'name' => $this->escape( wp_strip_all_tags( $name ) ),
|
|
'url' => $this->escape( $url ),
|
|
'pubkey' => $this->escape( $pubkey ),
|
|
'privkey' => $this->escape( base64_encode( $en_privkey ) ), // phpcs:ignore -- NOSONAR - trust.
|
|
'siteurl' => '',
|
|
'ga_id' => '',
|
|
'gas_id' => 0,
|
|
'offline_checks_last' => 0,
|
|
'offline_check_result' => 0,
|
|
'note' => '',
|
|
'statsUpdate' => 0,
|
|
'directories' => '',
|
|
'plugin_upgrades' => '',
|
|
'theme_upgrades' => '',
|
|
'translation_upgrades' => '',
|
|
'securityIssues' => '',
|
|
'premium_upgrades' => '',
|
|
'themes' => '',
|
|
'ignored_themes' => '',
|
|
'plugins' => '',
|
|
'ignored_plugins' => '',
|
|
'users' => '',
|
|
'categories' => '',
|
|
'pluginDir' => '',
|
|
'automatic_update' => 0,
|
|
'backup_before_upgrade' => 2,
|
|
'verify_certificate' => intval( $verifyCertificate ),
|
|
'ssl_version' => $sslVersion,
|
|
'uniqueId' => $uniqueId,
|
|
'mainwpdir' => 0,
|
|
'http_user' => $http_user,
|
|
'http_pass' => $http_pass,
|
|
'wpe' => $wpe,
|
|
'is_staging' => $isStaging,
|
|
);
|
|
|
|
$syncValues = array(
|
|
'dtsSync' => 0,
|
|
'dtsSyncStart' => 0,
|
|
'dtsAutomaticSync' => 0,
|
|
'dtsAutomaticSyncStart' => 0,
|
|
'totalsize' => 0,
|
|
'extauth' => '',
|
|
'sync_errors' => '',
|
|
);
|
|
if ( $this->wpdb->insert( $this->table_name( 'wp' ), $values ) ) {
|
|
$websiteid = $this->wpdb->insert_id;
|
|
MainWP_Encrypt_Data_Lib::instance()->encrypt_save_keys( $websiteid, $en_pk_data );
|
|
$syncValues['wpid'] = $websiteid;
|
|
$this->wpdb->insert( $this->table_name( 'wp_sync' ), $syncValues );
|
|
$this->wpdb->insert(
|
|
$this->table_name( 'wp_settings_backup' ),
|
|
array(
|
|
'wpid' => $websiteid,
|
|
'archiveFormat' => 'global',
|
|
)
|
|
);
|
|
|
|
foreach ( $groupnames as $groupname ) {
|
|
if ( $this->wpdb->insert(
|
|
$this->table_name( 'group' ),
|
|
array(
|
|
'userid' => $userid,
|
|
'name' => $this->escape( htmlspecialchars( $groupname ) ),
|
|
)
|
|
)
|
|
) {
|
|
$groupids[] = $this->wpdb->insert_id;
|
|
}
|
|
}
|
|
// add groupids.
|
|
foreach ( $groupids as $groupid ) {
|
|
$this->wpdb->insert(
|
|
$this->table_name( 'wp_group' ),
|
|
array(
|
|
'wpid' => $websiteid,
|
|
'groupid' => $groupid,
|
|
)
|
|
);
|
|
}
|
|
|
|
return $websiteid;
|
|
}
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* Remove child site from the MainWP Dashboard.
|
|
*
|
|
* @param int $websiteid Child site ID.
|
|
*
|
|
* @return int|boolean Return child site ID that was removed or false on failure.
|
|
*
|
|
* @uses \MainWP\Dashboard\MainWP_Utility::ctype_digit()
|
|
*/
|
|
public function remove_website( $websiteid ) {
|
|
if ( MainWP_Utility::ctype_digit( $websiteid ) ) {
|
|
$nr = $this->wpdb->delete( $this->table_name( 'wp' ), array( 'id' => $websiteid ) );
|
|
$this->wpdb->delete( $this->table_name( 'wp_group' ), array( 'wpid' => $websiteid ) );
|
|
$this->wpdb->delete( $this->table_name( 'wp_sync' ), array( 'wpid' => $websiteid ) );
|
|
$this->wpdb->delete( $this->table_name( 'wp_options' ), array( 'wpid' => $websiteid ) );
|
|
MainWP_Encrypt_Data_Lib::remove_key_file( $websiteid );
|
|
MainWP_DB_Uptime_Monitoring::instance()->delete_monitor( array( 'wpid' => $websiteid ) );
|
|
return $nr;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* Update child site db values.
|
|
*
|
|
* @param int $websiteid Child site ID.
|
|
* @param array $fields Database fields to update.
|
|
*
|
|
* @return int|boolean The number of rows updated, or false on error.
|
|
*/
|
|
public function update_website_values( $websiteid, $fields ) {
|
|
if ( ! empty( $fields ) ) {
|
|
// Lock the data stream to prevent other processes from updating at the same time.
|
|
$table_name = esc_sql( $this->table_name( 'wp' ) );
|
|
$sql = $this->wpdb->prepare(
|
|
"SELECT * FROM {$table_name} WHERE id = %d FOR UPDATE",
|
|
$websiteid
|
|
);
|
|
$this->wpdb->get_row( $sql );
|
|
|
|
return $this->wpdb->update( $this->table_name( 'wp' ), $fields, array( 'id' => $websiteid ) );
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* Update child site sync values.
|
|
*
|
|
* @param int $websiteid Child site ID.
|
|
* @param array $fields Database fields to update.
|
|
*
|
|
* @return int|boolean The number of rows updated, or false on error.
|
|
*/
|
|
public function update_website_sync_values( $websiteid, $fields ) {
|
|
if ( ! empty( $fields ) ) {
|
|
return $this->wpdb->update( $this->table_name( 'wp_sync' ), $fields, array( 'wpid' => $websiteid ) );
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* Update child site.
|
|
*
|
|
* @param int $websiteid Website ID.
|
|
* @param string $url Child site URL.
|
|
* @param int $userid Current user ID.
|
|
* @param string $name Child site name.
|
|
* @param string $siteadmin Child site administrator username.
|
|
* @param array $groupids Group IDs.
|
|
* @param array $groupnames Group Names.
|
|
* @param string $pluginDir Plugin directory.
|
|
* @param mixed $maximumFileDescriptorsOverride Overwrite the Maximum File Descriptors option.
|
|
* @param mixed $maximumFileDescriptorsAuto Auto set the Maximum File Descriptors option.
|
|
* @param mixed $maximumFileDescriptors Set the Maximum File Descriptors option.
|
|
* @param int $verifyCertificate Whether or not to verify SSL Certificate.
|
|
* @param mixed $archiveFormat Backup archive formate.
|
|
* @param string $uniqueId Unique security ID.
|
|
* @param string $http_user HTTP Basic Authentication username.
|
|
* @param string $http_pass HTTP Basic Authentication password.
|
|
* @param int $sslVersion SSL Version.
|
|
* @param bool $disableHealthChecking Disable Site health threshold.
|
|
* @param int $healthThreshold Site health threshold.
|
|
* @param string $backup_method Primary backup method.
|
|
*
|
|
* @return boolean ture on success or false on failure.
|
|
*
|
|
* @uses \MainWP\Dashboard\MainWP_System_Utility::can_edit_website()
|
|
* @uses \MainWP\Dashboard\MainWP_Utility::ctype_digit()
|
|
*/
|
|
public function update_website( // phpcs:ignore -- NOSONAR - complex.
|
|
$websiteid,
|
|
$url,
|
|
$userid,
|
|
$name,
|
|
$siteadmin,
|
|
$groupids,
|
|
$groupnames,
|
|
$pluginDir,
|
|
$maximumFileDescriptorsOverride,
|
|
$maximumFileDescriptorsAuto,
|
|
$maximumFileDescriptors,
|
|
$verifyCertificate = 1,
|
|
$archiveFormat = 'global',
|
|
$uniqueId = '',
|
|
$http_user = null,
|
|
$http_pass = null,
|
|
$sslVersion = 0,
|
|
$disableHealthChecking = 1,
|
|
$healthThreshold = 0,
|
|
$backup_method = 'global'
|
|
) {
|
|
|
|
$wpe = 0; // going to update when sync.
|
|
|
|
if ( MainWP_Utility::ctype_digit( $websiteid ) && MainWP_Utility::ctype_digit( $userid ) ) {
|
|
$website = $this->get_website_by_id( $websiteid );
|
|
if ( MainWP_System_Utility::can_edit_website( $website ) ) {
|
|
// update admin.
|
|
$this->wpdb->update(
|
|
$this->table_name( 'wp' ),
|
|
array(
|
|
'url' => $url,
|
|
'name' => wp_strip_all_tags( $name ),
|
|
'adminname' => $siteadmin,
|
|
'pluginDir' => $pluginDir,
|
|
'verify_certificate' => intval( $verifyCertificate ),
|
|
'ssl_version' => intval( $sslVersion ),
|
|
'wpe' => intval( $wpe ),
|
|
'uniqueId' => $uniqueId,
|
|
'http_user' => $http_user,
|
|
'http_pass' => $http_pass,
|
|
'disable_health_check' => $disableHealthChecking,
|
|
'health_threshold' => $healthThreshold,
|
|
'primary_backup_method' => $backup_method,
|
|
),
|
|
array( 'id' => $websiteid )
|
|
);
|
|
$this->wpdb->update(
|
|
$this->table_name( 'wp_settings_backup' ),
|
|
array( 'archiveFormat' => $archiveFormat ),
|
|
array( 'wpid' => $websiteid )
|
|
);
|
|
|
|
if ( get_option( 'mainwp_enableLegacyBackupFeature' ) ) {
|
|
$this->wpdb->update(
|
|
$this->table_name( 'wp' ),
|
|
array(
|
|
'maximumFileDescriptorsOverride' => (int) $maximumFileDescriptorsOverride,
|
|
'maximumFileDescriptorsAuto' => (int) $maximumFileDescriptorsAuto,
|
|
'maximumFileDescriptors' => (int) $maximumFileDescriptors,
|
|
),
|
|
array( 'id' => $websiteid )
|
|
);
|
|
}
|
|
|
|
// remove groups.
|
|
$this->wpdb->delete( $this->table_name( 'wp_group' ), array( 'wpid' => $websiteid ) );
|
|
// Remove GA stats.
|
|
$showErrors = $this->wpdb->hide_errors();
|
|
|
|
/**
|
|
* Action: mainwp_ga_delete_site
|
|
*
|
|
* Fires upon site removal process in order to delete Google Analytics data.
|
|
*
|
|
* @param int $websiteid Child site ID.
|
|
*
|
|
* @since Unknown
|
|
*/
|
|
do_action( 'mainwp_ga_delete_site', $websiteid );
|
|
|
|
if ( $showErrors ) {
|
|
$this->wpdb->show_errors();
|
|
}
|
|
// add groups with groupnames.
|
|
foreach ( $groupnames as $groupname ) {
|
|
if ( $this->wpdb->insert(
|
|
$this->table_name( 'group' ),
|
|
array(
|
|
'userid' => $userid,
|
|
'name' => $this->escape( $groupname ),
|
|
)
|
|
)
|
|
) {
|
|
$groupids[] = $this->wpdb->insert_id;
|
|
}
|
|
}
|
|
// add groupids.
|
|
foreach ( $groupids as $groupid ) {
|
|
$this->wpdb->insert(
|
|
$this->table_name( 'wp_group' ),
|
|
array(
|
|
'wpid' => $websiteid,
|
|
'groupid' => $groupid,
|
|
)
|
|
);
|
|
}
|
|
|
|
return true;
|
|
}
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
|
|
/**
|
|
* Get website update stats via SQL.
|
|
*
|
|
* @return object|null Database query result of null on failure.
|
|
*/
|
|
public function get_websites_stats_update_sql() {
|
|
$where = $this->get_sql_where_allow_access_sites( 'wp' );
|
|
return 'SELECT wp.*,wp_sync.sync_errors FROM ' . $this->table_name( 'wp' ) . ' wp JOIN ' . $this->table_name( 'wp_sync' ) . ' wp_sync ON wp.id = wp_sync.wpid WHERE (wp.statsUpdate = 0 OR ' . time() . ' - wp.statsUpdate >= ' . ( 60 * 60 * 24 ) . ')' . $where . ' ORDER BY wp.statsUpdate ASC';
|
|
}
|
|
|
|
/**
|
|
* Update child site statistics.
|
|
*
|
|
* Update whether or not a child site has been updated.
|
|
*
|
|
* @param mixed $websiteid Child site ID.
|
|
* @param mixed $statsUpdated Child site Update status.
|
|
*
|
|
* @return (int|boolean) Number of rows effected in update or false on failure.
|
|
*/
|
|
public function update_website_stats( $websiteid, $statsUpdated ) {
|
|
return $this->wpdb->update(
|
|
$this->table_name( 'wp' ),
|
|
array( 'statsUpdate' => $statsUpdated ),
|
|
array( 'id' => $websiteid )
|
|
);
|
|
}
|
|
|
|
/**
|
|
* Get child site by url.
|
|
*
|
|
* @param string $url Child site URL.
|
|
*
|
|
* @return object|null Database query result or null on failure.
|
|
*/
|
|
public function get_websites_by_url( $url ) {
|
|
if ( '/' !== substr( $url, - 1 ) ) {
|
|
$url .= '/';
|
|
}
|
|
$wp_table = esc_sql( $this->table_name( 'wp' ) );
|
|
$wp_sync_table = esc_sql( $this->table_name( 'wp_sync' ) );
|
|
$results = $this->wpdb->get_results( $this->wpdb->prepare( "SELECT * FROM {$wp_table} wp JOIN {$wp_sync_table} wp_sync ON wp.id = wp_sync.wpid WHERE wp.url = %s", $url ), OBJECT );
|
|
if ( $results ) {
|
|
return $results;
|
|
}
|
|
|
|
if ( stristr( $url, '/www.' ) ) {
|
|
// remove www if it's there!
|
|
$url = str_replace( '/www.', '/', $url );
|
|
} else {
|
|
// add www if it's not there!
|
|
$url = str_replace( 'https://', 'https://www.', $url );
|
|
$url = str_replace( 'http://', 'http://www.', $url );
|
|
}
|
|
|
|
$results = $this->wpdb->get_results( $this->wpdb->prepare( "SELECT * FROM {$wp_table} wp JOIN {$wp_sync_table} wp_sync ON wp.id = wp_sync.wpid WHERE wp.url = %s", $url ), OBJECT );
|
|
if ( $results ) {
|
|
return $results;
|
|
}
|
|
|
|
$url = str_replace( array( 'https://www.', 'http://www.', 'https://', 'http://', 'www.' ), array( '', '', '', '', '' ), $url );
|
|
|
|
return $this->wpdb->get_results( $this->wpdb->prepare( "SELECT * FROM {$wp_table} wp JOIN {$wp_sync_table} wp_sync ON wp.id = wp_sync.wpid WHERE replace(replace(replace(replace(replace(wp.url, 'https://www.',''), 'http://www.',''), 'https://', ''), 'http://', ''), 'www.', '') = %s", $url ), OBJECT );
|
|
}
|
|
|
|
/**
|
|
* Method get_websites_to_notice_health_threshold()
|
|
*
|
|
* Get websites to notice site health.
|
|
*
|
|
* @param int $globalThreshold Global site health threshold.
|
|
*/
|
|
public function get_websites_to_notice_health_threshold( $globalThreshold ) {
|
|
|
|
$where = $this->get_sql_where_allow_access_sites( 'wp' );
|
|
$extra_view = array( 'monitoring_notification_emails', 'settings_notification_emails' );
|
|
|
|
if ( 80 >= $globalThreshold ) { // actual is 80.
|
|
// should-be-improved site health.
|
|
$where_global_threshold = '( wp.health_threshold = 0 AND wp_sync.health_value < 80 )';
|
|
} else {
|
|
// good site health.
|
|
$where_global_threshold = '( wp.health_threshold = 0 AND wp_sync.health_value >= 80 )';
|
|
}
|
|
|
|
$where_site_threshold = ' ( wp.health_threshold = 80 AND wp_sync.health_value < 80 ) '; // should-be-improved site health.
|
|
$where_site_threshold .= ' OR ( wp.health_threshold = 100 AND wp_sync.health_value >= 80 ) '; // good site health.
|
|
|
|
$wp_table = esc_sql( $this->table_name( 'wp' ) );
|
|
$wp_sync_table = esc_sql( $this->table_name( 'wp_sync' ) );
|
|
$option_view = $this->get_option_view( $extra_view );
|
|
|
|
return $this->wpdb->get_results( // phpcs:ignore PluginCheck.Security.DirectDB.UnescapedDBParameter -- $option_view is a validated SQL subquery from get_option_view() with escaped fields
|
|
"SELECT wp.*,wp_sync.*,wp_optionview.* FROM {$wp_table} wp
|
|
JOIN {$wp_sync_table} wp_sync ON wp.id = wp_sync.wpid
|
|
JOIN {$option_view} wp_optionview ON wp.id = wp_optionview.wpid
|
|
WHERE wp.disable_health_check <> 1 AND wp.offline_check_result = 1 AND ( {$where_global_threshold} OR{$where_site_threshold} ) AND wp_sync.health_site_noticed = 0 " .
|
|
$where,
|
|
OBJECT
|
|
);
|
|
}
|
|
|
|
/**
|
|
* Get websites offline status.
|
|
*
|
|
* @return array Sites with offline status.
|
|
*/
|
|
public function get_websites_http_check_status() {
|
|
$where = $this->get_sql_where_allow_access_sites( 'wp' );
|
|
$extra_view = array( 'settings_notification_emails' );
|
|
$wp_table = esc_sql( $this->table_name( 'wp' ) );
|
|
$option_view = $this->get_option_view( $extra_view );
|
|
|
|
return $this->wpdb->get_results( // phpcs:ignore PluginCheck.Security.DirectDB.UnescapedDBParameter -- $option_view is a validated SQL subquery from get_option_view() with escaped fields
|
|
"SELECT wp.*,wp_optionview.* FROM {$wp_table} wp
|
|
JOIN {$option_view} wp_optionview ON wp.id = wp_optionview.wpid
|
|
WHERE wp.disable_status_check <> 1 AND wp.offline_check_result = -1 " .
|
|
$where,
|
|
OBJECT
|
|
);
|
|
}
|
|
|
|
/**
|
|
* Get DB Sites.
|
|
*
|
|
* @since 4.6
|
|
*
|
|
* @param mixed $params params.
|
|
*
|
|
* @return array $dbwebsites.
|
|
*/
|
|
public function get_db_sites( $params = array() ) { // phpcs:ignore -- NOSONAR - complex.
|
|
|
|
$dbwebsites = array();
|
|
|
|
$data_fields = MainWP_System_Utility::get_default_map_site_fields();
|
|
$data_fields[] = 'verify_certificate';
|
|
$data_fields[] = 'client_id';
|
|
|
|
$fields = isset( $params['fields'] ) && is_array( $params['fields'] ) ? $params['fields'] : array();
|
|
$sites = isset( $params['sites'] ) && is_array( $params['sites'] ) ? $params['sites'] : array();
|
|
$groups = isset( $params['groups'] ) && is_array( $params['groups'] ) ? $params['groups'] : array();
|
|
$clients = isset( $params['clients'] ) && is_array( $params['clients'] ) ? $params['clients'] : array();
|
|
$schema_fields = isset( $params['schema_fields'] ) && is_array( $params['schema_fields'] ) ? $params['schema_fields'] : array(); // since 5.2.
|
|
$selectgroups = isset( $params['selectgroups'] ) && ! empty( $params['selectgroups'] ) ? true : false; // since 5.2.
|
|
|
|
if ( ! empty( $schema_fields ) ) { // since 5.2.
|
|
foreach ( $schema_fields as $field_name ) {
|
|
if ( ! in_array( $field_name, $data_fields ) ) {
|
|
$data_fields[] = $field_name;
|
|
}
|
|
}
|
|
} elseif ( is_array( $fields ) ) {
|
|
foreach ( $fields as $field_indx => $field_name ) {
|
|
|
|
$get_field = $field_name;
|
|
if ( is_numeric( $get_field ) || is_bool( $get_field ) ) { // to compatible fix.
|
|
$get_field = $field_indx;
|
|
}
|
|
|
|
if ( in_array( $get_field, static::$possible_options ) && ! in_array( $get_field, $data_fields ) ) {
|
|
$data_fields[] = $get_field;
|
|
}
|
|
}
|
|
}
|
|
|
|
if ( ! empty( $sites ) ) {
|
|
foreach ( $sites as $v ) {
|
|
if ( MainWP_Utility::ctype_digit( $v ) ) {
|
|
$website = static::instance()->get_website_by_id( $v, $selectgroups );
|
|
if ( empty( $website ) ) {
|
|
continue;
|
|
}
|
|
$dbwebsites[ $website->id ] = MainWP_Utility::map_site( $website, $data_fields );
|
|
}
|
|
}
|
|
}
|
|
|
|
if ( ! empty( $groups ) ) {
|
|
foreach ( $groups as $v ) {
|
|
if ( MainWP_Utility::ctype_digit( $v ) ) {
|
|
$websites = static::instance()->query( static::instance()->get_sql_websites_by_group_id( $v, $selectgroups ) );
|
|
while ( $websites && ( $website = static::fetch_object( $websites ) ) ) {
|
|
$dbwebsites[ $website->id ] = MainWP_Utility::map_site( $website, $data_fields );
|
|
}
|
|
static::free_result( $websites );
|
|
}
|
|
}
|
|
}
|
|
|
|
$params = array(
|
|
'full_data' => true,
|
|
'selectgroups' => $selectgroups,
|
|
);
|
|
$client_sites = MainWP_DB_Client::instance()->get_websites_by_client_ids( $clients, $params );
|
|
if ( $client_sites ) {
|
|
foreach ( $client_sites as $website ) {
|
|
$dbwebsites[ $website->id ] = MainWP_Utility::map_site( $website, $data_fields );
|
|
}
|
|
}
|
|
return $dbwebsites;
|
|
}
|
|
|
|
/**
|
|
* Get Sites.
|
|
*
|
|
* @param int $websiteid The id of the child site you wish to retrieve.
|
|
* @param bool $for_manager Check Team Control.
|
|
* @param array $others Array of others.
|
|
*
|
|
* @return array $output Array of content to output.
|
|
*
|
|
* @uses \MainWP\Dashboard\MainWP_System_Utility::can_edit_website()
|
|
* @uses \MainWP\Dashboard\MainWP_Utility::get_nice_url()
|
|
*/
|
|
public function get_sites( $websiteid = null, $for_manager = false, $others = array() ) { // phpcs:ignore -- NOSONAR - not quite complex function.
|
|
|
|
if ( ! is_array( $others ) ) {
|
|
$others = array();
|
|
}
|
|
|
|
$search_site = null;
|
|
$orderBy = 'wp.url';
|
|
$offset = false;
|
|
$rowcount = false;
|
|
$extraWhere = null;
|
|
|
|
if ( isset( $websiteid ) && ( null !== $websiteid ) ) {
|
|
$website = static::instance()->get_website_by_id( $websiteid );
|
|
|
|
if ( ! MainWP_System_Utility::can_edit_website( $website ) ) {
|
|
return false;
|
|
}
|
|
|
|
if ( ! \mainwp_current_user_can( 'site', $websiteid ) ) {
|
|
return false;
|
|
}
|
|
|
|
return array(
|
|
array(
|
|
'id' => $websiteid,
|
|
'url' => MainWP_Utility::get_nice_url( $website->url, true ),
|
|
'name' => $website->name,
|
|
'totalsize' => $website->totalsize,
|
|
'sync_errors' => $website->sync_errors,
|
|
),
|
|
);
|
|
} else {
|
|
if ( isset( $others['orderby'] ) ) {
|
|
if ( 'site' === $others['orderby'] ) {
|
|
$orderBy = 'wp.name ' . ( 'asc' === $others['order'] ? 'asc' : 'desc' );
|
|
} elseif ( 'url' === $others['orderby'] ) {
|
|
$orderBy = 'wp.url ' . ( 'asc' === $others['order'] ? 'asc' : 'desc' );
|
|
}
|
|
}
|
|
if ( isset( $others['search'] ) ) {
|
|
$search_site = trim( $others['search'] );
|
|
}
|
|
|
|
if ( is_array( $others ) && isset( $others['plugins_slug'] ) ) {
|
|
$slugs = explode( ',', $others['plugins_slug'] );
|
|
$extraWhere = '';
|
|
foreach ( $slugs as $slug ) {
|
|
$slug = wp_json_encode( $slug );
|
|
$slug = trim( $slug, '"' );
|
|
$slug = str_replace( '\\', '.', $slug );
|
|
$extraWhere .= ' wp.plugins REGEXP "' . $slug . '" OR';
|
|
}
|
|
$extraWhere = trim( rtrim( $extraWhere, 'OR' ) );
|
|
|
|
if ( '' === $extraWhere ) {
|
|
$extraWhere = null;
|
|
} else {
|
|
$extraWhere = '(' . $extraWhere . ')';
|
|
}
|
|
}
|
|
}
|
|
|
|
$totalRecords = '';
|
|
|
|
if ( isset( $others['per_page'] ) && ! empty( $others['per_page'] ) ) {
|
|
$sql = static::instance()->get_sql_websites_for_current_user( false, $search_site, $orderBy, false, false, $extraWhere, $for_manager );
|
|
$websites_total = static::instance()->query( $sql );
|
|
$totalRecords = ( $websites_total ? static::num_rows( $websites_total ) : 0 );
|
|
|
|
if ( $websites_total ) {
|
|
static::free_result( $websites_total );
|
|
}
|
|
|
|
$rowcount = absint( $others['per_page'] );
|
|
$pagenum = isset( $others['paged'] ) ? absint( $others['paged'] ) : 0;
|
|
if ( $pagenum > $totalRecords ) {
|
|
$pagenum = $totalRecords;
|
|
}
|
|
$pagenum = max( 1, $pagenum );
|
|
$offset = ( $pagenum - 1 ) * $rowcount;
|
|
|
|
}
|
|
|
|
$sql = static::instance()->get_sql_websites_for_current_user( false, $search_site, $orderBy, $offset, $rowcount, $extraWhere, $for_manager );
|
|
$websites = static::instance()->query( $sql );
|
|
|
|
$output = array();
|
|
while ( $websites && ( $website = static::fetch_object( $websites ) ) ) {
|
|
$re = array(
|
|
'id' => $website->id,
|
|
'url' => MainWP_Utility::get_nice_url( $website->url, true ),
|
|
'name' => $website->name,
|
|
'totalsize' => $website->totalsize,
|
|
'sync_errors' => $website->sync_errors,
|
|
'client_id' => $website->client_id,
|
|
);
|
|
|
|
if ( 0 < $totalRecords ) {
|
|
$re['totalRecords'] = $totalRecords;
|
|
$totalRecords = 0;
|
|
}
|
|
|
|
$output[] = $re;
|
|
}
|
|
static::free_result( $websites );
|
|
|
|
return $output;
|
|
}
|
|
|
|
/**
|
|
* Method get_lookup_items().
|
|
*
|
|
* Get bulk lookup items to reduce number of db queries.
|
|
*
|
|
* @param string $item_name lookup item name.
|
|
* @param int $item_id lookup item id.
|
|
* @param string $obj_name loockup object name.
|
|
*
|
|
* @return mixed Result
|
|
*/
|
|
public function get_lookup_items( $item_name, $item_id, $obj_name ) {
|
|
return $this->wpdb->get_results( $this->wpdb->prepare( 'SELECT * FROM ' . $this->table_name( 'lookup_item_objects' ) . ' WHERE item_name=%s AND item_id = %d AND object_name = %s', $item_name, $item_id, $obj_name ) ); //phpcs:ignore -- ok.
|
|
}
|
|
|
|
/**
|
|
* Method insert_lookup_item().
|
|
*
|
|
* Insert lookup item, need checks existed before to prevent double values.
|
|
*
|
|
* @param string $item_name item name.
|
|
* @param int $item_id item id.
|
|
* @param string $obj_name object name.
|
|
* @param int $obj_id object id.
|
|
*
|
|
* @return mixed Result
|
|
*/
|
|
public function insert_lookup_item( $item_name, $item_id, $obj_name, $obj_id ) {
|
|
if ( empty( $item_name ) || empty( $item_id ) || empty( $obj_name ) || empty( $obj_id ) ) {
|
|
return false;
|
|
}
|
|
$data = array(
|
|
'item_name' => 'cost',
|
|
'item_id' => $item_id,
|
|
'object_name' => $obj_name,
|
|
'object_id' => $obj_id,
|
|
);
|
|
$this->wpdb->insert( $this->table_name( 'lookup_item_objects' ), $data );
|
|
return $this->wpdb->insert_id; // must return lookup id.
|
|
}
|
|
|
|
/**
|
|
* Method delete_lookup_items().
|
|
*
|
|
* Delete bulk lookup items by lookup ids or object names with item id and item name, to reduce number of db queries.
|
|
*
|
|
* @param string $by Delete by.
|
|
* @param array $params params.
|
|
*
|
|
* @return mixed Result
|
|
*/
|
|
public function delete_lookup_items( $by = 'lookup_id', $params = array() ) { // phpcs:ignore -- NOSONAR - complex.
|
|
if ( ! is_array( $params ) ) {
|
|
return false;
|
|
}
|
|
|
|
$lookup_ids = isset( $params['lookup_ids'] ) ? $params['lookup_ids'] : null;
|
|
$item_id = isset( $params['item_id'] ) ? $params['item_id'] : null;
|
|
$object_id = isset( $params['object_id'] ) ? $params['object_id'] : null;
|
|
$item_name = isset( $params['item_name'] ) ? $params['item_name'] : null;
|
|
$obj_names = isset( $params['object_names'] ) ? $params['object_names'] : null;
|
|
|
|
if ( 'object_name' === $by ) {
|
|
if ( empty( $item_id ) || empty( $item_name ) ) {
|
|
return false;
|
|
}
|
|
|
|
$obj_names = $this->escape_array( $obj_names );
|
|
if ( ! empty( $obj_names ) ) {
|
|
$this->wpdb->query( $this->wpdb->prepare( 'DELETE FROM ' . $this->table_name( 'lookup_item_objects' ) . ' WHERE item_name = %s AND item_id = %d AND object_name IN ("' . implode( '","', $obj_names ) . '") ', $item_name, $item_id ) ); //phpcs:ignore -- ok.
|
|
return true;
|
|
}
|
|
} elseif ( 'object_id' === $by ) {
|
|
if ( empty( $object_id ) || empty( $item_name ) || empty( $obj_names ) ) {
|
|
return false;
|
|
}
|
|
|
|
$obj_names = $this->escape_array( $obj_names );
|
|
if ( ! empty( $obj_names ) ) {
|
|
$this->wpdb->query( $this->wpdb->prepare( 'DELETE FROM ' . $this->table_name( 'lookup_item_objects' ) . ' WHERE item_name = %s AND object_id = %d AND object_name IN ("' . implode( '","', $obj_names ) . '") ', $item_name, $object_id ) ); //phpcs:ignore -- ok.
|
|
return true;
|
|
}
|
|
} elseif ( 'lookup_id' === $by ) {
|
|
if ( empty( $lookup_ids ) ) {
|
|
return false;
|
|
}
|
|
if ( is_numeric( $lookup_ids ) ) {
|
|
$lookup_ids = array( $lookup_ids );
|
|
} elseif ( is_array( $lookup_ids ) ) {
|
|
$lookup_ids = MainWP_Utility::array_numeric_filter( $lookup_ids );
|
|
} else {
|
|
return false;
|
|
}
|
|
$this->wpdb->query( 'DELETE FROM ' . $this->table_name( 'lookup_item_objects' ) . ' WHERE lookup_id IN (' . implode( ',', $lookup_ids ) . ') ' ); //phpcs:ignore -- ok.
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
|
|
/**
|
|
* Return the user data for the given consumer_key.
|
|
*
|
|
* @param string $consumer_key Consumer key.
|
|
* @param string $consumer_secret Secret key.
|
|
* @param string $scope scope.
|
|
* @param string $description description.
|
|
* @param int $enabled 1 or 0.
|
|
* @param array $others others.
|
|
*
|
|
* @return array
|
|
*/
|
|
public function insert_rest_api_key( $consumer_key, $consumer_secret, $scope, $description, $enabled, $others = array() ) {
|
|
global $current_user;
|
|
|
|
if ( $current_user ) {
|
|
$user_id = $current_user->ID;
|
|
}
|
|
|
|
if ( empty( $user_id ) ) {
|
|
return false;
|
|
}
|
|
|
|
if ( ! is_array( $others ) ) {
|
|
$others = array();
|
|
}
|
|
|
|
$pass = isset( $others['key_pass'] ) ? $others['key_pass'] : '';
|
|
$type = isset( $others['key_type'] ) ? intval( $others['key_type'] ) : 0;
|
|
|
|
// Created API keys.
|
|
$permissions = in_array( $scope, array( 'read', 'write', 'read_write' ), true ) ? sanitize_text_field( $scope ) : 'read';
|
|
$this->wpdb->insert(
|
|
$this->table_name( 'api_keys' ),
|
|
array(
|
|
'user_id' => $user_id,
|
|
'description' => $description,
|
|
'permissions' => $permissions,
|
|
'consumer_key' => mainwp_api_hash( $consumer_key ),
|
|
'consumer_secret' => $consumer_secret,
|
|
'truncated_key' => substr( $consumer_key, -7 ),
|
|
'enabled' => $enabled,
|
|
'key_pass' => $pass,
|
|
'key_type' => $type,
|
|
),
|
|
array(
|
|
'%d',
|
|
'%s',
|
|
'%s',
|
|
'%s',
|
|
'%s',
|
|
'%s',
|
|
'%d',
|
|
'%s',
|
|
'%d',
|
|
),
|
|
);
|
|
|
|
return array(
|
|
'key_id' => $this->wpdb->insert_id,
|
|
'user_id' => $user_id,
|
|
'consumer_key' => $consumer_key,
|
|
'consumer_secret' => $consumer_secret,
|
|
'key_permissions' => $permissions,
|
|
);
|
|
}
|
|
|
|
/**
|
|
* Update rest api key.
|
|
*
|
|
* @param int $key_id Consumer key.
|
|
* @param string $scope scope.
|
|
* @param string $description description.
|
|
* @param int $enabled Enabled.
|
|
*
|
|
* @return array
|
|
*/
|
|
public function update_rest_api_key( $key_id, $scope, $description, $enabled = 1 ) {
|
|
$permissions = in_array( $scope, array( 'read', 'write', 'read_write' ), true ) ? sanitize_text_field( $scope ) : 'read';
|
|
return $this->wpdb->update(
|
|
$this->table_name( 'api_keys' ),
|
|
array(
|
|
'description' => $description,
|
|
'permissions' => $permissions,
|
|
'enabled' => $enabled ? 1 : 0,
|
|
),
|
|
array(
|
|
'key_id' => $key_id,
|
|
)
|
|
);
|
|
}
|
|
|
|
|
|
/**
|
|
* Method is_existed_enabled_rest_key().
|
|
*
|
|
* @return bool result.
|
|
*/
|
|
public function is_existed_enabled_rest_key() {
|
|
$table_name = esc_sql( $this->table_name( 'api_keys' ) );
|
|
$enabled = $this->wpdb->get_row( "SELECT * FROM {$table_name} WHERE enabled = 1 LIMIT 1" );
|
|
return $enabled ? true : false;
|
|
}
|
|
|
|
/**
|
|
* Method get_rest_api_key_by().
|
|
*
|
|
* @param int $id To get key.
|
|
*
|
|
* @return array
|
|
*/
|
|
public function get_rest_api_key_by( $id ) {
|
|
$table_name = esc_sql( $this->table_name( 'api_keys' ) );
|
|
return $this->wpdb->get_row( $this->wpdb->prepare( "SELECT * FROM {$table_name} WHERE key_id = %d", $id ) );
|
|
}
|
|
|
|
/**
|
|
* Method remove_rest_api_key().
|
|
*
|
|
* @param string $id to delete.
|
|
*
|
|
* @return array
|
|
*/
|
|
public function remove_rest_api_key( $id ) {
|
|
$table_name = esc_sql( $this->table_name( 'api_keys' ) );
|
|
return $this->wpdb->query( $this->wpdb->prepare( "DELETE FROM {$table_name} WHERE key_id = %s", $id ) );
|
|
}
|
|
|
|
/**
|
|
* Method get_rest_api_keys().
|
|
*
|
|
* @return array
|
|
*/
|
|
public function get_rest_api_keys() {
|
|
$table_name = esc_sql( $this->table_name( 'api_keys' ) );
|
|
return $this->wpdb->get_results( "SELECT * FROM {$table_name} ORDER BY key_id DESC" );
|
|
}
|
|
|
|
|
|
/**
|
|
* Update regular process.
|
|
*
|
|
* @param array $data process data.
|
|
* @return mixed
|
|
*/
|
|
public function update_regular_process( $data ) {
|
|
if ( isset( $data['process_id'] ) ) {
|
|
$process_id = $data['process_id'];
|
|
unset( $data['process_id'] );
|
|
return $this->wpdb->update( $this->table_name( 'schedule_processes' ), $data, array( 'process_id' => $process_id ) );
|
|
} elseif ( is_array( $data ) && isset( $data['type'] ) && isset( $data['process_slug'] ) ) {
|
|
return $this->wpdb->insert( $this->table_name( 'schedule_processes' ), $data );
|
|
}
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* Delete regular process.
|
|
*
|
|
* @param int $process_id Process id.
|
|
* @param int $item_id Item id.
|
|
* @param string $pro_type Process type.
|
|
* @param string $pro_slug Process slug.
|
|
*
|
|
* @return mixed
|
|
*/
|
|
public function delete_regular_process( $process_id = false, $item_id = false, $pro_type = false, $pro_slug = false ) {
|
|
|
|
if ( is_numeric( $process_id ) && ! empty( $process_id ) ) {
|
|
return $this->wpdb->delete(
|
|
$this->table_name( 'schedule_processes' ),
|
|
array(
|
|
'process_id' => $process_id,
|
|
)
|
|
);
|
|
} elseif ( ! empty( $pro_type ) || ! empty( $pro_slug ) ) {
|
|
|
|
$data = array();
|
|
|
|
if ( ! empty( $pro_type ) ) {
|
|
$data['type'] = $pro_type;
|
|
}
|
|
|
|
if ( ! empty( $pro_slug ) ) {
|
|
$data['process_slug'] = $pro_slug;
|
|
}
|
|
|
|
if ( ! empty( $item_id ) ) {
|
|
$data['item_id'] = $item_id;
|
|
}
|
|
// Bulk delete.
|
|
return $this->wpdb->delete( $this->table_name( 'schedule_processes' ), $data );
|
|
}
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* Method get_regular_process_by_item_id_type_slug
|
|
*
|
|
* @param integer $item_id item id.
|
|
* @param string $type type.
|
|
* @param string $process_slug process slug.
|
|
*
|
|
* @return mixed result
|
|
*/
|
|
public function get_regular_process_by_item_id_type_slug( $item_id, $type, $process_slug ) {
|
|
$table_name = esc_sql( $this->table_name( 'schedule_processes' ) );
|
|
return $this->wpdb->get_row( $this->wpdb->prepare( "SELECT pr.* FROM {$table_name} pr WHERE pr.item_id = %d AND pr.type = %s AND pr.process_slug = %s", $item_id, $type, $process_slug ) );
|
|
}
|
|
|
|
/**
|
|
* Method log_system_query
|
|
*
|
|
* @param array $params params.
|
|
* @param string $sql query.
|
|
* @return void
|
|
*/
|
|
public function log_system_query( $params, $sql ) {
|
|
if ( is_array( $params ) && ! empty( $params['dev_log_query'] ) && ! empty( $sql ) ) {
|
|
error_log( $sql ); //phpcs:ignore -- NOSONAR - for dev.
|
|
do_action( 'mainwp_log_system_query', $params, $sql );
|
|
}
|
|
}
|
|
}
|