Tổng hợp Functions hay dùng trong WordPress

Bài viết tổng hợp những Function hay và được sử dụng nhiều trong WordPress, thay thế phần nào việc sử dụng thêm Plugin, giúp tối ưu tốc độ tải trang. . .

Kiểm tra định dạng số điện thoại 10 số Việt Nam

function check_wpcf7_tel( $result, $tel ) { 
  $result = preg_match( '/^(0|\+84)(\s|\.)?((3[2-9])|(5[689])|(7[06-9])|(8[1-689])|(9[0-46-9]))(\d)(\s|\.)?(\d{3})(\s|\.)?(\d{3})$/', $tel );
  return $result; 
}

add_filter( 'wpcf7_is_tel', 'check_wpcf7_tel', 10, 2 );

Code phân trang cho bài viết

//Code phan trang
function wiki_wp_corenavi($custom_query = null, $paged = null) {
    global $wp_query;
    if($custom_query) $main_query = $custom_query;
    else $main_query = $wp_query;
    $paged = ($paged) ? $paged : get_query_var('paged');
    $big = 999999999;
    $total = isset($main_query->max_num_pages)?$main_query->max_num_pages:'';
    if($total > 1) echo '<div class="pagenavi">';
    echo paginate_links( array(
        'base' => str_replace( $big, '%#%', esc_url( get_pagenum_link( $big ) ) ),
        'format' => '?paged=%#%',
        'current' => max( 1, $paged ),
        'total' => $total,
        'mid_size' => '10', // Số trang hiển thị khi có nhiều trang trước khi hiển thị ...
        'prev_text'    => __('<i class="icon-angle-left"></i>','wiki'),
        'next_text'    => __('<i class="icon-angle-right"></i>','wiki'),
    ) );
    if($total > 1) echo '</div>';
}

Thêm Panel trong Dashboard

add_action( 'admin_footer', 'rv_custom_dashboard_widget' );
function rv_custom_dashboard_widget() {
    // Bail if not viewing the main dashboard page
    if ( get_current_screen()->base !== 'dashboard' ) {
        return;
    }
    ?>
    
    <div id="custom-id" style="display: none;border: 2px solid #52accc; padding: 0 20px">
    <h2 style="margin-top:20px; text-transform:uppercase; color: #dd3333; margin-bottom:-10px">Về chúng tôi</h2>	
    <h3>CÔNG TY TNHH TM & DỊCH VỤ FOREST JUMP VIỆT NAM</h3>
    <p style="color: #000"><strong>Địa chỉ: </strong>P3432 HH4B Linh Đàm - Hoàng Liệt - Hoàng Mai - Hà Nội</p>
    <p style="color: #000"><strong>Hotline: </strong><a style="text-decoration:none" href="tel:0888805078">0888 805 078</a></p>
    <p style="color: #000"><strong>Email: </strong><a style="text-decoration:none" href="mailto:lienhe@forestjump.com.vn">lienhe@forestjump.com.vn</a></p>
    <p style="color: #000"><strong>Website: </strong><a href="https://forestjump.com.vn" style="text-decoration:none">Forestjump.com.vn</a></p>
    </div>
    <script>
        jQuery(document).ready(function($) {
            $('#welcome-panel').after($('#custom-id').show());
        });
    </script>

<?php }

Đổi font chữ từ pt sang px

function flatsome_editor_text_sizes($initArray){
    $initArray['fontsize_formats'] = "9px 10px 12px 13px 14px 16px 17px 18px 19px 20px 21px 24px 28px 32px 36px";
    return $initArray;
};

Thêm Page Options trong quản trị

// Page Options
if( function_exists('acf_add_options_page') ) {
    acf_add_options_page(array(
        'page_title' 	=> 'Cài đặt chung', // Title hiển thị khi truy cập vào Options page
        'menu_title'	=> 'Cài đặt chung', // Tên menu hiển thị ở khu vực admin
        'menu_slug' 	=> 'cai-dat-chung', // Url hiển thị trên đường dẫn của options page
        'capability'	=> 'edit_posts',
        'redirect'	=> false
    ));
}

