<?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/%E8%A4%87%E8%A3%BD%E9%80%A3%E7%B5%90/feed/" rel="self" type="application/rss+xml" />
	<link>https://piglife.tw</link>
	<description>Hello World，一個紀錄生活與學習的地方</description>
	<lastBuildDate>Tue, 23 Dec 2025 22:21:03 +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>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>
