Wednesday, April 15, 2015

Cách sử dụng Page Fragment Caching của plugin W3 Total Cache để load dữ liệu động

W3 Total Cache là plugin hữu dụng cho Wordpress để cải thiện tốc độ và hiệu năng của website. Tuy nhiên để có thể load dữ liệu tùy biến thì nhiều khi bạn sẽ gặp khó khăn, chẳng hạn như: bạn muốn hiển thị một thông tin ngẫu nhiên trên footer của website

Để làm được điều đó ta có thể sử dụng kĩ thuật Page Fragment Caching như sau:

1. Thêm định nghĩa sau trong file wp-config.php


define('W3TC_DYNAMIC_SECURITY', 'somesecurestring');

2. Với đoạn code PHP cần load động (không sử dụng tính năng cache của W3 Total Cache) ta hoặc sử dụng 1 trong các cách sau:

 

Cách 1:
<!-- mfunc somesecurestring any PHP code --><!-- /mfunc somesecurestring -->

Cách 2:
<!-- mfunc somesecurestring -->any PHP code<!-- /mfunc somesecurestring -->

Cách 3:
<!--MFUNC somesecurestring -->
echo rand();
<!--/mfunc somesecurestring -->

Lưu ý: 
- Mọi người hay nhầm lẫn việc sử dụng W3TC_DYNAMIC_SECURITY thay vì somesecurestring đứng sau mfunc.
- Nhớ xóa Page Cache để thay đổi có tác dụng nhé!

Nếu không được thì có thể bạn phải thêm mfunc trong mục Ignored comment stems của Minify setting như hình dưới


[Genesis] Hiển thị nội dung bên dưới bài viết theo danh mục

Chào mọi người, hôm nay mình có 1 nhiệm vụ chỉnh sửa cho 1 website sử dụng Genesis Wordpress. Cụ thể:

- Thêm vào cuối mỗi bài viết (Post) một khung quảng cáo nhỏ mà nội dung của nó được lấy từ dữ liệu của danh mục của bài viết.



Sau đây là cách làm của mình:

1. Thêm 3 trường mới vào category để khi tạo mới / hoặc chỉnh sửa thì có thể thay đổi:

- Ảnh quảng cáo: ad_img
- Tiêu đề quảng cáo: ad_title
- Đường dẫn bài quảng cáo: ad_url

Trong file functions.php của theme đang sử dụng cho website Wordpress, thêm đoạn code sau:

//add extra fields to category edit form hook
add_action ( 'edit_category_form_fields', 'extra_category_fields');
//add extra fields to category edit form callback function
function extra_category_fields( $tag ) {    //check for existing featured ID
    $t_id = $tag->term_id;
    $cat_meta = get_option( "category_$t_id");
?>

<tr class="form-field">
    <th scope="row" valign="top"><label for="Cat_meta[ad_img]"><?php _e('Ad Image Url'); ?></label></th>
    <td>
        <input type="text" name="Cat_meta[ad_img]" id="Cat_meta[ad_img]" size="40" value="<?php echo $cat_meta['ad_img'] ? $cat_meta['ad_img'] : ''; ?>"><br />
        <span class="description"><?php _e('The image is shown on post pages of this category'); ?></span>
    </td>
</tr>
<tr class="form-field">
    <th scope="row" valign="top"><label for="Cat_meta[ad_title]"><?php _e('Ad Title'); ?></label></th>
    <td>
        <input type="text" name="Cat_meta[ad_title]" id="Cat_meta[ad_title]" size="40" value="<?php echo $cat_meta['ad_title'] ? $cat_meta['ad_title'] : ''; ?>"><br />
        <span class="description"><?php _e('The Ad Title is used for the ad title on page posts of this category'); ?></span>
    </td>
</tr>
<tr class="form-field">
    <th scope="row" valign="top"><label for="Cat_meta[ad_url]"><?php _e('Ad Url'); ?></label></th>
    <td>
        <input type="text" name="Cat_meta[ad_url]" id="Cat_meta[ad_url]" size="40" value="<?php echo $cat_meta['ad_url'] ? $cat_meta['ad_url'] : ''; ?>"><br />
        <span class="description"><?php _e('The Ad Url is used for the adlink on page posts of this category'); ?></span>
    </td>
</tr>
<tr class="form-field">
    <th scope="row" valign="top"><label for="Cat_meta[ad_text]"><?php _e('Ad Text'); ?></label></th>
    <td>
        <textarea name="Cat_meta[ad_text]" id="Cat_meta[ad_text]" rows="5" cols="50" class="large-text"><?php echo $cat_meta['ad_text'] ? $cat_meta['ad_text'] : ''; ?></textarea><br />
        <span class="description"><?php _e('The Ad Text is used for the ad copy on page posts of this category'); ?></span>
    </td>
</tr>
<?php
}

