Trang chủ WordpressHướng dẫn Wordpress Các mẹo hay cho WordPress #1

Các mẹo hay cho WordPress #1

bởi Thạch Phạm
1 bình luận 1905 views

Trong khi làm việc với WordPress, ngoài việc sử dụng theme và plugin để tùy chỉnh website của mình thì còn một việc mà những người sử dụng WordPress nâng cao hay làm nữa đó là viết code tùy chỉnh dựa vào hai tính năng action & filter trong WordPress.

Hai tính năng này có thể giúp người dùng trực tiếp can thiệp vào mã nguồn của WordPress mà không cần sửa trực tiếp, để tránh các nguy cơ bị lỗi nghiêm trọng hoặc không bị mất đi khi tiến hành cập nhật WordPress.

Trong bài này, mình sẽ giới thiệu qua một vài đoạn code khá hay để bạn có thể sử dụng, đa phần là copy vào file functions.php trong theme bạn đang sử dụng.

Tự chuyển hướng sau khi đăng ký

Code này sẽ giúp người dùng chuyển hướng đến một trang nhất định sau khi họ đăng ký thành công thay vì trở lại trang đăng nhập như mặc định.


function wps_registration_redirect(){
    return home_url( '/member/' );
}
add_filter( 'registration_redirect', 'wps_registration_redirect' );

Trong đó, bạn thay chữ member thành slug của page mà bạn cần chuyển tới.

Hiển thị số lượng post của custom post type ra Dashboard

Hiện tại khi bạn ra trang Dashboard của trang quản trị, bạn sẽ thấy phần tên là At a Glance, ở đó sẽ hiển thị số lượng post và page hiện có. Nếu bạn muốn thêm dòng hiển thị số lượng post trong một post type nào đó thì có thể sử dụng code dưới đây.

add_filter( 'dashboard_glance_items', 'custom_glance_items', 10, 1 );
function custom_glance_items( $items = array() ) {
    $post_types = array( 'post_type_1', 'post_type_2' );
    foreach( $post_types as $type ) {
        if( ! post_type_exists( $type ) ) continue;
        $num_posts = wp_count_posts( $type );
        if( $num_posts ) {
            $published = intval( $num_posts->publish );
            $post_type = get_post_type_object( $type );
            $text = _n( '%s ' . $post_type->labels->singular_name, '%s ' . $post_type->labels->name, $published, 'your_textdomain' );
            $text = sprintf( $text, number_format_i18n( $published ) );
            if ( current_user_can( $post_type->cap->edit_posts ) ) {
                $items[] = sprintf( '%2$s', $type, $text ) . "\n";
            } else {
                $items[] = sprintf( '%2$s', $type, $text ) . "\n";
            }
        }
    }
    return $items;
}

Trong đó, post_type_1 và post_type_2 là slug của post type mà bạn cần hiển thị ra.

Chuyển sang trang kế tiếp bằng bàn phím

Đây không phải là code PHP mà là jQuery, bạn sẽ cần chèn vào một file JS nào đó trong theme.

      $(document).keydown(function(e){
                if (e.which == 37) { // left arrow
                   if(!prev) return false;
                        window.location.href = $('link[rel=prev]').attr('href');
                }
                if (e.which == 39) { // right arrow
                   if(!next) return false;
                        window.location.href = $('link[rel=next]').attr('href');
                }
        });

Trong đó, 37 và 39 là số thứ tự của bàn phím. Để xem số của từng phím, bạn có thể vào đây.

Thêm Featured Image vào RSS Feed

Mặc định RSS Feed chỉ lấy nội dung và tiêu đề của bài viết. Nếu bài của bạn có featured image nhưng nó không hiển thị ra ngoài thì RSS cũng không hiển thị, chèn code dưới đây vào để khắc phục điều đó.

add_filter( 'the_content', 'featured_image_in_feed' );
function featured_image_in_feed( $content ) {
    global $post;
    if( is_feed() ) {
        if ( has_post_thumbnail( $post->ID ) ){
            $output = get_the_post_thumbnail( $post->ID, 'medium', array( 'style' => 'float:right; margin:0 0 10px 10px;' ) );
            $content = $output . $content;
        }
    }
    return $content;
}

Bắt buộc thêm ảnh Featured Image trước khi đăng bài

Đối với một số blog có nhiều tác giả, thì việc cộng tác viên quên gắn featured image cho bài viết là điều dễ xảy ra. Chèn đoạn dưới đây vào file functions.php để khắc phục việc đó:

add_action('save_post', 'wpds_check_thumbnail');
add_action('admin_notices', 'wpds_thumbnail_error');
function wpds_check_thumbnail($post_id) {
    // change to any custom post type
    if(get_post_type($post_id) != 'post')
        return;
    if ( !has_post_thumbnail( $post_id ) ) {
        // set a transient to show the users an admin message
        set_transient( "has_post_thumbnail", "no" );
        // unhook this function so it doesn't loop infinitely
        remove_action('save_post', 'wpds_check_thumbnail');
        // update the post set it to draft
        wp_update_post(array('ID' => $post_id, 'post_status' => 'draft'));
        add_action('save_post', 'wpds_check_thumbnail');
    } else {
        delete_transient( "has_post_thumbnail" );
    }
}
function wpds_thumbnail_error()
{
    // check if the transient is set, and display the error message
    if ( get_transient( "has_post_thumbnail" ) == "no" ) {
        echo "<div id='message' class='error'><p><strong>Bạn phải thêm ảnh Featured Image!.</strong></p></div>";
        delete_transient( "has_post_thumbnail" );
    }
}

Bắt buộc bình luận phải đủ ký tự

