Hiển thị các bài đăng có nhãn Hướng dẫn Wordpress. Hiển thị tất cả bài đăng
Hiển thị các bài đăng có nhãn Hướng dẫn Wordpress. Hiển thị tất cả bài đăng

Thứ Năm, 20 tháng 11, 2014

Tự code chức năng đếm lượt xem và top bài xem nhiều

Trong thời gian qua có nhiều bạn thắc mắc thêm chức năng tự đếm lượt xem bài viết, kiểu như xem một lần thì lượt xem sẽ tăng lên một giá trị, và kết hợp với cái chức năng đếm lượt xem đó để làm tính năng widget hiển thị bài viết xem nhiều. Cái vấn đề mà mình thường thấy ở đây là có nhiều bạn tìm được plugin nhưng lại không có đủ chức năng cần, mà plugin có đủ tính năng thì lại hoạt động không tốt, không như ý muốn.

Vậy thì ở bài này, mình sẽ hướng dẫn bạn tự viết một plugin có chức năng đếm lượt xem cho post hoặc bất cứ cái gì, đồng thời hướng dẫn luôn cách viết code tạo widget hiển thị post nhiều trong tuần, tháng hoặc bao nhiêu ngày tùy ý bạn.

Tổng quan kỹ thuật


Ở bài hướng dẫn này, chúng ta sẽ làm việc với hai tính năng khá quan trọng và cũng rất thú vị trong WordPress đó là Custom Post Field để tạo khóa (meta key) chứa dữ liệu lượt xem (meta data) cho mỗi bài và tính năng tạo widget để làm cái widget hiển thị danh sách các bài theo thứ tự từ được xem nhiều đến thấp, kèm theo thumbnail và số lượt view nếu thích.

Sở dĩ ở đây chúng ta nên sử dụng Custom Post Field cho chức năng đếm lượt xem là vì con số lượt xem chúng ta có thể hiểu rằng nó là một dữ liệu thêm vào của mỗi bài viết, mà trong WordPress thì đã có Custom Post Field có nhiệm vụ cho phép chúng ta tạo ra những cái khóa (key) tùy ý và mỗi khóa đều sẽ có giá trị riêng của nó. Vậy thì việc sử dụng Custom Post Field để tạo ra một khóa riêng để xác định và sử dụng giá trị của nó như là con số lượt xem là điều hợp lý nhất và rút ngắn thời gian triển khai vì chỉ cần vài dòng code là được.

Còn đối với tính năng tạo widget hiển thị danh sách các bài xem nhiều thì chắc chắn sẽ sử dụng Query & Loop để liệt kê các bài viết xem nhiều ra rồi. Nhưng làm sao để lấy được các bài được xem nhiều, và làm sao lấy dữ liệu đó trong khoảng thời gian nhất định (7 ngày chẳng hạn)? May mắn thay, WordPress cho phép chúng ta tạo query và lấy dữ liệu dựa theo meta key (khóa của Custom Post Field) và chúng ta có thể sắp xếp lại kiểu dữ liệu này theo hướng giảm dần trong giá trị, thành ra chúng ta sẽ có danh sách các bài viết xem nhiều nhất.

Hướng dẫn chi tiết


1. Thiết lập plugin


Bước này quá dễ dàng rồi, chúng ta sẽ tạo một thư mục tên là topview trong thư mục /wp-content/plugins để chứa plugin, và trong thư mục này sẽ có 2 file tên là plugins.php styles.css như hình dưới.

topview-pluginstructure



Và trong file plugins.php ta có vài đoạn khai báo thông tin cho plugin như sau:

<?php
/*
 Plugin Name: PostView
 Plugin Author: ThachPham
 Description: Plugin đếm lượt xem bài viết và hiển thị top bài xem nhiều
 Version: 1.0
 Author URI: http://thachpham.com
 */

Tí nữa chúng ta sẽ viết code vào phía bên dưới. Bây giờ hãy tạm thời vào Plugins -> Installed Plugins và kích hoạt nó lên đi.

2. Viết code đếm lượt view


Code đếm lượt view ở đây khá ngắn gọn vì nó là tính năng đơn giản mà, chỉ có các dòng như sau:

function postview_set($postID) {
    $count_key = 'postview_number';
    $count = get_post_meta($postID, $count_key, true);
    if($count==''){
        $count = 0;
        delete_post_meta($postID, $count_key);
        add_post_meta($postID, $count_key, '0');
    }else{
        $count++;
        update_post_meta($postID, $count_key, $count);
    }
}