// save extra category extra fields hook
add_action ( 'edited_category', 'save_extra_category_fileds');
   // save extra category extra fields callback function
function save_extra_category_fileds( $term_id ) {
    if ( isset( $_POST['Cat_meta'] ) ) {
        $t_id = $term_id;
        $cat_meta = get_option( "category_$t_id");
        $cat_keys = array_keys($_POST['Cat_meta']);
            foreach ($cat_keys as $key){
            if (isset($_POST['Cat_meta'][$key])){
                $cat_meta[$key] = $_POST['Cat_meta'][$key];
            }
        }
        //save the option array
        update_option( "category_$t_id", $cat_meta );
    }
}
2. Lấy dữ liệu meta của Category và hiển thị trong mỗi bài viết:

Thêm đoạn code cũng vào functions.php:

add_action( 'genesis_entry_footer', 'wpsites_after_post_widget', 5 );
function wpsites_after_post_widget() {
    if ( is_single() ) {
        /* genesis_widget_area( 'after-post', array(
            'before' => '<div class="after-post" class="widget-area">',
            'after'  => '</div>',
        ) ); */
        $categories = get_the_category();
        $output = '';
        if($categories){
            foreach($categories as $category) {$cat_data = get_option("category_$cat_id");
                $cat_data = get_option("category_{$category->term_id}");
                if (isset($cat_data['ad_title'])) { ?>
                    <section class="author-box" style="border: #0E4E81 2px dashed;"><?php if (!empty($cat_data['ad_img'])): ?><img src="<?=$cat_data['ad_img']?>" class="avatar avatar-70 photo" width="70" height="70" alt="<?=$cat_data['ad_title']?>"><?php endif?><a href="<?=$cat_data['ad_url']?>" title="<?=$cat_data['ad_title']?>"><h4 class="author-box-title"><?=$cat_data['ad_title']?></h4></a><div class="author-box-content"><?=$cat_data['ad_text']?></div><a href="<?=$cat_data['ad_url']?>" title="<?=$cat_data['ad_title']?>"><img src="http://example.com/wp-content/uploads/2015/04/xem-bai-thuoc-chua-khoi-benh-tri.jpg" alt="<?=$cat_data['ad_title']?>" style="padding-top: 20px;display: block;margin: 0 auto;"/></a></section>
            <?php }
            }
        }
    }
}
Phần html sử dụng bên trên bạn hoàn toàn có thể thay đổi tùy ý.

Bạn có cách làm nào khác không? Đừng ngại comment chia sẻ bên dưới cho mọi người và mình biết cách làm khác của bạn nhé!

Tuesday, April 14, 2015

Dùng GMAIL để nhận hoặc gửi thay cho một địa chỉ email khác

Chào các bạn,

Có lẽ chúng ta đều biết tới dịch thư điện tử của Google (Gmail), phải nói đây là dịch vụ miễn phí và rất chất lượng. Vì việc quen dùng Gmail mà nhiều khi chúng ta muốn sử dụng chính Gmail để gửi/nhận từ một địa chỉ email khác ví dụ email@example.com.

Để thực hiện được việc gửi/nhận đó đòi hỏi email@example.com được cài đặt trên mail server có hỗ trợ các giao thức IMAP, POP.

NKTGL sẽ hướng dẫn các bạn cài đặt từng bước một để có thể gửi/nhận email@example.com bên trong Gmail.

1. Đăng nhập Gmail, ấn nút Settings ở góc phải trên

Vào trang cài đặt của Gmail
 2. Chọn Account & Import


