<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Hồ Bảo Huy - Chuyên Gia SEO - Chuyên Gia Marketing &#187; wordpress api</title>
	<atom:link href="http://www.hobaohuy.com/tag/wordpress-api/feed" rel="self" type="application/rss+xml" />
	<link>http://www.hobaohuy.com</link>
	<description>www.hobaohuy.com</description>
	<lastBuildDate>Wed, 01 Oct 2014 07:44:56 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	
	<item>
		<title>Làm sao để sử dụng đúng cách AJAX trong WordPress</title>
		<link>http://www.hobaohuy.com/lam-sao-de-su-dung-dung-cach-ajax-trong-wordpress.html</link>
		<comments>http://www.hobaohuy.com/lam-sao-de-su-dung-dung-cach-ajax-trong-wordpress.html#comments</comments>
		<pubDate>Tue, 30 Sep 2014 05:34:28 +0000</pubDate>
		<dc:creator><![CDATA[admin]]></dc:creator>
				<category><![CDATA[Phát Triển WordPress]]></category>
		<category><![CDATA[AJAX]]></category>
		<category><![CDATA[wordpress api]]></category>

		<guid isPermaLink="false">http://www.hobaohuy.com/?p=114</guid>
		<description><![CDATA[Chào các bạn, trong việc phát triển Theme và Plugin thì chắc hẳn ít nhiều các bạn cũng có sử dụng thêm AJAX. Cách thường dùng là chúng ta sẽ tạo ra các file php để xử lý request từ AJAX. Cách này khá mất công khi chúng ta vừa phải tạo mới file, vừa phải]]></description>
				<content:encoded><![CDATA[<p>Chào các bạn, trong việc phát triển Theme và Plugin thì chắc hẳn ít nhiều các bạn cũng có sử dụng thêm AJAX. Cách thường dùng là chúng ta sẽ tạo ra các file php để xử lý request từ AJAX. Cách này khá mất công khi chúng ta vừa phải tạo mới file, vừa phải include các file cần thiết để có thể tương tác và sử dụng được hàm WordPress. Cách này tuy vẫn đáp ứng được nhưng không khuyến khích dùng. Vì thế trong bài viết này mình sẽ hướng dẫn các bạn cách sử dụng AJAX trong WordPress đúng cách hơn.</p>
<p><img class="size-full" style="opacity: 1;" title="Hướng dẫn sử dụng AJAX trong WordPress đúng cách" src="/images/post/2014/09/30/05//ajax-trong-wordpress.jpg" alt="ajax trong wordpress Làm sao để sử dụng đúng cách AJAX trong WordPress " width="550" height="300" /></p>
<p>Việc sử dụng AJAX trong WordPress rất đơn giản. Các bạn không cần phải tạo ra bất kỳ file nào để xử lý request từ AJAX mà sử dụng chính <strong>file admin-AJAX.php</strong> trong <strong>thư mục wp-admin</strong> để xử lý thông qua 2 hook mà WordPress đã cung cấp sẵn: <strong>wp_AJAX_{action}</strong> và <strong>wp_AJAX_nopriv_{action}</strong>.</p>
<p><strong>Xem thêm</strong>: Action &amp; Filter trong WordPress</p>
<p>Hook<strong> wp_AJAX_{action}</strong> áp dụng khi người dùng đã đăng nhập và <strong>hook wp_AJAX_nopriv_{action}</strong> áp dụng khi người dùng không đăng nhập.</p>
<p>Để hiểu được cách sử dụng, các bạn làm theo ví dụ này của mình. Thêm đoạn code sau vào <strong>file functions.php</strong>:</p>
<div>
<div id="highlighter_121827" class="syntaxhighlighter  php">
<table border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td class="gutter">
<div class="line number1 index0 alt2">01</div>
<div class="line number2 index1 alt1">02</div>
<div class="line number3 index2 alt2">03</div>
<div class="line number4 index3 alt1">04</div>
<div class="line number5 index4 alt2">05</div>
<div class="line number6 index5 alt1">06</div>
<div class="line number7 index6 alt2">07</div>
<div class="line number8 index7 alt1">08</div>
<div class="line number9 index8 alt2">09</div>
<div class="line number10 index9 alt1">10</div>
<div class="line number11 index10 alt2">11</div>
<div class="line number12 index11 alt1">12</div>
<div class="line number13 index12 alt2">13</div>
<div class="line number14 index13 alt1">14</div>
<div class="line number15 index14 alt2">15</div>
<div class="line number16 index15 alt1">16</div>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2"><code class="php spaces">    </code><code class="php plain">add_action( </code><code class="php string">'wp_footer'</code><code class="php plain">, </code><code class="php string">'dvd_action_javascript'</code> <code class="php plain">);</code></div>
<div class="line number2 index1 alt1"><code class="php spaces">    </code><code class="php keyword">function</code> <code class="php plain">dvd_action_javascript() {</code></div>
<div class="line number3 index2 alt2"><code class="php spaces">        </code><code class="php plain">?&gt;&lt;script&gt;</code><code class="php comments">// &lt;![CDATA[</code></div>
<div class="line number4 index3 alt1"><code class="php spaces">        </code><code class="php plain">jQuery(document).ready(</code><code class="php keyword">function</code><code class="php plain">($) {</code></div>
<div class="line number5 index4 alt2"><code class="php spaces">            </code><code class="php plain">$.AJAX({</code></div>
<div class="line number6 index5 alt1"><code class="php spaces">                </code><code class="php plain">type : </code><code class="php string">'POST'</code><code class="php plain">,</code></div>
<div class="line number7 index6 alt2"><code class="php spaces">                </code><code class="php plain">data : {</code><code class="php string">'action'</code> <code class="php plain">: </code><code class="php string">'dvd_action'</code><code class="php plain">, </code><code class="php string">'data'</code> <code class="php plain">: </code><code class="php string">'du lieu gui len server'</code><code class="php plain">},</code></div>
<div class="line number8 index7 alt1"><code class="php spaces">                </code><code class="php plain">url : </code><code class="php string">'&lt;?php echo admin_url( "admin-AJAX.php" ); ?&gt;'</code><code class="php plain">,</code></div>
<div class="line number9 index8 alt2"><code class="php spaces">                </code><code class="php plain">success : </code><code class="php keyword">function</code> <code class="php plain">(resp){</code></div>
<div class="line number10 index9 alt1"><code class="php spaces">                    </code><code class="php plain">console.log(resp);</code></div>
<div class="line number11 index10 alt2"><code class="php spaces">                </code><code class="php plain">}</code></div>
<div class="line number12 index11 alt1"><code class="php spaces">            </code><code class="php plain">});</code></div>
<div class="line number13 index12 alt2"><code class="php spaces">        </code><code class="php plain">});</code></div>
<div class="line number15 index14 alt2"><code class="php comments">// ]]&gt;&lt;/script&gt;&lt;!--?php</code></div>
<div class="line number16 index15 alt1"><code class="php spaces">    </code><code class="php plain">}</code></div>
</div>
</td>
</tr>
</tbody>
</table>
</div>
</div>
<p>Đoạn code trên đơn giản là sử dụng hàm AJAX để gửi request đến file xử lý (<em>/wp-admin/admin-AJAX.php</em>). Đoạn script trên sẽ được thêm vào footer của theme thông qua hook <strong>wp_footer</strong>. Các bạn có thể sử dụng bất kỳ hàm AJAX nào khác như post, get … của Jquery.</p>
<p>Các bạn lưu ý chỗ dữ liệu gửi đi, với action thì bắt buộc phải có để có thể sử dụng được 2 hook ở trên. Giá trị của action thì có để đặt tùy ý và giá trị này sẽ được thay vào {action} của 2 hook bên trên. Thêm tiếp đoạn code sau:</p>
<div>
<div id="highlighter_46950" class="syntaxhighlighter  php">
<table border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td class="gutter">
<div class="line number1 index0 alt2">1</div>
<div class="line number2 index1 alt1">2</div>
<div class="line number3 index2 alt2">3</div>
<div class="line number4 index3 alt1">4</div>
<div class="line number5 index4 alt2">5</div>
<div class="line number6 index5 alt1">6</div>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2"><code class="php plain">add_action(</code><code class="php string">'wp_AJAX_dvd_action'</code><code class="php plain">, </code><code class="php string">'dvd_action'</code><code class="php plain">);</code></div>
<div class="line number2 index1 alt1"><code class="php plain">add_action(</code><code class="php string">'wp_AJAX_nopriv_dvd_action'</code><code class="php plain">, </code><code class="php string">'dvd_action'</code><code class="php plain">);</code></div>
<div class="line number3 index2 alt2"><code class="php keyword">function</code> <code class="php plain">dvd_action() {</code></div>
<div class="line number4 index3 alt1"><code class="php spaces">    </code><code class="php functions">echo</code> <code class="php variable">$_POST</code><code class="php plain">[</code><code class="php string">'data'</code><code class="php plain">];</code></div>
<div class="line number5 index4 alt2"><code class="php spaces">    </code><code class="php keyword">die</code><code class="php plain">();</code></div>
<div class="line number6 index5 alt1"><code class="php plain">}</code></div>
</div>
</td>
</tr>
</tbody>
</table>
</div>
</div>
<p>Các bạn để ý tên 2 hook bên trên. Với hook wp_AJAX_{action}, {action} là dvd_action. Tương tự với hook wp_AJAX_nopriv_{action}, {action} cũng là dvd_action do bên trên dữ liệu gửi đi mình đã khai báo với action là dvd_action. Các bạn thấy đấy, dựa vào action để nó có thể xác định được đúng request và xử lý chúng.</p>
<p>Trong hàm xử lý mình sẽ echo ra dữ liệu gửi lên từ AJAX và khi người dùng đăng nhập hay không đăng nhập thì hàm xử lý này vẫn sẽ hoạt động. Nếu muốn giới hạn thì các bạn có thể chọn 1 trong 2 hook trên cho phù hợp. Lưu ý: để nhận đúng kết quả trả về thì nên kết thúc hàm bằng hàm die(); hoặc exit();</p>
<p>Thử chạy và f12 lên xem kết quả nhé:</p>
<p><img class="size-full wp-image-17192" style="opacity: 1;" title="Hướng dẫn sử dụng AJAX trong WordPress đúng cách" src="/images/post/2014/09/30/05//ket-qua-tra-ve.png" alt="ket qua tra ve Làm sao để sử dụng đúng cách AJAX trong WordPress " width="716" height="109" /></p>
<p>Trong trường hợp các bạn muốn sử dụng đoạn script trên thông qua 1 file js thì cần phải đăng ký 1 biến global lưu đường dẫn tới file xử lý thông qua hàm sau:</p>
<div>
<div id="highlighter_476250" class="syntaxhighlighter  php">
<table border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td class="gutter">
<div class="line number1 index0 alt2">1</div>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2"><code class="php plain">wp_localize_script( </code><code class="php variable">$handle</code><code class="php plain">, </code><code class="php variable">$name</code><code class="php plain">, </code><code class="php variable">$data</code> <code class="php plain">);</code></div>
</div>
</td>
</tr>
</tbody>
</table>
</div>
</div>
<p>Trong đó:</p>
<p>&#8211; $handle là tên script đã đăng ký</p>
<p>&#8211; $name là tên biến sẽ chứa dữ liệu</p>
<p>&#8211; $data là mảng chứa dữ liệu cho biến $name</p>
<p>Cụ thể hơn các bạn làm tiếp ví dụ sau sẽ hiểu:</p>
<p>Đoạn code xử lý AJAX ở trên vẫn giữ nguyên, mình sẽ thay đổi lại đoạn script thay vì dùng thông qua hook thì mình sẽ dùng thông qua 1 file js. Ở đây mình đặt tên là my_js.js và nó nằm trong thư mục js của theme. Trước hết mình đăng ký file my_js.js và 1 đối tượng lưu đường dẫn tới file xử lý:</p>
<div>
<div id="highlighter_314017" class="syntaxhighlighter  php">
<table border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td class="gutter">
<div class="line number1 index0 alt2">1</div>
<div class="line number2 index1 alt1">2</div>
<div class="line number3 index2 alt2">3</div>
<div class="line number4 index3 alt1">4</div>
<div class="line number5 index4 alt2">5</div>
<div class="line number6 index5 alt1">6</div>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2"><code class="php plain">add_action(</code><code class="php string">'init'</code><code class="php plain">, </code><code class="php string">'dvd_enqueue_script'</code><code class="php plain">);</code></div>
<div class="line number2 index1 alt1"><code class="php keyword">function</code> <code class="php plain">dvd_enqueue_script(){</code></div>
<div class="line number3 index2 alt2"><code class="php spaces">    </code><code class="php plain">wp_register_script(</code><code class="php string">'dvd_js'</code><code class="php plain">, get_template_directory_uri() . </code><code class="php string">'/js/my_js.js'</code><code class="php plain">, </code><code class="php keyword">array</code><code class="php plain">(</code><code class="php string">'jquery'</code><code class="php plain">), null, false);</code></div>
<div class="line number4 index3 alt1"><code class="php spaces">    </code><code class="php plain">wp_localize_script(</code><code class="php string">'dvd_js'</code><code class="php plain">, </code><code class="php string">'AJAX'</code><code class="php plain">, </code><code class="php keyword">array</code><code class="php plain">(</code><code class="php string">'url'</code> <code class="php plain">=&gt; admin_url(</code><code class="php string">'admin-AJAX.php'</code><code class="php plain">)));</code></div>
<div class="line number5 index4 alt2"><code class="php spaces">    </code><code class="php plain">wp_enqueue_script(</code><code class="php string">'dvd_js'</code><code class="php plain">);</code></div>
<div class="line number6 index5 alt1"><code class="php plain">}</code></div>
</div>
</td>
</tr>
</tbody>
</table>
</div>
</div>
<p>Sau khi đã đăng ký xong mình có thể lấy đường dẫn tới file xử lý trong my_js.js bằng cách sử dụng: AJAX.url:</p>
<div>
<div id="highlighter_475271" class="syntaxhighlighter  jscript">
<table border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td class="gutter">
<div class="line number1 index0 alt2">01</div>
<div class="line number2 index1 alt1">02</div>
<div class="line number3 index2 alt2">03</div>
<div class="line number4 index3 alt1">04</div>
<div class="line number5 index4 alt2">05</div>
<div class="line number6 index5 alt1">06</div>
<div class="line number7 index6 alt2">07</div>
<div class="line number8 index7 alt1">08</div>
<div class="line number9 index8 alt2">09</div>
<div class="line number10 index9 alt1">10</div>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2"><code class="jscript plain">jQuery(document).ready(</code><code class="jscript keyword">function</code><code class="jscript plain">($) {</code></div>
<div class="line number2 index1 alt1"><code class="jscript spaces">    </code><code class="jscript plain">$.AJAX({</code></div>
<div class="line number3 index2 alt2"><code class="jscript spaces">        </code><code class="jscript plain">type : </code><code class="jscript string">'POST'</code><code class="jscript plain">,</code></div>
<div class="line number4 index3 alt1"><code class="jscript spaces">        </code><code class="jscript plain">data : {</code><code class="jscript string">'action'</code> <code class="jscript plain">: </code><code class="jscript string">'dvd_action'</code><code class="jscript plain">, </code><code class="jscript string">'data'</code> <code class="jscript plain">: </code><code class="jscript string">'du lieu gui len server'</code><code class="jscript plain">},</code></div>
<div class="line number5 index4 alt2"><code class="jscript spaces">        </code><code class="jscript plain">url : AJAX.url,</code></div>
<div class="line number6 index5 alt1"><code class="jscript spaces">        </code><code class="jscript plain">success : </code><code class="jscript keyword">function</code> <code class="jscript plain">(resp){</code></div>
<div class="line number7 index6 alt2"><code class="jscript spaces">            </code><code class="jscript plain">console.log(resp);</code></div>
<div class="line number8 index7 alt1"><code class="jscript spaces">        </code><code class="jscript plain">}</code></div>
<div class="line number9 index8 alt2"><code class="jscript spaces">    </code><code class="jscript plain">});</code></div>
<div class="line number10 index9 alt1"><code class="jscript plain">});</code></div>
</div>
</td>
</tr>
</tbody>
</table>
</div>
</div>
<p>Các bạn chạy lại và xem kết quả nhé. Vẫn y hệt kết quả như trước phải không nào?</p>
<p>Trường hợp các bạn sử dụng AJAX trong trang quản lý (dashboard) thì không cần phải khai báo đường dẫn tới file xử lý (admin-AJAX.php) nữa. Bởi vì WordPress đã cung cấp sẵn 1 biến global có tên AJAXurl lưu đường dẫn tới file xử lý rồi. Việc của chúng ta là lấy ra mà dùng thôi.</p>
<p>Thử luôn ví dụ cho các bạn dễ hiểu.</p>
<div>
<div id="highlighter_285565" class="syntaxhighlighter  php">
<table border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td class="gutter">
<div class="line number1 index0 alt2">01</div>
<div class="line number2 index1 alt1">02</div>
<div class="line number3 index2 alt2">03</div>
<div class="line number4 index3 alt1">04</div>
<div class="line number5 index4 alt2">05</div>
<div class="line number6 index5 alt1">06</div>
<div class="line number7 index6 alt2">07</div>
<div class="line number8 index7 alt1">08</div>
<div class="line number9 index8 alt2">09</div>
<div class="line number10 index9 alt1">10</div>
<div class="line number11 index10 alt2">11</div>
<div class="line number12 index11 alt1">12</div>
<div class="line number13 index12 alt2">13</div>
<div class="line number14 index13 alt1">14</div>
<div class="line number15 index14 alt2">15</div>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2"><code class="php spaces">    </code><code class="php plain">add_action( </code><code class="php string">'admin_footer'</code><code class="php plain">, </code><code class="php string">'dvd_action_javascript'</code> <code class="php plain">);</code></div>
<div class="line number2 index1 alt1"><code class="php spaces">    </code><code class="php keyword">function</code> <code class="php plain">dvd_action_javascript() {</code></div>
<div class="line number3 index2 alt2"><code class="php spaces">        </code><code class="php plain">?&gt;&lt;script&gt;</code><code class="php comments">// &lt;![CDATA[</code></div>
<div class="line number4 index3 alt1"><code class="php spaces">        </code><code class="php plain">jQuery(document).ready(</code><code class="php keyword">function</code><code class="php plain">($) {</code></div>
<div class="line number5 index4 alt2"><code class="php spaces">            </code><code class="php plain">$.AJAX({</code></div>
<div class="line number6 index5 alt1"><code class="php spaces">                </code><code class="php plain">type : </code><code class="php string">'POST'</code><code class="php plain">,</code></div>
<div class="line number7 index6 alt2"><code class="php spaces">                </code><code class="php plain">data : {</code><code class="php string">'action'</code> <code class="php plain">: </code><code class="php string">'dvd_action'</code><code class="php plain">, </code><code class="php string">'data'</code> <code class="php plain">: </code><code class="php string">'du lieu gui len server'</code><code class="php plain">},</code></div>
<div class="line number8 index7 alt1"><code class="php spaces">                </code><code class="php plain">url : AJAXurl,</code></div>
<div class="line number9 index8 alt2"><code class="php spaces">                </code><code class="php plain">success : </code><code class="php keyword">function</code> <code class="php plain">(resp){</code></div>
<div class="line number10 index9 alt1"><code class="php spaces">                    </code><code class="php plain">console.log(resp);</code></div>
<div class="line number11 index10 alt2"><code class="php spaces">                </code><code class="php plain">}</code></div>
<div class="line number12 index11 alt1"><code class="php spaces">            </code><code class="php plain">});</code></div>
<div class="line number13 index12 alt2"><code class="php spaces">        </code><code class="php plain">});</code></div>
<div class="line number15 index14 alt2"><code class="php comments">// ]]&gt;&lt;/script&gt;&lt;?php }</code></div>
</div>
</td>
</tr>
</tbody>
</table>
</div>
</div>
<p>Mình dùng hook admin_footer để thêm 1 đoạn script vào footer của trang quản lý, các bạn có thể sử dụng file js riêng đều được. Nội dung đoạn code tương tự ví dụ trên chỉ khác chỗ option url thôi. Phần xử lý AJAX thông qua 2 hook bên trên các bạn vẫn giữ nguyên. Vào trang quản lý, f12 và kiểm tra kết quả nhé.</p>
<h3>Lời kết</h3>
<p>Mình đã hướng dẫn xong cách sử dụng AJAX trong WordPress. Hy vọng qua bài viết này các bạn có thể hiểu và biết cách vận dụng AJAX tốt hơn trong WordPress. Mọi vướng mắc các bạn có thể comment bên dưới để được sự hỗ trợ từ mọi người.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.hobaohuy.com/lam-sao-de-su-dung-dung-cach-ajax-trong-wordpress.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>WordPress Loop (Vòng lặp trong WordPress) – Các tham số đặc biệt cần nhớ</title>
		<link>http://www.hobaohuy.com/wordpress-loop-vong-lap-trong-wordpress-cac-tham-so-dac-biet-can-nho.html</link>
		<comments>http://www.hobaohuy.com/wordpress-loop-vong-lap-trong-wordpress-cac-tham-so-dac-biet-can-nho.html#comments</comments>
		<pubDate>Tue, 30 Sep 2014 05:33:17 +0000</pubDate>
		<dc:creator><![CDATA[admin]]></dc:creator>
				<category><![CDATA[Phát Triển WordPress]]></category>
		<category><![CDATA[wordpress api]]></category>
		<category><![CDATA[Wordpress Loop]]></category>
		<category><![CDATA[wordpress nâng cao]]></category>

		<guid isPermaLink="false">http://www.hobaohuy.com/?p=113</guid>
		<description><![CDATA[Như bạn đã biết thì trước đây mình đã có một bài cực kỳ chi tiết về WordPress Loop (Vòng lặp của WordPress) để bạn hiểu thêm về cách mà chúng ta sẽ cho hiển thị bài viết trong theme là như thế nào. Cũng từ bài đó, mình đã nhận được một số câu]]></description>
				<content:encoded><![CDATA[<p>Như bạn đã biết thì trước đây mình đã có một bài cực kỳ chi tiết về WordPress Loop (<strong>Vòng lặp của WordPress</strong>) để bạn hiểu thêm về cách mà chúng ta sẽ cho hiển thị bài viết trong theme là như thế nào. Cũng từ bài đó, mình đã nhận được một số câu hỏi liên quan về cách <strong>sử dụng các tham số như thế nào cho đúng</strong> và <strong>các tham số nào nên nhớ</strong> vì trong một Query nó có rất nhiều tham số khiến bạn phải choáng ngợp.<img class="decoded aligncenter" title="WordPress Loop (Vòng lặp) – Các tham số quan trọng cần nhớ" src="/images/post/2014/09/30/05//WordPress-loop.png" alt="WordPress loop WordPress Loop (Vòng lặp trong WordPress) – Các tham số đặc biệt cần nhớ"  /></p>
<p>Vậy thì ở trong bài này, mình sẽ giải thích kỹ hơn về các tham số quan trọng nhất mà bạn cần phải nhớ khi sử dụng WordPress Loop nhằm có thể “lôi” bài viết từ database ra theo đúng ý của mình.</p>
<h3>Về cách viết tham số</h3>
<p>Bạn có thể viết tham số theo dạng thế này nếu như chỉ dùng 1 hoặc 2 tham số.</p>
<div>
<div id="highlighter_331695" class="syntaxhighlighter  php">
<table border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td class="gutter">
<div class="line number1 index0 alt2">1</div>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2"><code class="php variable">$new_loop</code> <code class="php plain">= </code><code class="php keyword">new</code> <code class="php plain">WP_Query(</code><code class="php string">'posts_per_page=5&amp;s=wordpress'</code><code class="php plain">);</code></div>
</div>
</td>
</tr>
</tbody>
</table>
</div>
</div>
<p>Trong đó, dấu <strong>&amp;</strong> sẽ ngăn cách giữa các tham số với nhau.</p>
<p>Nhưng nếu bạn có nhiều tham số thì tốt nhất nên viết thành dạng thế này cho dễ quản lý:</p>
<div>
<div id="highlighter_595479" class="syntaxhighlighter  php">
<table border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td class="gutter">
<div class="line number1 index0 alt2">1</div>
<div class="line number2 index1 alt1">2</div>
<div class="line number3 index2 alt2">3</div>
<div class="line number4 index3 alt1">4</div>
<div class="line number5 index4 alt2">5</div>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2"><code class="php variable">$args</code> <code class="php plain">= </code><code class="php keyword">array</code><code class="php plain">(</code></div>
<div class="line number2 index1 alt1"><code class="php spaces">        </code><code class="php string">'posts_per_page'</code> <code class="php plain">=&gt; </code><code class="php string">'5'</code><code class="php plain">,</code></div>
<div class="line number3 index2 alt2"><code class="php spaces">        </code><code class="php string">'s'</code> <code class="php plain">=&gt; </code><code class="php string">'wordpress'</code></div>
<div class="line number4 index3 alt1"><code class="php plain">);</code></div>
<div class="line number5 index4 alt2"><code class="php variable">$new_loop</code> <code class="php plain">= </code><code class="php keyword">new</code> <code class="php plain">WP_Query(</code><code class="php variable">$args</code><code class="php plain">);</code></div>
</div>
</td>
</tr>
</tbody>
</table>
</div>
</div>
<p>Tức là ta sẽ khai báo nó vào một biến để sử dụng. Có một cách mình rất hay xài là tạo các biến này trong file nào đó rồi include vào file functions.php để dễ quản lý nếu theme có nhiều Query khác nhau.</p>
<h3>Các tham số thông dụng của WordPress Query</h3>
<h4>1. Tham số tùy chỉnh số lượng bài viết cần lấy</h4>
<p>Tham số này tên là <code>posts_per_page</code>. Giá trị của nó sẽ là một số tự nhiên và số này chỉnh là số bài viết cần hiển thị ra.</p>
<div>
<div id="highlighter_954363" class="syntaxhighlighter  php">
<table border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td class="gutter">
<div class="line number1 index0 alt2">1</div>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2"><code class="php variable">$new_loop</code> <code class="php plain">= </code><code class="php keyword">new</code> <code class="php plain">WP_Query( </code><code class="php string">'posts_per_page=5'</code> <code class="php plain">);</code></div>
</div>
</td>
</tr>
</tbody>
</table>
</div>
</div>
<h4>2. Tham số lấy bài viết từ một post type chỉ định</h4>
<p>Tham số này sẽ dùng nhiều nhất khi bạn sử dụng Custom Post Type để Loop nó có thể lấy các bài viết ra từ một post type nào đó. Có thể lấy ra từ nhiều post type khác nhau.</p>
<div>
<div id="highlighter_517699" class="syntaxhighlighter  php">
<table border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td class="gutter">
<div class="line number1 index0 alt2">1</div>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2"><code class="php variable">$new_loop</code> <code class="php plain">= </code><code class="php keyword">new</code> <code class="php plain">WP_Query( </code><code class="php string">'post_type=sanpham'</code> <code class="php plain">);</code></div>
</div>
</td>
</tr>
</tbody>
</table>
</div>
</div>
<p>Nếu muốn lấy bài từ nhiều post type một lúc thì bạn sẽ viết thế này:</p>
<div>
<div id="highlighter_429825" class="syntaxhighlighter  php">
<table border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td class="gutter">
<div class="line number1 index0 alt2">1</div>
<div class="line number2 index1 alt1">2</div>
<div class="line number3 index2 alt2">3</div>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2"><code class="php variable">$new_loop</code> <code class="php plain">= </code><code class="php keyword">new</code> <code class="php plain">WP_Query( </code><code class="php keyword">array</code><code class="php plain">(</code></div>
<div class="line number2 index1 alt1"><code class="php spaces">        </code><code class="php string">'post_type'</code> <code class="php plain">=&gt; </code><code class="php keyword">array</code><code class="php plain">( </code><code class="php string">'post'</code><code class="php plain">, </code><code class="php string">'page'</code><code class="php plain">, </code><code class="php string">'sanpham'</code> <code class="php plain">)</code></div>
<div class="line number3 index2 alt2"><code class="php plain">) );</code></div>
</div>
</td>
</tr>
</tbody>
</table>
</div>
</div>
<h4>3. Tham số bỏ qua các bài đăng sau nó</h4>
<p>Tham số này rất hữu dụng cho các bạn muốn làm trang tin tức khi sử dụng liên tiếp 2 loop với nhau, đó là bỏ qua các bài đăng sau nó bằng tham số <code>offset</code>.</p>
<div>
<div id="highlighter_177608" class="syntaxhighlighter  php">
<table border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td class="gutter">
<div class="line number1 index0 alt2">1</div>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2"><code class="php variable">$new_loop</code> <code class="php plain">= </code><code class="php keyword">new</code> <code class="php plain">WP_Query( </code><code class="php string">'offset=3&amp;posts_per_page=4'</code> <code class="php plain">);</code></div>
</div>
</td>
</tr>
</tbody>
</table>
</div>
</div>
<p>Đoạn trên nghĩa là nó sẽ hiển thị 4 bài nhưng loại trừ 3 bài mới nhất.</p>
<h4>4. Tham số bỏ qua Sticky Post</h4>
<p>Khi website bạn có gắn Sticky Post thì mặc định nó đều gọi ra trong Loop trong mọi trường hợp. Nếu bạn không muốn hiển thị sticky post ở một loop nào đó thì có thể sử dụng tham số <code>ignore_sticky_posts</code>.</p>
<div>
<div id="highlighter_695691" class="syntaxhighlighter  php">
<table border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td class="gutter">
<div class="line number1 index0 alt2">1</div>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2"><code class="php variable">$new_loop</code> <code class="php plain">= </code><code class="php keyword">new</code> <code class="php plain">WP_Query( </code><code class="php string">'ignore_sticky_posts=1&amp;cat=4&amp;posts_per_page=-1'</code> <code class="php plain">);</code></div>
</div>
</td>
</tr>
</tbody>
</table>
</div>
</div>
<p>Đoạn trên nghĩa là lấy toàn bộ bài viết (-1) trong category mang ID là 4 nhưng loại trừ sticky post trong category đó.</p>
<h4>5. Tham số lấy bài từ Category và Tag</h4>
<div>
<div id="highlighter_218761" class="syntaxhighlighter  php">
<table border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td class="gutter">
<div class="line number1 index0 alt2">1</div>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2"><code class="php variable">$new_loop</code> <code class="php plain">= WP_Query( </code><code class="php string">'tag=wordpress-co-ban&amp;cat=5'</code> <code class="php plain">);</code></div>
</div>
</td>
</tr>
</tbody>
</table>
</div>
</div>
<p>Đoạn trên nghĩa là sẽ lấy các bài viết trong category mang ID là <strong>5</strong> có gắn tag là <strong>wordpress cơ bản</strong> (viết dưới dạng slug).</p>
<p>Ngoài ra, một số tham số liên quan tới tag là:</p>
<ul>
<li><code>tag</code> (string) – Sử dụng slug của tag.</li>
<li><code>tag_id</code> (int) – Sử dụng với định dạng ID.</li>
<li><code>tag__and</code> (array) – Lấy bài từ nhiều tag nhưng các bài đó sử dụng chung nhiều tag, sử dụng ID.</li>
<li><code>tag__in</code> (array) – Lấy bài từ nhiều tag khác nhau, sử dụng ID.</li>
<li><code>tag__not_in</code> (array) – Không lấy bài từ tag chỉ định, dùng ID.</li>
<li><code>tag_slug__and</code> (array) – Tương tự với <code>tag__and</code> nhưng dùng slug.</li>
<li><code>tag_slug__in</code> (array) – Tương tự với <code>tag__in</code> nhưng dùng slug.</li>
</ul>
<p>Tương tự với tag, category cũng có các tham số tương tự như vậy, tham khảo tại đây.</p>
<h4>6. Lấy bài theo ngày tháng</h4>
<p>Phần ngày tháng này là một trong những tham số khá quan trọng vì nó sẽ có thể giúp ích được cho bạn để giải quyết nhiều vấn đề. Chẳng hạn như bạn muốn lấy bài theo tháng, ngày, giờ, cuối tuần, mùa,…..Hoàn toàn có thể làm được trong tham số này.</p>
<div>
<div id="highlighter_246332" class="syntaxhighlighter  php">
<table border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td class="gutter">
<div class="line number1 index0 alt2">1</div>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2"><code class="php variable">$new_query</code> <code class="php plain">= </code><code class="php keyword">new</code> <code class="php plain">WP_Query( </code><code class="php string">'year=2014&amp;monthnum=06&amp;day=12'</code> <code class="php plain">);</code></div>
</div>
</td>
</tr>
</tbody>
</table>
</div>
</div>
<p>Ở đoạn trên là ta sẽ lấy bài trong ngày 12 tháng 6 năm 2014.</p>
<p>Nếu bạn cần lấy bài của ngày hôm nay ra thì có thể viết ở dạng như sau:</p>
<div>
<div id="highlighter_506275" class="syntaxhighlighter  php">
<table border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td class="gutter">
<div class="line number1 index0 alt2">1</div>
<div class="line number2 index1 alt1">2</div>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2"><code class="php variable">$today</code> <code class="php plain">= </code><code class="php functions">getdate</code><code class="php plain">();</code></div>
<div class="line number2 index1 alt1"><code class="php variable">$new_query</code> <code class="php plain">= </code><code class="php keyword">new</code> <code class="php plain">WP_Query( </code><code class="php string">'year='</code> <code class="php plain">. </code><code class="php variable">$today</code><code class="php plain">[</code><code class="php string">"year"</code><code class="php plain">] . </code><code class="php string">'&amp;monthnum='</code> <code class="php plain">. </code><code class="php variable">$today</code><code class="php plain">[</code><code class="php string">"mon"</code><code class="php plain">] . </code><code class="php string">'&amp;day='</code> <code class="php plain">. </code><code class="php variable">$today</code><code class="php plain">[</code><code class="php string">"mday"</code><code class="php plain">] );</code></div>
</div>
</td>
</tr>
</tbody>
</table>
</div>
</div>
<p>Hoặc lấy toàn bộ bài trong tuần này:</p>
<div>
<div id="highlighter_598128" class="syntaxhighlighter  php">
<table border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td class="gutter">
<div class="line number1 index0 alt2">1</div>
<div class="line number2 index1 alt1">2</div>
<div class="line number3 index2 alt2">3</div>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2"><code class="php variable">$week</code> <code class="php plain">= </code><code class="php functions">date</code><code class="php plain">(</code><code class="php string">'W'</code><code class="php plain">);</code></div>
<div class="line number2 index1 alt1"><code class="php variable">$year</code> <code class="php plain">= </code><code class="php functions">date</code><code class="php plain">(</code><code class="php string">'Y'</code><code class="php plain">);</code></div>
<div class="line number3 index2 alt2"><code class="php variable">$new_query</code> <code class="php plain">= </code><code class="php keyword">new</code> <code class="php plain">WP_Query( </code><code class="php string">'year='</code> <code class="php plain">. </code><code class="php variable">$year</code> <code class="php plain">. </code><code class="php string">'&amp;w='</code> <code class="php plain">. </code><code class="php variable">$week</code> <code class="php plain">);</code></div>
</div>
</td>
</tr>
</tbody>
</table>
</div>
</div>
<p>Hoặc bạn cũng có thể lấy chi tiết bài trong thời gian nhất định của những ngày hành chính. Tức là <strong>từ 8h đến 17h từ thứ hai đến thứ sáu</strong>.</p>
<div>
<div id="highlighter_15837" class="syntaxhighlighter  php">
<table border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td class="gutter">
<div class="line number1 index0 alt2">01</div>
<div class="line number2 index1 alt1">02</div>
<div class="line number3 index2 alt2">03</div>
<div class="line number4 index3 alt1">04</div>
<div class="line number5 index4 alt2">05</div>
<div class="line number6 index5 alt1">06</div>
<div class="line number7 index6 alt2">07</div>
<div class="line number8 index7 alt1">08</div>
<div class="line number9 index8 alt2">09</div>
<div class="line number10 index9 alt1">10</div>
<div class="line number11 index10 alt2">11</div>
<div class="line number12 index11 alt1">12</div>
<div class="line number13 index12 alt2">13</div>
<div class="line number14 index13 alt1">14</div>
<div class="line number15 index14 alt2">15</div>
<div class="line number16 index15 alt1">16</div>
<div class="line number17 index16 alt2">17</div>
<div class="line number18 index17 alt1">18</div>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2"><code class="php variable">$args</code> <code class="php plain">= </code><code class="php keyword">array</code><code class="php plain">(</code></div>
<div class="line number2 index1 alt1"><code class="php spaces">        </code><code class="php string">'date_query'</code> <code class="php plain">=&gt; </code><code class="php keyword">array</code><code class="php plain">(</code></div>
<div class="line number3 index2 alt2"><code class="php spaces">                </code><code class="php keyword">array</code><code class="php plain">(</code></div>
<div class="line number4 index3 alt1"><code class="php spaces">                        </code><code class="php string">'hour'</code>      <code class="php plain">=&gt; 9,</code></div>
<div class="line number5 index4 alt2"><code class="php spaces">                        </code><code class="php string">'compare'</code>   <code class="php plain">=&gt; </code><code class="php string">'&gt;='</code><code class="php plain">,</code></div>
<div class="line number6 index5 alt1"><code class="php spaces">                </code><code class="php plain">),</code></div>
<div class="line number7 index6 alt2"><code class="php spaces">                </code><code class="php keyword">array</code><code class="php plain">(</code></div>
<div class="line number8 index7 alt1"><code class="php spaces">                        </code><code class="php string">'hour'</code>      <code class="php plain">=&gt; 17,</code></div>
<div class="line number9 index8 alt2"><code class="php spaces">                        </code><code class="php string">'compare'</code>   <code class="php plain">=&gt; </code><code class="php string">'&lt;='</code><code class="php plain">,</code></div>
<div class="line number10 index9 alt1"><code class="php spaces">                </code><code class="php plain">),</code></div>
<div class="line number11 index10 alt2"><code class="php spaces">                </code><code class="php keyword">array</code><code class="php plain">(</code></div>
<div class="line number12 index11 alt1"><code class="php spaces">                        </code><code class="php string">'dayofweek'</code> <code class="php plain">=&gt; </code><code class="php keyword">array</code><code class="php plain">( 2, 6 ),</code></div>
<div class="line number13 index12 alt2"><code class="php spaces">                        </code><code class="php string">'compare'</code>   <code class="php plain">=&gt; </code><code class="php string">'BETWEEN'</code><code class="php plain">,</code></div>
<div class="line number14 index13 alt1"><code class="php spaces">                </code><code class="php plain">),</code></div>
<div class="line number15 index14 alt2"><code class="php spaces">        </code><code class="php plain">),</code></div>
<div class="line number16 index15 alt1"><code class="php spaces">        </code><code class="php string">'posts_per_page'</code> <code class="php plain">=&gt; -1,</code></div>
<div class="line number17 index16 alt2"><code class="php plain">);</code></div>
<div class="line number18 index17 alt1"><code class="php variable">$new_query</code> <code class="php plain">= </code><code class="php keyword">new</code> <code class="php plain">WP_Query( </code><code class="php variable">$args</code> <code class="php plain">);</code></div>
</div>
</td>
</tr>
</tbody>
</table>
</div>
</div>
<p>Tham khảo thêm tại đây.</p>
<h3>Lời kết</h3>
<p>Ở bài trên chúng ta đã làm quen qua 6 tham số chính khá quan trọng trong việc sử dụng Query trong WordPress để lấy bài theo ý muốn. Thực tế sức mạnh của WordPress Query còn lớn hơn nhiều nếu bạn có khả năng sáng tạo tốt và áp dụng hết toàn bộ tinh hoa của WordPress.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.hobaohuy.com/wordpress-loop-vong-lap-trong-wordpress-cac-tham-so-dac-biet-can-nho.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Tăng cường tối đa tính bảo mật trong WordPress bằng Nonce</title>
		<link>http://www.hobaohuy.com/tang-cuong-toi-da-tinh-bao-mat-trong-wordpress-bang-nonce.html</link>
		<comments>http://www.hobaohuy.com/tang-cuong-toi-da-tinh-bao-mat-trong-wordpress-bang-nonce.html#comments</comments>
		<pubDate>Tue, 30 Sep 2014 05:31:46 +0000</pubDate>
		<dc:creator><![CDATA[admin]]></dc:creator>
				<category><![CDATA[Phát Triển WordPress]]></category>
		<category><![CDATA[bảo mật]]></category>
		<category><![CDATA[wordpress api]]></category>

		<guid isPermaLink="false">http://www.hobaohuy.com/?p=112</guid>
		<description><![CDATA[Trong khi xây dựng 1 website thì vấn đề quan trọng không thể thiếu đó là bảo mật. Có rất nhiều cách để tăng cường tính bảo mật trong WordPress. Bạn Thạch cũng đã có bài viết về một số cách bảo mật trong WordPress. Các bạn có thể xem lại tại đây. Trong bài]]></description>
				<content:encoded><![CDATA[<p>Trong khi xây dựng 1 website thì vấn đề quan trọng không thể thiếu đó là bảo mật. Có rất nhiều cách để tăng cường tính bảo mật trong WordPress. Bạn Thạch cũng đã có bài viết về một số cách bảo mật trong WordPress. Các bạn có thể xem lại tại đây. Trong bài viết này mình sẽ hướng dẫn thêm cho các bạn cách <strong>bảo mật với</strong> <strong>Nonce</strong>, một cách hiệu quả để hạn chế việc tấn công theo kỹ thuật <strong>Cross Site Request Forgery</strong> <strong>(CSRF).</strong></p>
<p><img class="size-full  aligncenter" style="opacity: 1;" title="Sử dụng Nonce để tăng cường tính bảo mật trong WordPress" src="/images/post/2014/09/30/05//nonce-trong-wordpress.png" alt="nonce trong wordpress Tăng cường tối đa tính bảo mật trong WordPress bằng Nonce" width="588" height="330" /></p>
<h3>1. Nonce là gì?</h3>
<p>Hiểu đơn giản nó là 1 chuỗi duy nhất được tạo ra bởi WordPress cho mỗi người dùng. Nó giúp bảo vệ website khỏi những request tự tạo với mục đích xấu.</p>
<p>Ví dụ như thế này cho các bạn dễ hiểu. Giả sử mình có 1 link dùng để xóa bài viết như thế này:</p>
<div>
<div id="highlighter_408563" class="syntaxhighlighter  xml">
<table border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td class="gutter">
<div class="line number1 index0 alt2">1</div>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2"><code class="xml plain">&lt;</code><code class="xml keyword">a</code> <code class="xml color1">href</code><code class="xml plain">=</code><code class="xml string">"http://domain/?action=delete&amp;id=1"</code><code class="xml plain">&gt;Xóa&lt;/</code><code class="xml keyword">a</code><code class="xml plain">&gt;</code></div>
</div>
</td>
</tr>
</tbody>
</table>
</div>
</div>
<p>Khi mình click vào link thì bài viết sẽ được xóa bình thường. Ok, không vấn đề gì. Nhưng vấn đề xảy ra nếu người dùng có dụng ý xấu. Họ sử dụng 1số thủ thuật nào đó để thông qua quyền của mình và thực hiện việc chạy lại đường link trên với 1 id khác thì sao? Bài viết khác có thể bị xóa cho dù mình không click vào nút xóa. Bây giờ các bạn đã thấy vấn đề rồi chứ. Ngoài ra thì khi dùng form để submit dữ liệu cũng vẫn bị vấn đề trên.</p>
<p>Vậy làm sao để xác định được chính xác 1 request do người dùng thực hiện thông qua click link hay submit form ?</p>
<p>Việc cần làm là chúng ta phải tạo ra thêm 1 nonce cho request và trang xử lý phải xác nhận cái nonce này. Nếu nonce không hợp lệ thì không xử lý request. Làm như vậy thì chúng ta mới xác định được chính xác thao tác đấy(click link, submit form) là thực sự của người dùng tạo ra.</p>
<h3>2. Các sử dụng</h3>
<p>Như đã nói ở trên nonce là 1 chuỗi vậy chuỗi này được tạo ra như thế nào? Mở <strong>file wp_config.php</strong> lên và tìm đến 2 hằng <strong>NONCE_KEY</strong> và <strong>AUTH_SALT</strong>. Các bạn thấy chưa ạ? Một dãy các ký tự đúng không nào? WordPress đã sử dụng dụng 2 hằng này và hash cùng với một số thông số khác sau như action, user id … sau đó cắt ra 1 đoạn để tạo ra nonce đấy.</p>
<p>Cách đơn giản và linh động nhất là các bạn sử dụng <strong>hàm wp_create_nonce($action)</strong> để tạo nonce và dùng <strong>hàm wp_verify_nonce($nonce, $action)</strong> để xác nhận.</p>
<p>Giả sử với link xóa bài như bên trên, mình cần tạo ra 1 nonce, đưa nonce này vào query string, bên trang xử lý sẽ xác nhận nonce thông qua query string.</p>
<div>
<div id="highlighter_525902" class="syntaxhighlighter  php">
<table border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td class="gutter">
<div class="line number1 index0 alt2">1</div>
<div class="line number2 index1 alt1">2</div>
<div class="line number3 index2 alt2">3</div>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2"><code class="php variable">$nonce</code> <code class="php plain">= wp_create_nonce(</code><code class="php string">' delete_1'</code><code class="php plain">); </code><code class="php comments">//tạo nonce</code></div>
<div class="line number3 index2 alt2"><code class="php functions">echo</code> <code class="php string">'&lt;a href="http://domain/?action=delete&amp;id=1&amp;_nonce='</code><code class="php plain">.</code><code class="php variable">$nonce</code><code class="php plain">.</code><code class="php string">'"&gt;Xóa&lt;/a&gt;'</code><code class="php plain">; </code></div>
</div>
</td>
</tr>
</tbody>
</table>
</div>
</div>
<p>Các bạn thấy đấy, mình đã tạo thêm 1 nonce với $action truyền vào là delete_1. Và mình đã đưa nó vào query string để verify bên trang xử lý. Tên _nonce các bạn có thể đổi lại tùy ý. Lưu ý: với $action các bạn đặt như thế nào thì trang xử lý các bạn phải verify lại như thế đó.</p>
<p>Bên trang xử lý các bạn chỉ cần xác nhận cái nonce này trước khi xử lý. Không hợp lệ thì ngưng xử lý:</p>
<div>
<div id="highlighter_142595" class="syntaxhighlighter  php">
<table border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td class="gutter">
<div class="line number1 index0 alt2">1</div>
<div class="line number2 index1 alt1">2</div>
<div class="line number3 index2 alt2">3</div>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2"><code class="php keyword">if</code><code class="php plain">(!wp_verify_nonce(</code><code class="php variable">$_GET</code><code class="php plain">[</code><code class="php string">'_nonce'</code><code class="php plain">], </code><code class="php string">'delete_'</code><code class="php plain">.</code><code class="php variable">$_GET</code><code class="php plain">[</code><code class="php string">'id'</code><code class="php plain">])) </code><code class="php functions">exit</code><code class="php plain">();</code></div>
<div class="line number3 index2 alt2"><code class="php comments">//code xử lý ở đây ....</code></div>
</div>
</td>
</tr>
</tbody>
</table>
</div>
</div>
<p>Bên trang xử lý chúng ta verify nonce thông qua <strong>hàm wp_verify_nonce</strong>. Với <strong>$nonce</strong> là $_GET[&#8216;_nonce&#8217;], và <strong>$action</strong> là ‘delete_’.$_GET[&#8216;id&#8217;]. Vì ở trên nonce được tạo từ ‘delete_1′ nên trang xử lý cần verify đúng $action đó theo dạng delete_{id}.</p>
<p>Thực chất hàm này sẽ tạo ra 1 nonce khác theo $action và so sánh nó với nonce get được.</p>
<p>Đơn giản thế thôi, ngoài cách sử dụng trên wordpress còn cung cấp các hàm để tạo và kiểm tra nonce khác để áp dụng vào từng trường hợp cụ thể.</p>
<p>Để tạo nonce cho url, ngoài cách trên ra chúng ta có thể sử dụng thêm <strong>hàm wp_nonce_url( $actionurl, $action, $name )</strong> hàm này sẽ trả về cho chúng ta 1 đường dẫn đầy đủ chứa nonce.</p>
<p>Tham số:</p>
<ul>
<li>$actionurl chính là đường dẫn để add nonce vào.</li>
<li>$action tương tự trên.</li>
<li>$name là tên của nonce, mặc định là _wpnonce</li>
</ul>
<p>Cũng với ví dụ trên mình sử dùng hàm <strong>wp_nonce_url()</strong> để tạo:</p>
<div>
<div id="highlighter_457962" class="syntaxhighlighter  php">
<table border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td class="gutter">
<div class="line number1 index0 alt2">1</div>
<div class="line number2 index1 alt1">2</div>
<div class="line number3 index2 alt2">3</div>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2"><code class="php variable">$nonce_url</code> <code class="php plain">= wp_nonce_url(</code><code class="php string">'http://domain/?action=delete&amp;id=1'</code><code class="php plain">, </code><code class="php string">'delete_1'</code><code class="php plain">);</code></div>
<div class="line number3 index2 alt2"><code class="php functions">echo</code> <code class="php string">'&lt;a href="'</code><code class="php plain">. </code><code class="php variable">$nonce_url</code><code class="php plain">.</code><code class="php string">' "&gt;Xóa&lt;/a&gt;'</code><code class="php plain">;</code></div>
</div>
</td>
</tr>
</tbody>
</table>
</div>
</div>
<p>Khi xem thì các bạn thấy đường dẫn nó cũng tương tự cách trên, _wpnonce chính là tham số $name mặc định, các bạn muốn đổi thành tên khác thì tùy chỉnh tại tham số này.</p>
<div>
<div id="highlighter_884845" class="syntaxhighlighter  xml">
<table border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td class="gutter">
<div class="line number1 index0 alt2">1</div>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2"><code class="xml plain">http://domain/?action=delete&amp;id=1&amp;_wpnonce=e73a52569c</code></div>
</div>
</td>
</tr>
</tbody>
</table>
</div>
</div>
<p>Tiếp tục để tạo nonce cho 1 form các bạn có thể dùng thêm <strong>hàm wp_nonce_field( $action, $name, $referer, $echo )</strong>. Các tham số như $action và $name thì tương tự trên. Tham số <strong>$referer</strong> sẽ nhận giá trị true hoặc false, quyết định hiển thị thêm 1 field ẩn chứa đường dẫn hiện tại. <strong>$echo</strong> cũng nhận giá trị true hoặc false, quyết định hàm <strong>wp_nonce_field()</strong> sẽ hiển thị hay trả về kết quả.</p>
<p>Khi sử dụng hàm này với <strong>$referer </strong>là true các bạn sẽ thấy trong form có thêm 2 trường dạng như thế này:</p>
<div>
<div id="highlighter_366965" class="syntaxhighlighter  xml">
<table border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td class="gutter">
<div class="line number1 index0 alt2">1</div>
<div class="line number2 index1 alt1">2</div>
<div class="line number3 index2 alt2">3</div>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2"><code class="xml plain">&lt;</code><code class="xml keyword">input</code> <code class="xml color1">type</code><code class="xml plain">=</code><code class="xml string">"hidden"</code> <code class="xml color1">id</code><code class="xml plain">=</code><code class="xml string">"_nonce"</code> <code class="xml color1">name</code><code class="xml plain">=</code><code class="xml string">"_nonce"</code> <code class="xml color1">value</code><code class="xml plain">=</code><code class="xml string">"43bc8cf75e"</code> <code class="xml plain">/&gt;</code></div>
<div class="line number3 index2 alt2"><code class="xml plain">&lt;</code><code class="xml keyword">input</code> <code class="xml color1">type</code><code class="xml plain">=</code><code class="xml string">"hidden"</code> <code class="xml color1">name</code><code class="xml plain">=</code><code class="xml string">"_wp_http_referer"</code> <code class="xml color1">value</code><code class="xml plain">=</code><code class="xml string">"/phanmem/ "</code> <code class="xml plain">/&gt;</code></div>
</div>
</td>
</tr>
</tbody>
</table>
</div>
</div>
<p>Về cách verify nonce thì WordPress cung cấp thêm cho chúng ta 2 hàm nữa khác là <strong>check_admin_referer()</strong> và <strong>check_ajax_referer()</strong>.</p>
<p>Hàm <strong>check_admin_referer() </strong>sẽ dùng để verify nonce trong trang quản lý. Hàm này nhận 2 tham số là <strong>$action</strong> và <strong>$query_arg</strong> với <strong>$action</strong> thì tương tự, <strong>$query_arg</strong> chính là <strong>$name</strong> của nonce. Hàm này sẽ trả về true nếu nonce hợp lệ và ngược lại là false.</p>
<p>Giả sử có 1 form dạng như thế này:</p>
<div>
<div id="highlighter_707774" class="syntaxhighlighter  xml">
<table border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td class="gutter">
<div class="line number1 index0 alt2">1</div>
<div class="line number2 index1 alt1">2</div>
<div class="line number3 index2 alt2">3</div>
<div class="line number4 index3 alt1">4</div>
<div class="line number5 index4 alt2">5</div>
<div class="line number6 index5 alt1">6</div>
<div class="line number7 index6 alt2">7</div>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2"><code class="xml plain">&lt;</code><code class="xml keyword">form</code> <code class="xml color1">method</code><code class="xml plain">=</code><code class="xml string">"post"</code><code class="xml plain">&gt;</code></div>
<div class="line number3 index2 alt2"><code class="xml spaces">    </code><code class="xml plain">//.......</code></div>
<div class="line number5 index4 alt2"><code class="xml spaces">   </code><code class="xml plain">&lt;?</code><code class="xml keyword">php</code> <code class="xml plain">wp_nonce_field( 'myaction','mynonce' ); ?&gt;</code></div>
<div class="line number7 index6 alt2"><code class="xml plain">&lt;/</code><code class="xml keyword">form</code><code class="xml plain">&gt;</code></div>
</div>
</td>
</tr>
</tbody>
</table>
</div>
</div>
<p>Thì khi verify các bạn làm như sau:</p>
<div>
<div id="highlighter_878405" class="syntaxhighlighter  php">
<table border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td class="gutter">
<div class="line number1 index0 alt2">1</div>
<div class="line number2 index1 alt1">2</div>
<div class="line number3 index2 alt2">3</div>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2"><code class="php keyword">if</code><code class="php plain">(!check_admin_referer(</code><code class="php string">'myaction'</code><code class="php plain">, </code><code class="php string">'mynonce'</code><code class="php plain">)) </code><code class="php keyword">die</code><code class="php plain">();</code></div>
<div class="line number3 index2 alt2"><code class="php spaces"> </code></div>
</div>
</td>
</tr>
</tbody>
</table>
</div>
</div>
<p>Hàm <strong>check_ajax_referer()</strong> sẽ verify nonce thông qua <strong>Ajax</strong>. Hàm này nhận 3 tham số, 2 tham số đầu là <strong>$action</strong> và <strong>$query_arg</strong> tương tự hàm trên, với tham số thứ 3 là <strong>$die,</strong> nếu nonce không hợp lệ, và tham số này set true thì sẽ ngưng xử lý, nếu false thì bỏ qua. Mặc định là true.</p>
<p>Thời gian sống mặc định của 1 nonce là 24 giờ. Các bạn vẫn có thể chỉnh sửa lại thông qua hook<strong> nonce_life</strong>.</p>
<div>
<div id="highlighter_133949" class="syntaxhighlighter  php">
<table border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td class="gutter">
<div class="line number1 index0 alt2">1</div>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2"><code class="php plain">add_filter( </code><code class="php string">'nonce_life'</code><code class="php plain">, </code><code class="php keyword">function</code> <code class="php plain">() { </code><code class="php keyword">return</code> <code class="php plain">4 * HOUR_IN_SECONDS; } );</code></div>
</div>
</td>
</tr>
</tbody>
</table>
</div>
</div>
<p>Hằng <strong>HOUR_IN_SECONDS </strong>sẽ trả về số giây trên giờ (3600).</p>
<h3>3. Lời kết</h3>
<p>Mình đã hướng dẫn xong cho các bạn cách bảo mật WordPress với <strong>Nonce</strong> để hạn chế việc tấn công theo kỹ thuật <strong>CSRF</strong> trong khi phát triển theme và plugin. Hy vọng với những kiến thức này có thể giúp các bạn bảo vệ website của mình tốt hơn.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.hobaohuy.com/tang-cuong-toi-da-tinh-bao-mat-trong-wordpress-bang-nonce.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
