[ ad, açıklama ] */ function tibospeed_db_items() { return array( 'revisions' => array( __( 'Post revisions', 'tibospeed' ), __( 'The latest revisions of each post are kept (as many as the setting).', 'tibospeed' ) ), 'autodrafts' => array( __( 'Auto-drafts', 'tibospeed' ), __( 'Empty posts that were opened but never saved.', 'tibospeed' ) ), 'trash' => array( __( 'Trashed posts', 'tibospeed' ), __( 'Trash older than 30 days.', 'tibospeed' ) ), 'spam' => array( __( 'Spam and trashed comments', 'tibospeed' ), '' ), 'transients' => array( __( 'Expired transients', 'tibospeed' ), __( 'Cache records left behind by plugins.', 'tibospeed' ) ), 'orphanmeta' => array( __( 'Orphaned post meta', 'tibospeed' ), __( 'Meta records left over from deleted posts.', 'tibospeed' ) ), ); } /** * Öğe sayıları. * * @return array */ function tibospeed_db_counts() { global $wpdb; // phpcs:disable WordPress.DB.DirectDatabaseQuery $keep = (int) tibospeed_get( 'revisions_keep' ); $c = array(); $rev = (int) $wpdb->get_var( "SELECT COUNT(*) FROM {$wpdb->posts} WHERE post_type = 'revision'" ); $par = (int) $wpdb->get_var( "SELECT COUNT(DISTINCT post_parent) FROM {$wpdb->posts} WHERE post_type = 'revision'" ); $c['revisions'] = max( 0, $rev - $par * $keep ); $c['autodrafts'] = (int) $wpdb->get_var( "SELECT COUNT(*) FROM {$wpdb->posts} WHERE post_status = 'auto-draft'" ); $c['trash'] = (int) $wpdb->get_var( $wpdb->prepare( "SELECT COUNT(*) FROM {$wpdb->posts} WHERE post_status = 'trash' AND post_modified < %s", gmdate( 'Y-m-d H:i:s', time() - 30 * DAY_IN_SECONDS ) ) ); $c['spam'] = (int) $wpdb->get_var( "SELECT COUNT(*) FROM {$wpdb->comments} WHERE comment_approved IN ('spam','trash')" ); $c['transients'] = (int) $wpdb->get_var( $wpdb->prepare( "SELECT COUNT(*) FROM {$wpdb->options} WHERE option_name LIKE %s AND option_value < %d", $wpdb->esc_like( '_transient_timeout_' ) . '%', time() ) ); $c['orphanmeta'] = (int) $wpdb->get_var( "SELECT COUNT(*) FROM {$wpdb->postmeta} pm LEFT JOIN {$wpdb->posts} p ON p.ID = pm.post_id WHERE p.ID IS NULL" ); // phpcs:enable return $c; } /** * Temizle. * * @param string $what Öğe. * @return int Silinen. */ function tibospeed_db_clean( $what ) { global $wpdb; $n = 0; // phpcs:disable WordPress.DB.DirectDatabaseQuery switch ( $what ) { case 'revisions': $keep = (int) tibospeed_get( 'revisions_keep' ); $parents = $wpdb->get_col( $wpdb->prepare( "SELECT post_parent FROM {$wpdb->posts} WHERE post_type = 'revision' GROUP BY post_parent HAVING COUNT(*) > %d LIMIT 2000", $keep ) ); foreach ( $parents as $p ) { $ids = $wpdb->get_col( $wpdb->prepare( "SELECT ID FROM {$wpdb->posts} WHERE post_type = 'revision' AND post_parent = %d ORDER BY post_date DESC", $p ) ); foreach ( array_slice( $ids, $keep ) as $id ) { if ( wp_delete_post_revision( (int) $id ) ) { ++$n; } } } break; case 'autodrafts': foreach ( $wpdb->get_col( "SELECT ID FROM {$wpdb->posts} WHERE post_status = 'auto-draft' LIMIT 2000" ) as $id ) { if ( wp_delete_post( (int) $id, true ) ) { ++$n; } } break; case 'trash': foreach ( $wpdb->get_col( $wpdb->prepare( "SELECT ID FROM {$wpdb->posts} WHERE post_status = 'trash' AND post_modified < %s LIMIT 2000", gmdate( 'Y-m-d H:i:s', time() - 30 * DAY_IN_SECONDS ) ) ) as $id ) { if ( wp_delete_post( (int) $id, true ) ) { ++$n; } } break; case 'spam': foreach ( $wpdb->get_col( "SELECT comment_ID FROM {$wpdb->comments} WHERE comment_approved IN ('spam','trash') LIMIT 5000" ) as $id ) { if ( wp_delete_comment( (int) $id, true ) ) { ++$n; } } break; case 'transients': $keys = $wpdb->get_col( $wpdb->prepare( "SELECT option_name FROM {$wpdb->options} WHERE option_name LIKE %s AND option_value < %d LIMIT 5000", $wpdb->esc_like( '_transient_timeout_' ) . '%', time() ) ); foreach ( $keys as $k ) { if ( delete_transient( substr( $k, strlen( '_transient_timeout_' ) ) ) ) { ++$n; } } break; case 'orphanmeta': $n = (int) $wpdb->query( "DELETE pm FROM {$wpdb->postmeta} pm LEFT JOIN {$wpdb->posts} p ON p.ID = pm.post_id WHERE p.ID IS NULL" ); break; case 'optimize': if ( false === stripos( (string) $wpdb->db_server_info(), 'sqlite' ) && ! defined( 'DB_ENGINE' ) ) { foreach ( $wpdb->get_col( $wpdb->prepare( 'SHOW TABLES LIKE %s', $wpdb->esc_like( $wpdb->prefix ) . '%' ) ) as $t ) { $wpdb->query( 'OPTIMIZE TABLE `' . esc_sql( $t ) . '`' ); // phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared ++$n; } } break; } // phpcs:enable return $n; } /** * Her sayfa açılışında belleğe yüklenen (autoload) ayarlar. * * @return array [ toplam bayt, ilk 12 [ ad, bayt ] ] */ function tibospeed_autoload_report() { global $wpdb; // phpcs:disable WordPress.DB.DirectDatabaseQuery $total = (int) $wpdb->get_var( "SELECT SUM(LENGTH(option_value)) FROM {$wpdb->options} WHERE autoload IN ('yes','on','auto-on','auto')" ); $top = $wpdb->get_results( "SELECT option_name n, LENGTH(option_value) b FROM {$wpdb->options} WHERE autoload IN ('yes','on','auto-on','auto') ORDER BY b DESC LIMIT 12", ARRAY_A ); // phpcs:enable return array( $total, $top ); } add_action( 'wp_ajax_tibospeed_db_clean', function () { check_ajax_referer( 'tibospeed_admin', 'nonce' ); if ( ! current_user_can( 'manage_options' ) ) { wp_send_json_error( null, 403 ); } $what = isset( $_POST['what'] ) ? sanitize_key( wp_unslash( $_POST['what'] ) ) : ''; $n = 0; $list = 'all' === $what ? array_merge( array_keys( tibospeed_db_items() ), array( 'optimize' ) ) : array( $what ); foreach ( $list as $w ) { if ( isset( tibospeed_db_items()[ $w ] ) || 'optimize' === $w ) { $n += tibospeed_db_clean( $w ); } } wp_send_json_success( array( 'n' => $n, 'counts' => tibospeed_db_counts(), ) ); } ); // Haftalık otomatik temizlik. add_action( 'init', function () { if ( 'weekly' === tibospeed_get( 'db_auto' ) ) { if ( ! wp_next_scheduled( 'tibospeed_db_auto' ) ) { wp_schedule_event( time() + HOUR_IN_SECONDS, 'weekly', 'tibospeed_db_auto' ); } } elseif ( wp_next_scheduled( 'tibospeed_db_auto' ) ) { wp_clear_scheduled_hook( 'tibospeed_db_auto' ); } } ); add_action( 'tibospeed_db_auto', function () { foreach ( array_keys( tibospeed_db_items() ) as $w ) { tibospeed_db_clean( $w ); } } );