Trong code này, chúng ta sẽ tạo ra một hàm tên là postview_set() với ý nghĩa cụ thể là:


  • Dòng số 02 – 03: Thiết lập biến riêng để kiểm tra dữ liệu trong meta key, cái $count_key nghĩa là thiết lập tên metakey được lưu trong table wp_postmeta. Lưu ý là sau này nếu bạn đổi cái tên key này, tất cả giá trị sẽ được reset lại.

  • Dòng số 04 – 08: Kiểm tra xem cái meta key postview_number có dữ liệu chưa, nếu dữ liệu của nó là rỗng thì sẽ tiến hành tạo mới cho nó một meta key với tên postview_number ở trên. Đồng thời đưa biến $count về giá trị là 0.

  • Dòng số 08 – 11: Nếu meta key postview_number đã có dữ liệu (phủ định của việc không có dữ liệu thì nghĩa là đã có dữ liệu chứ còn gì) thì biến $count sẽ được tăng thêm một giá trị.

Vậy thì hàm này sẽ thực thi thế nào? Để hàm này chạy được, bạn phải đặt code sau vào file single.php trong theme đang sử dụng, và phải chèn nằm trong loop (trong cặp while):

<?php postview_set(get_the_ID()); ?>

topview-setviewfunction

Nghĩa là mỗi khi khách truy cập vào website thì hàm này sẽ được lặp lại một lần nữa và cập nhật vào database, cứ như thế, như thế sau mỗi lần khách truy cập, đó là lý do tại sao nếu website bạn đông lượt truy cập thì có thể tính năng này sẽ chiếm khá nhiều tài nguyên vì sửa dữ liệu liên tục.

3. Viết code hiển thị lượt xem


Ở code trên chúng ta chỉ tiến hành viết code cho việc cập nhật lượt xem thôi chứ chưa hiển thị ra, nếu bạn có nhu cầu hiển thị lượt xem ra trang nội dung bài viết thì chèn thêm đoạn sau vào file plugins.php

function postview_get($postID){
    $count_key = 'postview_number';
    $count = get_post_meta($postID, $count_key, true);
    if($count==''){
        delete_post_meta($postID, $count_key);
        add_post_meta($postID, $count_key, '0');
        return "0 lượt xem";
    }
    return $count.' lượt xem';
}

Đồng thời chèn thêm đoạn này vào dưới nó để tránh tình trạng một truy cập mà cộng tới 2 lượt xem:

remove_action( 'wp_head', 'adjacent_posts_rel_link_wp_head', 10, 0);

Đoạn code này cũng tương tự như code đếm lượt xem thôi, chỉ khác một cái là nó return thêm biến $count ra ngoài để hiển thị giá trị của meta key postview_number, tức là lượt xem. Sau đó bạn chèn đoạn sau vào file single.php ở vị trí cần hiển thị lượt xem, dĩ nhiên là phải đặt trong cặp while:

<?php echo postview_get(get_the_ID()); ?>

topview-getviewfunction

Tất nhiên bạn có thể chèn ở vị trí nào nếu thích trong cặp while vì mỗi theme có cấu trúc khác nhau và ý mỗi người mỗi khác nên mình không thể chỉ ra vị trí cụ thể để chèn được. Nhưng đẹp nhất là chèn kế bên các đoạn code hiển thị lượt bình luận, category, tên tác giả. Nếu bạn thấy file single.php của bạn có đoạn get_template_part('content',....) thì cứ tìm file content.php và content-xxx.php trong theme rồi chèn code vào tất cả file đó cũng được.

Kết quả sau khi chèn:

topview-getviewfunction-front

Lưu ý khi dùng các plugin tạo cache cho website như WP Super Cache, W3 Total Cache thì nó sẽ hiển thị lượt xem không chính xác và hàm này cũng vô tác dụng. Lý do là cache sẽ được lưu dưới dạng file tĩnh .html nên giá trị sẽ không thay đổi khi họ truy cập cho đến khi cache được xóa. Nhưng database cache và object cache thì vẫn làm việc, mình test thì thấy như vậy còn đối với bạn thế nào thì không chắc chắn lắm.

4. Viết widget hiển thị bài xem nhiều


