<?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>LearnDash &#8211; 小豬日常</title>
	<atom:link href="https://piglife.tw/tag/learndash/feed/" rel="self" type="application/rss+xml" />
	<link>https://piglife.tw</link>
	<description>Hello World，一個紀錄生活與學習的地方</description>
	<lastBuildDate>Thu, 01 Jan 2026 22:20:43 +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>LearnDash &#8211; 小豬日常</title>
	<link>https://piglife.tw</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>在 LearnDash 課程列表新增已報名學生數欄位並優化查詢效能</title>
		<link>https://piglife.tw/technical-notes/learndash-enrolled-count-column/</link>
					<comments>https://piglife.tw/technical-notes/learndash-enrolled-count-column/#respond</comments>
		
		<dc:creator><![CDATA[小豬]]></dc:creator>
		<pubDate>Thu, 01 Jan 2026 22:20:43 +0000</pubDate>
				<category><![CDATA[技術筆記]]></category>
		<category><![CDATA[LearnDash]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[WP_User_Query]]></category>
		<category><![CDATA[後台自訂欄位]]></category>
		<category><![CDATA[快取優化]]></category>
		<category><![CDATA[課程管理]]></category>
		<guid isPermaLink="false">https://piglife.tw/technical-notes/learndash-enrolled-count-column/</guid>

					<description><![CDATA[本文介紹如何在 LearnDash 後台課程列表新增已報名學生數欄位，並透過 WP_User_Que...]]></description>
										<content:encoded><![CDATA[<h2 class="wp-block-heading">前言</h2>
<p>這段程式碼主要解決 LearnDash 後台課程列表無法直接查看每門課程已報名學生數的問題。對於管理大量課程與學員的教學平台管理員來說，快速掌握報名狀況非常重要。本文適合熟悉 WordPress 與 LearnDash 且想自訂後台介面與效能優化的工程師或自學者。</p>
<h2 class="wp-block-heading">新增自訂欄位到課程列表</h2>
<p>透過 WordPress 提供的 <code>manage_edit-{$post_type}_columns</code> 過濾器，我們在 sfwd-courses（LearnDash 課程）後台列表中插入一個「已報名學生」欄位。此欄位被放置在標題欄位後面，方便管理者一目了然。</p>
<pre><code class="lang-php language-php php">add_filter(&#039;manage_edit-sfwd-courses_columns&#039;, function ($columns) {
    $new = [];
    foreach ($columns as $k =&gt; $v) {
        $new[$k] = $v;
        if ($k === &#039;title&#039;) {
            $new[&#039;ld_enrolled_count&#039;] = &#039;已報名學生&#039;;
        }
    }
    if (!isset($new[&#039;ld_enrolled_count&#039;])) {
        $new[&#039;ld_enrolled_count&#039;] = &#039;已報名學生&#039;;
    }
    return $new;
}, 20);</code></pre>
<h2 class="wp-block-heading">顯示欄位內容與計數邏輯</h2>
<p>使用 <code>manage_sfwd-courses_posts_custom_column</code> 動作鉤子，根據課程 ID 呼叫自訂函式取得報名學生數並輸出。計數邏輯透過 WP_User<em>Query 查詢所有有 <code>usermeta</code> 中 `course</em>{course_id}_access_from` 欄位存在的使用者數量，這是 LearnDash 判斷學員是否有課程存取權的標準做法。</p>
<pre><code class="lang-php language-php php">add_action(&#039;manage_sfwd-courses_posts_custom_column&#039;, function ($column, $post_id) {
    if ($column !== &#039;ld_enrolled_count&#039;)
        return;

    $count = vs_ld_get_enrolled_count($post_id);

    echo esc_html((string) $count);
}, 10, 2);</code></pre>
<h3 class="wp-block-heading">快取機制提升效能</h3>
<p>為避免課程列表頁面每筆課程都執行重複且昂貴的資料庫查詢，使用 WordPress 內建快取（wp_cache）暫存結果 10 分鐘。這樣可以大幅減少對資料庫的負擔，避免後台卡頓。</p>
<pre><code class="lang-php language-php php">function vs_ld_get_enrolled_count($course_id)
{
    $course_id = (int) $course_id;
    if ($course_id &lt;= 0)
        return 0;

    $cache_key = &#039;course_enrolled_&#039; . $course_id;
    $cached = wp_cache_get($cache_key, &#039;ld_course_enroll_count&#039;);
    if ($cached !== false) {
        return (int) $cached;
    }

    $meta_key = &#039;course_&#039; . $course_id . &#039;_access_from&#039;;

    $uq = new WP_User_Query([
        &#039;fields&#039; =&gt; &#039;ID&#039;,
        &#039;number&#039; =&gt; 1,
        &#039;paged&#039; =&gt; 1,
        &#039;count_total&#039; =&gt; true,
        &#039;meta_query&#039; =&gt; [
            [
                &#039;key&#039; =&gt; $meta_key,
                &#039;compare&#039; =&gt; &#039;EXISTS&#039;,
            ],
        ],
    ]);

    $count = (int) $uq-&gt;get_total();

    wp_cache_set($cache_key, $count, &#039;ld_course_enroll_count&#039;, 10 * MINUTE_IN_SECONDS);

    return $count;
}</code></pre>
<h2 class="wp-block-heading">課程更新時清除快取</h2>
<p>為確保報名數字不會因快取而過時，當課程內容被更新時，會自動刪除對應快取，讓下一次查詢能取得最新資料。</p>
<pre><code class="lang-php language-php php">add_action(&#039;save_post_sfwd-courses&#039;, function ($post_id) {
    if (defined(&#039;DOING_AUTOSAVE&#039;) &amp;&amp; DOING_AUTOSAVE)
        return;
    $post_id = (int) $post_id;
    wp_cache_delete(&#039;course_enrolled_&#039; . $post_id, &#039;ld_course_enroll_count&#039;);
}, 20);</code></pre>
<h2 class="wp-block-heading">實務應用與延伸</h2>
<p>這種方式適合需要在 LearnDash 後台快速掌握各課程報名狀況的管理者，尤其是課程數量龐大時，快取機制可有效減少資料庫負擔。未來可延伸加入排序功能，或結合 AJAX 即時更新報名數，提升使用體驗。</p>
<h2 class="wp-block-heading">常見問題與注意事項</h2>
<ul>
<li>快取時間設定過短會增加資料庫查詢頻率，過長可能導致數據不即時，需依實際需求調整。</li>
<li>使用 WP_User_Query 查詢大量用戶時，仍需注意資料庫效能，建議搭配適當索引。</li>
<li>本範例假設 LearnDash 使用標準 usermeta key，若有自訂存取邏輯需調整查詢條件。</li>
</ul>
<h2 class="wp-block-heading">完整程式碼</h2>
<pre><code class="lang-php language-php php">&lt;?php
if (!defined(&#039;ABSPATH&#039;))
    exit;

/**
 * LearnDash：後台課程清單新增「已報名學生數」欄位
 * - post_type: sfwd-courses
 * - 計數依據：usermeta key = course_{course_id}_access_from EXISTS
 * - 有短暫快取，避免清單頁卡爆
 */

/** 1) 加欄位 */
add_filter(&#039;manage_edit-sfwd-courses_columns&#039;, function ($columns) {
    // 插在標題後面（你也可以改位置）
    $new = [];
    foreach ($columns as $k =&gt; $v) {
        $new[$k] = $v;
        if ($k === &#039;title&#039;) {
            $new[&#039;ld_enrolled_count&#039;] = &#039;已報名學生&#039;;
        }
    }
    if (!isset($new[&#039;ld_enrolled_count&#039;])) {
        $new[&#039;ld_enrolled_count&#039;] = &#039;已報名學生&#039;;
    }
    return $new;
}, 20);

/** 2) 顯示欄位內容 */
add_action(&#039;manage_sfwd-courses_posts_custom_column&#039;, function ($column, $post_id) {
    if ($column !== &#039;ld_enrolled_count&#039;)
        return;

    $count = vs_ld_get_enrolled_count($post_id);

    echo esc_html((string) $count);
}, 10, 2);

/** 3) 計數函式（含快取） */
function vs_ld_get_enrolled_count($course_id)
{
    $course_id = (int) $course_id;
    if ($course_id &lt;= 0)
        return 0;

    // 快取 10 分鐘（避免列表頁每一列都打一次 users table）
    $cache_key = &#039;course_enrolled_&#039; . $course_id;
    $cached = wp_cache_get($cache_key, &#039;ld_course_enroll_count&#039;);
    if ($cached !== false) {
        return (int) $cached;
    }

    // LearnDash 最常用的課程存取 key
    $meta_key = &#039;course_&#039; . $course_id . &#039;_access_from&#039;;

    // 用 WP_User_Query 計數 meta_key EXISTS 的使用者
    $uq = new WP_User_Query([
        &#039;fields&#039; =&gt; &#039;ID&#039;,
        &#039;number&#039; =&gt; 1,        // 只要 count_total，不要真的撈一堆 ID
        &#039;paged&#039; =&gt; 1,
        &#039;count_total&#039; =&gt; true,
        &#039;meta_query&#039; =&gt; [
            [
                &#039;key&#039; =&gt; $meta_key,
                &#039;compare&#039; =&gt; &#039;EXISTS&#039;,
            ],
        ],
    ]);

    $count = (int) $uq-&gt;get_total();

    wp_cache_set($cache_key, $count, &#039;ld_course_enroll_count&#039;, 10 * MINUTE_IN_SECONDS);

    return $count;
}

/** 4) 當課程更新時，清掉該課程快取（避免顯示太久舊數字） */
add_action(&#039;save_post_sfwd-courses&#039;, function ($post_id) {
    if (defined(&#039;DOING_AUTOSAVE&#039;) &amp;&amp; DOING_AUTOSAVE)
        return;
    $post_id = (int) $post_id;
    wp_cache_delete(&#039;course_enrolled_&#039; . $post_id, &#039;ld_course_enroll_count&#039;);
}, 20);</code></pre>]]></content:encoded>
					
					<wfw:commentRss>https://piglife.tw/technical-notes/learndash-enrolled-count-column/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