Xóa thông báo kích hoạt Flatsome trong quản trị

add_action( 'init', 'hide_notice' );
function hide_notice() {
remove_action( 'admin_notices', 'flatsome_maintenance_admin_notice' );
}

Xóa trường thông tin trong form đặt hàng

add_filter( 'woocommerce_billing_fields', 'wc_npr_filter_phone', 10, 1 
);
function wc_npr_filter_phone( $address_fields ) {
    $address_fields['billing_phone']['required'] = true;
    $address_fields['billing_country']['required'] = false;
    $address_fields['billing_last_name']['required'] = false;
    $address_fields['billing_city']['required'] = false;
    $address_fields['billing_postcode']['required'] = false;
    $address_fields['billing_email']['required'] = false;
    $address_fields['billing_state']['required'] = false;
    $address_fields['billing_address_1']['required'] = true;
    $address_fields['billing_address_2']['required'] = false;
    return $address_fields;

}

//make shipping fields not required in checkout
add_filter( 'woocommerce_shipping_fields', 
'wc_npr_filter_shipping_fields', 10, 1 );
function wc_npr_filter_shipping_fields( $address_fields ) {
    $address_fields['shipping_first_name']['required'] = true;
    $address_fields['shipping_last_name']['required'] = false;
    $address_fields['shipping_phone']['required'] = true;
    $address_fields['shipping_address_1']['required'] = true;
    $address_fields['shipping_address_2']['required'] = false;
    $address_fields['shipping_city']['required'] = false;
    $address_fields['shipping_country']['required'] = false;
    $address_fields['shipping_postcode']['required'] = false;
    $address_fields['shipping_state']['required'] = false;
    
    return $address_fields;
}
add_filter( 'woocommerce_checkout_fields' , 'custom_override_checkout_fields' );

// Our hooked in function - $fields is passed via the filter!
function custom_override_checkout_fields( $fields ) {
     unset($fields['billing']['billing_company']);
     //unset($fields['billing']['billing_address_1']);
     unset($fields['billing']['billing_last_name']);
     unset($fields['billing']['billing_address_2']);
     unset($fields['billing']['billing_country']);
     unset($fields['billing']['billing_city']);
     unset($fields['billing']['billing_state']);
     unset($fields['billing']['billing_postcode']);
     //unset($fields['billing']['billing_email']);
      unset($fields['shipping']['shipping_company']);
     //unset($fields['billing']['billing_address_1']);
     unset($fields['shipping']['shipping_last_name']);
     unset($fields['shipping']['shipping_address_2']);
     unset($fields['shipping']['shipping_country']);
     unset($fields['shipping']['shipping_city']);
     unset($fields['shipping']['shipping_state']);
     unset($fields['shipping']['shipping_postcode']);
     //unset($fields['shipping']['shipping_email']);
     return $fields;
}

Tạo mã đơn Woocommer tùy chỉnh

//Custom Order Number
add_filter( 'woocommerce_order_number', 'change_woocommerce_order_number' );
function change_woocommerce_order_number( $order_id ) {
    $prefix = 'BEAR';
    $suffix = 'ONL';
    $new_order_id = $prefix . $order_id . $suffix;
    return $new_order_id;
}

Xóa thẻ H3 trong tiêu đề bình luận

add_filter( 'comment_form_defaults', 'custom_reply_title' );
function custom_reply_title( $defaults ){
  $defaults['title_reply_before'] = '<span id="reply-title" class="h4 comment-reply-title">';
  $defaults['title_reply_after'] = '</span>';
  return $defaults;
}

Tắt Gutenberg Editor & Gutenberg Widget

// Disables the block editor from managing widgets in the Gutenberg plugin.
add_filter( 'gutenberg_use_widgets_block_editor', '__return_false', 100 );

// Disables the block editor from managing widgets. renamed from wp_use_widgets_block_editor
add_filter( 'use_widgets_block_editor', '__return_false' );

Dịch ngôn ngữ