Trước hết, để hiểu hết toàn bộ code nếu bạn chưa biết thì nên đọc qua hai bài này:


  • Hướng dẫn Query & Loop trong WordPress toàn tập

  • Hướng dẫn tạo widget trong 6 bước

Và code tạo widget hiển thị bài được xem nhiều ta sẽ có như sau, chèn vào file plugins.php luôn nhé:

/* Tạo widget hiển thị bài xem nhiều
 * @tham khảo tại http://bit.ly/1tY8TFn
 */

function create_topview_widget() {
    register_widget( 'TopView_Widget' );
}
add_action( 'widgets_init', 'create_topview_widget' );

class TopView_Widget extends WP_Widget {
    
    /*
     * Thiết lập tên widget và description của nó (Appearance -> Widgets)
     */
    function TopView_Widget() {
        $options = array(
           'classname' => 'topview',
            'description' => 'Xem bài viết xem nhiều nhất'
        );
        $this->WP_Widget('topview', 'Top View', $options);
    }
    
    /*
     * Tạo form điền tham số cho widget
     * ở đây ta có 3 form là title, postnum (số lượng bài) và postdate (tuổi của bài
     */
    function form($instance) {
        $default = array(
            'title' => 'Bài xem nhiều nhất',
            'postnum' => 5,
            'postdate' => 30
        );
        $instance = wp_parse_args( (array) $instance, $default );
        $title = esc_attr( $instance['title'] );
        $postnum = esc_attr( $instance['postnum'] );
        $postdate = esc_attr( $instance['postdate'] );
        
        echo "<label>Tiêu đề:</label> <input class='widefat' type='text' name='".$this->get_field_name('title')."' value='".$title."' />";
        echo "<label>Số lượng bài viết:</label> <input class='widefat' type='number' name='".$this->get_field_name('postnum')."' value='".$postnum."' />";
        echo "<label>Độ tuổi của bài viết (ngày)</label> <input class='widefat' type='number' name='".$this->get_field_name('postdate')."' value='".$postdate."' />";
    }
    
    /*
     * Cập nhật dữ liệu nhập vào form tùy chọn trong database
     */
    function update($new_instance, $old_instance) {
        $instance = $old_instance;
        $instance['title'] = strip_tags($new_instance['title']);
        $instance['postnum'] = strip_tags($new_instance['postnum']);
        $instance['postdate'] = strip_tags($new_instance['postdate']);
        return $instance;
    }
    
    function widget($args, $instance) {
        global $postdate; // Thiết lập biến $postdate là biến toàn cục để dùng ở hàm filter_where
        extract( $args );
        $title = apply_filters( 'widget_title', $instance['title'] );
        $postnum = $instance['postnum'];
        $postdate = $instance['postdate'];
        
        echo $before_widget;
        echo $before_title.$title.$after_title;
        
        $query_args = array(
            'post_per_page' => $postnum,
            'meta_key' => 'postview_number',
            'orderby' => 'meta_value_num',
            'order' => 'DESC',
            'ignore_sticky_posts' => -1
        );
        
        /*
         * Cách lấy bài viết theo độ tuổi (-30 days = lấy bài được 30 ngày tuổi)
         * @tham khảo tại http://bit.ly/1y7WXFp
         */
        function filter_where( $where = '' ) {
            global $postdate;
            $where .= " AND post_date > '" . date('Y-m-d', strtotime('-'.$postdate.' days')) . "'";
            return $where;
        }
        add_filter( 'posts_where', 'filter_where' );
        
        $postview_query = new WP_Query( $query_args );
        
        remove_filter( 'posts_where', 'filter_where' ); // Xóa filter để tránh ảnh hưởng đến query khác
        
        if ($postview_query->have_posts() ) :
            echo "<ul>";
            while ( $postview_query->have_posts() ) :
                $postview_query->the_post(); ?>

                    <li>
                        <?php /* Bỏ comment nếu muốn hiện thumbnail
                            if ( has_post_thumbnail() )
                                the_post_thumbnail( 'thumbnail' );
                            else
                                echo "</br><img src='http://dummyimage.com/50/000/fff&text=thach'>";
                            */
                        ?>
                        <a href="<?php the_permalink(); ?>"><?php the_title(); ?></a>
                    </li>
                    
            <?php endwhile;
            echo "</ul>";
            endif;
            echo $after_widget;
    }
}

Và bây giờ bạn vào Appearance -> Widget và kéo widget tên Top View vào sidebar và đặt tùy chọn cho nó là xong.

