<?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>amelia &#8211; 小豬日常</title>
	<atom:link href="https://piglife.tw/tag/amelia/feed/" rel="self" type="application/rss+xml" />
	<link>https://piglife.tw</link>
	<description>Hello World，一個紀錄生活與學習的地方</description>
	<lastBuildDate>Fri, 12 Dec 2025 14:51:51 +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>amelia &#8211; 小豬日常</title>
	<link>https://piglife.tw</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>WooCommerce 會員後台嵌入 Amelia 預約日曆與隱藏管理員選單實作筆記</title>
		<link>https://piglife.tw/technical-notes/woocommerce-amelia-calendar-iframe/</link>
					<comments>https://piglife.tw/technical-notes/woocommerce-amelia-calendar-iframe/#respond</comments>
		
		<dc:creator><![CDATA[小豬]]></dc:creator>
		<pubDate>Thu, 06 Feb 2025 10:39:41 +0000</pubDate>
				<category><![CDATA[技術筆記]]></category>
		<category><![CDATA[admin_head]]></category>
		<category><![CDATA[amelia]]></category>
		<category><![CDATA[iframe]]></category>
		<category><![CDATA[woocommerce]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[會員後台]]></category>
		<category><![CDATA[選單擴充]]></category>
		<guid isPermaLink="false">https://piglife.tw/?p=484</guid>

					<description><![CDATA[介紹如何在 WooCommerce 會員後台新增 Amelia 預約日曆選單，並利用 admin_h...]]></description>
										<content:encoded><![CDATA[<h2 class="wp-block-heading">前言</h2>
<p>在 WooCommerce 會員後台嵌入 Amelia 預約日曆，可以讓用戶直接查看與管理預約，提升使用體驗。但直接嵌入 WordPress 後台頁面時，會看到不必要的管理員選單與工具列，影響介面整潔度。本文將介紹如何利用 WordPress 的 <code>admin_head</code> 鉤子與 WooCommerce 的會員選單過濾器，達成隱藏管理員元素並新增「我的日曆」選單的功能。</p>
<h2 class="wp-block-heading">隱藏 WordPress 管理員選單與工具列</h2>
<p>當 iframe 載入 WordPress 後台 Amelia 預約頁面時，左側選單、頂部工具列等管理員元素會干擾介面。透過 <code>admin_head</code> 鉤子判斷 URL 是否帶有 <code>iframe=true</code> 參數，動態插入 CSS 隱藏這些元素，並調整內容區域寬度與頁面邊距。</p>
<p>關鍵程式碼片段：</p>
<pre><code class="lang-php language-php php">function hide_admin_elements_for_iframe() {
 if (isset($_GET[&#039;iframe&#039;]) &amp;&amp; $_GET[&#039;iframe&#039;] == &#039;true&#039;) {
  echo &#039;
&lt;style&gt;
   #adminmenumain, #wpadminbar, .update-nag, #screen-meta, #screen-options-link-wrap, #contextual-help-link-wrap {
    display: none !important;
   }
   #wpcontent, #wpfooter { margin-left: 0; }
   html.wp-toolbar { padding-top: 0 !important; }
   body { margin: 0; padding: 0; }
   #wpfooter { display: none !important; }
  &lt;/style&gt;&#039;;
 }
}
add_action(&#039;admin_head&#039;, &#039;hide_admin_elements_for_iframe&#039;);</code></pre>
<p>這段程式碼確保只有在 iframe 模式下才隱藏管理員介面元素，避免影響正常管理操作。</p>
<h2 class="wp-block-heading">在 WooCommerce 會員後台新增「我的日曆」選單</h2>
<p>為方便用戶直接在會員中心查看 Amelia 預約日曆，使用 <code>add_rewrite_endpoint</code> 註冊新端點 <code>ameliacustomercalendar</code>，並透過 <code>woocommerce_account_menu_items</code> 過濾器在「我的課程」後新增「我的日曆」選單。</p>
<p>點擊「我的日曆」時，利用 <code>woocommerce_account_ameliacustomercalendar_endpoint</code> 鉤子輸出 iframe，載入 Amelia 預約日曆頁面，並帶入 <code>iframe=true</code> 參數以隱藏管理員元素。</p>
<p>關鍵程式碼片段：</p>
<pre><code class="lang-php language-php php">function add_ameliacustomercalendar_to_myaccount_menu() {
 add_rewrite_endpoint(&#039;ameliacustomercalendar&#039;, EP_ROOT | EP_PAGES);

 add_filter(&#039;woocommerce_account_menu_items&#039;, function($menu_links) {
  $new_menu_links = [];
  foreach ($menu_links as $key =&gt; $label) {
   $new_menu_links[$key] = $label;
   if ($key === &#039;ameliacustomerpanel&#039;) {
    $new_menu_links[&#039;ameliacustomercalendar&#039;] = &#039;我的日曆&#039;;
   }
  }
  return $new_menu_links;
 });

 add_action(&#039;woocommerce_account_ameliacustomercalendar_endpoint&#039;, function() {
  echo &#039;&lt;iframe width=&quot;100%&quot; height=&quot;600&quot; src=&quot;/wp-admin/admin.php?page=wpamelia-calendar&amp;iframe=true&quot;&gt;&lt;/iframe&gt;&#039;;
 });
}
add_action(&#039;init&#039;, &#039;add_ameliacustomercalendar_to_myaccount_menu&#039;);</code></pre>
<h2 class="wp-block-heading">測試與驗證</h2>
<ol>
<li>在瀏覽器網址列加入 <code>?iframe=true</code>，確認 WordPress 管理員選單與工具列是否隱藏。</li>
<li>進入 WooCommerce 會員後台，確認「我的日曆」選單是否出現。</li>
<li>點擊「我的日曆」，檢查 iframe 是否正確載入 Amelia 預約日曆，且無多餘管理員元素。</li>
</ol>
<h2 class="wp-block-heading">延伸與常見坑</h2>
<ul>
<li>若使用快取插件，新增端點後可能需要刷新重寫規則（Permalinks）。</li>
<li>iframe 高度可依需求調整，避免出現滾動條。</li>
<li>確保 Amelia 預約系統權限設定允許會員查看。</li>
</ul>
<h2 class="wp-block-heading">完整程式碼</h2>
<pre><code class="lang-text language-text text">function hide_admin_elements_for_iframe() {
 if (isset($_GET[&#039;iframe&#039;]) &amp;&amp; $_GET[&#039;iframe&#039;] == &#039;true&#039;) {
  echo &#039;
&lt;style&gt;
   #adminmenumain, /* 左側選單 */
   #wpadminbar, /* 頂部管理工具列 */
   .update-nag, /* 更新通知 */
   #screen-meta, /* 屏幕選項 */
   #screen-options-link-wrap, /* 屏幕選項按鈕 */
   #contextual-help-link-wrap /* 說明按鈕 */
   {
    display: none !important;
   }
   #wpcontent, #wpfooter{
    margin-left: 0;
   }
   html.wp-toolbar {
    padding-top: 0 !important;
   }
   body {
    margin: 0;
    padding: 0;
   }
   #wpfooter{
    display: none !important;
   }
  &lt;/style&gt;&#039;;
 }
}
add_action(&#039;admin_head&#039;, &#039;hide_admin_elements_for_iframe&#039;);

function add_ameliacustomercalendar_to_myaccount_menu() {
 add_rewrite_endpoint(&#039;ameliacustomercalendar&#039;, EP_ROOT | EP_PAGES);

 add_filter(&#039;woocommerce_account_menu_items&#039;, function($menu_links) {
  $new_menu_links = [];
  foreach ($menu_links as $key =&gt; $label) {
   $new_menu_links[$key] = $label;
   if ($key === &#039;ameliacustomerpanel&#039;) {
    $new_menu_links[&#039;ameliacustomercalendar&#039;] = &#039;我的日曆&#039;;
   }
  }
  return $new_menu_links;
 });

 add_action(&#039;woocommerce_account_ameliacustomercalendar_endpoint&#039;, function() {
  echo &#039;&lt;iframe width=&quot;100%&quot; height=&quot;600&quot; src=&quot;/wp-admin/admin.php?page=wpamelia-calendar&amp;iframe=true&quot;&gt;&lt;/iframe&gt;&#039;;
 });
}
add_action(&#039;init&#039;, &#039;add_ameliacustomercalendar_to_myaccount_menu&#039;);</code></pre>]]></content:encoded>
					
					<wfw:commentRss>https://piglife.tw/technical-notes/woocommerce-amelia-calendar-iframe/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>WordPress Amelia 預約系統取得使用者 ID 實作筆記</title>
		<link>https://piglife.tw/technical-notes/wordpress-amelia-user-id/</link>
					<comments>https://piglife.tw/technical-notes/wordpress-amelia-user-id/#respond</comments>
		
		<dc:creator><![CDATA[小豬]]></dc:creator>
		<pubDate>Fri, 24 Jan 2025 03:39:19 +0000</pubDate>
				<category><![CDATA[技術筆記]]></category>
		<category><![CDATA[amelia]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[wpdb]]></category>
		<category><![CDATA[使用者id]]></category>
		<category><![CDATA[資料庫查詢]]></category>
		<category><![CDATA[預約系統]]></category>
		<guid isPermaLink="false">https://piglife.tw/?p=476</guid>

					<description><![CDATA[介紹如何透過 PHP 與 WordPress $wpdb 物件，安全查詢 Amelia 預約系統中對...]]></description>
										<content:encoded><![CDATA[<h2 class="wp-block-heading">前言</h2>
<p>在整合 WordPress 插件如 Amelia 預約系統時，常需要從 WordPress 使用者中取得對應的 Amelia 使用者 ID。這對於同步使用者資料或進行特定預約操作非常重要。本文針對如何透過 PHP 及 WordPress 資料庫物件 $wpdb 查詢 Amelia 使用者 ID 進行說明，適合有基礎 PHP 與 WordPress 開發經驗的工程師或自學者。</p>
<h2 class="wp-block-heading">函式說明</h2>
<p>以下函式 <code>get_amelia_user_id</code> 主要功能是透過 WordPress 使用者 ID 查詢 Amelia 系統中對應的使用者 ID。若查無資料，則回傳 <code>false</code>。</p>
<pre><code class="lang-php language-php php">function get_amelia_user_id($wp_user_id) {
    if (empty($wp_user_id)) {
        return false; // 如果 WordPress 使用者 ID 為空，直接回傳 false
    }
    global $wpdb; // 呼叫 WordPress 資料庫全域物件
    $user_table = $wpdb-&gt;prefix . &#039;amelia_users&#039;; // Amelia 的資料表名稱
    $a_uid = $wpdb-&gt;get_results($wpdb-&gt;prepare(&quot;SELECT id FROM {$user_table} WHERE externalId = %d&quot;, $wp_user_id), ARRAY_A);
    if (count($a_uid) &gt; 0) {
        return $a_uid[0][&#039;id&#039;]; // 如果找到結果，回傳第一筆的 id
    } else {
        return false; // 沒有找到結果時回傳 false
    }
}</code></pre>
<h2 class="wp-block-heading">函式細節說明</h2>
<ol>
<li><strong>檢查輸入值是否有效</strong>：
<ul>
<li>使用 <code>empty()</code> 判斷 <code>$wp_user_id</code> 是否為空，避免無意義的資料庫查詢。</li>
</ul></li>
<li><strong>資料表命名</strong>：
<ul>
<li>利用 <code>$wpdb-&gt;prefix</code> 動態取得 WordPress 資料表前綴，確保資料表名稱正確。</li>
</ul></li>
<li><strong>安全查詢</strong>：
<ul>
<li>使用 <code>$wpdb-&gt;prepare</code> 來避免 SQL 注入風險，確保查詢安全。</li>
</ul></li>
<li><strong>回傳邏輯</strong>：
<ul>
<li>若查詢結果非空，回傳第一筆資料的 <code>id</code>，否則回傳 <code>false</code>。</li>
</ul></li>
</ol>
<h2 class="wp-block-heading">實際應用場景</h2>
<ul>
<li>自動同步 WordPress 使用者與 Amelia 使用者資料，確保兩邊資料一致。</li>
<li>根據 WordPress 使用者身份執行 Amelia 預約系統的特定操作。</li>
<li>在後台管理介面快速查詢 Amelia 使用者資料，提升管理效率。</li>
</ul>
<h2 class="wp-block-heading">常見坑與建議</h2>
<ul>
<li>確認 Amelia 資料表名稱與結構，避免因版本差異導致查詢失敗。</li>
<li>建議在實務中加入錯誤處理與日誌記錄，提升系統穩定性與除錯效率。</li>
<li>若系統使用多語系或多站台，需注意資料表前綴與使用者 ID 的對應關係。</li>
</ul>
<h2 class="wp-block-heading">完整程式碼</h2>
<pre><code class="lang-text language-text text">function get_amelia_user_id($wp_user_id) {
    if (empty($wp_user_id)) {
        return false; // 如果 WordPress 使用者 ID 為空，直接回傳 false
    }
    global $wpdb; // 呼叫 WordPress 資料庫全域物件
    $user_table = $wpdb-&gt;prefix . &#039;amelia_users&#039;; // Amelia 的資料表名稱
    $a_uid = $wpdb-&gt;get_results($wpdb-&gt;prepare(&quot;SELECT id FROM {$user_table} WHERE externalId = %d&quot;, $wp_user_id), ARRAY_A);
    if (count($a_uid) &gt; 0) {
        return $a_uid[0][&#039;id&#039;]; // 如果找到結果，回傳第一筆的 id
    } else {
        return false; // 沒有找到結果時回傳 false
    }
}</code></pre>]]></content:encoded>
					
					<wfw:commentRss>https://piglife.tw/technical-notes/wordpress-amelia-user-id/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