//Dịch ngôn ngữ
function multi_change_translate_text( $translated ) {
    $text       = array(
        'Thêm vào giỏ hàng' => 'Đặt mua',
        'Add to cart' => 'Đặt mua',
        'Mô tả' => 'Thông tin sản phẩm',
        'Lựa chọn các tùy chọn' => 'Xem thêm',
        'Cảm ơn bạn. Đơn hàng của bạn đã được nhận.' => 'Cảm ơn bạn! Chúng tôi đã nhận được đơn hàng của bạn.',
    );
    $translated = str_ireplace( array_keys( $text ), $text, $translated );
    return $translated;
}
add_filter( 'gettext', 'multi_change_translate_text', 20 );

Thay khoảng giá bằng giá của biến thể

//Replace Price Range by Variation Price
add_action( 'woocommerce_before_single_product', 'move_variations_single_price', 1 );
function move_variations_single_price(){
  global $product, $post;
  if ( $product->is_type( 'variable' ) ) {
    add_action( 'woocommerce_single_product_summary', 'replace_variation_single_price', 10 );
  }
}

function replace_variation_single_price() {
  ?>
    <style>
      .woocommerce-variation-price {
        display: none;
      }
    </style>
    <script>
      jQuery(document).ready(function($) {
        var priceselector = '.product p.price';
        var originalprice = $(priceselector).html();

        $( document ).on('show_variation', function() {
          $(priceselector).html($('.single_variation .woocommerce-variation-price').html());
        });
        $( document ).on('hide_variation', function() {
          $(priceselector).html(originalprice);
        });
      });
    </script>
  <?php
}

//Save For simple products
add_action( 'woocommerce_single_product_summary', 'simple_product_saving_amount', 11 );
function simple_product_saving_amount() {
    global $product;

    if( $product->is_type('simple') && $product->is_on_sale() ) {
        $regular_price = (float) wc_get_price_to_display( $product, array('price' => $product->get_regular_price() ) );
        $active_price  = (float) wc_get_price_to_display( $product, array('price' => $product->get_sale_price() ) );

        $saved_amount  = $regular_price - $active_price;
        $percentage    = round( $saved_amount / $regular_price * 100 );

        echo '<p id="saving_rpice">'. __("Tiết kiệm") .': ' . wc_price($saved_amount) . ' ('.$percentage.'%)</p>';
    }
}

//Save For product variations (on variable products)
add_filter( 'woocommerce_available_variation', 'variable_product_saving_amount', 10, 3 );
function variable_product_saving_amount( $data, $product, $variation ) {

    if( $variation->is_on_sale() ) {
        $saved_amount  = $data['display_regular_price'] - $data['display_price'];
        $percentage    = round( $saved_amount / $data['display_regular_price'] * 100 );

        $data['price_html'] .= '<p id="saving_rpice">'. __("Tiết kiệm") .': ' . wc_price($saved_amount) . ' ('.$percentage.'%)</p>';
    }
    return $data;
}

Thay 0đ bằng Liên hệ

// Thay 0đ bằng Liên hệ
function wiki_wc_custom_get_price_html( $price, $product ) {
    if ( $product->get_price() == 0 ) {
        if ( $product->is_on_sale() && $product->get_regular_price() ) {
            $regular_price = wc_get_price_to_display( $product, array( 'qty' => 1, 'price' => $product->get_regular_price() ) );
 
            $price = wc_format_price_range( $regular_price, __( 'Free!', 'woocommerce' ) );
        } else {
            $price = '<span class="amount">' . __( 'Liên hệ', 'woocommerce' ) . '</span>';
        }
    }
    return $price;
}
add_filter( 'woocommerce_get_price_html', 'wiki_wc_custom_get_price_html', 10, 2 );

Thêm Widget Area

register_sidebar( array(
    'name' => 'Contact Menu',
    'id' => 'contactmenu',
    'description' => 'Widget for Contact Menu',
    'before_widget' => '<div class="contact-menu">',
    'after_widget' => '</div>',
    'before_title' => '<span class="widget-title">',
    'after_title' => '</span>',
    ) );

Xóa Menu iTem trong trang quản trị

