<?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>hook &#8211; 小豬日常</title>
	<atom:link href="https://piglife.tw/tag/hook/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>hook &#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>
		<item>
		<title>使用 PHP 記錄 WooCommerce 訂單更新資料結構技術筆記</title>
		<link>https://piglife.tw/technical-notes/php-log-woocommerce-order-data/</link>
					<comments>https://piglife.tw/technical-notes/php-log-woocommerce-order-data/#respond</comments>
		
		<dc:creator><![CDATA[小豬]]></dc:creator>
		<pubDate>Thu, 09 Jan 2025 12:49:56 +0000</pubDate>
				<category><![CDATA[技術筆記]]></category>
		<category><![CDATA[hook]]></category>
		<category><![CDATA[json]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[woocommerce]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[訂單資料]]></category>
		<category><![CDATA[除錯]]></category>
		<guid isPermaLink="false">https://piglife.tw/?p=468</guid>

					<description><![CDATA[說明如何使用 PHP 透過 WooCommerce 的訂單狀態變更鉤子，將訂單詳細資料以 JSON ...]]></description>
										<content:encoded><![CDATA[<h2 class="wp-block-heading">前言</h2>
<p>在開發基於 WordPress 的 WooCommerce 網站時，了解訂單資料結構對於客製化功能非常重要。當訂單狀態或詳細資料更新時，能夠即時記錄這些資料有助於除錯與後續分析。本文針對 WooCommerce 訂單更新事件，說明如何使用 PHP 透過鉤子（hook）將訂單資料以 JSON 格式記錄到檔案中。</p>
<h2 class="wp-block-heading">需求情境</h2>
<ol>
<li>監聽 WooCommerce 訂單更新事件。</li>
<li>獲取訂單的完整詳細資料。</li>
<li>將資料儲存為 JSON 格式，方便後續分析或除錯。</li>
</ol>
<h2 class="wp-block-heading">解決方案</h2>
<p>利用 WooCommerce 提供的 <code>woocommerce_order_status_changed</code> 鉤子，在訂單狀態變更時觸發自訂函數，取得訂單資料並寫入檔案。</p>
<pre><code class="lang-php language-php php">add_action(&#039;woocommerce_order_status_changed&#039;, &#039;log_order_data&#039;, 10, 4);

function log_order_data($order_id, $old_status, $new_status, $order) {
    $data = [
        &#039;order_id&#039; =&gt; $order_id,
        &#039;old_status&#039; =&gt; $old_status,
        &#039;new_status&#039; =&gt; $new_status,
        &#039;order_data&#039; =&gt; $order-&gt;get_data() // 獲取訂單詳細資料
    ];

    write_to_log_file($data, &#039;order_update_log.json&#039;);
}

function write_to_log_file($data, $filename = &#039;meta_data.json&#039;) {
    $log_dir = __DIR__ . &#039;/logs&#039;; // 指定記錄檔存放目錄
    if (!file_exists($log_dir)) {
        mkdir($log_dir, 0755, true); // 如果目錄不存在，創建目錄
    }
    $log_file = $log_dir . &#039;/&#039; . $filename;

    // 將資料轉換為 JSON 格式
    $json_data = json_encode($data, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT);

    // 將 JSON 資料寫入文件（直接覆寫內容）
    file_put_contents($log_file, $json_data);
}</code></pre>
<h2 class="wp-block-heading">程式碼解說</h2>
<ol>
<li>
<p><strong>監聽訂單狀態更新事件</strong>
使用 WooCommerce 的 <code>woocommerce_order_status_changed</code> 鉤子，當訂單狀態變更時觸發 <code>log_order_data</code> 函數。</p>
<pre><code class="lang-php language-php php">add_action(&#039;woocommerce_order_status_changed&#039;, &#039;log_order_data&#039;, 10, 4);</code></pre>
</li>
<li>
<p><strong>獲取訂單詳細資料</strong>
透過 <code>WC_Order</code> 物件的 <code>get_data()</code> 方法取得完整訂單資料，包含客戶資訊、商品清單、付款方式等。</p>
<pre><code class="lang-php language-php php">&#039;order_data&#039; =&gt; $order-&gt;get_data()</code></pre>
</li>
<li>
<p><strong>記錄資料至 JSON 檔案</strong>
將資料轉換為 JSON 格式，並寫入指定的 <code>logs</code> 目錄下的檔案中，若目錄不存在則自動建立。</p>
<pre><code class="lang-php language-php php">write_to_log_file($data, &#039;order_update_log.json&#039;);</code></pre>
</li>
</ol>
<h2 class="wp-block-heading">範例輸出</h2>
<p>假設訂單狀態從 <code>processing</code> 更新為 <code>completed</code>，記錄的 JSON 資料範例如下：</p>
<pre><code class="lang-json language-json json">{
  &quot;order_id&quot;: 1234,
  &quot;old_status&quot;: &quot;processing&quot;,
  &quot;new_status&quot;: &quot;completed&quot;,
  &quot;order_data&quot;: {
    &quot;id&quot;: 1234,
    &quot;status&quot;: &quot;completed&quot;,
    &quot;currency&quot;: &quot;USD&quot;,
    &quot;total&quot;: &quot;99.99&quot;,
    &quot;customer_id&quot;: 5678,
    &quot;billing&quot;: {
      &quot;first_name&quot;: &quot;John&quot;,
      &quot;last_name&quot;: &quot;Doe&quot;,
      &quot;email&quot;: &quot;john.doe@example.com&quot;
    },
    &quot;line_items&quot;: [
      {
        &quot;name&quot;: &quot;T-Shirt&quot;,
        &quot;quantity&quot;: 2,
        &quot;total&quot;: &quot;49.99&quot;
      }
    ]
  }
}</code></pre>
<h2 class="wp-block-heading">適用場景</h2>
<ul>
<li><strong>除錯需求</strong>：快速了解 WooCommerce 訂單資料結構，協助定位問題。</li>
<li><strong>數據分析</strong>：將記錄的 JSON 資料用於訂單數據分析。</li>
<li><strong>客製化功能開發</strong>：根據訂單詳細資料設計特定邏輯。</li>
</ul>
<h2 class="wp-block-heading">完整程式碼</h2>
<pre><code class="lang-text language-text text">add_action(&#039;woocommerce_order_status_changed&#039;, &#039;log_order_data&#039;, 10, 4);

function log_order_data($order_id, $old_status, $new_status, $order) {
    $data = [
        &#039;order_id&#039; =&gt; $order_id,
        &#039;old_status&#039; =&gt; $old_status,
        &#039;new_status&#039; =&gt; $new_status,
        &#039;order_data&#039; =&gt; $order-&gt;get_data() // 獲取訂單詳細資料
    ];

    write_to_log_file($data, &#039;order_update_log.json&#039;);
}

function write_to_log_file($data, $filename = &#039;meta_data.json&#039;) {
    $log_dir = __DIR__ . &#039;/logs&#039;; // 指定記錄檔存放目錄
    if (!file_exists($log_dir)) {
        mkdir($log_dir, 0755, true); // 如果目錄不存在，創建目錄
    }
    $log_file = $log_dir . &#039;/&#039; . $filename;

    // 將資料轉換為 JSON 格式
    $json_data = json_encode($data, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT);

    // 將 JSON 資料寫入文件（直接覆寫內容）
    file_put_contents($log_file, $json_data);
}</code></pre>]]></content:encoded>
					
					<wfw:commentRss>https://piglife.tw/technical-notes/php-log-woocommerce-order-data/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