Trong trang này ta có thể thực hiện:
- Thêm & cài đặt địa chỉ email khác mà bạn muốn nhận thư gửi tới địa chỉ đó cũng vào trong Gmail.
- Thêm & cài đặt địa chỉ email khác mà bạn muốn gửi được thư từ địa chỉ đó qua tài khoản Gmail.

3. Thêm địa chỉ email để nhận trong Gmail (Add a POP3 mail account you own)

Nhập địa chỉ email rồi Next Step để chuyển sang bước tiếp theo

Nhập các thông tin email username, password, cấu hình server (cái này phải hỏi nhà cung cấp dịch vụ email hoặc admin hệ thống). Sau đó ấn Add Account.

Nếu thành công thì sẽ xuất hiện thêm dòng email mới đăng ký như hình dưới:


4. Thêm địa chỉ email để gửi qua tài khoản Gmail

Nhập địa chỉ email, rồi chuyển qua bước dưới

Nhập các thông số mà nhà cung cấp dịch vụ email hoặc admin hệ thống báo cho bạn
Sau khi ấn Add Account thành công, sẽ có 1 email được gửi tới địa chỉ email của bạn (trong ví dụ là: email@example.com). Để hoàn tất bạn quá trình cài đặt ta phải click vào đường dẫn trong nội dung thư đó. Sau khi thành công bạn sẽ được kết quả:


Khi gửi thư từ Gmail ta có thể lựa chọn



Nếu bạn có thắc mắc hay không hiểu rõ cách làm này đừng ngại comment bên dưới hoặc email trực tiếp cho mình nhé!

Thân mến!

Monday, April 13, 2015

Cách chặn các dải địa chỉ IP bằng file .htaccess

Một cách hiệu quả để chặn truy cập vào website đối với 1 dải IP, chẳng hạn như IP đến từ 1 quốc gia, là dùng file .htaccess.

Hãy xem ví dụ sau để biết cách sử dụng file .htaccess để chặn IP đến từ Trung Quốc,  India (IN), Bangladesh (BD) and Pakistan (PK), Philippines (PH)

order allow,deny
allow from all

