2017-05-10 54 views
2

我正在使用WooCommerce功能的WordPress網站上工作。如何操作`get_price_html()`函數?

我已經創建了一個自定義字段,它出現在產品頁面上,它允許購物者輸入他們自己的自定義文本。這個自定義文本將被刻在關聯的產品上,我的客戶希望每個輸入的信件收取2英鎊。我的客戶還要求產品價格在購物者在自定義字段中輸入/刪除字母時進行實時更新。

因此,我需要操作get_price_html()功能以輸出以下等式的總和:

當前產品價格+(字符計數*£2)

爲了產生字符計數,我已將以下jQuery代碼輸入到單一產品模板中:

<script type="text/javascript"> 
jQuery(document).on('keyup', '.product-custom-text', updateCount); 
jQuery(document).on('keydown', '.product-custom-text', updateCount); 

function updateCount() { 
    var cs = jQuery(this).val().length; 
    jQuery('#letter_count').text(cs); 
} 
</script> 

然後輸出到輸出字符數,我進入編碼到functions.php文件的下位:

function custom_letter_counter(){ 
    echo '<span id="letter_count"></span>'; 
} 
add_action('woocommerce_single_product_summary', 'custom_letter_counter'); 

是任何人都可以點我在正確的方向爲下一步我需要做的,以操縱/清除get_price_html()函數反映了上述方程的總和?

回答

0

你對這個問題有點含糊不清,因爲改變價格的HTML並不會真正改變產品價格本身。

  1. 你需要添加自定義的輸入框,需要刻
  2. 然後您就需要連接到車,這個自定義字段的值追加到產品中的文字
  3. 你需要通過計算產品一旦添加到購物車後有多少字符來計算總價格
  4. 然後您需要將自定義字段掛接到訂單數據,以便日後可以查看

這裏是如何完成所有這些...

首先讓我們添加文本輸入:

function add_engrave_text_field() { 
    echo '<table class="variations" cellspacing="0"> 
      <tbody> 
       <tr> 
        <td class="label"><label>Engrave Text</label></td> 
        <td class="value"> 
         <label><input type="text" name="engrave_text" placeholder="Engrave Text" /> £2 per letter</label>       
        </td> 
       </tr>        
      </tbody> 
     </table>'; 
} 
add_action('woocommerce_before_add_to_cart_button', 'add_engrave_text_field'); 

然後,我們把這段車秩序,一旦用戶點擊「添加到購物車」按鈕:

function save_engrave_text($cart_item_data, $product_id) { 
    if(isset($_POST['engrave_text']) && !empty($_POST['engrave_text'])) { 
     $cart_item_data[ "engrave_text" ] = esc_attr($_POST['engrave_text']);  
    } 

    return $cart_item_data; 
} 
add_filter('woocommerce_add_cart_item_data', 'save_engrave_text', 99, 2); 

然後我們計算多少會在總成本與需要被刻文:

function calculate_engrave_text_fee($cart_object) { 
    foreach ($cart_object->cart_contents as $key => $value) { 
     if(isset($value["engrave_text"])) { 
      // Get how many characters there are 
      $chars = strlen($value["engrave_text"]); 
      // Calculate the character count by 2 (£2) 
      $engrave_text_fee = $chars * 2; 
      $orgPrice = floatval($value['data']->price); 
      $value['data']->set_price($orgPrice + $engrave_text_fee); 
     } 
    } 
} 
add_action('woocommerce_before_calculate_totals', 'calculate_engrave_text_fee', 99); 

(可選)可以使每個產品車/結帳的雕刻文字:

function render_meta_on_cart_and_checkout($cart_data, $cart_item = null) { 
    $meta_items = array(); 

    /* Woo 2.4.2 updates */ 
    if(!empty($cart_data)) { 
     $meta_items = $cart_data; 
    } 

    if(isset($cart_item["engrave_text"])) { 
     $meta_items[] = array("name" => "Engrave Text", "value" => $cart_item["engrave_text"]); 
    } 

    return $meta_items; 
} 
add_filter('woocommerce_get_item_data', 'render_meta_on_cart_and_checkout', 99, 2); 

最後一點,你需要添加以下,使雕刻的文字出現在電子郵件,訂單等

function engrave_text_order_meta_handler($item_id, $values, $cart_item_key) { 
    if(isset($values["engrave_text"])) { 
     wc_add_order_item_meta($item_id, "Engrave Text", $values["engrave_text"]); 
    } 
} 
add_action('woocommerce_add_order_item_meta', 'engrave_text_order_meta_handler', 99, 3); 

這是從我的舊項目中複製並修改以適應您自己的需求,所以未經充分測試。調試應該相當簡單,因爲WooCommerce上的文檔非常豐富。

+0

感謝您的洞察。我已經創建了一個自定義輸入字段,輸出插入的字母數量。也就是說,我把自己的所有努力都取消了並實施了你的努力。插入自定義文本字段時,它不會影響價格本身。還有什麼我需要包括? – Craig

+0

我已經更新'calculate_engrave_text_fee'方法,使它能夠與WC的最新版本一起工作,並且現在它全部在我的末端工作(自己測試) – adamj

+0

感謝您的進一步修改。不幸的是,它仍然無法在網站上運行。我停用了我擁有的幾個插件,只留下了WooCommerce Plugin Active,但沒有成功。我也檢查過,以確保我擁有最新版本的WooCommerce。你能看到有任何其他問題可能會阻止這些代碼的工作嗎? – Craig