topview-widget

Nếu bạn đang sử dụng plugin WP-PostViews và muốn sử dụng widget này cho plugin đó thì chỉ việc đổi 'meta_key' => 'postview_number' thành 'meta_key' => 'views'.

5. Thêm CSS cho widget


Để widget mặc định thì nó chuối quá, ở đây mình có 1 vài đoạn CSS ngắn để bạn làm cái widget top bài xem nhiều nó có cái gì đó đặc biệt hơn một xíu. Tuy nhiên do chỉ là demo nên mình chẳng có làm gì nhiều ngoài việc đánh số thứ tự ho danh sách bài cả, do đó hãy tự viết thêm CSS nếu cần.

Chèn đoạn sau vào file styles.css

.topview ul {
    counter-reset: my-badass-counter;
}
.topview li:before {
    content: counter(my-badass-counter);
    counter-increment: my-badass-counter;
    padding: 5px 15px 8px 0;
    line-height: 1em;
    color: #7f7f7f;
    font-weight: bold;
    font-family: Arial!important;
    color: #A6A6A6;
    float: left;
}
.topview li {
    clear: both;
    margin: 10px 0;
    overflow: hidden;
}
.topview img {
    float: left;
    margin-right: 5px;
    width: 50px;
    height: 50px;
}

Đồng thời chèn đoạn sau vào file plugins.php để nó tự chèn file styles.css của plugin vào theme.

/*
 * Chèn CSS của plugin vào theme
 */
function custom_styles() {

 wp_register_style( 'topview-css', plugins_url( 'styles.css', __FILE__ ) , false, false, 'all' );
 wp_enqueue_style( 'topview-css' );

}
add_action( 'wp_enqueue_scripts', 'custom_styles' );

Bây giờ ta tạm có kết quả:

topview-widget-front

Vậy là xong bài rồi đấy. :D

6. Toàn bộ code trong bài


File plugins.php

<?php
/*
 Plugin Name: PostView
 Plugin Author: ThachPham
 Description: Plugin đếm lượt xem bài viết và hiển thị top bài xem nhiều
 Version: 1.0
 Author URI: http://thachpham.com
 */

// Set post view
function postview_set($postID) {
    $count_key = 'postview_number';
    $count = get_post_meta($postID, $count_key, true);
    if($count==''){
        $count = 0;
        delete_post_meta($postID, $count_key);
        add_post_meta($postID, $count_key, '0');
    }else{
        $count++;
        update_post_meta($postID, $count_key, $count);
    }
}
// Get post view
function postview_get($postID){
    $count_key = 'postview_number';
    $count = get_post_meta($postID, $count_key, true);
    if($count==''){
        delete_post_meta($postID, $count_key);
        add_post_meta($postID, $count_key, '0');
        return "0 lượt xem";
    }
    return $count.' lượt xem';
}

remove_action( 'wp_head', 'adjacent_posts_rel_link_wp_head', 10, 0);


/* Tạo widget hiển thị bài xem nhiều
 * @tham khảo tại http://bit.ly/1tY8TFn
 */

function create_topview_widget() {
    register_widget( 'TopView_Widget' );
}
add_action( 'widgets_init', 'create_topview_widget' );

class TopView_Widget extends WP_Widget {
     
    /*
     * Thiết lập tên widget và description của nó (Appearance -> Widgets)
     */
    function TopView_Widget() {
        $options = array(
           'classname' => 'topview',
            'description' => 'Xem bài viết xem nhiều nhất'
        );
        $this->WP_Widget('topview', 'Top View', $options);
    }
    
    /*
     * Tạo form điền tham số cho widget
     * ở đây ta có 3 form là title, postnum (số lượng bài) và postdate (tuổi của bài
     */
    function form($instance) {
        $default = array(
            'title' => 'Bài xem nhiều nhất',
            'postnum' => 5,
            'postdate' => 30
        );
        $instance = wp_parse_args( (array) $instance, $default );
        $title = esc_attr( $instance['title'] );
        $postnum = esc_attr( $instance['postnum'] );
        $postdate = esc_attr( $instance['postdate'] );
        
        echo "<label>Tiêu đề:</label> <input class='widefat' type='text' name='".$this->get_field_name('title')."' value='".$title."' />";
        echo "<label>Số lượng bài viết:</label> <input class='widefat' type='number' name='".$this->get_field_name('postnum')."' value='".$postnum."' />";
        echo "<label>Độ tuổi của bài viết (ngày)</label> <input class='widefat' type='number' name='".$this->get_field_name('postdate')."' value='".$postdate."' />";
    }
    
