别克军威 發表於 2023-7-2 00:00:00

详解WordPress中用于合成数组的wp_parse_args()函数

<p>
wp_parse_args() 函数是 WordPress 核心经常用到的函数,它的用途很多,但最主要用来给一个数组参数(args)绑定默认值。</p>
<p>
因为 wp_parse_args() 函数返回的一定是一个数组,所以他会把传入查询字符串和对象(object)自动转换成数组,给了使用者更加方便的条件,也增加了兼容性。</p>
<p>
常见的 query_posts()、wp_list_comments() 和 get_terms() 函数都使用了 wp_parse_args() 函数来帮它给数组参数添加默认值。</p>
<p>
<strong>用法</strong></p>
<div>
<div>
<div id="highlighter_314354">
<div>
<span>?</span>
</div>
<table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td>
<div>
1</div>
</td>
<td>
<div>
<div>
<code>wp_parse_args( </code><code>$args</code><code>, </code><code>$defaults</code> <code>);</code>
</div>
</div>
</td>
</tr></tbody></table>
</div>
</div>
<div id="codetool">
<div>
<textarea></textarea>
</div>
</div>
</div>
<p>
<strong>参数</strong></p>
<p>
$args</p>
<p>
(数组 | 字符串)(必须)查询字符串、对象或者数组参数,用来绑定默认值。</p>
<p>
默认值:None</p>
<p>
查询字符串:</p>
<div>
<div>
<div id="highlighter_325986">
<div>
<span>?</span>
</div>
<table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td>
<div>
1</div>
</td>
<td>
<div>
<div>
<code>type=post&amp;posts_per_page=5&amp;cat=1</code>
</div>
</div>
</td>
</tr></tbody></table>
</div>
</div>
<div id="codetool">
<div>
<textarea></textarea>
</div>
</div>
</div>
<p>
数组:</p>
<div>
<div>
<div id="highlighter_279384">
<div>
<span>?</span>
</div>
<table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td>
<div>
1</div>
</td>
<td>
<div>
<div>
<code>array</code><code>( </code><code>'type'</code> <code>=&gt; </code><code>'post'</code><code>, </code><code>'posts_per_page'</code> <code>=&gt; 5, </code><code>'cat'</code> <code>=&gt; </code><code>'1'</code> <code>)</code>
</div>
</div>
</td>
</tr></tbody></table>
</div>
</div>
<div id="codetool">
<div>
<textarea></textarea>
</div>
</div>
</div>
<p>
$defaults</p>
<p>
(数组)(可选)数组参数的默认参数。</p>
<p>
默认值:空字符串</p>
<p>
<strong>例子</strong></p>
<div>
<div>
<div id="highlighter_755686">
<div>
<span>?</span>
</div>
<table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td>
<div>
1</div>
<div>
2</div>
<div>
3</div>
<div>
4</div>
<div>
5</div>
<div>
6</div>
<div>
7</div>
<div>
8</div>
<div>
9</div>
<div>
10</div>
<div>
11</div>
<div>
12</div>
<div>
13</div>
<div>
14</div>
<div>
15</div>
<div>
16</div>
<div>
17</div>
<div>
18</div>
<div>
19</div>
<div>
20</div>
<div>
21</div>
<div>
22</div>
<div>
23</div>
<div>
24</div>
<div>
25</div>
<div>
26</div>
<div>
27</div>
<div>
28</div>
<div>
29</div>
<div>
30</div>
<div>
31</div>
<div>
32</div>
<div>
33</div>
<div>
34</div>
<div>
35</div>
<div>
36</div>
<div>
37</div>
<div>
38</div>
<div>
39</div>
<div>
40</div>
<div>
41</div>
<div>
42</div>
<div>
43</div>
<div>
44</div>
<div>
45</div>
<div>
46</div>
<div>
47</div>
<div>
48</div>
<div>
49</div>
<div>
50</div>
<div>
51</div>
<div>
52</div>
<div>
53</div>
<div>
54</div>
<div>
55</div>
<div>
56</div>
<div>
57</div>
<div>
58</div>
<div>
59</div>
<div>
60</div>
<div>
61</div>
<div>
62</div>
<div>
63</div>
</td>
<td>
<div>
<div>
<code>function</code> <code>explain_parse_args( </code><code>$args</code> <code>= </code><code>array</code><code>() ){</code>
</div>
<div>
<code> </code>
</div>
<div>
<code>  </code><code>//$args 的默认值</code>
</div>
<div>
<code>  </code><code>$defaults</code> <code>= </code><code>array</code><code>(</code>
</div>
<div>
<code>    </code><code>'before'</code> <code>=&gt; </code><code>'&lt;div&gt;'</code><code>,</code>
</div>
<div>
<code>    </code><code>'after'</code> <code>=&gt; </code><code>'&lt;/div&gt;'</code><code>,</code>
</div>
<div>
<code>    </code><code>'echo'</code> <code>=&gt; true,</code>
</div>
<div>
<code>    </code><code>'text'</code> <code>=&gt; </code><code>'wp_parse_args() 函数演示'</code>
</div>
<div>
<code>  </code><code>);</code>
</div>
<div>
<code> </code>
</div>
<div>
<code>  </code><code>//绑定默认值</code>
</div>
<div>
<code>  </code><code>$r</code> <code>= wp_parse_args( </code><code>$args</code><code>, </code><code>$defaults</code> <code>);</code>
</div>
<div>
<code> </code>
</div>
<div>
<code>  </code><code>$output</code> <code>= </code><code>$r</code><code>[</code><code>'before'</code><code>] . </code><code>$r</code><code>[</code><code>'text'</code><code>] . </code><code>$r</code><code>[</code><code>'after'</code><code>];</code>
</div>
<div>
<code>  </code><code>if</code><code>( !</code><code>$r</code><code>[</code><code>'echo'</code><code>] ) </code><code>return</code> <code>$output</code><code>;</code>
</div>
<div>
<code>  </code><code>echo</code> <code>$output</code><code>;</code>
</div>
<div>
<code>}</code>
</div>
<div>
<code> </code>
</div>
<div>
<code>//没有参数</code>
</div>
<div>
<code>explain_parse_args();</code><code>//打印:&lt;div&gt;wp_parse_args() 函数演示&lt;/div&gt;</code>
</div>
<div>
<code> </code>
</div>
<div>
<code>//字符串参数</code>
</div>
<div>
<code>$output</code> <code>= explain_parse_args( </code><code>'text=字符串参数&amp;before=&lt;div&gt;&amp;echo=0'</code> <code>);</code>
</div>
<div>
<code>echo</code> <code>$output</code><code>;</code><code>//打印:&lt;div&gt;字符串参数&lt;/div&gt;</code>
</div>
<div>
<code> </code>
</div>
<div>
<code>//数组参数</code>
</div>
<div>
<code>explain_parse_args( </code><code>array</code><code>( </code><code>'text'</code> <code>=&gt; </code><code>'数组参数'</code><code>, </code><code>'before'</code> <code>=&gt; </code><code>'&lt;div&gt;'</code> <code>) );</code><code>//打印:&lt;div&gt;数组参数&lt;/div&gt;</code>
</div>
<div>
<code>还有另一种不使用第二个 </code><code>$defaults</code> <code>参数的用法,就是帮你把一个查询字符串、对象或者数组的变量直接转换成通用的数组,避免判断类型。</code>
</div>
<div>
 </div>
