<?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>wp_query &#8211; 小豬日常</title>
	<atom:link href="https://piglife.tw/tag/wp_query/feed/" rel="self" type="application/rss+xml" />
	<link>https://piglife.tw</link>
	<description>Hello World，一個紀錄生活與學習的地方</description>
	<lastBuildDate>Tue, 23 Dec 2025 03:02:20 +0000</lastBuildDate>
	<language>zh-TW</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9</generator>

<image>
	<url>https://piglife.tw/wp-content/uploads/2017/10/cropped-logo-1-32x32.png</url>
	<title>wp_query &#8211; 小豬日常</title>
	<link>https://piglife.tw</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>WordPress 後台為自訂文章類型新增內容關鍵字搜尋功能</title>
		<link>https://piglife.tw/technical-notes/wordpress-solution-content-search/</link>
					<comments>https://piglife.tw/technical-notes/wordpress-solution-content-search/#respond</comments>
		
		<dc:creator><![CDATA[小豬]]></dc:creator>
		<pubDate>Mon, 22 Dec 2025 22:20:38 +0000</pubDate>
				<category><![CDATA[技術筆記]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[wp_query]]></category>
		<category><![CDATA[內容關鍵字搜尋]]></category>
		<category><![CDATA[後台搜尋]]></category>
		<category><![CDATA[自訂文章類型]]></category>
		<guid isPermaLink="false">https://piglife.tw/technical-notes/wordpress-solution-content-search/</guid>

					<description><![CDATA[介紹如何在 WordPress 自訂文章類型 solution 的後台新增內容關鍵字搜尋功能，透過 ...]]></description>
										<content:encoded><![CDATA[<h2 class="wp-block-heading">前言</h2>
<p>在 WordPress 後台管理自訂文章類型（此處為 solution）時，若想快速搜尋文章內容中是否包含特定關鍵字，系統預設的搜尋功能可能無法精準或方便達成此需求。這段程式碼示範如何為 solution 文章類型新增一個後台子選單，提供內容關鍵字搜尋功能，適合需要管理大量文章並快速定位內容的開發者與網站管理員。</p>
<h2 class="wp-block-heading">新增後台子選單</h2>
<p>使用 <code>admin_menu</code> action，先檢查 solution 文章類型是否存在，避免錯誤。接著透過 <code>add_submenu_page</code> 在 solution 列表底下新增「內容關鍵字搜尋」子選單，設定權限為 <code>edit_posts</code>，確保只有具備編輯權限的使用者能操作。</p>
<pre><code class="lang-php language-php php">add_action( &#039;admin_menu&#039;, function () {
    if ( ! post_type_exists( &#039;solution&#039; ) ) {
        return;
    }

    add_submenu_page(
        &#039;edit.php?post_type=solution&#039;,
        &#039;內容關鍵字搜尋&#039;,
        &#039;內容關鍵字搜尋&#039;,
        &#039;edit_posts&#039;,
        &#039;solution-content-search&#039;,
        &#039;solution_content_search_page_render&#039;
    );
} );</code></pre>
<h2 class="wp-block-heading">搜尋頁面渲染與表單處理</h2>
<p><code>solution_content_search_page_render</code> 函式負責渲染搜尋表單與結果頁面。首先檢查使用者權限，避免未授權存取。接著判斷是否有表單送出，並使用 WordPress 的 nonce 機制驗證安全性。</p>
<p>關鍵字透過 <code>sanitize_text_field</code> 與 <code>wp_unslash</code> 清理，避免 XSS 與注入風險。</p>
<pre><code class="lang-php language-php php">if ( isset( $_POST[&#039;solution_content_search_submit&#039;] ) ) {
    check_admin_referer( &#039;solution_content_search_action&#039;, &#039;solution_content_search_nonce&#039; );

    $keyword  = isset( $_POST[&#039;solution_keyword&#039;] ) ? sanitize_text_field( wp_unslash( $_POST[&#039;solution_keyword&#039;] ) ) : &#039;&#039;;
    $searched = true;

    if ( $keyword !== &#039;&#039; ) {
        // ...
    }
}</code></pre>
<h2 class="wp-block-heading">透過 WP_Query 及字串比對精確搜尋</h2>
<p>WordPress 內建搜尋（<code>s</code> 參數）會搜尋標題、內容等欄位，但可能不夠精準。此處先用 <code>WP_Query</code> 以關鍵字搜尋取得可能相關文章 ID，然後逐篇讀取內容，使用 <code>mb_stripos</code>（若有）或 <code>stripos</code> 做不區分大小寫的字串比對，確保內容確實包含關鍵字。</p>
<pre><code class="lang-php language-php php">$query = new WP_Query( array(
    &#039;post_type&#039;      =&gt; &#039;solution&#039;,
    &#039;post_status&#039;    =&gt; &#039;any&#039;,
    &#039;posts_per_page&#039; =&gt; -1,
    &#039;s&#039;              =&gt; $keyword,
    &#039;fields&#039;         =&gt; &#039;ids&#039;,
) );

foreach ( $query-&gt;posts as $post_id ) {
    $post = get_post( $post_id );
    if ( ! $post ) {
        continue;
    }

    $content = wp_strip_all_tags( $post-&gt;post_content );

    if ( function_exists( &#039;mb_stripos&#039; ) ) {
        $pos = mb_stripos( $content, $keyword );
    } else {
        $pos = stripos( $content, $keyword );
    }

    if ( $pos !== false ) {
        $results[] = $post_id;
    }
}
wp_reset_postdata();</code></pre>
<h2 class="wp-block-heading">搜尋結果呈現與操作介面</h2>
<p>搜尋結果會以表格形式呈現，包含文章 ID、標題（連結至編輯頁面）、前台連結與編輯按鈕，方便快速查看與編輯。若無輸入關鍵字或找不到結果，會顯示相應提示訊息。</p>
<p>表單使用 WordPress 內建的 <code>wp_nonce_field</code> 與 <code>submit_button</code>，確保安全與一致性。</p>
<h2 class="wp-block-heading">實務應用與優化方向</h2>
<p>此搜尋功能適合用於自訂文章類型管理，尤其是內容量大且需要精準定位文本的場景。未來可考慮加入分頁功能避免一次載入過多文章，或結合全文索引外掛提升搜尋效能。也可擴充搜尋範圍至自訂欄位或分類。</p>
<h2 class="wp-block-heading">完整程式碼</h2>
<pre><code class="lang-php language-php php">&lt;?php
// 在「solution」這個 post type 底下新增一個後台子選單：內容關鍵字搜尋
add_action( &#039;admin_menu&#039;, function () {
    // 確保有這個 post type
    if ( ! post_type_exists( &#039;solution&#039; ) ) {
        return;
    }

    add_submenu_page(
        &#039;edit.php?post_type=solution&#039;,          // 父層 (solution 列表底下)
        &#039;內容關鍵字搜尋&#039;,                        // 頁面標題
        &#039;內容關鍵字搜尋&#039;,                        // 左側選單名稱
        &#039;edit_posts&#039;,                           // 權限
        &#039;solution-content-search&#039;,              // slug
        &#039;solution_content_search_page_render&#039;   // callback
    );
} );

// 後台頁面：渲染搜尋表單與結果
function solution_content_search_page_render() {
    if ( ! current_user_can( &#039;edit_posts&#039; ) ) {
        wp_die( &#039;沒有權限檢視此頁面。&#039; );
    }

    $keyword  = &#039;&#039;;
    $results  = array();
    $searched = false;

    // 處理表單送出
    if ( isset( $_POST[&#039;solution_content_search_submit&#039;] ) ) {
        check_admin_referer( &#039;solution_content_search_action&#039;, &#039;solution_content_search_nonce&#039; );

        $keyword  = isset( $_POST[&#039;solution_keyword&#039;] ) ? sanitize_text_field( wp_unslash( $_POST[&#039;solution_keyword&#039;] ) ) : &#039;&#039;;
        $searched = true;

        if ( $keyword !== &#039;&#039; ) {
            // 先用 WP_Query 找出可能包含關鍵字的文章 (全文搜尋)
            $query = new WP_Query( array(
                &#039;post_type&#039;      =&gt; &#039;solution&#039;,
                &#039;post_status&#039;    =&gt; &#039;any&#039;,
                &#039;posts_per_page&#039; =&gt; -1,
                &#039;s&#039;              =&gt; $keyword,
                &#039;fields&#039;         =&gt; &#039;ids&#039;,
            ) );

            if ( $query-&gt;have_posts() ) {
                foreach ( $query-&gt;posts as $post_id ) {
                    $post = get_post( $post_id );
                    if ( ! $post ) {
                        continue;
                    }

                    // 從內容中做字串檢查（確保 content 真的有包含關鍵字）
                    $content = wp_strip_all_tags( $post-&gt;post_content );

                    if ( function_exists( &#039;mb_stripos&#039; ) ) {
                        $pos = mb_stripos( $content, $keyword );
                    } else {
                        $pos = stripos( $content, $keyword );
                    }

                    if ( $pos !== false ) {
                        $results[] = $post_id;
                    }
                }
            }
            wp_reset_postdata();
        }
    }

    ?&gt;
    &lt;div class=&quot;wrap&quot;&gt;

&lt;h1&gt;Solution 內容關鍵字搜尋&lt;/h1&gt;

&lt;p&gt;輸入一個關鍵字，系統會掃描 &amp;lt;code&amp;gt;solution&amp;lt;/code&amp;gt;
 文章類型的內容（content），只要有包含該字串，就列出標題與編輯連結。&lt;/p&gt;

        &lt;form method=&quot;post&quot; style=&quot;margin-top: 1em; margin-bottom: 2em;&quot;&gt;
            &lt;?php wp_nonce_field( &#039;solution_content_search_action&#039;, &#039;solution_content_search_nonce&#039; ); ?&gt;

            &lt;table class=&quot;form-table&quot; role=&quot;presentation&quot;&gt;

&lt;tr&gt;
                    &lt;th scope=&quot;row&quot;&gt;
                        &lt;label for=&quot;solution_keyword&quot;&gt;關鍵字字串&lt;/label&gt;
                    &lt;/th&gt;

&lt;td&gt;
                        &lt;input
                            type=&quot;text&quot;
                            id=&quot;solution_keyword&quot;
                            name=&quot;solution_keyword&quot;
                            class=&quot;regular-text&quot;
                            value=&quot;&lt;?php echo esc_attr( $keyword ); ?&gt;&quot;
                            placeholder=&quot;例如：API、某段程式碼、特定中文句子&quot;
                        /&gt;
                    &lt;/td&gt;
                &lt;/tr&gt;
            &lt;/table&gt;

            &lt;?php submit_button( &#039;開始搜尋&#039;, &#039;primary&#039;, &#039;solution_content_search_submit&#039; ); ?&gt;
        &lt;/form&gt;

        &lt;?php if ( $searched ) : ?&gt;

&lt;h2&gt;搜尋結果&lt;/h2&gt;

            &lt;?php if ( $keyword === &#039;&#039; ) : ?&gt;
                &lt;div class=&quot;notice notice-warning&quot;&gt;&lt;p&gt;請輸入關鍵字。&lt;/p&gt;&lt;/div&gt;
            &lt;?php elseif ( empty( $results ) ) : ?&gt;
                &lt;div class=&quot;notice notice-info&quot;&gt;&lt;p&gt;沒有找到內容包含「&lt;?php echo esc_html( $keyword ); ?&gt;」的 solution 文章。&lt;/p&gt;&lt;/div&gt;
            &lt;?php else : ?&gt;

&lt;p&gt;找到 &lt;?php echo esc_html( count( $results ) ); ?&gt; 篇文章，內容中包含「&lt;?php echo esc_html( $keyword ); ?&gt;」。&lt;/p&gt;

                &lt;table class=&quot;widefat fixed striped&quot;&gt;

&lt;thead&gt;

&lt;tr&gt;
                            &lt;th scope=&quot;col&quot; style=&quot;width: 50px;&quot;&gt;ID&lt;/th&gt;
                            &lt;th scope=&quot;col&quot;&gt;標題&lt;/th&gt;
                            &lt;th scope=&quot;col&quot; style=&quot;width: 200px;&quot;&gt;前台連結&lt;/th&gt;
                            &lt;th scope=&quot;col&quot; style=&quot;width: 150px;&quot;&gt;編輯&lt;/th&gt;
                        &lt;/tr&gt;
                    &lt;/thead&gt;

&lt;tbody&gt;
                    &lt;?php foreach ( $results as $post_id ) :
                        $title     = get_the_title( $post_id );
                        $view_link = get_permalink( $post_id );
                        $edit_link = get_edit_post_link( $post_id, &#039;&#039; );
                    ?&gt;

&lt;tr&gt;

&lt;td&gt;&lt;?php echo esc_html( $post_id ); ?&gt;&lt;/td&gt;

&lt;td&gt;
                                &lt;?php if ( $edit_link ) : ?&gt;
                                    &lt;a href=&quot;&lt;?php echo esc_url( $edit_link ); ?&gt;&quot;&gt;
                                        &lt;?php echo esc_html( $title ); ?&gt;
                                    &lt;/a&gt;
                                &lt;?php else : ?&gt;
                                    &lt;?php echo esc_html( $title ); ?&gt;
                                &lt;?php endif; ?&gt;
                            &lt;/td&gt;

&lt;td&gt;
                                &lt;?php if ( $view_link ) : ?&gt;
                                    &lt;a href=&quot;&lt;?php echo esc_url( $view_link ); ?&gt;&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;
                                        檢視
                                    &lt;/a&gt;
                                &lt;?php else : ?&gt;
                                    -
                                &lt;?php endif; ?&gt;
                            &lt;/td&gt;

&lt;td&gt;
                                &lt;?php if ( $edit_link ) : ?&gt;
                                    &lt;a href=&quot;&lt;?php echo esc_url( $edit_link ); ?&gt;&quot; class=&quot;button button-small&quot;&gt;
                                        編輯文章
                                    &lt;/a&gt;
                                &lt;?php else : ?&gt;
                                    -
                                &lt;?php endif; ?&gt;
                            &lt;/td&gt;
                        &lt;/tr&gt;
                    &lt;?php endforeach; ?&gt;
                    &lt;/tbody&gt;
                &lt;/table&gt;
            &lt;?php endif; ?&gt;
        &lt;?php endif; ?&gt;
    &lt;/div&gt;
    &lt;?php
}</code></pre>]]></content:encoded>
					
					<wfw:commentRss>https://piglife.tw/technical-notes/wordpress-solution-content-search/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>WordPress 自定義文章類型相關文章顯示實作筆記</title>
		<link>https://piglife.tw/technical-notes/wordpress-related-posts-cpt/</link>
					<comments>https://piglife.tw/technical-notes/wordpress-related-posts-cpt/#respond</comments>
		
		<dc:creator><![CDATA[小豬]]></dc:creator>
		<pubDate>Thu, 20 Feb 2025 07:18:16 +0000</pubDate>
				<category><![CDATA[技術筆記]]></category>
		<category><![CDATA[custom-post-type]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[wp_query]]></category>
		<category><![CDATA[相關文章]]></category>
		<category><![CDATA[自定義文章類型]]></category>
		<guid isPermaLink="false">https://piglife.tw/?p=495</guid>

					<description><![CDATA[介紹如何在 WordPress 自定義文章類型頁面中，利用 WP_Query 依據當前文章標題搜尋並...]]></description>
										<content:encoded><![CDATA[<h2 class="wp-block-heading">前言</h2>
<p>在 WordPress 開發中，常見需求是於自定義文章類型（Custom Post Type，CPT）頁面中顯示與該文章相關的一般文章。本文以名為 <code>member_info</code> 的 CPT 為例，示範如何利用 <code>WP_Query</code> 依據當前 CPT 文章標題搜尋並顯示相關文章。</p>
<h2 class="wp-block-heading">程式碼實現</h2>
<p>我們透過 <code>WP_Query</code> 搜尋標題或內容包含當前 <code>member_info</code> 文章標題的文章，並限制顯示數量。以下為範例程式碼，適合放入 <code>single-member_info.php</code> 或對應模板：</p>
<pre><code class="lang-php language-php php">if (is_singular(&#039;member_info&#039;)) {
  $current_title = get_the_title(); // 取得當前 member_info 文章標題

  $args = array(
    &#039;post_type&#039; =&gt; &#039;post&#039;, // 僅搜尋一般文章
    &#039;posts_per_page&#039; =&gt; 5, // 限制顯示數量
    &#039;s&#039; =&gt; $current_title, // 以標題作為搜尋關鍵字
  );

  $query = new WP_Query($args);

  if ($query-&gt;have_posts()) {
    echo &#039;
&lt;h3&gt;相關文章&lt;/h3&gt;&#039;;
    echo &#039;
&lt;ul&gt;&#039;;
    while ($query-&gt;have_posts()) {
      $query-&gt;the_post();
      echo &#039;
&lt;li&gt;&lt;a href=&quot;&#039; . get_permalink() . &#039;&quot;&gt;&#039; . get_the_title() . &#039;&lt;/a&gt;&lt;/li&gt;&#039;;
    }
    echo &#039;&lt;/ul&gt;&#039;;
  } else {
    echo &#039;
&lt;h3&gt;相關文章&lt;/h3&gt;&#039;;
    echo &#039;
&lt;p&gt;沒有找到相關文章&lt;/p&gt;&#039;;
  }

  wp_reset_postdata();
}</code></pre>
<h2 class="wp-block-heading">程式碼解析</h2>
<h3 class="wp-block-heading">1. 檢查文章類型</h3>
<pre><code class="lang-php language-php php">if (is_singular(&#039;member_info&#039;)) {</code></pre>
<p>確保程式碼只在 <code>member_info</code> 單篇文章頁執行，避免影響其他頁面。</p>
<h3 class="wp-block-heading">2. 取得當前文章標題</h3>
<pre><code class="lang-php language-php php">$current_title = get_the_title();</code></pre>
<p>利用 WordPress 內建函式取得目前 CPT 文章標題，作為搜尋關鍵字。</p>
<h3 class="wp-block-heading">3. 設定查詢參數</h3>
<pre><code class="lang-php language-php php">$args = array(
  &#039;post_type&#039; =&gt; &#039;post&#039;,
  &#039;posts_per_page&#039; =&gt; 5,
  &#039;s&#039; =&gt; $current_title,
);</code></pre>
<ul>
<li><code>post_type</code> 限定搜尋一般文章。</li>
<li><code>posts_per_page</code> 限制最多顯示 5 篇。</li>
<li><code>s</code> 參數用於全文搜尋，搜尋包含標題的文章。</li>
</ul>
<h3 class="wp-block-heading">4. 輸出查詢結果</h3>
<pre><code class="lang-php language-php php">if ($query-&gt;have_posts()) {
  echo &#039;
&lt;h3&gt;相關文章&lt;/h3&gt;&#039;;
  echo &#039;
&lt;ul&gt;&#039;;
  while ($query-&gt;have_posts()) {
    $query-&gt;the_post();
    echo &#039;
&lt;li&gt;&lt;a href=&quot;&#039; . get_permalink() . &#039;&quot;&gt;&#039; . get_the_title() . &#039;&lt;/a&gt;&lt;/li&gt;&#039;;
  }
  echo &#039;&lt;/ul&gt;&#039;;
} else {
  echo &#039;
&lt;h3&gt;相關文章&lt;/h3&gt;&#039;;
  echo &#039;
&lt;p&gt;沒有找到相關文章&lt;/p&gt;&#039;;
}</code></pre>
<p>判斷是否有符合條件的文章，並以列表形式輸出標題與連結。</p>
<h3 class="wp-block-heading">5. 重置查詢狀態</h3>
<pre><code class="lang-php language-php php">wp_reset_postdata();</code></pre>
<p>避免自訂查詢影響後續 WordPress 迴圈或內容顯示。</p>
<h2 class="wp-block-heading">實際應用與延伸</h2>
<ul>
<li>可用於產品頁面顯示與產品名稱相關的部落格文章。</li>
<li>課程頁面展示與課程名稱相關的學習資源。</li>
<li>可進一步結合自訂欄位或關聯插件，提升相關文章精準度。</li>
</ul>
<h2 class="wp-block-heading">常見坑</h2>
<ul>
<li><code>s</code> 參數為全文搜尋，可能導致結果不夠精確。</li>
<li>查詢結果過多時，建議加入分頁或限制數量。</li>
<li>請確保模板檔案命名與 CPT 名稱一致，避免無法正確載入。</li>
</ul>
<h2 class="wp-block-heading">完整程式碼</h2>
<pre><code class="lang-text language-text text">&lt;?php
if (is_singular(&#039;member_info&#039;)) {
  $current_title = get_the_title(); // 取得當前 member_info 文章的標題

  // 查詢與當前 member_info 相關的 post 文章
  $args = array(
    &#039;post_type&#039; =&gt; &#039;post&#039;, // 只搜尋一般文章
    &#039;posts_per_page&#039; =&gt; 5, // 限制顯示數量
    &#039;s&#039; =&gt; $current_title, // 內文搜尋關鍵字
  );

  $query = new WP_Query($args);

  if ($query-&gt;have_posts()) {
    echo &#039;
&lt;h3&gt;相關文章&lt;/h3&gt;&#039;;
    echo &#039;
&lt;ul&gt;&#039;;
    while ($query-&gt;have_posts()) {
      $query-&gt;the_post();
      echo &#039;
&lt;li&gt;&lt;a href=&quot;&#039; . get_permalink() . &#039;&quot;&gt;&#039; . get_the_title() . &#039;&lt;/a&gt;&lt;/li&gt;&#039;;
    }
    echo &#039;&lt;/ul&gt;&#039;;
  } else {
    echo &#039;
&lt;h3&gt;相關文章&lt;/h3&gt;&#039;;
    echo &#039;
&lt;p&gt;沒有找到相關文章&lt;/p&gt;&#039;;
  }

  wp_reset_postdata();
}
?&gt;</code></pre>]]></content:encoded>
					
					<wfw:commentRss>https://piglife.tw/technical-notes/wordpress-related-posts-cpt/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>利用 Shortcode 在 WordPress 頁面顯示指定 Post Type 文章教學</title>
		<link>https://piglife.tw/technical-notes/wordpress-shortcode-post-type/</link>
					<comments>https://piglife.tw/technical-notes/wordpress-shortcode-post-type/#respond</comments>
		
		<dc:creator><![CDATA[小豬]]></dc:creator>
		<pubDate>Wed, 01 Nov 2017 17:24:52 +0000</pubDate>
				<category><![CDATA[技術筆記]]></category>
		<category><![CDATA[functions.php]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[post type]]></category>
		<category><![CDATA[shortcode]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[wp_query]]></category>
		<category><![CDATA[自訂文章類型]]></category>
		<guid isPermaLink="false">https://piglife.tw/?p=265</guid>

					<description><![CDATA[介紹如何在 WordPress 中利用 shortcode 包裝 WP_Query 查詢指定文章類型...]]></description>
										<content:encoded><![CDATA[<h2 class="wp-block-heading">前言</h2>
<p>在使用 WordPress 建置網站時，若頁面內容多以 shortcode 方式組合，想要在頁面中靈活顯示特定文章類型（Post Type）的文章，就需要將查詢文章的功能包裝成 shortcode。這樣可以方便在任何頁面或文章中插入，提升內容管理彈性。本文適合有基礎 PHP 與 WordPress 開發經驗的工程師或自學者。</p>
<h2 class="wp-block-heading">建立自訂 Shortcode 函式</h2>
<p>我們可以在主題的 <code>functions.php</code> 檔案中，撰寫一個函式來查詢指定的文章類型，並輸出 HTML 結構。以下為範例關鍵程式碼說明：</p>
<pre><code class="lang-php language-php php">function home_post_listing_shortcode( $atts ) {
    ob_start();
    // 建立 WP_Query 物件，查詢 post_type 為 &#039;post&#039; 的文章，限制顯示 3 篇，依標題排序（降冪）
    $query = new WP_Query( array(
        &#039;post_type&#039;      =&gt; &#039;post&#039;, // 可替換成想抓取的自訂文章類型
        &#039;posts_per_page&#039; =&gt; 3,      // 取出文章數量
        &#039;order&#039;          =&gt; &#039;DESC&#039;, // 排序方式 ASC(小-&gt;大), DESC(大-&gt;小)
        &#039;orderby&#039;        =&gt; &#039;title&#039; // 依標題排序
    ) );

    if ( $query-&gt;have_posts() ) {
        echo &#039;&lt;ul class=&quot;info-listing&quot;&gt;&#039;;
        while ( $query-&gt;have_posts() ) {
            $query-&gt;the_post();
            ?&gt;
            &lt;li id=&quot;post-&lt;?php the_ID(); ?&gt;&quot; &lt;?php post_class(); ?&gt;&gt;
                &lt;div class=&quot;category_name&quot;&gt;&lt;?php the_category(); ?&gt;&lt;/div&gt;
                &lt;?php the_date(&#039;Y-m-d at g:ia&#039;, &#039;&lt;div class=&quot;news_date&quot;&gt;&#039;, &#039;&lt;/div&gt;&#039;); ?&gt;
                &lt;a href=&quot;&lt;?php the_permalink(); ?&gt;&quot;&gt;&lt;?php the_title(); ?&gt;&lt;/a&gt;
            &lt;/li&gt;
            &lt;?php
        }
        echo &#039;&lt;/ul&gt;&#039;;
        wp_reset_postdata();
    }

    return ob_get_clean();
}</code></pre>
<h2 class="wp-block-heading">註冊 Shortcode</h2>
<p>將上述函式註冊為 shortcode，讓 WordPress 辨識並可在頁面中使用：</p>
<pre><code class="lang-php language-php php">add_shortcode( &#039;list-posts-home&#039;, &#039;home_post_listing_shortcode&#039; );</code></pre>
<p>註冊後，只要在 WordPress 後台的頁面編輯器中插入 <code>[list-posts-home]</code>，就會顯示該 shortcode 所輸出的文章列表。</p>
<h2 class="wp-block-heading">實際應用與延伸</h2>
<ul>
<li>可修改 <code>post_type</code> 參數為自訂文章類型，如 <code>product</code>、<code>event</code> 等。</li>
<li>可加入 <code>category_name</code> 或 <code>tax_query</code> 參數，篩選特定分類文章。</li>
<li>調整 <code>posts_per_page</code> 與排序條件，符合不同需求。</li>
<li>搭配頁面建構器（如 Visual Composer）使用，提升內容排版彈性。</li>
</ul>
<h2 class="wp-block-heading">常見坑點</h2>
<ul>
<li><code>order</code> 參數應為 <code>DESC</code>（大到小），原範例中寫成 <code>DSC</code> 會無效。</li>
<li>使用 <code>the_date()</code> 時，若多篇文章同一天只會顯示一次日期，改用 <code>the_time()</code> 可避免此問題。</li>
<li>記得使用 <code>wp_reset_postdata()</code> 恢復全域文章資料，避免影響其他查詢。</li>
</ul>
<h2 class="wp-block-heading">完整程式碼</h2>
<pre><code class="lang-text language-text text">function home_post_listing_shortcode( $atts ) {
    ob_start();
    $query = new WP_Query( array(
        &#039;post_type&#039;      =&gt; &#039;post&#039;,
        &#039;posts_per_page&#039; =&gt; 3,
        &#039;order&#039;          =&gt; &#039;DESC&#039;,
        &#039;orderby&#039;        =&gt; &#039;title&#039;,
    ) );

    if ( $query-&gt;have_posts() ) {
        echo &#039;&lt;ul class=&quot;info-listing&quot;&gt;&#039;;
        while ( $query-&gt;have_posts() ) {
            $query-&gt;the_post();
            ?&gt;
            &lt;li id=&quot;post-&lt;?php the_ID(); ?&gt;&quot; &lt;?php post_class(); ?&gt;&gt;
                &lt;div class=&quot;category_name&quot;&gt;&lt;?php the_category(); ?&gt;&lt;/div&gt;
                &lt;?php the_date(&#039;Y-m-d at g:ia&#039;, &#039;&lt;div class=&quot;news_date&quot;&gt;&#039;, &#039;&lt;/div&gt;&#039;); ?&gt;
                &lt;a href=&quot;&lt;?php the_permalink(); ?&gt;&quot;&gt;&lt;?php the_title(); ?&gt;&lt;/a&gt;
            &lt;/li&gt;
            &lt;?php
        }
        echo &#039;&lt;/ul&gt;&#039;;
        wp_reset_postdata();
    }

    return ob_get_clean();
}

add_shortcode( &#039;list-posts-home&#039;, &#039;home_post_listing_shortcode&#039; );</code></pre>]]></content:encoded>
					
					<wfw:commentRss>https://piglife.tw/technical-notes/wordpress-shortcode-post-type/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
