WordPress

wydajność — Jak mogę buforować żądanie bazy danych w wordpress bez istniejącej wtyczki?

  • 27 kwietnia, 2023
  • 4 min read
wydajność — Jak mogę buforować żądanie bazy danych w wordpress bez istniejącej wtyczki?


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;

  }


Źródło

Warto przeczytać!  Zaktualizuj meta użytkownika przez ajax z frontendu, zapisując problem