    /*
     * Cập nhật dữ liệu nhập vào form tùy chọn trong database
     */
    function update($new_instance, $old_instance) {
        $instance = $old_instance;
        $instance['title'] = strip_tags($new_instance['title']);
        $instance['postnum'] = strip_tags($new_instance['postnum']);
        $instance['postdate'] = strip_tags($new_instance['postdate']);
        return $instance;
    }
    
    function widget($args, $instance) {
        global $postdate; // Thiết lập biến $postdate là biến toàn cục để dùng ở hàm filter_where
        extract( $args );
        $title = apply_filters( 'widget_title', $instance['title'] );
        $postnum = $instance['postnum'];
        $postdate = $instance['postdate'];
        
        echo $before_widget;
        echo $before_title.$title.$after_title;
        
        $query_args = array(
            'post_per_page' => $postnum,
            'meta_key' => 'postview_number',
            'orderby' => 'meta_value_num',
            'order' => 'DESC',
            'ignore_sticky_posts' => -1
        );
        
        /*
         * Cách lấy bài viết theo độ tuổi (-30 days = lấy bài được 30 ngày tuổi)
         * @tham khảo tại http://bit.ly/1y7WXFp
         */
        function filter_where( $where = '' ) {
            global $postdate;
            $where .= " AND post_date > '" . date('Y-m-d', strtotime('-'.$postdate.' days')) . "'";
            return $where;
        }
        add_filter( 'posts_where', 'filter_where' );
        
        $postview_query = new WP_Query( $query_args );
        
        remove_filter( 'posts_where', 'filter_where' ); // Xóa filter để tránh ảnh hưởng đến query khác
        
        if ($postview_query->have_posts() ) :
            echo "<ul>";
            while ( $postview_query->have_posts() ) :
                $postview_query->the_post(); ?>

                    <li>
                        <?php /* Bỏ comment nếu muốn hiện thumbnail
                            if ( has_post_thumbnail() )
                                the_post_thumbnail( 'thumbnail' );
                            else
                                echo "</br><img src='http://dummyimage.com/50/000/fff&text=thach'>";
                            */
                        ?>
                        <a href="<?php the_permalink(); ?>"><?php the_title(); ?></a>
                    </li>
                    
            <?php endwhile;
            echo "</ul>";
            endif;
            echo $after_widget;
    }
}

/*
 * Chèn CSS của plugin vào theme
 */
function custom_styles() {

 wp_register_style( 'topview-css', plugins_url( 'styles.css', __FILE__ ) , false, false, 'all' );
 wp_enqueue_style( 'topview-css' );

}
add_action( 'wp_enqueue_scripts', 'custom_styles' );

File style.css

.topview ul {
    counter-reset: my-badass-counter;
}
.topview li:before {
    content: counter(my-badass-counter);
    counter-increment: my-badass-counter;
    padding: 5px 15px 8px 0;
    line-height: 1em;
    color: #7f7f7f;
    font-weight: bold;
    font-family: Arial!important;
    color: #A6A6A6;
    float: left;
}
.topview li {
    clear: both;
    margin: 10px 0;
    overflow: hidden;
}
.topview img {
    float: left;
    margin-right: 5px;
    width: 50px;
    height: 50px;
}

Giải pháp đếm view và tương thích với cache


Trong bài này mình chỉ hướng dẫn bạn làm tính năng đếm view đơn giản nên nó sẽ không thể tương thích với cache vì lý do mình đã giải thích trong bài rồi. Nhưng mình nghĩ có một giải pháp khác có thể làm cái đếm view này rất tốt và tương thích với cache đó là sử dụng AJAX để sửa đổi giá trị meta key và sử dụng AJAX để lấy dữ liệu trong database để hiển thị ra ngoài.

Lý do sử dụng AJAX có thể tương thích với cache đó là dù trang bạn có cache hay không có cache thì các file Javascript vẫn xử lý bình thường, do vậy việc sử dụng AJAX bạn có thể hiểu là nó sẽ chỉ lấy dữ liệu ra sau khi trang được tải xong nên việc có cache hay không đều không quan trọng. Nhưng còn cụ thể thế nào thì mình sẽ test nhiều hơn rồi viết hướng dẫn sau.