<div>
<code>//字符串</code>
</div>
<div>
<code>$array</code> <code>= wp_parse_args( </code><code>'text=测试另一种用法&amp;type=字符串'</code> <code>);</code>
</div>
<div>
<code>var_dump( </code><code>$array</code> <code>);</code>
</div>
<div>
<code>/*</code>
</div>
<div>
<code>  </code><code>array(2) {</code>
</div>
<div>
<code>    </code><code>["text"]=&gt;</code>
</div>
<div>
<code>      </code><code>string(21) "测试另一种用法"</code>
</div>
<div>
<code>    </code><code>["type"]=&gt;</code>
</div>
<div>
<code>      </code><code>string(9) "字符串"</code>
</div>
<div>
<code>  </code><code>}</code>
</div>
<div>
<code>*/</code>
</div>
<div>
<code> </code>
</div>
<div>
<code>//对象(object)</code>
</div>
<div>
<code>class</code> <code>args_obj{</code>
</div>
<div>
<code> </code>
</div>
<div>
<code>  </code><code>public</code> <code>$text</code> <code>= </code><code>'测试另一种用法'</code><code>;</code>
</div>
<div>
<code> </code>
</div>
<div>
<code>  </code><code>public</code> <code>$type</code> <code>= </code><code>'对象(object)'</code><code>;</code>
</div>
<div>
<code> </code>
</div>
<div>
<code>  </code><code>function</code> <code>func(){</code>
</div>
<div>
<code>    </code><code>//转换成数组的时候对象里边的函数会被忽略</code>
</div>
<div>
<code>  </code><code>}</code>
</div>
<div>
<code> </code>
</div>
<div>
<code>}</code>
</div>
<div>
<code>$obj</code> <code>= </code><code>new</code> <code>args_obj;</code>
</div>
<div>
<code>var_dump( </code><code>$obj</code> <code>);</code>
</div>
<div>
<code>/*</code>
</div>
<div>
<code>object(args_obj)#2175 (2) {</code>
</div>
<div>
<code>  </code><code>["text"]=&gt;</code>
</div>
<div>
<code>    </code><code>string(21) "测试另一种用法"</code>
</div>
<div>
<code>  </code><code>["type"]=&gt;</code>
</div>
<div>
<code>    </code><code>string(18) "对象(object)"</code>
</div>
<div>
<code>}</code>
</div>
<div>
<code>*/</code>
</div>
</div>
</td>
</tr></tbody></table>
</div>
</div>
<div id="codetool">
<div>
<textarea></textarea>
</div>
</div>
</div>
<p>
<strong>wp_parse_args函数源代码详解</strong><br>
wp_parse_args 函数的源代码比较简单,<br>
依附于PHP 内置函数get_object_vars、array_merge与WordPress的wp_parse_str函数来实现,<br>
以下是该函数的源代码:</p>
<div>
<div>
<div id="highlighter_273260">
<div>
<span>?</span>
</div>
<table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td>
<div>
1</div>
<div>
2</div>
<div>
3</div>
<div>
4</div>
<div>
5</div>
<div>
6</div>
<div>
7</div>
<div>
8</div>
<div>
9</div>
<div>
10</div>
<div>
11</div>
<div>
12</div>
<div>
13</div>
<div>
14</div>
<div>
15</div>
<div>
16</div>
<div>
17</div>
<div>
18</div>
<div>
19</div>
<div>
20</div>
<div>
21</div>
<div>
22</div>
<div>
23</div>
<div>
24</div>
<div>
25</div>
<div>
26</div>
<div>
27</div>
<div>
28</div>
<div>
29</div>
</td>
<td>
<div>
<div>
<code>/**</code>
</div>
<div>
<code> </code><code>* Merge user defined arguments into defaults array.</code>
</div>
<div>
<code> </code><code>*</code>
</div>
<div>
<code> </code><code>* This function is used throughout WordPress to allow for both string or array</code>
</div>
<div>
<code> </code><code>* to be merged into another array.</code>
</div>
<div>
<code> </code><code>*</code>
</div>
<div>
<code> </code><code>* @since 2.2.0</code>
</div>
<div>
<code> </code><code>*</code>
</div>
<div>
<code> </code><code>*第一个参数可以是 字符串、数组或对象(obj)</code>
</div>
<div>
<code> </code><code>* @param string|array $args Value to merge with $defaults</code>
</div>
<div>
<code> </code><code>*第二个参数为默认的预设值数组,必须是数组</code>
</div>
<div>
<code> </code><code>* @param array $defaults Array that serves as the defaults.</code>
</div>
<div>
<code> </code><code>*返回值将是一个数组</code>
</div>
<div>
<code> </code><code>* @return array Merged user defined values with defaults.</code>
</div>
<div>
<code> </code><code>*/</code>
</div>
<div>
<code>function</code> <code>wp_parse_args( </code><code>$args</code><code>, </code><code>$defaults</code> <code>= </code><code>''</code> <code>) {</code>
</div>
<div>
<code> </code><code>if</code> <code>( </code><code>is_object</code><code>( </code><code>$args</code> <code>) )</code>
</div>
<div>
<code> </code><code>//将接收的对象(obj)转换为数组</code>
</div>
<div>
<code> </code><code>$r</code> <code>= get_object_vars( </code><code>$args</code> <code>);</code>
</div>
<div>
<code> </code><code>elseif</code> <code>( </code><code>is_array</code><code>( </code><code>$args</code> <code>) )</code>
</div>
<div>
<code> </code><code>//如果是数组则不转换</code>
</div>
<div>
<code> </code><code>$r</code> <code>=&amp; </code><code>$args</code><code>;</code>
</div>
<div>
<code> </code><code>else</code>
</div>
<div>
<code> </code><code>//将接收的字符串转换为数组</code>
</div>
<div>
<code> </code><code>wp_parse_str( </code><code>$args</code><code>, </code><code>$r</code> <code>);</code>
</div>
<div>
<code> </code><code>if</code> <code>( </code><code>is_array</code><code>( </code><code>$defaults</code> <code>) )</code>
</div>
<div>
<code> </code><code>return</code> <code>array_merge</code><code>( </code><code>$defaults</code><code>, </code><code>$r</code> <code>);</code>
</div>
<div>
<code> </code><code>return</code> <code>$r</code><code>;</code>
</div>
<div>
<code>}</code>
</div>
</div>
</td>
</tr></tbody></table>
</div>
</div>
<div id="codetool">
<div>
<textarea></textarea>
</div>
</div>
</div>
<p>
其中get_object_vars函数是用来返回由对象属性组成的关联数组。<br>
array_merge函数用是将两个或多个数组的单元合并起来,一个数组中的值附加在前一个数组的后面。返回作为结果的数组。</p>
頁: [1]
查看完整版本: 详解WordPress中用于合成数组的wp_parse_args()函数