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 4 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');