# Get up-to-date list (in .htaccess format) from http://www.wizcrafts.net/chinese-blocklist.html
# China IP Address Blocks
deny from 1.80.0.0/13 1.92.0.0/14 1.192.0.0/13 1.202.0.0/15 1.204.0.0/14 14.144.0.0/12 14.208.0.0/12 23.80.54.0/24 23.104.141.0/24 23.105.14.0/24 27.8.0.0/13 27.16.0.0/12 27.36.0.0/14 27.40.0.0/13 27.50.128.0/17 27.54.192.0/18 27.106.128.0/18 27.115.0.0/17 27.148.0.0/14 27.152.0.0/13 27.184.0.0/13 36.32.0.0/14 36.248.0.0/14 42.96.128.0/17 42.120.0.0/15 58.16.0.0/15 58.20.0.0/16 58.21.0.0/16 58.22.0.0/15 58.34.0.0/16 58.37.0.0/16 58.38.0.0/16 58.40.0.0/16 58.42.0.0/16 58.44.0.0/14 58.48.0.0/13 58.56.0.0/15 58.58.0.0/16 58.59.0.0/17 58.60.0.0/14 58.68.128.0/17 58.82.0.0/15 58.100.0.0/15 58.208.0.0/12 58.242.0.0/15 58.246.0.0/15 58.248.0.0/13 59.32.0.0/12 59.51.0.0/16 59.52.0.0/14 59.56.0.0/13 59.72.0.0/16 59.108.0.0/15 59.172.0.0/14 60.0.0.0/13 60.11.0.0/16 60.12.0.0/16 60.24.0.0/13 60.160.0.0/11 60.194.0.0/15 60.208.0.0/13 60.216.0.0/15 60.220.0.0/14 61.4.64.0/20 61.4.80.0/22 61.4.176.0/20 61.48.0.0/13 61.128.0.0/10 61.135.0.0/16 61.136.0.0/18 61.139.0.0/16 61.145.73.208/28 61.147.0.0/16 61.150.0.0/16 61.152.0.0/16 61.154.0.0/16 61.160.0.0/16 61.162.0.0/15 61.164.0.0/16 61.175.0.0/16 61.177.0.0/16 61.179.0.0/16 61.183.0.0/16 61.184.0.0/16 61.185.219.232/29 61.187.0.0/16 61.188.0.0/16 61.232.0.0/14 61.236.0.0/15 61.240.0.0/14 101.64.0.0/13 101.72.0.0/14 101.76.0.0/15 101.80.0.0/12 103.253.4.0/22 106.112.0.0/13 110.6.0.0/15 110.51.0.0/16 110.52.0.0/15 110.80.0.0/13 110.88.0.0/14 110.96.0.0/11 110.173.0.0/19 110.173.32.0/20 110.173.64.0/18 110.192.0.0/11 110.240.0.0/12 111.0.0.0/10 111.72.0.0/13 111.121.0.0/16 111.128.0.0/11 111.160.0.0/13 111.172.0.0/14 111.176.0.0/13 111.228.0.0/14 112.0.0.0/10 112.64.0.0/14 112.80.0.0/12 112.100.0.0/14 112.111.0.0/16 112.122.0.0/15 112.224.0.0/11 113.0.0.0/13 113.8.0.0/15 113.12.0.0/14 113.16.0.0/15 113.18.0.0/16 113.62.0.0/15 113.64.0.0/10 113.128.0.0/15 113.136.0.0/13 113.194.0.0/15 113.204.0.0/14 114.28.0.0/16 114.80.0.0/12 114.96.0.0/13 114.104.0.0/14 114.112.0.0/14 112.109.128.0/17 114.216.0.0/13 114.224.0.0/11 115.24.0.0/15 115.28.0.0/15 115.32.0.0/14 115.48.0.0/12 115.84.0.0/18 115.100.0.0/15 115.148.0.0/14 115.152.0.0/15 115.168.0.0/14 115.212.0.0/16 115.230.0.0/16 115.236.96.0/23 115.236.136.0/22 115.239.228.0/22 116.1.0.0/16 116.2.0.0/15 116.4.0.0/14 116.8.0.0/14 116.16.0.0/12 116.52.0.0/14 116.76.0.0/15 116.90.80.0/20 116.112.0.0/14 116.128.0.0/10 116.204.0.0/15 116.208.0.0/14 116.224.0.0/12 116.254.128.0/18 117.8.0.0/13 117.21.0.0/16 117.22.0.0/15 117.24.0.0/13 117.32.0.0/13 117.40.0.0/14 117.44.0.0/15 117.79.224.0/20 117.80.0.0/12 117.136.0.0/13 118.26.0.0/16 118.72.0.0/13 118.112.0.0/13 118.120.0.0/14 118.132.0.0/14 118.144.0.0/14 118.180.0.0/14 118.186.0.0/15 118.192.0.0/16 118.248.0.0/13 119.0.0.0/13 119.8.0.0/16 119.10.0.0/17 119.18.192.0/20 119.36.0.0/16 119.57.0.0/16 119.60.0.0/16 119.88.0.0/14 119.96.0.0/13 119.112.0.0/13 119.120.0.0/13 119.128.0.0/12 119.144.0.0/14 119.164.0.0/14 119.176.0.0/12 119.233.0.0/16 120.0.0.0/12 120.24.0.0/14 120.32.0.0/13 120.40.0.0/14 120.68.0.0/14 120.80.0.0/13 120.192.0.0/10 121.0.16.0/20 121.8.0.0/13 121.16.0.0/12 121.32.0.0/14 121.60.0.0/14 121.76.0.0/15 121.196.0.0/14 121.204.0.0/14 121.224.0.0/12 122.10.128.0/17 122.51.128.0/17 122.64.0.0/11 122.119.0.0/16 122.136.0.0/13 122.156.0.0/14 122.188.0.0/14 122.192.0.0/14 122.198.0.0/16 122.200.64.0/18 122.224.0.0/12 123.4.0.0/14 123.8.0.0/13 123.52.0.0/14 123.64.0.0/11 123.97.128.0/17 123.100.0.0/19 123.112.0.0/12 123.128.0.0/13 123.138.0.0/15 123.150.0.0/15 123.152.0.0/13 123.164.0.0/14 123.180.0.0/14 123.184.0.0/14 123.196.0.0/15 123.232.0.0/14 123.249.0.0/16 124.42.64.0/18 124.64.0.0/15 124.67.0.0/16 124.73.0.0/16 124.114.0.0/15 124.126.0.0/15 124.128.0.0/13 124.160.0.0/15 124.162.0.0/16 124.163.0.0/16 124.192.0.0/15 124.200.0.0/13 124.226.0.0/15 124.228.0.0/14 124.236.0.0/14 124.240.0.0/17 124.240.128.0/18 124.248.0.0/17 125.36.0.0/14 125.40.0.0/13 125.64.0.0/12 125.79.0.0/16 125.80.0.0/13 125.88.0.0/13 125.104.0.0/13 125.112.0.0/12 125.210.0.0/15 140.224.0.0/16 140.237.0.0/16 140.246.0.0/16 140.249.0.0/16 159.226.0.0/16 171.34.0.0/15 171.36.0.0/14 171.40.0.0/13 175.0.0.0/12 175.16.0.0/13 175.24.0.0/14 175.30.0.0/15 175.42.0.0/15 175.44.0.0/16 175.46.0.0/15 175.48.0.0/12 175.64.0.0/11 175.102.0.0/16 175.106.128.0/17 175.146.0.0/15 175.148.0.0/14 175.152.0.0/14 175.160.0.0/12 175.178.0.0/16 175.184.128.0/18 175.185.0.0/16 175.186.0.0/15 175.188.0.0/14 180.76.0.0/16 180.96.0.0/11 180.136.0.0/13 180.152.0.0/13 180.208.0.0/15 182.18.0.0/17 182.32.0.0/12 182.88.0.0/14 182.112.0.0/12 182.128.0.0/12 183.0.0.0/10 183.64.0.0/13 183.129.0.0/16 183.148.0.0/16 183.160.0.0/12 183.184.0.0/13 183.192.0.0/11 192.34.109.224/28 192.74.224.0/19 198.2.203.64/28 198.2.212.160/28 202.43.144.0/22 202.46.32.0/19 202.66.0.0/16 202.75.208.0/20 202.96.0.0/12 202.111.160.0/19 202.112.0.0/14 202.117.0.0/16 202.165.176.0/20 202.196.80.0/20 203.69.0.0/16 203.86.0.0/18 203.86.64.0/19 203.93.0.0/16 203.169.160.0/19 203.171.224.0/20 210.5.0.0/19 210.14.128.0/19 210.21.0.0/16 210.32.0.0/14 210.51.0.0/16 210.52.0.0/15 210.77.0.0/16 210.192.96.0/19 211.76.96.0/20 211.78.208.0/20 211.86.144.0/20 211.90.0.0/15 211.92.0.0/14 211.96.0.0/13 211.136.0.0/13 211.144.12.0/22 211.144.96.0/19 211.144.160.0/20 211.147.0.0/16 211.152.14.0/24 211.154.64.0/19 211.154.128.0/19 211.155.24.0/22 211.157.32.0/19 211.160.0.0/13 211.233.70.0/24 218.0.0.0/11 218.56.0.0/13 218.64.0.0/11 218.84.0.0/14 218.88.0.0/13 218.96.0.0/14 218.102.0.0/16 218.104.0.0/14 218.108.0.0/15 218.194.80.0/20 218.200.0.0/13 218.240.0.0/13 219.128.0.0/11 219.154.0.0/15 219.223.192.0/18 219.232.0.0/16 219.234.80.0/20 219.235.0.0/16 220.112.0.0/16 220.154.0.0/15 220.160.0.0/11 220.181.0.0/16 220.191.0.0/16 220.192.0.0/12 220.228.70.0/24 220.242.0.0/15 220.248.0.0/14 220.250.0.0/19 220.252.0.0/16 221.0.0.0/12 221.122.0.0/15 221.176.0.0/13 221.192.0.0/14 221.200.0.0/14 221.204.0.0/15 221.206.0.0/16 221.207.0.0/16 221.208.0.0/12 221.212.0.0/15 221.214.0.0/15 221.216.0.0/13 221.224.0.0/13 221.228.0.0/14 221.232.0.0/13 222.32.0.0/11 222.64.0.0/12 222.80.0.0/12 222.132.0.0/14 222.136.0.0/13 222.168.0.0/13 222.172.222.0/24 222.176.0.0/13 222.184.0.0/13 222.200.0.0/16 222.208.0.0/13 222.219.0.0/16 222.220.0.0/15 222.240.0.0/13 223.4.0.0/14 223.64.0.0/11 223.144.0.0/12 223.240.0.0/13

