<?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>preview &#8211; 小豬日常</title>
	<atom:link href="https://piglife.tw/tag/preview/feed/" rel="self" type="application/rss+xml" />
	<link>https://piglife.tw</link>
	<description>Hello World，一個紀錄生活與學習的地方</description>
	<lastBuildDate>Fri, 12 Dec 2025 14:52:29 +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>preview &#8211; 小豬日常</title>
	<link>https://piglife.tw</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Blocksy 主題 WooCommerce 產品頁新增下載與預覽彈窗實作筆記</title>
		<link>https://piglife.tw/technical-notes/blocksy-woocommerce-download-preview-modal/</link>
					<comments>https://piglife.tw/technical-notes/blocksy-woocommerce-download-preview-modal/#respond</comments>
		
		<dc:creator><![CDATA[小豬]]></dc:creator>
		<pubDate>Thu, 13 Feb 2025 17:14:35 +0000</pubDate>
				<category><![CDATA[技術筆記]]></category>
		<category><![CDATA[blocksy]]></category>
		<category><![CDATA[download]]></category>
		<category><![CDATA[hook]]></category>
		<category><![CDATA[modal]]></category>
		<category><![CDATA[preview]]></category>
		<category><![CDATA[woocommerce]]></category>
		<category><![CDATA[WordPress]]></category>
		<guid isPermaLink="false">https://piglife.tw/?p=487</guid>

					<description><![CDATA[說明如何利用 Blocksy 主題的 WooCommerce Hook，在產品頁購物車按鈕下方新增彈...]]></description>
										<content:encoded><![CDATA[<h2 class="wp-block-heading">前言</h2>
<p>在 WooCommerce 產品頁面中，若產品包含可下載或預覽的檔案，提供使用者直覺的預覽與下載介面能提升購買體驗。本文適合熟悉 WordPress 主題開發與 WooCommerce 的工程師或自學者，說明如何利用 Blocksy 主題的特定 Hook，在產品頁購物車按鈕下方新增一個彈窗，顯示預覽與下載連結。</p>
<h2 class="wp-block-heading">新增功能程式碼</h2>
<p>透過 <code>blocksy:woocommerce:product-single:add_to_cart:after</code> Action Hook，將彈窗 HTML 結構插入產品頁。以下為關鍵程式碼片段：</p>
<pre><code class="lang-php language-php php">add_action(&#039;blocksy:woocommerce:product-single:add_to_cart:after&#039;, function() {
  global $post;
  echo &#039;&lt;div class=&quot;ks_links_section&quot;&gt;&#039;;
  echo &#039;&lt;div class=&quot;datasheet_btn&quot;&gt;&lt;button id=&quot;ks_show_links_modal&quot;&gt;Datasheet &gt;&lt;/button&gt;&lt;/div&gt;&#039;;
  echo &#039;&lt;div id=&quot;ks_links_modal&quot; class=&quot;ks_modal&quot;&gt;&#039;;
  echo &#039;&lt;div class=&quot;ks_modal-content&quot;&gt;&#039;;
  echo &#039;&lt;span class=&quot;ks_close&quot;&gt;&amp;times;&lt;/span&gt;&#039;;

  // 預覽連結
  $preview_links = get_post_meta($post-&gt;ID, &#039;_preview_links&#039;, true);
  if (!empty($preview_links)) {
    echo &#039;&lt;table class=&quot;file-table&quot; border=&quot;0&quot; width=&quot;100%&quot;&gt;&#039;;
    foreach ($preview_links as $link) {
      echo &#039;
&lt;tr&gt;&#039;;
      echo &#039;
&lt;td&gt;&#039; . esc_html($link[&#039;name&#039;]) . &#039;&lt;/td&gt;&#039;;
      echo &#039;
&lt;td&gt;&#039; . esc_html($link[&#039;date&#039;]) . &#039;&lt;/td&gt;&#039;;
      echo &#039;
&lt;td&gt;&lt;a href=&quot;&#039; . esc_url($link[&#039;url&#039;]) . &#039;&quot; target=&quot;_blank&quot;&gt;Preview&lt;/a&gt;&lt;/td&gt;&#039;;
      echo &#039;&lt;/tr&gt;&#039;;
    }
    echo &#039;&lt;/table&gt;&#039;;
  } else {
    echo &#039;
&lt;p&gt;No preview files available.&lt;/p&gt;&#039;;
  }

  // 下載連結（限已購買且登入用戶）
  if (is_user_logged_in() &amp;&amp; wc_customer_bought_product(&#039;&#039;, get_current_user_id(), $post-&gt;ID)) {
    echo &#039;
&lt;h4&gt;Download file&lt;/h4&gt;&#039;;
    $download_links = get_post_meta($post-&gt;ID, &#039;_download_links&#039;, true);
    if (!empty($download_links)) {
      echo &#039;&lt;table class=&quot;file-table&quot; border=&quot;0&quot; width=&quot;100%&quot;&gt;&#039;;
      foreach ($download_links as $index =&gt; $link) {
        echo &#039;
&lt;tr&gt;&#039;;
        echo &#039;
&lt;td&gt;&#039; . esc_html($link[&#039;name&#039;]) . &#039;&lt;/td&gt;&#039;;
        echo &#039;
&lt;td&gt;&#039; . esc_html($link[&#039;date&#039;]) . &#039;&lt;/td&gt;&#039;;
        echo &#039;
&lt;td&gt;&#039;;
        echo &quot;&lt;button class=&#039;download-btn&#039; data-product-id=&#039;{$post-&gt;ID}&#039; data-index=&#039;{$index}&#039; style=&#039;color: #0073aa; background: none; border: none; cursor: pointer;&#039;&gt;Download&lt;/button&gt;&quot;;
        echo &#039;&lt;/td&gt;&#039;;
        echo &#039;&lt;/tr&gt;&#039;;
      }
      echo &#039;&lt;/table&gt;&#039;;
    } else {
      echo &#039;
&lt;p&gt;No download links available.&lt;/p&gt;&#039;;
    }
  }

  echo &#039;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&#039;;
});</code></pre>
<p>此段程式碼會在產品頁購物車按鈕下方插入一個按鈕，點擊後彈出包含預覽與下載連結的彈窗。下載連結僅對已購買且登入的用戶顯示。</p>
<h2 class="wp-block-heading">新增前端樣式與行為</h2>
<p>為了讓彈窗視覺與互動更友善，需要加入 CSS 與 JavaScript。</p>
<h3 class="wp-block-heading">CSS &#8211; 彈窗樣式</h3>
<pre><code class="lang-css language-css css">.ks_modal {
  display: none;
  position: fixed;
  z-index: 1000;
  left: 0;
  top: 0;
  width: 100%;
  height: 100%;
  background-color: rgba(0, 0, 0, 0.5);
}

.ks_modal-content {
  background-color: #fff;
  padding: 20px;
  margin: 15% auto;
  width: 50%;
  border-radius: 10px;
}

.ks_close {
  float: right;
  font-size: 24px;
  cursor: pointer;
}</code></pre>
<h3 class="wp-block-heading">JavaScript &#8211; 彈窗開關控制</h3>
<pre><code class="lang-js language-js js">jQuery(document).ready(function($) {
  $(&#039;#ks_show_links_modal&#039;).on(&#039;click&#039;, function() {
    $(&#039;#ks_links_modal&#039;).fadeIn();
  });

  $(&#039;.ks_close&#039;).on(&#039;click&#039;, function() {
    $(&#039;#ks_links_modal&#039;).fadeOut();
  });
});</code></pre>
<p>這段 JS 透過 jQuery 綁定按鈕事件，控制彈窗的顯示與隱藏。</p>
<h2 class="wp-block-heading">測試與調整</h2>
<ol>
<li>確認產品頁購物車按鈕下方是否出現「Datasheet &gt;」按鈕。</li>
<li>點擊按鈕，檢查彈窗是否正常顯示預覽連結。</li>
<li>測試下載連結顯示條件：
<ul>
<li>未登入或未購買用戶不應看到下載連結。</li>
<li>已購買且登入用戶可看到並使用下載按鈕。</li>
</ul></li>
</ol>
<h2 class="wp-block-heading">完整程式碼</h2>
<pre><code class="lang-text language-text text">// 在 WooCommerce 產品頁購物車按鈕區塊的下方新增彈窗顯示下載和預覽連結
add_action(&#039;blocksy:woocommerce:product-single:add_to_cart:after&#039;, function() {
  global $post;
  echo &#039;&lt;div class=&quot;ks_links_section&quot;&gt;&#039;;
  echo &#039;&lt;div class=&quot;datasheet_btn&quot;&gt;&lt;button id=&quot;ks_show_links_modal&quot;&gt;Datasheet &gt;&lt;/button&gt;&lt;/div&gt;&#039;;
  echo &#039;&lt;div id=&quot;ks_links_modal&quot; class=&quot;ks_modal&quot;&gt;&#039;;
  echo &#039;&lt;div class=&quot;ks_modal-content&quot;&gt;&#039;;
  echo &#039;&lt;span class=&quot;ks_close&quot;&gt;&amp;times;&lt;/span&gt;&#039;;

  // 顯示預覽連結
  echo &#039;
&lt;h4&gt;Preview file&lt;/h4&gt;&#039;;
  $preview_links = get_post_meta($post-&gt;ID, &#039;_preview_links&#039;, true);
  if (!empty($preview_links)) {
    echo &#039;&lt;table class=&quot;file-table&quot; border=&quot;0&quot; width=&quot;100%&quot;&gt;&#039;;
    foreach ($preview_links as $link) {
      echo &#039;
&lt;tr&gt;&#039;;
      echo &#039;
&lt;td&gt;&#039; . esc_html($link[&#039;name&#039;]) . &#039;&lt;/td&gt;&#039;;
      echo &#039;
&lt;td&gt;&#039; . esc_html($link[&#039;date&#039;]) . &#039;&lt;/td&gt;&#039;;
      echo &#039;
&lt;td&gt;&lt;a href=&quot;&#039; . esc_url($link[&#039;url&#039;]) . &#039;&quot; target=&quot;_blank&quot;&gt;Preview&lt;/a&gt;&lt;/td&gt;&#039;;
      echo &#039;&lt;/tr&gt;&#039;;
    }
    echo &#039;&lt;/table&gt;&#039;;
  } else {
    echo &#039;
&lt;p&gt;No preview files available.&lt;/p&gt;&#039;;
  }

  // 顯示下載連結（僅限已購買並登入的用戶）
  if (is_user_logged_in() &amp;&amp; wc_customer_bought_product(&#039;&#039;, get_current_user_id(), $post-&gt;ID)) {
    echo &#039;
&lt;h4&gt;Download file&lt;/h4&gt;&#039;;
    $download_links = get_post_meta($post-&gt;ID, &#039;_download_links&#039;, true);
    if (!empty($download_links)) {
      echo &#039;&lt;table class=&quot;file-table&quot; border=&quot;0&quot; width=&quot;100%&quot;&gt;&#039;;
      foreach ($download_links as $index =&gt; $link) {
        echo &#039;
&lt;tr&gt;&#039;;
        echo &#039;
&lt;td&gt;&#039; . esc_html($link[&#039;name&#039;]) . &#039;&lt;/td&gt;&#039;;
        echo &#039;
&lt;td&gt;&#039; . esc_html($link[&#039;date&#039;]) . &#039;&lt;/td&gt;&#039;;
        echo &#039;
&lt;td&gt;&#039;;
        echo &quot;&lt;button class=&#039;download-btn&#039; data-product-id=&#039;{$post-&gt;ID}&#039; data-index=&#039;{$index}&#039; style=&#039;color: #0073aa; background: none; border: none; cursor: pointer;&#039;&gt;Download&lt;/button&gt;&quot;;
        echo &#039;&lt;/td&gt;&#039;;
        echo &#039;&lt;/tr&gt;&#039;;
      }
      echo &#039;&lt;/table&gt;&#039;;
    } else {
      echo &#039;
&lt;p&gt;No download links available.&lt;/p&gt;&#039;;
    }
  }

  echo &#039;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&#039;;
});

/* 彈窗樣式 */
.ks_modal {
  display: none;
  position: fixed;
  z-index: 1000;
  left: 0;
  top: 0;
  width: 100%;
  height: 100%;
  background-color: rgba(0, 0, 0, 0.5);
}

.ks_modal-content {
  background-color: #fff;
  padding: 20px;
  margin: 15% auto;
  width: 50%;
  border-radius: 10px;
}

.ks_close {
  float: right;
  font-size: 24px;
  cursor: pointer;
}

// 控制彈窗開關
jQuery(document).ready(function($) {
  $(&#039;#ks_show_links_modal&#039;).on(&#039;click&#039;, function() {
    $(&#039;#ks_links_modal&#039;).fadeIn();
  });

  $(&#039;.ks_close&#039;).on(&#039;click&#039;, function() {
    $(&#039;#ks_links_modal&#039;).fadeOut();
  });
});</code></pre>
<h2 class="wp-block-heading">結論</h2>
<p>透過 Blocksy 主題提供的 Hook，結合 WooCommerce 產品頁面，我們能輕鬆新增一個彈窗介面，提供使用者預覽與下載檔案的功能，提升產品資訊的呈現與使用者體驗，特別適合販售技術文件或數位內容的商店。</p>]]></content:encoded>
					
					<wfw:commentRss>https://piglife.tw/technical-notes/blocksy-woocommerce-download-preview-modal/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
