Trang chủ WordpressWordpress Development Cách tạo Shortcode từ A tới Z

Cách tạo Shortcode từ A tới Z

bởi Thạch Phạm
57 bình luận 9390 views
Khuyến mãi hosting

shortcodes
Cách đây hơn một năm mình đã có một tutorial cách tự viết một shortcode dành cho riêng mình. Nhưng sau khi đọc lại bài đó thì thấy khá lủng củng ở nhiều chi tiết và quá dài nên ở bài này mình xin viết lại theo hướng dễ hiểu nhất cho những ai chưa biết, cũng như tóm gọn lại những ý quan trọng cần truyền tải.

Shortcode là gì?

Shortcode dịch theo đúng tiếng Việt nghĩa là Code ngắn hay nói cách khác là một đoạn code ngắn. Đoạn code ngắn này sẽ thực thi những tác vụ gì đó mà bạn đã định sẵn trong lúc tạo shortcode, ví dụ như hiển thị một Loop chẳng hạn. Bạn có thể thực thi shortcode này ở bất cứ đâu như trong bài viết, trong theme, ngoại trừ excerpt và widget, nhưng mình sẽ có cách hướng dẫn bạn khắc phục.

Bây giờ shortcode được sử dụng khá phổ biến, bạn có thể vào thư viện plugin WordPress và tìm plugin với từ khóa shortcode ra là có rất nhiều plugin hỗ trợ bạn sẵn một số shortcode đủ yêu cầu, nào là trang trí bài viết, nào là làm các công việc phức tạp hơn. Và trong nhiều theme, nó cũng có thể hỗ trợ sẵn một vài shortcode của nó.

Cách tạo shortcode

Toàn bộ code trong bài này bạn viết vào file functions.php của theme nhé.

Để tạo một shortcode ta sẽ bao gồm 2 bước chính:

  1. Thiết lập function thực thi code trong shortcode.
  2. Tạo một tên shortcode dựa vào function đã tạo cho nó.

Để dễ hình dung, mình đưa ra một mẫu tạo shortcode thế này.

        //Khởi tạo function cho shortcode
	function create_shortcode() {
		echo "Hello World!";
	}
        //Tạo shortcode tên là [test_shortcode] và sẽ thực thi code từ function create_shortcode
	add_shortcode( 'test_shortcode', 'create_shortcode' );

Những gì quan trọng mình đã comment hết vào code rồi. Nghĩa là lúc này nếu bạn viết [test_shortcode] vào nội dung bài viết thì nó sẽ hiển thị cụm từ Hello World! thay cho cái shortcode bạn vừa viết.

Nhưng có một vấn đề là cái chữ Hello World! nó sẽ luôn luôn ở đầu bài viết do chúng ta sử dụng lệnh echo. Nếu muốn cho nó hiển thị ngay đúng vị trí đặt shortcode, bạn nên sử dụng cú pháp return thay vì echo. Bạn có thể sửa echo "Hello World!" thành return "Hello World!" nhé và sau này khi viết shortcode, tránh dùng echo.

Tương tự, ta áp dụng thêm một xíu kiến thức về Loop và Query để tạo một shortcode hiển thị 10 bài ngẫu nhiên nhé.

function create_shortcode_randompost() {

	$random_query = new WP_Query(array(
		'posts_per_page' => 10,
		'orderby' => 'rand'
	));

	ob_start();
	if ( $random_query->have_posts() ) :
		"<ol>";
		while ( $random_query->have_posts() ) :
			$random_query->the_post();?>

				<li><a href="<?php the_permalink(); ?>"><h5><?php the_title(); ?></h5></a></li>

		<?php endwhile;
		"</ol>";
	endif;
	$list_post = ob_get_contents(); //Lấy toàn bộ nội dung phía trên bỏ vào biến $list_post để return

	ob_end_clean();

	return $list_post;
}
add_shortcode('random_post', 'create_shortcode_randompost');