// admin_init action works better than admin_menu in modern wordpress (at least v5+)
add_action( 'admin_init', 'my_remove_menu_pages' );
function my_remove_menu_pages() {


  global $user_ID;

  if ( $user_ID != 1 ) { //your user id

   remove_menu_page('edit.php'); // Posts
   remove_menu_page('upload.php'); // Media
   remove_menu_page('link-manager.php'); // Links
   remove_menu_page('edit-comments.php'); // Comments
   remove_menu_page('edit.php?post_type=page'); // Pages
   remove_menu_page('plugins.php'); // Plugins
   remove_menu_page('themes.php'); // Appearance
   remove_menu_page('users.php'); // Users
   remove_menu_page('tools.php'); // Tools
   remove_menu_page('options-general.php'); // Settings
  }
}

Ẩn thông báo trong trang quản trị

add_action('admin_head', 'bc_disable_notice'); function bc_disable_notice() { ?> <style> #message { display: none;} </style> <?php }

Tắt cập nhật tự động Theme và Plugin

Thêm vào functions.php

// Disable Auto Update Themes
add_filter( 'auto_update_theme', '__return_false' );
// Disable Auto Update Plugins
add_filter( 'auto_update_plugin', '__return_false' );

Tắt cài đặt Themes – Plugins

define('DISALLOW_FILE_MODS',true);

Tính thời gian đọc hết một bài viết

// Hàm tính số từ trong một chuỗi
function countWords($text) {
    return str_word_count(strip_tags($text));
}

// Hàm tính thời gian để đọc hết một bài viết
function calculateReadingTime($content, $wordsPerMinute = 200) {
    $wordCount = countWords($content);
    $readingTime = ceil($wordCount / $wordsPerMinute); // Làm tròn lên để đảm bảo thời gian được hiển thị là một số nguyên
    return $readingTime;
}

// Hàm hiển thị thời gian đọc
function displayReadingTime($content, $wordsPerMinute = 200) {
    $readingTime = calculateReadingTime($content, $wordsPerMinute);
    return "$readingTime phút đọc";
}

// Đăng ký shortcode để hiển thị thời gian đọc
add_shortcode('reading_time', 'display_reading_time_shortcode');
// Shortcode 23 phút đọc
// Hàm thực thi shortcode
function display_reading_time_shortcode($atts) {
    // Lấy nội dung của bài viết hiện tại
    global $post;
    $content = $post->post_content;

    // Tính thời gian đọc
    $readingTime = displayReadingTime($content);

    // Trả về kết quả để hiển thị
    return $readingTime;
}

Tính thời gian đăng bài cách thời điểm đọc là bao lâu

// Thời gian đăng bài
// Hàm tính thời gian từ một ngày đến ngày hiện tại
function calculateElapsedTime($post_date) {
    $post_time = strtotime($post_date);
    $current_time = time();
    $elapsed_time = $current_time - $post_time;

    // Chuyển đổi khoảng thời gian thành định dạng ngày/giờ/phút/...
    $elapsed_time_string = human_time_diff($post_time, $current_time);

    return $elapsed_time_string;
}

// Đăng ký shortcode để hiển thị thời gian đăng bài
add_shortcode('post_age', 'display_post_age_shortcode');
// Shortcode 3 năm trước
// Hàm thực thi shortcode
function display_post_age_shortcode($atts) {
    // Lấy thời gian đăng bài của post hiện tại
    global $post;
    $post_date = $post->post_date;

    // Tính thời gian đã trôi qua từ thời gian đăng bài
    $elapsed_time = calculateElapsedTime($post_date);

    // Trả về kết quả để hiển thị
    return "$elapsed_time trước";
}

Hiển thị lượt xem bài viết

// Post View Count
add_filter ('use_block_editor_for_post', '__return_false'); 
function getPostViews($postID, $is_single = true){
global $post;
if(!$postID) $postID = $post->ID;
$count_key = 'post_views_count';
$count = get_post_meta($postID, $count_key, true);
if(!$is_single){
return '<span class="svl_show_count_only">'.$count.'</span>';
}
$nonce = wp_create_nonce('flat_count_post');
if($count == "0"){
delete_post_meta($postID, $count_key);
add_post_meta($postID, $count_key, '0');
return '<span class="svl_post_view_count" data-id="'.$postID.'" data-nonce="'.$nonce.'">0</span>';
}
return '<span class="svl_post_view_count" data-id="'.$postID.'" data-nonce="'.$nonce.'">'.$count.'</span>';
}
function setPostViews($postID) {
$count_key = 'post_views_count';
$count = get_post_meta($postID, $count_key, true);
if($count == "0" || empty($count) || !isset($count)){
add_post_meta($postID, $count_key, 1);
update_post_meta($postID, $count_key, 1);
}else{
$count++;
update_post_meta($postID, $count_key, $count);
}
}
add_action( 'wp_ajax_svl-ajax-counter', 'svl_ajax_callback' );
add_action( 'wp_ajax_nopriv_svl-ajax-counter', 'svl_ajax_callback' );
function svl_ajax_callback() {
if ( !wp_verify_nonce( $_REQUEST['nonce'], "flat_count_post")) {
exit();
}
$count = 0;
if ( isset( $_GET['p'] ) ) {
global $post;
$postID = intval($_GET['p']);
$post = get_post( $postID );
if($post && !empty($post) && !is_wp_error($post)){
setPostViews($post->ID);
$count_key = 'post_views_count';
$count = get_post_meta($postID, $count_key, true);
}
}
die($count.'');
}
add_action( 'wp_footer', 'svl_ajax_script', PHP_INT_MAX );
function svl_ajax_script() {
if(!is_single()) return;
?>
<script>
(function($){
$(document).ready( function() {
$('.svl_post_view_count').each( function( i ) {
var $id = $(this).data('id');
var $nonce = $(this).data('nonce');
var t = this;
$.get('<?php echo admin_url( 'admin-ajax.php' ); ?>?action=svl-ajax-counter&nonce='+$nonce+'&p='+$id, function( html ) {
$(t).html( html );
});
});
});
})(jQuery);
</script>
<?php
}

add_filter('manage_posts_columns', 'posts_column_views');
add_action('manage_posts_custom_column', 'posts_custom_column_views',5,2);
function posts_column_views($defaults){
$defaults['post_views'] = __( '' , '' );
return $defaults;
}
function posts_custom_column_views($column_name, $id){
if( $column_name === 'post_views' ) {
echo getPostViews( get_the_ID(), false);
}
}
// Đếm lượt Comment
// Đăng ký shortcode để hiển thị số lượng bình luận
add_shortcode('post_comments', 'display_post_comments_shortcode');
// Shortcode 0 bình luận
// Hàm thực thi shortcode
function display_post_comments_shortcode($atts) {
    global $post;
    $comments_count = get_comments_number($post->ID);
    return "{$comments_count} bình luận";
}

Hiển thị danh sách danh mục bài viết

// Danh sách danh mục bài viết
// Đăng ký shortcode để hiển thị danh mục của bài viết
add_shortcode('post_categories', 'display_post_categories_shortcode');

// Hàm thực thi shortcode
function display_post_categories_shortcode($atts) {
    $categories_list = get_the_category_list(' ');
    if ($categories_list) {
        return $categories_list;
    } else {
        return 'Bài viết này không thuộc danh mục nào.';
    }
}
// Đăng ký shortcode để hiển thị các tags của bài viết
add_shortcode('post_tags', 'display_post_tags_shortcode');

// Hàm thực thi shortcode
function display_post_tags_shortcode($atts) {
    global $post;
    
    // Lấy danh sách các tags của bài viết
    $tags = get_the_tags($post->ID);
    
    // Nếu có tags, hiển thị chúng
    if ($tags) {
        $tag_links = array();
        foreach ($tags as $tag) {
            $tag_links[] = '<a class="tagname" href="' . get_tag_link($tag->term_id) . '">' . $tag->name . '</a>';
        }
        return '<div class="taglist">Tags: ' . implode(' ', $tag_links).'</div>';
    } else {
        return '';
    }
}

Hiển thị số lượng sản phẩm đã bán

// Số lượng sản phẩm đã bán 
add_action( 'woocommerce_sold', 'wc_product_sold_count' );
function wc_product_sold_count() {
 global $product;
 $units_sold = get_post_meta( $product->get_id(), 'total_sales', true );
 echo '<p class="da-ban">' . sprintf( __( '%s lượt mua', 'woocommerce' ), $units_sold ) . '</p>';
}

Hiển thị lượt đánh giá sao

// Hiển thị đánh giá sao
remove_action( 'woocommerce_single_product_summary', 'woocommerce_template_loop_rating', 5 );
remove_action( 'woocommerce_after_shop_loop_item_title', 'woocommerce_template_loop_rating', 5 );
add_action('woocommerce_starrated', 'wiki_com_get_star_rating' );
function wiki_com_get_star_rating()
{
    global $woocommerce, $product;
    $average = $product->get_average_rating();

    echo '<div class="star-rating"><span style="width:'.( ( $average / 5 ) * 100 ) . '%"><strong itemprop="ratingValue" class="rating">'.$average.'</strong> '.__( 'out of 5', 'woocommerce' ).'</span></div>';
}

Hiển thị số lượng sản phẩm còn lại

// Sản phẩm còn lại
add_filter( 'woocommerce_get_availability', 'custom_get_availability', 1, 2);
function custom_get_availability( $availability, $_product ) {
//change text "In Stock' to 'SPECIAL ORDER'
    if($_product->is_in_stock()){
        $availability['availability']='còn ' . $_product->get_stock_quantity().' '.__('sản phẩm','woocommerce');
    }

    //change text "Out of Stock' to 'SOLD OUT'
    if(!$_product->is_in_stock()) {
        $availability['availability']=__('Hết hàng','woocommerce');
    }
    return $availability;
}

Thêm tùy chọn xuất hóa đơn VAT

// Thêm tùy chọn xuất hóa đơn VAT tại trang thanh toán
add_action('woocommerce_before_order_notes', 'custom_checkout_field');

function custom_checkout_field($checkout) {
    echo '<div id="custom_checkout_field"><h3>' . __('Hóa đơn VAT') . '</h3>';

    woocommerce_form_field('vat_invoice', array(
        'type'          => 'checkbox',
        'class'         => array('form-row-wide'),
        'label'         => __('Yêu cầu xuất hóa đơn VAT'),
        ), $checkout->get_value('vat_invoice'));

    echo '</div>';
}

// Lưu giá trị của tùy chọn xuất hóa đơn VAT khi đơn hàng được đặt
add_action('woocommerce_checkout_update_order_meta', 'custom_checkout_field_update_order_meta');

function custom_checkout_field_update_order_meta($order_id) {
    if (isset($_POST['vat_invoice'])) {
        update_post_meta($order_id, 'VAT Invoice', esc_attr($_POST['vat_invoice']));
    }
}

// Hiển thị tùy chọn xuất hóa đơn VAT trong trang quản trị đơn hàng
add_action('woocommerce_admin_order_data_after_billing_address', 'custom_checkout_field_display_admin_order_meta', 10, 1);

function custom_checkout_field_display_admin_order_meta($order) {
    $vat_invoice = get_post_meta($order->get_id(), 'VAT Invoice', true);
    if ($vat_invoice) {
        echo '<p><strong>' . __('VAT Invoice') . ':</strong> ' . __('Yes') . '</p>';
    }
}

// Thêm mục thiết lập để đặt thuế suất VAT trong quản trị
add_filter('woocommerce_get_sections_tax', 'add_vat_section');

function add_vat_section($sections) {
    $sections['vat'] = __('VAT Settings');
    return $sections;
}

add_filter('woocommerce_get_settings_tax', 'add_vat_settings', 10, 2);

function add_vat_settings($settings, $current_section) {
    if ($current_section == 'vat') {
        $settings_vat = array();

        $settings_vat[] = array(
            'name' => __('VAT Settings'),
            'type' => 'title',
            'id' => 'vat_settings'
        );

        $settings_vat[] = array(
            'name' => __('VAT Rate'),
            'type' => 'number',
            'id' => 'woocommerce_vat_rate',
            'css' => 'min-width:300px;',
            'desc' => __('Enter the VAT rate as a percentage.'),
            'desc_tip' => true,
        );

        $settings_vat[] = array(
            'type' => 'sectionend',
            'id' => 'vat_settings'
        );

        return $settings_vat;
    } else {
        return $settings;
    }
}

// Tính và thêm VAT vào tổng giá trị đơn hàng nếu tùy chọn xuất hóa đơn VAT được chọn
add_action('woocommerce_cart_calculate_fees', 'add_vat_fee');

function add_vat_fee($cart) {
    if (is_admin() && !defined('DOING_AJAX')) {
        return;
    }

    if (isset($_POST['post_data'])) {
        parse_str($_POST['post_data'], $post_data);
    } else {
        $post_data = array();
    }

    if (isset($post_data['vat_invoice']) && $post_data['vat_invoice']) {
        $vat_rate = floatval(get_option('woocommerce_vat_rate'));
        if ($vat_rate > 0) {
            $cart_total = $cart->cart_contents_total;
            $vat = $cart_total * ($vat_rate / 100);
            $cart->add_fee(__('VAT'), $vat, true);
        }
    }
}
// Thêm VAT vào thông tin đơn hàng
add_action('woocommerce_checkout_create_order', 'add_vat_to_order_meta', 20, 2);

function add_vat_to_order_meta($order, $data) {
    if (isset($_POST['vat_invoice']) && $_POST['vat_invoice']) {
        $vat_rate = floatval(get_option('woocommerce_vat_rate'));
        if ($vat_rate > 0) {
            $cart_total = WC()->cart->cart_contents_total;
            $vat = $cart_total * ($vat_rate / 100);
            $order->update_meta_data('VAT', $vat);
        }
    }
}

// Xử lý AJAX để cập nhật giỏ hàng khi chọn xuất hóa đơn VAT
add_action('wp_footer', 'add_vat_checkbox_script');
function add_vat_checkbox_script() {
    if (is_checkout()) {
        ?>
        <script type="text/javascript">
        jQuery(function($) {
            $('form.checkout').on('change', 'input#vat_invoice', function() {
                $(document.body).trigger('update_checkout');
            });
        });
        </script>
        <?php
    }
}

// Thêm trường ẩn để truyền giá trị VAT qua AJAX
add_action('woocommerce_review_order_before_payment', 'add_vat_hidden_field');
function add_vat_hidden_field() {
    ?>
    <input type="hidden" name="vat_invoice" id="hidden_vat_invoice" value="0" />
    <?php
}

// Cập nhật trường ẩn khi người dùng chọn hoặc bỏ chọn tùy chọn VAT
add_action('wp_footer', 'update_hidden_vat_field_script');
function update_hidden_vat_field_script() {
    if (is_checkout()) {
        ?>
        <script type="text/javascript">
        jQuery(function($) {
            $('form.checkout').on('change', 'input#vat_invoice', function() {
                if ($(this).is(':checked')) {
                    $('#hidden_vat_invoice').val('1');
                } else {
                    $('#hidden_vat_invoice').val('0');
                }
            });
        });
        </script>
        <?php
    }
}

Báo lỗi khi không nhập trường thông tin ở form đặt hàng

// Check field
function custom_checkout_field_validation_script() {
    if (is_checkout()) {
        ?>
        <script type="text/javascript">
            jQuery(document).ready(function($) {
                // Hàm kiểm tra trường
                function validate_field(field) {
                    // Xóa thông báo lỗi cũ
                    field.next('.error-message').remove();
                    var field_name = field.attr('name');

                    // Kiểm tra các trường thông tin chung
                    if (field.val() === '') {
                        field.css('border', '1px solid red');
                        field.after('<span class="error-message" style="color: red; font-size: 12px;">Vui lòng nhập thông tin</span>');
                        return false;
                    } else {
                        field.css('border', '');
                    }

                    // Kiểm tra điều kiện đặc biệt cho trường điện thoại
                    if (field_name === 'billing_phone') {
                        var phone_regex = /^0\d{9}$/;
                        if (!phone_regex.test(field.val())) {
                            field.css('border', '1px solid red');
                            field.after('<span class="error-message" style="color: red; font-size: 12px;">Số điện thoại không hợp lệ. Số điện thoại phải bắt đầu bằng số 0 và có 10 chữ số.</span>');
                            return false;
                        } else {
                            field.css('border', '');
                        }
                    }

                    // Kiểm tra điều kiện đặc biệt cho trường email
                    if (field_name === 'billing_email') {
                        var email_regex = /^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/;
                        if (!email_regex.test(field.val())) {
                            field.css('border', '1px solid red');
                            field.after('<span class="error-message" style="color: red; font-size: 12px;">Địa chỉ email không hợp lệ.</span>');
                            return false;
                        } else {
                            field.css('border', '');
                        }
                    }
                    return true;
                }

                // Kiểm tra các trường khi người dùng rời khỏi trường đó
                $('input[name="billing_first_name"], input[name="billing_last_name"], input[name="billing_email"], input[name="billing_phone"]').on('blur', function() {
                    validate_field($(this));
                });

                // Kiểm tra tất cả các trường khi người dùng nhấn nút "Đặt hàng"
                $('form.checkout').on('submit', function(event) {
                    var valid = true;
                    $('input[name="billing_first_name"], input[name="billing_last_name"], input[name="billing_email"], input[name="billing_phone"]').each(function() {
                        if (!validate_field($(this))) {
                            valid = false;
                        }
                    });

                    if (!valid) {
                        event.preventDefault();
                        alert('Vui lòng điền đầy đủ các trường bắt buộc.');
                    }
                });
            });
        </script>
        <?php
    }
}
add_action('wp_footer', 'custom_checkout_field_validation_script');

Chỉ cho phép tìm kiếm với từ khóa có trong tiêu đề

function search_by_title_only( $search, $wp_query ) {
    // Kiểm tra nếu không phải là trang tìm kiếm thì không thực hiện thay đổi gì
    if ( !$wp_query->is_search ) {
        return $search;
    }

    // Kiểm tra nếu không phải tìm kiếm trong post type 'product' thì không thực hiện thay đổi gì
    if ( !is_post_type_archive('product') && !isset($wp_query->query_vars['s'])) {
        return $search;
    }

    global $wpdb;

    // Lấy từ khóa tìm kiếm
    $search_term = $wp_query->query_vars['s'];

    // Nếu từ khóa không rỗng, tạo câu truy vấn chỉ tìm kiếm theo tiêu đề sản phẩm
    if ( !empty( $search_term ) ) {
        $search = $wpdb->prepare(" AND {$wpdb->posts}.post_title LIKE '%%%s%%'", $wpdb->esc_like($search_term));
    }

    return $search;
}
add_filter( 'posts_search', 'search_by_title_only', 10, 2 );
function remove_ttt_pnwc_modal_content() {
    if (!is_cart()) { // Kiểm tra nếu không phải là trang giỏ hàng
        ?>
        <style>
            .ttt-pnwc-modal, .woocommerce-message {
                display: none !important;
            }
        </style>
        <?php
    }
}
add_action('wp_head', 'remove_ttt_pnwc_modal_content');

 

Về tôi

Minh Anh

Xin chia sẻ những phần việc nhỏ ở các dự án đã triển khai để tiện sử dụng lại ở những dự án khác, giúp rút ngắn thời gian hoàn thành sản phẩm, giảm chi phí cho đối tác và khách hàng.
0 0 đánh giá
Đánh giá bài viết
Theo dõi
Thông báo của
guest
0 Góp ý
Cũ nhất
Mới nhất Được bỏ phiếu nhiều nhất
Phản hồi nội tuyến
Xem tất cả bình luận

Danh mục bài viết

Khám phá những nội dung mới nhất

0
Rất thích suy nghĩ của bạn, hãy bình luận.x