# India (IN), Bangladesh (BD) and Pakistan (PK)
deny from 14.96.0.0/14 14.139.0.0/16 14.194.0.0/15 27.248.0.0/14 27.255.0.0/18 27.255.128.0/24 39.32.0.0/11 49.15.0.0/18 49.200.0.0/14 49.248.0.0/17 59.88.0.0/13 59.96.0.0/14 59.160.0.0/14 59.164.0.0/15 9.176.0.0/13 59.184.0.0/15 61.247.238.0/24 101.56.0.0/13 112.110.0.0/16 113.19.0.0/16 113.212.64.0/19 114.31.224.0/20 115.108.0.0/14 115.167.24.0/24 115.240.0.0/12 116.72.0.0/14 116.202.12.0/22 116.203.0.0/16 117.192.0.0/10 119.152.0.0/13 119.160.0.0/17 120.56.0.0/13 120.138.98.0/24 121.240.0.0/13 122.160.0.0/12 122.176.0.0/13 122.184.0.0/14 123.49.0.0/18 123.236.0.0/14 124.124.0.0/15 124.247.235.0/24 124.253.8.0/21 125.209.64.0/18 139.190.0.0/16 171.48.0.0/12 180.215.0.0/16 182.64.0.0/12 182.176.0.0/12 183.82.0.0/15 193.53.87.0/24 202.54.0.0/16 202.63.160.0/19 202.87.240.0/20 202.137.232.0/21 202.154.224.0/24 203.76.176.0/20 203.92.47.0/24 203.115.80.0/20 203.135.62.0/24 203.188.247.0/24 203.192.231.0/24 203.197.0.0/16 206.214.208.0/20 210.211.128.0/17 210.212.64.0/20 218.248.0.0/20 223.130.4.0/22

