wydajność — Jak mogę buforować żądanie bazy danych w wordpress bez istniejącej wtyczki?
![wydajność — Jak mogę buforować żądanie bazy danych w wordpress bez istniejącej wtyczki?](https://oen.pl/wp-content/uploads/2023/01/apple-touch-icon@2.png)
Jak mogę używać trwałej pamięci podręcznej w wordpress bez wtyczek, której klasy powinienem użyć?
Gdzie mogę się udokumentować?
WP_Object_Cache
Implementuje buforowanie w bazie danych i nietrwałe. Jak napisano w oficjalnej dokumentacji.
czytałem o Transients
ale przechowują w DB. Czytałem też, że tzw WP_CACHE
funkcja nie jest już dostępna.
W BooksManager (wtyczka)
if(is_admin()){
if(isset($_POST['term']) && isset($_POST['type']) && isset($_POST['catalog'])){
$term = wp_unslash( $_POST['term']);
$type = wp_unslash( $_POST['type']);
$catalog = wp_unslash( $_POST['catalog']);
$args_query = array(
'search_term' => array($type => $term),
'catalog' =>$catalog,
'limit' => '',
'orderby' => array(
'mode'=>'DESC',
'key' => 'year'
)
);
$bmplugin->get_posts($args_query);
}
}
Funkcja, która obsługuje moje żądania Ajax dotyczące stronicowania.
function pagination_handler(){
check_ajax_referer( 'admin' );
if(false ===(get_transient('admin_query_results'))){
$this->last_query = get_transient('admin_query_results');
}
if(isset($_POST['npage']) && !empty($_POST['npage'])){
self::$BM_Query->current_page = $_POST['npage'];
if(self::$BM_Query->current_page < 0)
self::$BM_Query->current_page = 0;
else if(self::$BM_Query->current_page > self::$BM_Query->max_num_pages)
self::$BM_Query->current_page = self::$BM_Query->max_num_pages;
else if(self::$BM_Query->current_page > self::$BM_Query->page_count)
self::$BM_Query->current_page = self::$BM_Query->page_count;
}
self::$BM_Query->query($this->last_query);
$this->table_pagination();
wp_die();
}
W klasie BM_Query
jest to główna funkcja wysyłająca zapytania do bazy danych
public function get_posts():bool{
global $wpdb;
$this->parse_query();
$_sql="";
$_where="";
$_order="";
$_limit="";
$q = &$this->query_vars;
if(!$this->a_author && !$this->a_search && !$this->a_title && !$this->a_year){
return false;
}
if(isset( $q['search_term']['num_coll'] ) && !empty( $q['search_term']['num_coll'])){
if(is_numeric($q['search_term']['num_coll'])){
$_where .= $wpdb->prepare(" num_coll LIKE %d ",$q['search_term']['num_coll']);
}
}
if(isset( $q['search_term']['num_ing'] ) && !empty( $q['search_term']['num_ing'])){
if(is_numeric($q['search_term']['num_ing'])){
$_where .= $wpdb->prepare(" num_ing LIKE %d ",$q['search_term']['num_ing']);
}
}
if($this->a_title){
$q['search_term']['title'] = trim($q['search_term']['title']);
$q['search_term']['title'] = esc_sql($wpdb->esc_like( $q['search_term']['title'] ));
$q['search_term']['title'] = '%'.$q['search_term']['title'].'%';
$_where .= $wpdb->prepare(" title LIKE %s ",$q['search_term']['title']);
}
if($this->a_author){
$q['search_term']['author'] = trim($q['search_term']['author']);
$q['search_term']['author'] = esc_sql($wpdb->esc_like( $q['search_term']['author'] ));
$q['search_term']['author'] = '%'.$q['search_term']['author'].'%';
$_where .= $wpdb->prepare(" author LIKE %s ",$q['search_term']['author']);
}
if($this->a_year){
$_where .= $wpdb->prepare(" year LIKE %s ",$q['search_term']['year']);
}
if($this->a_key){
if($this->a_mode)
$_order = $wpdb->prepare(" ORDER BY {$this->tablename}.{$q['orderby']['key']} {$q['orderby']['mode']} ");
else
$_order = $wpdb->prepare(" ORDER BY {$this->tablename}.{$q['orderby']['key']} DESC ");
}
if($this->a_limit){
$_limit = $wpdb->prepare(" LIMIT %d ", $q['limit']);
}
$_catalog = $wpdb->prepare(" WHERE catalog=%s ", $q['catalog']);
$_sql = "SELECT * FROM ".$this->tablename.$_catalog ."AND status="publish" AND disp= 1 AND ";
$_sql .= $_where . $_order . $_limit;
$this->posts = $wpdb->get_results($_sql);
$this->post_count = $wpdb->num_rows;
$this->page_count = ceil($this->post_count / $this->post_for_page);
$this->offset = $this->current_page * $this->post_for_page;
return true;
}