Bạn có thể thấy từ đoạn 08 đến 21 mình viết loop bên trong hàm ob_start()ob_end_clean(). Thực chất ở đây mục đích của mình không phải là cache gì cả mà mình sẽ wrap phần đó lại để mình dùng hàm ob_get_contents() vào biến $list_post, sau đó là return cái biến này ra mà thôi vì khi làm shortcode mình phải dùng return mà. Nếu ai có cách nào hay hơn thì cho mình biết nhé.

Bây giờ thì bạn viết shortcode [random_post] vào vị trí mà bạn cần hiển thị danh sách bài ngẫu nhiên trong bài là xong.

Tạo shortcode sử dụng tham số

Ở phần trước chúng ta chỉ tìm hiểu qua cách tạo một shortcode đơn giản, nghĩa là nó chỉ hiển thị y chóc những gì ta đã viết vào shortcode mà không cho phép chỉnh lại theo ý muốn của người sử dụng. Nếu bạn muốn cho người dùng có thể tự sửa lại những gì hiển thị ra thì ở đây chúng ta phải sử dụng các tham số.

Ví dụ, ở đoạn shortcode trên chúng ta đã cho hiển thị 10 bài viết ngẫu nhiên. Nhưng nếu khi sử dụng tham số, chúng ta có thể cho người dùng tùy biến lại tham số ở phần số lượng bài viết hiển thị ra và có thể tùy chọn thứ tự sắp xếp nếu bạn muốn.

Để tạo shortcode có chứa tham số, ta tạo lại shortcode như sau:

function create_shortcode_thamso($args, $content) {
	return "Đây là số ". $args['thamso1'];
}
add_shortcode( 'shortcode_thamso', 'create_shortcode_thamso' );

Đầu tiên là ở phần tạo function, ta có hai tham số là $args$content. Biến $args nghĩa là tham số trong shortcode và biến $content nghĩa là đoạn nội dung được bọc trong code. Bạn xem ví dụ dưới:

[shortcode_thamso thamso1="100]Đây là biến $content[/shortcode]

Như vậy, ta có thamso1 là tham số và số 100 nghĩa là giá trị của tham số mà người dùng có thể đặt bất kỳ. Còn $content là nội dung được bọc bên trong shortcode, nhưng ở đoạn trên mình không sử dụng biến $content để in nên dù bạn có viết như thế thì phần $content cũng chưa hiển thị ra đâu.

Bây giờ bạn viết cái shortcode trên vào bài thì sẽ thấy nó hiển thị là “Đây là số 100“. Right? Và đó cũng chính là shortcode chứa tham số.

Tương tự, mình có một ví dụ rất cơ bản như sau, ta làm một shortcode tính tổng chẳng hạn.

function create_shortcode_tinhtong($args, $content) {
	$tong = $args['term1'] + $args['term2'];
	return "Tổng là ".$tong;
}
add_shortcode( 'tinhtong', 'create_shortcode_tinhtong' );

Và khi viết shortcode ta sẽ viết như sau:

[tinhtong term1="50" term2="30"]

Kết quả sẽ trả về là “Tổng là 80“. Right?

Và thêm một ví dụ có sử dụng biến $content nè.

function create_shortcode_content($args, $content) {
	return strtoupper($content); //In hoa toàn bộ content trong shortcode
}
add_shortcode('shortcode_content', 'create_shortcode_content');

Và bây giờ bạn thử viết trong bài shortcode này xem.

[shortcode_content]Viết cái gì đó vào đây[/shortcode_content]

Có phải là nó đã in hoa toàn bộ chữ trong nội dung của shortcode không?

Thế thì, tại sao ví dụ trên mình chỉ sử dụng $content mà phải khai báo cả $args? Bởi vì mặc định nếu bạn chỉ khai báo một tham số thì nó sẽ tự hiểu biến đó chính là tham số thứ nhất, nên tốt nhất bạn nên khai báo cả 2 biến, dĩ nhiên bạn có thể đặt tên bất kỳ.

Tóm lại:

  • $args sẽ có cấu trúc tham số dạng $args[‘thamso’], và cái chữ thamso là tham số trong shortcode mà bạn phải ghi giống vậy.
  • $content là biến in ra toàn bộ nội dung được đặt giữa thẻ mở shortcode và thẻ đóng shortcode.

Cách viết shortcode vào file PHP

Shortcode chỉ thực thi trong trình soạn thảo của WordPress thôi chứ ở các hoàn cảnh khác nó không hiểu. Do đó nếu bạn muốn chèn shortcode vào một file PHP thì phải sử dụng hàm do_shortcode() để nó thực thi. Ví dụ như sau:

<?php echo do_shortcode('[test_shortcode]'); ?>

Cách viết shortcode vào widget Text

Mặc định widget Text sẽ không cho bạn chèn shortcode vào, nếu muốn nó thực thi thì bạn chỉ cần filter lại nó là xong. Chèn đoạn sau vào file functions.php

add_filter('widget_text', 'do_shortcode');

Những ví dụ điển hình để làm shortcode

Shortcode hiển thị video từ Youtube

Mặc định đoạn mã nhúng video từ Youtube sẽ có dạng.

<iframe src="//www.youtube.com/embed/0KJ60uJZ3-Q" height="480" width="640" allowfullscreen="" frameborder="0"></iframe>

Vậy thì ở đây chúng ta chơi luôn 3 tham số là:

  • Tham số nhập ID của video.
  • Tham số chỉnh chiều rộng của video.
  • Tham số chỉnh chiều ngang của video.

Ok let’s do it!

function create_youtube_shortcode( $args, $content ) {
	$content = '<iframe src="//www.youtube.com/embed/'.$args['id'].'" height=" '.$args['height'].'" width="'.$args['width'].'" allowfullscreen="" frameborder="0"></iframe>';
 return $content;
}
add_shortcode('youtube', 'create_youtube_shortcode');

Và cách viết shortcode sẽ là thế này (xóa dấu / đi):

[/youtube width="500" height="300" id="0KJ60uJZ3-Q"]

Nó sẽ tự truyền các tham số mà bạn đã nhập vào shortcode.

Chèn một box thông báo đủ màu sắc

Ví dụ này ta sẽ làm việc với $content trong shortcode.

function create_thongbao_shortcode($args, $content) {
	return "
<div class='thongbao'>".$content."</div>
";
}
add_shortcode( 'thongbao', 'create_thongbao_shortcode' );

Và thêm một xíu CSS vào file style.css nhé

.thongbao {
     background: #585858;
     padding: 1.5em 2em;
     color: #FFF;
     border: 1px solid #C7C7C7;
}

Ok, bây giờ bạn có thể viết vào nội dung là [thongbao]Nội dung thông báo[/thongbao] rồi xem kết quả nhé.

Shortcode lấy thông tin Facebook

Shortcode lấy thông tin từ Facebook

Ở ví dụ này code sẽ hơi dài một chút do có sử dụng get content từ JSON thông qua Facebook Graph. Cấu trúc shortcode sẽ là [\fbgraph username="thachpham92"]. Cái thachpham92 nghĩa là tham số nhập vào, tức là username của Facebook cần hiển thị.

function create_fbgraph_shortcode($args, $content) {
	$get_info = wp_remote_get('https://graph.facebook.com/'.$args['username']);
	$get_avatar = "https://graph.facebook.com/".$args['username']."/picture?type=large";
	$dc_info = json_decode($get_info['body'], true);
	$dc_avatar = json_decode($get_avatar['data'], true);

	// Tạo biến cho dễ xử lý.
	$fb_id = $dc_info['id'];
	$fb_username = $dc_info['username'];
	$fb_url = $dc_info['link'];
	$fb_name = $dc_info['first_name'];
	// Ghi giới tính thành tiếng Việt
	if ($dc_info['gender'] == 'male') {
		$fb_gender = "Nam";
	} else if ($dc_info['gender'] == female) {
		$fb_gender = "Nữ";
	} else {
		$fb_gender = "Chưa xác định giới tính!";
	}

	ob_start();?>
<div class="fb-info">
<h5>Thông tin của <?php echo $fb_name; ?></h5>
<div class="avatar"><img alt="" src="<?php echo $get_avatar; ?>" /></div>
<div class="info"><strong>ID của bạn: </strong> <?php echo $fb_id; ?>
 <strong>Username: </strong> <?php echo $fb_username; ?>
 <strong>Giới tính: </strong> <?php echo $fb_gender; ?></div>
</div>
	<?php
        $result = ob_get_contents();
	ob_end_clean();

	return $result;

}
add_shortcode( 'fbgraph', 'create_fbgraph_shortcode' );

Và thêm một xíu CSS như demo

.fb-info {
overflow: hidden;
padding: 0.5em 1em;
background: #3B5998;
border: 1px solid #E8E8E8;
color: #FFF;
-webkit-border-radius: 10px;
-moz-border-radius: 10px;
border-radius: 10px;
}
.fb-info .avatar {
width: 30%;
float: left;
margin-right: 5%;
padding: 10px;
background: #FFF;
border: 1px solid #F3F3F3;
-webkit-border-radius: 10px;
-moz-border-radius: 10px;
border-radius: 10px;
}
.fb-info .info {
width: 60%;
float: right;
}

Ok, hãy thử xem nào.

Kết bài

Như vậy là ở bài này bạn đã biết qua cách tạo một shortcode cơ bản là như thế nào, rồi tạo một shortcode có sử dụng tham số và mình cũng đã giải thích khá kỹ càng về nó (nên bài nó mới dài thế này).

Thật sự shortcode trong WordPress là một tính năng vô cùng mạnh mẽ để bạn có thể chèn một cái gì đó vào bài một cách nhanh chóng. Nhưng hãy cẩn thận khi dùng nó bởi vì nếu bạn đã dùng ở nhiều bài, sau này bạn không muốn dùng shortcode đó nữa rồi tắt đi, lúc đó mới thật sự là mệt.

Nếu bạn vẫn còn thắc mắc, vui lòng để lại bình luận nhé.

57 bình luận

Có thể bạn quan tâm

0 0 vote
Article Rating
guest
57 Comments
mới nhất
cũ nhất đánh giá nhiều
Inline Feedbacks
View all comments

[…] kèm theo Theme là những tính năng tốt nhất của WooFramework, rất nhiều shortcode hỗ trợ hữu ích, vì thế nếu bạn là một người khó tính và kén chọn […]

[…] vào Pages -> Add New và tạo một hoặc nhiều page mới với nội dung là các shortcode dưới đây, bạn chỉ nên đặt một shortcode trong một […]

[…] khi chỉnh xong phần field, bạn có thể copy đoạn shortcode bên trong khung màu nâu bỏ vào phần form bên tay trái. Bạn nên chèn theo kiểu […]

[…] thiết lập ở đây nhưng để nó hoạt động thì nội dung phải cần có các shortcode tương ứng như […]

[…] trang làm trang chính quản lý tài khoản, trang đó bắt buộc phải chứa shortcode tương ứng để có thể hiển thị thông tin tài khoản thành […]

[…] sau đó viết nội dung cần hiển thị vào, trong đó bạn có thể sử dụng các shortcode của Woocommerce để hiển thị sản […]

[…] vẫn chiếm được cảm tình của nhiều người vì nó hỗ trợ sẵn khá nhiều shortcode để bạn thoải mái tùy chỉnh, hỗ trợ Theme Options riêng và đặc biệt là hỗ […]

[…] mà đã chỉnh xong phần field, bạn thực sự có thể copy đoạn shortcode bên trong khung màu nâu bỏ vào phần form bên tay trái. Bạn nên chèn theo dường […]

[…] do vậy bài viết này Sáu sẽ hướng dẫn cho bạn cách viết plugin và khai báo Shortcode để sử dụng trong bài viết của […]

[…] directory2. Activate the plugin through the ‘Plugins’ menu in WordPress3. Place the shortcode [saucode] or [saugist id=”Gist’s ID”] in your contact […]

[…]  Đi kèm theo Theme là những tính năng tốt nhất của WooFramework, rất nhiều shortcode hỗ trợ hữu ích, vì thế nếu bạn là một người khó tính và kén chọn thì […]

[…] thấy phần Shortcode chứ? Bạn muốn nó hiển thị ở trang nào thì cứ copy cái shortcode của từng […]

[…] thiết lập ở đây nhưng để nó hoạt động thì nội dung phải cần có các shortcode tương ứng như […]

[…] còn có thêm tính năng tùy chỉnh không giới hạn, lịch sự kiện, hỗ trợ shortcode, và rất nhiều tính năng khác để giúp bạn ứng dụng Exposure nhiều […]

[…] sản phẩm theo SKU/ID..v..v..nhưng có một cái hơi thiếu xót đó là không hỗ trợ shortcode hiển thị sản phẩm đang được giảm giá (có giá sale). Vậy nếu bạn đang có […]

[…] có hỗ trợ Responsive rồi đó ha, ngoài ra nó cũng hỗ trợ thêm như tabs widget, shortcode cần thiết, theme […]

[…] sản phẩm theo SKU/ID..v..v..nhưng có một cái hơi thiếu xót đó là không hỗ trợ shortcode hiển thị sản phẩm đang được giảm giá (có giá sale). Vậy nếu bạn đang có […]

[…] như làm việc với các code tạo widget hay tạo shortcode, để tạo một custom post type bạn có thể viết vào file functions.php của theme […]

[…] sau đó viết nội dung cần hiển thị vào, trong đó bạn có thể sử dụng các shortcode của Woocommerce để hiển thị sản […]

[…] Visual Composer mình cũng không muốn sử dụng vì nó khá nặng, và nó sẽ sinh ra shortcode nên sẽ thấy rắc rối nếu như sau này bạn không sử dụng […]

[…] khi chỉnh xong phần field, bạn có thể copy đoạn shortcode bên trong khung màu nâu bỏ vào phần form bên tay trái. Bạn nên chèn theo kiểu như […]

[…]  Đi kèm theo Theme là những tính năng tốt nhất của WooFramework, rất nhiều shortcode hỗ trợ hữu ích, vì thế nếu bạn là một người khó tính và kén chọn thì […]

[…] vào Pages -> Add New và tạo một hoặc nhiều page mới với nội dung là các shortcode dưới đây, bạn chỉ nên đặt một shortcode trong một […]

[…] Xem Video Hướng dẫn chi tiết cách tạo shortcode cơ bản và nâng cao. Xem bài chi tiết và hỏi đáp: https://thachpham.com/wordpress/wordpress-development/cach-tao-shortcode-tu-a-toi-z.html […]

[…] khi chỉnh xong phần field, bạn có thể copy đoạn shortcode bên trong khung màu nâu bỏ vào phần form bên tay trái. Bạn nên chèn theo kiểu như […]

trackback

[…] gì vào đó cũng được. Ở phần contact-form, bạn có thể thay [CONTACT-FORM] thành shortcode của Contact Form 7 vì các chức năng này tự code chưa chắc đã tốt như các plugin […]

[…] nó sẽ liệt kê ra toàn bộ các hooks, actions, filters, classes, functions, constants và shortcode có trong mã nguồn và được sắp xếp theo danh mục và chữ cái rất dễ tìm […]

[…] Tới đây mình hy vọng là đã truyền đạt đủ những gì mà bạn cần ở tính năng này, bạn có thể tự mày mò thêm để có thể sử dụng tính năng này một cách tối ưu nhất cho dự án của mình. Hy vọng vào một ngày đẹp trời nào đó, mình sẽ viết tutorial hướng dẫn cách bạn làm một widget sử dụng AJAX để tra cứu theme/plugin hoặc shortcode. […]

[…] gì vào đó cũng được. Ở phần contact-form, bạn có thể thay [CONTACT-FORM] thành shortcode của Contact Form 7 vì các chức năng này tự code chưa chắc đã tốt như các plugin […]

[…] gì vào đó cũng được. Ở phần contact-form, bạn có thể thay [CONTACT-FORM] thành shortcode của Contact Form 7 vì các chức năng này tự code chưa chắc đã tốt như các plugin […]

[…]  Đi kèm theo Theme là những tính năng tốt nhất của WooFramework, rất nhiều shortcode hỗ trợ hữu ích, vì thế nếu bạn là một người khó tính và kén chọn thì […]

[…]  Đi kèm theo Theme là những tính năng tốt nhất của WooFramework, rất nhiều shortcode hỗ trợ hữu ích, vì thế nếu bạn là một người khó tính và kén chọn thì […]

Lê Khiêm

Anh cho em hỏi theme anh sử dụng trong video này tên j?

Trang

O!k ThanK! oouu

nguyễn đức huy

bài viết của anh hay quá. Nó giúp ích cho em rất nhiều

nguoivanchuyen366

Cám ơn bạn Thạch, mỗi bài viết của bạn đều giúp ích được cho mình rất nhiều.

AnhKieu

Em chào anh ạ. Anh cho em hỏi nếu muốn hiển thị kết quả bài làm của học sinh ra ngoài ngay khi kết thúc thì như nào ạ?? Có làm được như hiển thị thông tin facebook không ạ? Em cảm ơn anh ạ.

tl0815

Anh cho em hỏi phần ShortCode lấy thông tin fb thì cái CSS chèn ở đâu?

Quang Toi

Bạn cho mình hỏi. Giờ mình muốn tạo một nút để insert shortcode vào trình sọn thảo thì làm thế nào?

An Le

Bạn ơi cho mình hỏi là mình active cái tính năng Carosel trong Jetpack, nhưng wordpress báo là bị trùng cái shortcode [gallery] với theme (mình đã bỏ tất cả các plugin liên quan rồi). Bạn giúp mình cách khắc phục với. Tks.

An Le

Đúng là do theme bạn ah nên mình mới hỏi là có cách nào khắc phục không, vì theme thì mình mua rồi nên chắc không thay đổi được.

Brian Oneil

website wp của e sửa dụng hàm str_replace để thay từ trong bài viết!
nhưng hiện tại nó không hoạt động được nữa! ko rõ lý do gì! e tắt hết plugin kiểm tra xem có dụng cái nào ko ? cũng ko đc! mọi người có ai có thể cho ý kiến giúp đỡ ko ạ ?

Brian Oneil

đây là code e dùng để add quảng cáo vào bài viết! nhưng đây là add vào tất cả các bài! còn muốn chỉ chèn vào category mình muốn thì e vẫn chưa làm đc! dùng hàm wp_get_post_terms! nhung e chưa hiểu rõ lắm! a ThachPham hướng dẫn lại xíu đc ko ạ ? function rayno_insert_after($content) { $closing_p = ”; $ads_after_paragraph = 6; $ads = ‘[contact-form-7 id=”14948″ title=”Untitled”]’; $paragraphs = explode( $closing_p, $content ); if(is_single()){ foreach ($paragraphs as $index => $paragraph) { if ( trim( $paragraph ) ) { $paragraphs[$index] .= $closing_p; } if ( $index + 1 == $ads_after_paragraph… Xem thêm »

Brian Oneil

e muốn post thuộc category nào đó sẽ hiện a ạ!

Brian Oneil

có cách giải quyết nào ko a ạ?

Brian Oneil

cảm ơn a! a cho e hỏi 1 câu nữa nha! e có hàm str_replace! để tìm và thay từ trong content của wp. nhưng có một số từ không thay được! e đã thử replace trong csdl! nhưng ko đc! không rõ lý do ! a giúp e đc ko ạ?

Brian Oneil

function prefix_insert_post_ads( $content ) {

$ad_code = do_shortcode('[notet]');

if ( is_single() &amp;&amp; is_category(80)) {
return prefix_insert_after_paragraph( $ad_code, 30, $content );
}
return $content;

}

add_filter( ‘the_content’, ‘prefix_insert_post_ads’ );*/

code như này chưa được! có sai sót gì ko a chỉ e thêm với ạ ?

Brian Oneil

e chưa làm được ! a hướng dẫn e xíu được ko ạ ? cảm ơn a

Brian Oneil

e mới viết wp ah a chỉ e với ! cảm ơn a!

57
0
Would love your thoughts, please comment.x
()
x