# Philippines (PH)
deny from 27.110.144.0/20 37.0.120.0/21 85.92.152.0/21 110.5.64.0/21 111.235.80.0/20 112.201.128.0/17 112.202.0.0/16 120.28.64.0/18 122.54.125.73 125.60.128.0/17 125.212.52.0/22 125.212.56.0/22 180.193.64.0/19 202.52.54.0/23 202.133.192.0/24 202.146.184.0/23 222.127.32.0/19 222.127.64.0/19

[PHP] Cách kiểm tra địa chỉ IP có đến từ Việt Nam hay không?

Để xác định quốc gia của một địa chỉ IP truy cập website ta có thể sử dụng GeoLite2 (Tham khảo thêm tại: http://dev.maxmind.com/geoip/geoip2/geolite2/). Mặc dù dữ liệu GeoLite2 ít chính xác hơn so với dữ liệu GeoIP2 của MaxMind nhưng nó lại là miễn phí và vẫn được cập nhật thường xuyên vào các ngày thứ ba đầu tiên hàng tháng.

GeoLite2 không được MaxMind hỗ trợ tuy nhiên chúng ta có thể tìm thấy nhiều tài liệu, bài viết hướng dẫn sử dụng, gỡ rối trên mạng.

Lưu ý: GeoLite2 được phân phối theo License: Creative Commons Attribution-ShareAlike 3.0 Unported License.

Sử dụng GeoLite2 với ngôn ngữ PHP ta có thể sử dụng MaxMind-DB-Reader: https://github.com/maxmind/MaxMind-DB-Reader-php/tree/master/src/MaxMind/Db. Bạn có thể dùng file tôi đã sắp xếp theo thư mục và có 1 wrapper để gọi đơn giản liên kết sau:

https://drive.google.com/file/d/0B7AGuhjjjSK5b0N2T05RZ2hsVGc/view?usp=sharing

Cách sử dụng ví dụ trong 1 function PHP như sau:

function is_in_vietnam() {
    require_once 'duong_dan_toi_file_GeoLite2Helper.php';
    $helper = new GeoLite2Helper();
    return $helper->checkIpFromVietnam() === "VN";
}

Nếu bạn không thể sử dụng được hoặc muốn trao đổi thêm đừng ngần ngại comment hoặc email cho NKTGL.

Sunday, April 12, 2015

Cách khắc phục lỗi không khởi động được máy ảo dùng Windows Virtual PC

Cách khắc phục lỗi không khởi động được máy ảo dùng Windows Virtual PC
Khi tạo một máy ảo mới dùng Windows Virtual PC bạn có thể sẽ gặp phải lỗi sau:
banner3
Figure 1: Lỗi khi cài đặt máy ảo, source: http://www.howtogeek.com/
Nguyên nhân là do thứ tự khởi động cài đặt cho máy ảo thì ổ cứng ảo được khởi động đầu tiên, tuy nhiên bạn chưa cài đặt hệ điều hành nào trên ổ cứng này. Cách khắc phục như thế nào?
THAY ĐỔI THỨ TỰ KHỞI ĐỘNG CỦA MÁY ẢO
Ấn Ctrl + Alt + Del, như hình bên dưới
vpc_error2
Figure 2: Khởi động lại bằng cách ấn Ctrl+Alt+Del, source: http://www.howtogeek.com/
Máy ảo sẽ khởi động lại, nhanh tay ấn phím DEL (nếu không được, có thể là phím ESC hoặc F2) cho tới khi vào màn hình BIOS của máy ảo như bên dưới:
vpc_bios4
Figure 3: Ấn DEL để vào cài đặt BIOS, source: http://www.howtogeek.com/
Trong BIOS ảo, chọn Boot Device Priority trong mục Boot, sau đó lựa chọn thứ tự khởi động đúng. Ví dụ bạn đang muốn cài đặt hệ điều hành mới từ file ISO (dùng ổ CDROM/DVD ảo) thì chọn thứ tự khởi động đầu tiên là CDROM.
vpc_error4
Figure 4: Chọn thứ tự khởi động đúng cho máy ảo, Source: http://www.howtogeek.com/
Nhớ lưu lại bằng cách ấn F10, rồi OK
vpc_bios7
Figure 5: Lưu lại cài đặt và khởi động lại, Source: http://www.howtogeek.com/
Máy ảo sẽ khởi động lại và bạn có thể tiến hành cài đặt bình thường.

Tuesday, April 7, 2015

Tắt thông báo bản cập nhật mới của Wordpress và Plugin

Với các website xây dựng từ Wordpress, mỗi khi có phiên bản mới của Wordpress hoặc các Plugin đang sử dụng thì bạn sẽ nhận được các dạng thông báo như hình dưới đây:

Minh họa thông báo cập nhật của Wordpress & Plugin, source: wpoptimus.com
Nhiều khi những thông báo này khiến bạn khó chịu hay "ngứa mắt" và bạn muốn tắt chúng đi. Như vậy thì phải làm sao?

Dưới đây là một số cách bạn có thể tham khảo để thực hiện được "mong muốn" trên:

1. Viết thêm code trong theme hoặc plugin

Thêm đoạn mã sau vào theme hay plugin của bạn sẽ loại bỏ các thông báo cập nhật phiên bản mới, cài đặt mới của Wordpress

add_action('after_setup_theme','remove_core_updates');
function remove_core_updates()
{
 if(! current_user_can('update_core')){return;}
 add_action('init', create_function('$a',"remove_action( 'init', 'wp_version_check' );"),2);
 add_filter('pre_option_update_core','__return_null');
 add_filter('pre_site_transient_update_core','__return_null');
}

Thêm đoạn mã sau để loại bỏ hoàn toàn thông báo cập nhật của Plugin

remove_action('load-update-core.php','wp_update_plugins');
add_filter('pre_site_transient_update_plugins','__return_null');

Đoạn mã dưới sẽ loại bỏ toàn bộ các thông báo cập nhật bất kể của Wordpress Core, plugin hay theme

function remove_core_updates(){
global $wp_version;return(object) array('last_checked'=> time(),'version_checked'=> $wp_version,);
}
add_filter('pre_site_transient_update_core','remove_core_updates');
add_filter('pre_site_transient_update_plugins','remove_core_updates');
add_filter('pre_site_transient_update_themes','remove_core_updates');

Để tắt thông báo của chỉ 1 plugin cụ thể thì thêm vào plugin đó đoạn code sau:

function filter_plugin_updates( $value ) {
unset( $value->response['plugin_name/plugin_name.php'] );
return $value;
}
add_filter( 'site_transient_update_plugins', 'filter_plugin_updates' );

Trong đó plugin_name/plugin_name.php ta thay tương ứng với plugin đó. Ví dụ: better-wp-security/better-wp-security.php ứng với plugin Better Wordpress Security.

2. Sử dụng Plugin

Chúng ta có thể sử dụng các Plugin sẵn có để thực hiện việc bỏ thông báo cập nhật:
- Disable All WordPress Updates
- Disable WordPress Core Updates
- Disable WordPress Plugin Updates
- Disable WordPress Theme Updates

Bài viết tổng hợp từ Internet, nguồn: http://www.wpoptimus.com/626/7-ways-disable-update-wordpress-notifications/

Sunday, April 5, 2015

2 cách vô hiệu hóa plugin đã được kích hoạt trong Wordpress

Các bạn Blogger, Webmaster, Lập Trình Viên thân mến, đã bao giờ các bạn gặp phải tình huống sau khi cài đặt hay nâng cấp một plugin của Wordpress thì website bị lỗi thậm chí không vào được admin để sửa vì bị lỗi?

Ảnh minh họa website bị lỗi sau khi cài đặt plugin

KHI BỊ NHƯ VẬY THÌ TA PHẢI LÀM SAO?
Bạn hãy bình tĩnh đừng vội xóa hết đi và cài lại website. Có hai cách đơn giản có thể xử lý trường hợp này như sau:

Cách 1: Đổi tên hoặc xóa bỏ thư mục plugin gây ra lỗi

Trong Wordpress thông thường thì các plugins được lưu trong thư mục webroot/wp-content/plugins, từng plugin lưu thành 1 thư mục (có thể là 1 file php) riêng.

Ảnh minh họa thư mục chứa các plugins trong Wordpress
Sau khi đổi tên hay xóa thư mục thì plugin gây lỗi tương ứng sẽ tự động bị vô hiệu hóa. 

Lưu ý rằng nếu ta đổi tên thư mục plugin trở lại thì nó cũng sẽ không tự động được kích hoạt lại đâu nhé!

Cách 2: Gỡ bỏ plugin lỗi trong DATABASE

Vào sửa trực tiếp trong cơ sở dữ liệu (nếu hosting/server có hỗ trợ PhpMyAdmin, sxd hay Adminer... có thể sử dụng thay cho console).

Ảnh minh họa cấu trúc dữ liệu mặc định của 1 website wordpress
Trong bảng wp_options (wp_ là tiền tố của bảng dữ liệu cho website Wordpress, nếu bạn đã thay đổi tiền tố này thì phải lưu ý dùng đúng), chọn dòng có option_name là active_plugins:

SELECT * FROM wp_options WHERE option_name = 'active_plugins'

Ảnh mình họa option 'active_plugins'
Nếu muốn vô hiệu hóa toàn bộ plugins đang sử dụng thì chỉ cần xóa option này khỏi bảng wp_options. Nếu bạn muốn xóa 1 plugin nào đang active thì xóa dòng tương ứng với plugin đó trong option_value của 'active_plugins'. Sau khi xóa thì phải giảm index cho toàn bộ các plugin xếp sau trong giá trị option_value.

Ảnh minh họa xóa giá trị của option_value ứng với 'active_plugins'
Trên đây là 2 cách để vô hiệu hóa một hoặc nhiều plugin sử dụng trong Wordpress. Nếu bạn còn cách nào khác muốn chia sẻ đừng ngần ngại post lên trong comment hoặc email cho NKTGL nhé!