<?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>後台自訂欄位 &#8211; 小豬日常</title>
	<atom:link href="https://piglife.tw/tag/%e5%be%8c%e5%8f%b0%e8%87%aa%e8%a8%82%e6%ac%84%e4%bd%8d/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>後台自訂欄位 &#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>
		<item>
		<title>WooCommerce 後台商品列表新增複製購物車連結並支援優惠券輸入功能</title>
		<link>https://piglife.tw/technical-notes/woocommerce-copy-cart-link-coupon/</link>
					<comments>https://piglife.tw/technical-notes/woocommerce-copy-cart-link-coupon/#respond</comments>
		
		<dc:creator><![CDATA[小豬]]></dc:creator>
		<pubDate>Tue, 23 Dec 2025 22:21:03 +0000</pubDate>
				<category><![CDATA[技術筆記]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[woocommerce]]></category>
		<category><![CDATA[優惠券]]></category>
		<category><![CDATA[剪貼簿操作]]></category>
		<category><![CDATA[後台自訂欄位]]></category>
		<category><![CDATA[複製連結]]></category>
		<guid isPermaLink="false">https://piglife.tw/technical-notes/woocommerce-copy-cart-link-coupon/</guid>

					<description><![CDATA[介紹如何在 WooCommerce 後台商品列表新增一欄複製加入購物車連結的按鈕，並支援彈窗輸入優惠...]]></description>
										<content:encoded><![CDATA[<h2 class="wp-block-heading">前言</h2>
<p>在 WooCommerce 後台商品列表中，管理者常需要快速取得商品的「加入購物車」連結以便分享或推廣。這段程式碼實作了在商品列表中新增一欄「複製課程連結」按鈕，點擊後可彈出視窗讓使用者輸入優惠券代碼，並將優惠券參數附加到連結中，最後將完整連結複製到剪貼簿。這對於需要快速產生帶優惠券的購物車連結的電商管理者非常實用。</p>
<h2 class="wp-block-heading">新增自訂欄位顯示複製按鈕</h2>
<p>利用 <code>manage_edit-product_columns</code> 過濾器新增一欄「複製課程連結」，並透過 <code>manage_product_posts_custom_column</code> 動作在該欄位輸出一個帶有商品加入購物車 URL 的按鈕。URL 是以網站首頁 URL 加上 <code>/cart/?add-to-cart=商品ID</code> 組成。</p>
<pre><code class="lang-php language-php php">add_filter(&#039;manage_edit-product_columns&#039;, &#039;add_copy_link_column&#039;);
function add_copy_link_column($columns) {
    $columns[&#039;copy_add_to_cart&#039;] = __(&#039;複製課程連結&#039;, &#039;woocommerce&#039;);
    return $columns;
}

add_action(&#039;manage_product_posts_custom_column&#039;, &#039;show_copy_link_column_content&#039;, 10, 2);
function show_copy_link_column_content($column, $post_id) {
    if ($column === &#039;copy_add_to_cart&#039;) {
        $product_id = (int) $post_id;
        $site_url = my_copy_cart_site_url();
        $add_to_cart_url = $site_url . &#039;/cart/?add-to-cart=&#039; . $product_id;
        echo &#039;&lt;button type=&quot;button&quot; class=&quot;button copy-cart-link&quot; data-url=&quot;&#039; . esc_attr($add_to_cart_url) . &#039;&quot; title=&quot;點擊複製連結&quot;&gt;複製&lt;/button&gt;&#039;;
    }
}</code></pre>
<h2 class="wp-block-heading">客製化 JavaScript 處理複製邏輯與優惠券輸入</h2>
<p>在後台商品列表頁尾插入 JavaScript 和 CSS，當使用者點擊「複製」按鈕時：</p>
<ol>
<li>透過 <code>window.prompt</code> 詢問是否輸入優惠券代碼，可留空。</li>
<li>根據輸入結果組合最終 URL，若有優惠券則加上 <code>&amp;wt_coupon=優惠券代碼</code>。</li>
<li>使用 Clipboard API 複製連結，若不支援則使用傳統 <code>execCommand</code> 備援。</li>
<li>複製成功會顯示成功提示，失敗則顯示錯誤提示並提供手動複製。</li>
</ol>
<pre><code class="lang-js language-js js">function buildFinalUrl(baseUrl) {
    var coupon = window.prompt(&#039;是否要加入優惠券？\n(可留空，直接按確定即可)&#039;, &#039;&#039;);
    if (coupon === null) return baseUrl;
    coupon = String(coupon || &#039;&#039;).trim();
    if (!coupon) return baseUrl;
    var joiner = (baseUrl.indexOf(&#039;?&#039;) === -1) ? &#039;?&#039; : &#039;&amp;&#039;;
    return baseUrl + joiner + &#039;wt_coupon=&#039; + encodeURIComponent(coupon);
}

$(document).on(&#039;click&#039;, &#039;.copy-cart-link&#039;, function(e) {
    e.preventDefault();
    var button = $(this);
    var baseUrl = button.data(&#039;url&#039;);
    var originalHtml = button.html();
    if (button.hasClass(&#039;copying&#039;)) return;
    button.addClass(&#039;copying&#039;);
    var finalUrl = buildFinalUrl(baseUrl);
    if (navigator.clipboard &amp;&amp; window.isSecureContext) {
        navigator.clipboard.writeText(finalUrl).then(function() {
            showCopySuccess(button, originalHtml);
        }).catch(function() {
            fallbackCopyTextToClipboard(finalUrl, button, originalHtml);
        });
    } else {
        fallbackCopyTextToClipboard(finalUrl, button, originalHtml);
    }
});</code></pre>
<h2 class="wp-block-heading">快速動作連結整合</h2>
<p>除了欄位按鈕外，也在商品標題下方的快速動作連結加入「複製購物車連結」，提升操作便利性。此連結同樣帶有商品加入購物車的 URL，並套用相同的 JavaScript 行為。</p>
<pre><code class="lang-php language-php php">add_filter(&#039;post_row_actions&#039;, &#039;add_copy_link_quick_action&#039;, 10, 2);
function add_copy_link_quick_action($actions, $post) {
    if ($post-&gt;post_type === &#039;product&#039;) {
        $product_id = (int) $post-&gt;ID;
        $site_url = my_copy_cart_site_url();
        $add_to_cart_url = $site_url . &#039;/cart/?add-to-cart=&#039; . $product_id;
        $actions[&#039;copy_cart_link&#039;] = &#039;&lt;a href=&quot;#&quot; class=&quot;copy-cart-link&quot; data-url=&quot;&#039; . esc_attr($add_to_cart_url) . &#039;&quot; style=&quot;color:#0073aa;&quot;&gt;📋 複製購物車連結&lt;/a&gt;&#039;;
    }
    return $actions;
}</code></pre>
<h2 class="wp-block-heading">實務應用與優化建議</h2>
<p>此功能適合需要快速產生帶優惠券的購物車連結的 WooCommerce 商店管理員，方便推廣或客服回覆。未來可優化：</p>
<ul>
<li>將網站 URL 改為動態取得，避免硬編碼。</li>
<li>增加複製成功的視覺動畫提升 UX。</li>
<li>支援多種優惠券參數或其他自訂參數。</li>
<li>對於大量商品列表，可考慮優化前端效能。</li>
</ul>
<h2 class="wp-block-heading">完整程式碼</h2>
<pre><code class="lang-php language-php php">&lt;?php
/**
 * WooCommerce 後台商品列表添加複製 add-to-cart 連結的功能 + 可選優惠券
 * 適用於 WPCode（PHP Snippet / Run Everywhere 或 Admin Only）
 *
 * 功能：
 * - 商品列表新增一欄「複製課程連結」
 * - 點按後彈出視窗詢問優惠券（可留空）
 * - 若有填，複製的 URL 會加上：&amp;wt_coupon=COUPON
 * - 同時支援「快速動作」複製
 */

/** 你網站的網域（建議改成動態，不用寫死） */
function my_copy_cart_site_url() {
    return home_url();
}

// 在商品列表中添加自定義列
add_filter(&#039;manage_edit-product_columns&#039;, &#039;add_copy_link_column&#039;);
function add_copy_link_column($columns) {
    $columns[&#039;copy_add_to_cart&#039;] = __(&#039;複製課程連結&#039;, &#039;woocommerce&#039;);
    return $columns;
}

// 顯示列內容
add_action(&#039;manage_product_posts_custom_column&#039;, &#039;show_copy_link_column_content&#039;, 10, 2);
function show_copy_link_column_content($column, $post_id) {
    if ($column === &#039;copy_add_to_cart&#039;) {
        $product_id = (int) $post_id;

        $site_url = my_copy_cart_site_url();
        $add_to_cart_url = $site_url . &#039;/cart/?add-to-cart=&#039; . $product_id;

        echo &#039;&lt;button type=&quot;button&quot; class=&quot;button copy-cart-link&quot; data-url=&quot;&#039; . esc_attr($add_to_cart_url) . &#039;&quot; title=&quot;點擊複製連結&quot;&gt;
                 複製
              &lt;/button&gt;&#039;;
    }
}

// 添加 JavaScript 和 CSS
add_action(&#039;admin_footer&#039;, &#039;copy_link_admin_script&#039;);
function copy_link_admin_script() {
    $screen = get_current_screen();
    if (!$screen || $screen-&gt;id !== &#039;edit-product&#039;) {
        return;
    }
    ?&gt;

&lt;style&gt;
        .copy-cart-link {
            display: inline-flex;
            align-items: center;
            gap: 4px;
            padding: 4px 8px;
            font-size: 12px;
            line-height: 1.4;
            border-radius: 3px;
            cursor: pointer;
            transition: all 0.3s ease;
        }
        .copy-cart-link:hover {
            background-color: #000000;
            color: white;
            transform: translateY(-1px);
        }
        .copy-cart-link .dashicons {
            font-size: 14px;
            width: 14px;
            height: 14px;
        }
        .column-copy_add_to_cart {
            width: 110px;
            text-align: center;
        }
        @media screen and (max-width: 782px) {
            .copy-cart-link {
                padding: 6px 10px;
                font-size: 13px;
            }
        }
    &lt;/style&gt;

    &lt;script type=&quot;text/javascript&quot;&gt;
        jQuery(document).ready(function($) {

            // 組裝最終要複製的 URL（可選 wt_coupon）
            function buildFinalUrl(baseUrl) {
                // 1) 詢問優惠券（可留空）
                var coupon = window.prompt(&#039;是否要加入優惠券？\n(可留空，直接按確定即可)&#039;, &#039;&#039;);

                // 使用者按取消 -&gt; 仍照原本複製（你也可以改成 return null 代表不複製）
                if (coupon === null) {
                    return baseUrl;
                }

                coupon = String(coupon || &#039;&#039;).trim();
                if (!coupon) {
                    return baseUrl;
                }

                // 2) 已有 ?add-to-cart=...，直接加 &amp;wt_coupon=
                //    若未來 baseUrl 可能沒有 query，這裡也做保險處理
                var joiner = (baseUrl.indexOf(&#039;?&#039;) === -1) ? &#039;?&#039; : &#039;&amp;&#039;;
                return baseUrl + joiner + &#039;wt_coupon=&#039; + encodeURIComponent(coupon);
            }

            $(document).on(&#039;click&#039;, &#039;.copy-cart-link&#039;, function(e) {
                e.preventDefault();

                var button = $(this);
                var baseUrl = button.data(&#039;url&#039;);
                var originalHtml = button.html();

                if (button.hasClass(&#039;copying&#039;)) return;
                button.addClass(&#039;copying&#039;);

                var finalUrl = buildFinalUrl(baseUrl);

                // 若你希望「按取消就不複製」，把 buildFinalUrl 的取消行為改成 return null
                // 然後這裡加上：
                // if (!finalUrl) { button.removeClass(&#039;copying&#039;); return; }

                if (navigator.clipboard &amp;&amp; window.isSecureContext) {
                    navigator.clipboard.writeText(finalUrl).then(function() {
                        showCopySuccess(button, originalHtml);
                    }).catch(function(err) {
                        console.error(&#039;Copy failed: &#039;, err);
                        fallbackCopyTextToClipboard(finalUrl, button, originalHtml);
                    });
                } else {
                    fallbackCopyTextToClipboard(finalUrl, button, originalHtml);
                }
            });

            function fallbackCopyTextToClipboard(text, button, originalHtml) {
                var textArea = document.createElement(&quot;textarea&quot;);
                textArea.value = text;

                textArea.style.top = &quot;0&quot;;
                textArea.style.left = &quot;0&quot;;
                textArea.style.position = &quot;fixed&quot;;
                textArea.style.opacity = &quot;0&quot;;
                textArea.style.pointerEvents = &quot;none&quot;;

                document.body.appendChild(textArea);
                textArea.focus();
                textArea.select();

                try {
                    var successful = document.execCommand(&#039;copy&#039;);
                    if (successful) {
                        showCopySuccess(button, originalHtml);
                    } else {
                        showCopyError(button, originalHtml, text);
                    }
                } catch (err) {
                    console.error(&#039;Copy failed: &#039;, err);
                    showCopyError(button, originalHtml, text);
                }

                document.body.removeChild(textArea);
            }

            function showCopySuccess(button, originalHtml) {
                button.removeClass(&#039;copying&#039;).addClass(&#039;copied&#039;);
                button.html(&#039;&lt;span class=&quot;dashicons dashicons-yes&quot;&gt;&lt;/span&gt; 已複製&#039;);

                setTimeout(function() {
                    button.removeClass(&#039;copied&#039;);
                    button.html(originalHtml);
                }, 2500);
            }

            function showCopyError(button, originalHtml, text) {
                button.removeClass(&#039;copying&#039;);

                var tooltip = $(&#039;&lt;div class=&quot;copy-error-tooltip&quot; style=&quot;position:absolute;background:#333;color:#fff;padding:8px 12px;border-radius:4px;font-size:12px;z-index:9999;max-width:320px;word-break:break-all;&quot;&gt;複製失敗，請手動複製：&lt;br&gt;&#039; + text + &#039;&lt;/div&gt;&#039;);
                $(&#039;body&#039;).append(tooltip);

                var buttonOffset = button.offset();
                tooltip.css({
                    top: buttonOffset.top - tooltip.outerHeight() - 5,
                    left: buttonOffset.left
                });

                setTimeout(function() { tooltip.remove(); }, 5000);

                tooltip.on(&#039;click&#039;, function() {
                    if (navigator.clipboard) navigator.clipboard.writeText(text);
                    $(this).remove();
                });
            }

        });
    &lt;/script&gt;
    &lt;?php
}

// 可選：添加快速動作連結（在商品名稱下方）
add_filter(&#039;post_row_actions&#039;, &#039;add_copy_link_quick_action&#039;, 10, 2);
function add_copy_link_quick_action($actions, $post) {
    if ($post-&gt;post_type === &#039;product&#039;) {
        $product_id = (int) $post-&gt;ID;

        $site_url = my_copy_cart_site_url();
        $add_to_cart_url = $site_url . &#039;/cart/?add-to-cart=&#039; . $product_id;

        $actions[&#039;copy_cart_link&#039;] = &#039;&lt;a href=&quot;#&quot; class=&quot;copy-cart-link&quot; data-url=&quot;&#039; . esc_attr($add_to_cart_url) . &#039;&quot; style=&quot;color:#0073aa;&quot;&gt;📋 複製購物車連結&lt;/a&gt;&#039;;
    }
    return $actions;
}
</code></pre>]]></content:encoded>
					
					<wfw:commentRss>https://piglife.tw/technical-notes/woocommerce-copy-cart-link-coupon/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