Lời kết


Bài tới đây có vẻ cũng dài rồi, và hy vọng với cách giải thích của mình bạn có thể hiểu được tính năng này làm việc như thế nào và quan trọng nhất là cách xây dựng bộ tính năng này. Bài vẫn còn cơ bản nên sẽ còn nghèo ý tưởng, nếu bạn có thêm ý tưởng nào để phát triển code tối ưu hơn thì hãy chia sẻ thêm cho mình ở phần bình luận nhé.
Continue Reading

Hướng dẫn WP Super Cache toàn tập

Mục lục nội dung

I. Cài đặt WP Super Cache

1.1) Cài đặt trên Shared Hosting hoặc Webserver Apache

1.2) Cài đặt trên webserver NGINX (LEMP)

II. Kích hoạt WP Super Cache

III. Quản lý các file cache

III. Thiết lập WP Super Cache tối ưu

IV. Sửa lỗi timestamp

V. Một số lưu ý khi dùng WP Super Cache

VI. WP Super Cache cho Woocommerce

Lời kết



WP Super Cache là một trong những plugin miễn phí tốt nhất để hỗ trợ tăng tốc website WordPress bằng công nghệ tạo bộ nhớ đệm (cache) dành cho các website nhỏ và vừa, mà cụ thể là sử dụng phương thức HTML Cache. Sở dĩ nó được xếp vào danh sách plugin tốt nhất không chỉ vì hiệu suất sử dụng mà nó còn có cách sử dụng rất dễ, phù hợp với những người mới tiếp xúc với WordPress.

Ở trong bài này, mình sẽ nói qua toàn bộ những vấn đề về plugin WP Super Cache như cách cài đặt trên nhiều loại webserver, ý nghĩa của từng thiết lập và cách cấu hình sao cho hợp chuẩn để website đạt tốc độ cao.

Nên xem trước: Các phương thức Caching trong WordPress và khi nào nên dùng.

I. Cài đặt WP Super Cache


1.1) Cài đặt trên Shared Hosting hoặc Webserver Apache


Hầu hết các Shared Hosting đều sử dụng webserver Apache nên nếu bạn sử dụng máy chủ riêng đang sử dụng Apache thì cách cài đặt chẳng khác gì với cách cài đặt trên Shared Hosting.

Để xem cách cài đặt WP Super Cache dành cho Shared Hosting/Apache, hãy làm theo phần hướng dẫn này.

Note: Hãy chắc chắn rằng file .htaccess trong thư mục public_html của website bạn đang CHMOD là 644. Mình khuyến khích bạn dùng WordPress tại các nhà cung cấp Shared Hosting phù hợp với WordPress cũng vì lý do này.

1.2) Cài đặt trên webserver NGINX (LEMP)


Để cài đặt trên NGINX và PHP-FPM (LEMP), thì đầu tiên hãy chắc chắn rằng bạn đã cấp quyền cho user nginx và PHP-FPM sở hữu thư mục chứa website.

chown -R nginx:nginx /home/website/domain.com/public_html

Sau đó vào Plugins -> Add New và cài đặt WP Super Cache như bình thường. Kích hoạt xong, thì việc bạn cần làm đầu tiên là mở file cấu hình domain đang sử dụng trong NGINX và thêm đoạn này vào giữa cặp server {....}.

 set $cache_uri $request_uri;

 # POST requests and urls with a query string should always go to PHP
 if ($request_method = POST) {
  set $cache_uri 'null cache';
 }
 if ($query_string != "") {
  set $cache_uri 'null cache';
 }   

 # Don't cache uris containing the following segments
 if ($request_uri ~* "(/wp-admin/|/xmlrpc.php|/wp-(app|cron|login|register|mail).php|wp-.*.php|/feed/|index.php|wp-comments-popup.php|wp-links-opml.php|wp-locations.php|sitemap(_index)?.xml|[a-z0-9_-]+-sitemap([0-9]+)?.xml)") {
  set $cache_uri 'null cache';
 }   

 # Don't use the cache for logged in users or recent commenters
 if ($http_cookie ~* "comment_author|wordpress_[a-f0-9]+|wp-postpass|wordpress_logged_in") {
  set $cache_uri 'null cache';
 }

Kế tiếp bạn tìm cặp localtion / {....} và thay thành thế này:

#Load from cache
location / {
     try_files /wp-content/cache/supercache/$http_host/$cache_uri/index.html $uri $uri/ /index.php ;
}

Và đây là ví dụ của mình:

server {
 listen  80;
 server_name thach.dev www.thach.dev;

 # The Document Root
 root  /home/thach/public_html;
 error_log /usr/local/apps/nginx/var/log/thach.dev.err;
 access_log /usr/local/apps/nginx/var/log/thach.dev.log main;

 set $cache_uri $request_uri;

 # POST requests and urls with a query string should always go to PHP
 if ($request_method = POST) {
  set $cache_uri 'null cache';
 }
 if ($query_string != "") {
  set $cache_uri 'null cache';
 }   

 # Don't cache uris containing the following segments
 if ($request_uri ~* "(/wp-admin/|/xmlrpc.php|/wp-(app|cron|login|register|mail).php|wp-.*.php|/feed/|index.php|wp-comments-popup.php|wp-links-opml.php|wp-locations.php|sitemap(_index)?.xml|[a-z0-9_-]+-sitemap([0-9]+)?.xml)") {
  set $cache_uri 'null cache';
 }   

 # Don't use the cache for logged in users or recent commenters
 if ($http_cookie ~* "comment_author|wordpress_[a-f0-9]+|wp-postpass|wordpress_logged_in") {
  set $cache_uri 'null cache';
 }

 # Load from cache
 location / {
  try_files /wp-content/cache/supercache/$http_host/$cache_uri/index.html $uri $uri/ /index.php ;
 } 

}

Các đoạn minh bôi đậm là những đoạn bạn cần chèn vào.

II. Kích hoạt WP Super Cache


Vài trường hợp sau khi cài đặt, bạn truy cập vào Settings -> WP Super Cache sẽ thấy thông báo này:


Cảnh báo CONSTANT trong wp-config.php của WP Super Cache
Cảnh báo CONSTANT trong wp-config.php của WP Super Cache
Thông báo này có nghĩa là file wp-config.php của bạn chưa có đoạn define( 'WP_CACHE', true ); nhưng nếu file wp-config.php của bạn đang CHMOD là 644 thì nó sễ có quyền ghi vào tự động, do đó bạn chỉ cần ấn nút Update Status là nó cập nhật vào, thông báo sẽ ẩn đi.

Để kích hoạt, bạn chọn Caching On trong tab Easy và ấn Update Status.


Kích hoạt WP Super Cache
Kích hoạt WP Super Cache
Sau đó để kiểm tra xem cache đã được bật hay chưa, bạn hãy vào website bằng trình duyệt khác (không đăng nhập vào website) và ấn Ctrl + U để xem source của website, kéo xuống dưới cùng xem có đoạn này hay không, nếu có là thành công.

wp-super-cache-checkcache

III. Quản lý các file cache


Để xem danh sách các trang đã được lưu cache, bạn vào tab Contents và ấn List all cached files.

wp-super-cache-listcached

Nó sẽ hiển thị danh sách các trang được lưu cache thế này:

wp-super-cache-listcached02

Bạn có thể ấn vào nút X của mỗi trang để xóa cache của trang đó đi.

III. Thiết lập WP Super Cache tối ưu


Để thiết lập WP Super Cache nâng cao, bạn cần chuyển sang tab Advanced.

Tại đây, bạn hãy click vào các tùy chọn sau (các tùy chọn khác đã được chọn thì không cần bỏ chọn):

Cache hits to this website for quick access. (Recommended)

Dòng này sẽ được đánh dấu vào nếu bạn đã bật WP Super Cache ở tab Easy.

Use mod_rewrite to serve cache files. (Recommended)

Sử dụng phương thức rewrite đường dẫn để load file cache nhanh hơn. Hãy chắc chắn là file .htaccess (đối với Apache/Shared Hosting) đang CHMOD là 644 vì chút nữa ta sẽ cần cập nhật nội dung file này, đối với NGINX thì không cần vì ở trên mình đã kêu bạn chèn các quy tắc ghi đường dẫn của WP Super Cache.

Compress pages so they’re served more quickly to visitors. (Recommended)

Nén file cache thành dạng gzip để giảm dung lượng của website nhằm load nhanh hơn.

Don’t cache pages for known users. (Recommended)

Không load file cache nếu bạn đăng nhập, nếu bạn là quản trị thì sẽ hơi rắc rối nếu bạn bật cache cho người quản trị vì khi cần thay đổi cái gì đó, bạn phải xóa cache.