Một cách chống việc spam vớ vẩn ở comment, bạn có thể chỉ định phải viết tối thiểu bao nhiêu ký tự để có thể đăng bình luận.

add_filter( 'preprocess_comment', 'minimal_comment_length' );
function minimal_comment_length( $commentdata ) {
    $minimalCommentLength = 20;
    if ( strlen( trim( $commentdata['comment_content'] ) ) < $minimalCommentLength ){
    wp_die( 'All comments must be at least ' . $minimalCommentLength . ' characters long.' );
    }
    return $commentdata;
}

Thêm màu trạng thái bài viết

Mặc định WordPress có một số trạng thái bài viết như Draft, Published, Pending, Future, Private. Nhưng thật khó khăn để nhận ra nếu bạn chỉ lướt sơ danh sách bài viết, thêm màu cho từng trạng thái là cách hữu hiệu nhất.

add_action('admin_footer','posts_status_color');
function posts_status_color(){
?>
<style>
.status-draft{background: #FCE3F2 !important;}
.status-pending{background: #87C5D6 !important;}
.status-publish{/* no background keep wp alternating colors */}
.status-future{background: #C6EBF5 !important;}
.status-private{background:#F2D46F;}
</style>
<?php
}

Đặt link nofollow ở một số category nhất định

Thông thường các plugin như WP External Link sẽ giúp bạn đưa các link trỏ ra ngoài thành nofollow và đưa 1 số link đặc biệt thành dofollow. Thế tại sao lại không thử đưa link các bài viết trong một category nhất định thành nofollow?

function nofollow_cat_posts($text) {
global $post;
        if( in_category(1) ) { // SET CATEGORY ID HERE
                $text = stripslashes(wp_rel_nofollow($text));
        }
        return $text;
}
add_filter('the_content', 'nofollow_cat_posts');

Tự động xóa revision của bài viết

Revision trong WordPress là các bản sao của bài viết nó sẽ tự động lưu sau mỗi thời gian nhất định khi bạn soạn bài. Nếu blog bạn có quá nhiều revision, việc database bị phình to hay chậm chạp là điều dễ hiểu.

Các plugin như WP Clean Up có thể giúp bạn xóa revision thừa nhưng nó chỉ xóa nếu bạn sử dụng plugin đó. Có một cách khác để bạn tự động xóa revision là chèn một đoạn code dưới đây vào file functions.php.

$wpdb->query( "DELETE FROM $wpdb->posts WHERE post_type = 'revision'" );

Tự chèn custom field khi post/page được đăng

Một bài thực hành cho những ai mới tập sử dụng action hook trong WordPress. Bạn có thể tùy chỉnh tự thêm một custom field và một giá trị nhất định mỗi khi bài được đăng lên.

add_action('publish_page', 'add_custom_field_automatically');
add_action('publish_post'. 'add_custom_field_automatically');
function add_custom_field_automatically($post_ID) {
    global $wpdb;
    if(!wp_is_post_revision($post_ID)) {
        add_post_meta($post_ID, 'ten_field', 'gia_tri', true);
    }
}

Đổi slug đường dẫn đến trang tác giả

Mặc định khi truy cập vào một trang tác giả trên WordPress nó sẽ có định dạng http://example.com/author/thachpham. Mẹo dưới đây có thể giúp bạn đổi chữ author trên đường dẫn thành thanh-vien chẳng hạn.

add_action('init', 'cng_author_base');
function cng_author_base() {
    global $wp_rewrite;
    $author_slug = 'thanh-vien';
    $wp_rewrite->author_base = $author_slug;
}

Cho phép đăng nhập bằng username lẫn email

Mặc định WordPress chỉ cho phép đăng nhập bằng username thôi, mẹo này sẽ cho phép khách có thể đăng nhập lẫn username và email của thành viên.

function login_with_email_address($username) {
        $user = get_user_by('email',$username);
        if(!empty($user->user_login))
                $username = $user->user_login;
        return $username;
}
add_action('wp_authenticate','login_with_email_address');
function change_username_wps_text($text){
       if(in_array($GLOBALS['pagenow'], array('wp-login.php'))){
         if ($text == 'Username'){$text = 'Username / Email';}
            }
                return $text;
         }
add_filter( 'gettext', 'change_username_wps_text' );

Chặn các truy vấn nguy hiểm

Thông thường các hacker có thể khai thác lỗi SQL Injection bằng việc trực tiếp nhập các câu lệnh truy vấn trên URL của website. Hãy chèn code dưới đây vào file functions.php để ngăn chặn việc này:

global $user_ID; if($user_ID) {
	if(!current_user_can('administrator')) {
		if (strlen($_SERVER['REQUEST_URI']) > 255 ||
			stripos($_SERVER['REQUEST_URI'], "eval(") ||
			stripos($_SERVER['REQUEST_URI'], "CONCAT") ||
			stripos($_SERVER['REQUEST_URI'], "UNION+SELECT") ||
			stripos($_SERVER['REQUEST_URI'], "base64")) {
				@header("HTTP/1.1 414 Request-URI Too Long");
				@header("Status: 414 Request-URI Too Long");
				@header("Connection: Close");
				@exit;
		}
	}
}

Còn tiếp

Do bài dài nên mình xin tạm dừng ở đây và sẽ giới thiệu thêm các mẹo hay ở bộ sưu tập sau nhé. 😀

1 bình luận

Có thể bạn quan tâm

Hiện tại blog tạm đóng bình luận vì mình cần tập trung thời gian vào cập nhật bài viết. Bình luận sẽ mở ra cho đến khi mình sẵn sàng.