Only refresh current page when comments made.

Nếu bạn sử dụng hệ thống bình luận trong WordPress thì tùy chọn này sẽ tự xóa cache của trang có bình luận mới để tránh các trường hợp thành viên comment xong lại không thấy comment của mình do cache.

Đánh dấu xong, hãy ấn vào nút Update Status để hoàn tất.

Sau đó bạn kéo xuống, tìm nút Update Mod_Rewrite Rules rồi ấn vào để nó tự thêm nội dung file .htaccess nếu bạn sử dụng phương thức rewrite đường dẫn để load cache (NGINX không cần làm).

wp-supercache-updatemodrewrite

Nếu nó hiện ra bảng màu xanh lá cây thì bạn đã làm thành công.

Trường hợp nó không tự chèn nội dung đó vào file .htaccess do phân quyền thì bạn hãy bấm vào nút View Mod_Rewrite Rules và copy bỏ vào file .htaccess ngoài thư mục gốc của website thủ công.

Xem hình ảnh thiết lập của mình (ảnh lớn)

IV. Sửa lỗi timestamp


wp-supercache-timestamp

Lỗi timestamp này nghĩa là thời gian lưu file cache được đánh dấu trên server không trùng khớp với mốc thời gian trên máy tính. Thực tế lỗi này chẳng chết ai nếu bạn đã làm bước kiểm tra cache ở phần II nhưng bạn có thể làm thử cách sau để fix thông báo này:


  1. Thay đổi múi giờ trong website phù hợp với máy tính của bạn (Settings -> General).

  2. Xóa toàn bộ cache (WP Super Cache -> Contents -> Delete Cache) và vào trình duyệt khác truy cập vào website.

  3. Ấn lại nút Test Cache.

Nếu nó vẫn báo lỗi thì kệ nó, miễn sao khi bạn log out ra, website vẫn tải nhanh do có cache là được.

V. Một số lưu ý khi dùng WP Super Cache



  • Các plugin/code hỗ trợ đếm lượt xem bài viết không hoạt động chính xác do nó chỉ đếm lượt truy cập khi trang đó không có cache.

  • Lỗi trắng trang/404 nếu bạn dùng SSL/HTTPS.

  • Khi chuyển host, nên gỡ plugin WP Super Cache ra nếu không muốn bị lỗi trắng trang do sai đường dẫn thiết lập trong wp-config.php. Sau đó cài lại WP Super Cache trên host mới.

  • Nếu bạn dùng các host yếu, nên sử dụng tùy chọn “Use PHP to serve cache files” thay cho “Use mod_rewrite to serve cache files”.

  • Nếu vẫn bị lỗi trắng trang khi cài WP Super Cache là khả năng tương thích trên host bạn hơi kém, hãy đọc file error log.

  • Nên tắt plugin khi chuyển host.

  • Nếu bạn đang dùng các plugin bảo mật như iThemes Security, Bullef Proof Security,…thì có thể nó sẽ chặn ghi nội dung vào file wp-config.php và .htaccess, hãy tạm tắt các plugin này trước khi cài đặt.

VI. WP Super Cache cho Woocommerce


Nếu bạn đang dùng Woocommerce để làm website bán hàng thì có thể WP Super Cache sẽ làm cho trang giỏ hàng và thanh toán không thể hoạt động được do nó được lưu cache. Do vậy, hãy tiến hành đặt đoạn dưới đây vào phần Accepted Filenames & Rejected URIs trong tab Advanced và chọn Pages như hình dưới.

wp-supercache-excludepage

Lời kết


Thực ra plugin WP Super Cache không có nhiều tùy chọn để phải hướng dẫn nhiều nên trong bài này chỉ có vậy thôi, nó vốn nổi tiếng tuy đơn giản nhưng có hiệu suất sử dụng rất tốt và tương thích hầu hết mọi cấu hình của host nên bạn hoàn toàn yên tâm. Cũng nói luôn rằng nếu bạn bị lỗi trắng trang hay 500 khi dùng WP Super Cache thì nên đọc file error log để xác định nguyên nhân mặc dù khả năng này xảy ra là rất hiếm.

Bài viết Hướng dẫn WP Super Cache toàn tập được giữ bản quyền bởi Thach Pham
Continue Reading

About Us

Like Us

Designed By Seo Blogger Templates- Published By Gooyaabi Templates