| Server IP : 160.187.147.141 / Your IP : 216.73.216.229 Web Server : nginx/1.28.0 System : Linux inter3 6.8.0-63-generic #66-Ubuntu SMP PREEMPT_DYNAMIC Fri Jun 13 20:25:30 UTC 2025 x86_64 User : butparkerkhactencom ( 1005) PHP Version : 8.4.8 Disable Function : NONE MySQL : OFF | cURL : ON | WGET : ON | Perl : ON | Python : OFF | Sudo : ON | Pkexec : OFF Directory : /home/butparkerkhactencom/butparkerkhacten.com/wp-content/themes/generatepress-child/ |
Upload File : |
<?php
/**
* GeneratePress Child Theme functions and definitions
*/
add_action( 'wp_enqueue_scripts', 'generatepress_child_enqueue_styles' );
add_action( 'wp_enqueue_scripts', 'orologio_clone_dequeue_plugin_assets', 100 );
add_action( 'template_redirect', 'oc_redirect_malformed_clone_paths', -1 );
add_action( 'template_redirect', 'oc_redirect_legacy_product_category_paths', -1 );
add_action( 'template_redirect', 'orologio_clone_disable_front_page_cache' );
add_action( 'admin_bar_menu', 'oc_home_admin_bar_edit_link', 999 );
add_action( 'admin_enqueue_scripts', 'oc_home_admin_assets' );
add_action( 'load-post.php', 'oc_home_prepare_edit_screen' );
add_action( 'edit_form_after_title', 'oc_home_render_edit_panel' );
add_action( 'save_post_page', 'oc_home_save_page_settings' );
add_filter( 'use_block_editor_for_post', 'oc_home_disable_block_editor', 10, 2 );
add_action( 'acf/init', 'oc_product_spec_register_acf_fields' );
add_action( 'add_meta_boxes', 'oc_product_spec_add_meta_box' );
add_action( 'save_post_product', 'oc_product_spec_save_meta_box' );
add_action( 'add_meta_boxes', 'oc_product_media_add_meta_box' );
add_action( 'save_post_product', 'oc_product_media_save_meta_box' );
add_action( 'wp_ajax_oc_quick_order', 'oc_handle_quick_order' );
add_action( 'wp_ajax_nopriv_oc_quick_order', 'oc_handle_quick_order' );
add_filter( 'woocommerce_placeholder_img_src', 'oc_woocommerce_placeholder_img_src' );
add_filter( 'nav_menu_link_attributes', 'orologio_clone_localize_menu_links' );
add_filter( 'post_link', 'orologio_clone_localize_url' );
add_filter( 'page_link', 'orologio_clone_localize_url' );
add_filter( 'post_type_link', 'orologio_clone_localize_url' );
add_filter( 'term_link', 'orologio_clone_localize_url' );
add_filter( 'body_class', 'orologio_clone_body_class' );
add_filter( 'option_home', 'orologio_clone_current_origin' );
add_filter( 'option_siteurl', 'orologio_clone_current_origin' );
add_filter( 'redirect_canonical', 'orologio_clone_localize_redirect' );
add_filter( 'pre_get_document_title', 'orologio_clone_virtual_document_title', 999 );
add_filter( 'rank_math/frontend/title', 'orologio_clone_virtual_document_title', 999 );
add_filter( 'document_title_parts', 'orologio_clone_virtual_title_parts' );
add_action( 'template_redirect', 'orologio_clone_render_virtual_pages', 0 );
function orologio_clone_localize_redirect( $redirect_url ) {
if ( orologio_clone_virtual_page_slug() ) {
return false;
}
return orologio_clone_localize_url( $redirect_url );
}
function orologio_clone_virtual_title_parts( $title ) {
$slug = orologio_clone_virtual_page_slug();
if ( ! $slug ) {
return $title;
}
if ( 'services' === $slug ) {
$title['title'] = 'Dịch vụ Parker';
} elseif ( 'about' === $slug ) {
$title['title'] = 'Giới thiệu';
} elseif ( 'contact' === $slug ) {
$title['title'] = 'Liên hệ';
}
unset( $title['tagline'] );
return $title;
}
function orologio_clone_virtual_document_title( $title ) {
if ( is_404() ) {
return 'Không tìm thấy trang - ' . get_bloginfo( 'name' );
}
$slug = orologio_clone_virtual_page_slug();
if ( ! $slug ) {
return $title;
}
$labels = array(
'services' => 'Dịch vụ Parker',
'about' => 'Giới thiệu',
'contact' => 'Liên hệ',
);
return ( $labels[ $slug ] ?? $title ) . ' - ' . get_bloginfo( 'name' );
}
function orologio_clone_is_surface() {
return is_front_page()
|| is_home()
|| is_page()
|| is_singular( 'post' )
|| is_archive()
|| is_search()
|| is_404()
|| is_singular( 'product' )
|| is_post_type_archive( 'product' )
|| is_tax( array( 'product_cat', 'product_tag' ) )
|| orologio_clone_virtual_page_slug();
}
function orologio_clone_virtual_page_slug() {
$path = trim( (string) wp_parse_url( $_SERVER['REQUEST_URI'] ?? '', PHP_URL_PATH ), '/' );
$path = sanitize_title( $path );
if ( in_array( $path, array( 'lien-he', 'contact' ), true ) ) {
return 'contact';
}
if ( in_array( $path, array( 'gioi-thieu', 'about' ), true ) ) {
return 'about';
}
if ( in_array( $path, array( 'dich-vu', 'services' ), true ) ) {
return 'services';
}
return '';
}
function orologio_clone_render_virtual_pages() {
$slug = orologio_clone_virtual_page_slug();
if ( ! $slug || ! is_404() ) {
return;
}
status_header( 200 );
nocache_headers();
$is_contact = 'contact' === $slug;
$is_services = 'services' === $slug;
global $wp_query;
if ( $wp_query ) {
$wp_query->is_404 = false;
$wp_query->is_page = true;
}
$virtual_title = 'services' === $slug ? 'Dịch vụ Parker' : ( 'about' === $slug ? 'Giới thiệu' : 'Liên hệ' );
get_header();
?>
<script>document.title = <?php echo wp_json_encode( $virtual_title . ' - ' . get_bloginfo( 'name' ) ); ?>;</script>
<main class="orologio-clone oc-page">
<?php oc_clone_header(); ?>
<?php if ( $is_contact ) : ?>
<?php oc_render_contact_page_sections(); ?>
<?php elseif ( $is_services ) : ?>
<?php oc_render_services_page_sections(); ?>
<?php else : ?>
<?php oc_render_history_page_sections(); ?>
<?php endif; ?>
<?php oc_clone_footer_cta(); ?>
</main>
<?php
get_footer();
exit;
}
function orologio_clone_body_class( $classes ) {
if ( orologio_clone_is_surface() ) {
$classes[] = 'orologio-clone-active';
}
return $classes;
}
function orologio_clone_current_origin( $stored_url = '' ) {
$forwarded_proto = strtolower( sanitize_text_field( wp_unslash( $_SERVER['HTTP_X_FORWARDED_PROTO'] ?? '' ) ) );
$cf_visitor = strtolower( sanitize_text_field( wp_unslash( $_SERVER['HTTP_CF_VISITOR'] ?? '' ) ) );
$uses_https = is_ssl() || 'https' === $forwarded_proto || false !== strpos( $cf_visitor, 'https' );
$scheme = $uses_https ? 'https://' : 'http://';
$host = sanitize_text_field( wp_unslash( $_SERVER['HTTP_HOST'] ?? '' ) );
$host = preg_replace( '/[^a-z0-9.\-:\[\]]/i', '', $host );
if ( '' === $host ) {
return is_string( $stored_url ) ? untrailingslashit( $stored_url ) : '';
}
return $scheme . $host;
}
function orologio_clone_localize_url( $url ) {
if ( ! is_string( $url ) || '' === $url ) {
return $url;
}
$origin = orologio_clone_current_origin();
$url = preg_replace( '#https?://(www\.)?butparkerkhacten\.com#i', $origin, $url );
$url = preg_replace( '#https?://but(?:%20|\+|\s)+parker(?:%20|\+|\s)+khac(?:%20|\+|\s)+ten#i', $origin, $url );
$url = preg_replace( '#https?://(?:localhost|127\.0\.0\.1)(?::\d+)?#i', $origin, $url );
return $url;
}
function oc_redirect_malformed_clone_paths() {
if ( is_admin() || wp_doing_ajax() ) {
return;
}
$request_uri = (string) wp_unslash( $_SERVER['REQUEST_URI'] ?? '' );
$request_path = rawurldecode( (string) wp_parse_url( $request_uri, PHP_URL_PATH ) );
if ( ! preg_match( '#^/but\s+parker\s+khac\s+ten(?:/|$)#i', $request_path ) ) {
return;
}
$clean_path = preg_replace( '#^/but\s+parker\s+khac\s+ten#i', '', $request_path );
$clean_path = '/' . ltrim( $clean_path ?: '/', '/' );
$target = home_url( $clean_path );
$query = (string) wp_parse_url( $request_uri, PHP_URL_QUERY );
if ( '' !== $query ) {
$target .= '?' . $query;
}
wp_safe_redirect( esc_url_raw( $target ), 301 );
exit;
}
function oc_redirect_legacy_product_category_paths() {
if ( is_admin() || wp_doing_ajax() ) {
return;
}
$request_uri = (string) wp_unslash( $_SERVER['REQUEST_URI'] ?? '' );
$request_path = rawurldecode( (string) wp_parse_url( $request_uri, PHP_URL_PATH ) );
if ( ! preg_match( '#^/product-category/(?:[^/]+/)*([^/]+)/?$#i', $request_path, $matches ) ) {
return;
}
$term = get_term_by( 'slug', sanitize_title( $matches[1] ), 'product_cat' );
if ( ! $term ) {
return;
}
$target = get_term_link( $term );
if ( is_wp_error( $target ) ) {
return;
}
$query = (string) wp_parse_url( $request_uri, PHP_URL_QUERY );
if ( '' !== $query ) {
$target .= ( false === strpos( $target, '?' ) ? '?' : '&' ) . $query;
}
wp_safe_redirect( esc_url_raw( orologio_clone_localize_url( $target ) ), 301 );
exit;
}
function orologio_clone_localize_menu_links( $atts ) {
if ( isset( $atts['href'] ) ) {
$atts['href'] = orologio_clone_localize_url( $atts['href'] );
}
return $atts;
}
function orologio_clone_disable_front_page_cache() {
if ( orologio_clone_is_surface() && ! defined( 'DONOTCACHEPAGE' ) ) {
define( 'DONOTCACHEPAGE', true );
}
if ( orologio_clone_is_surface() ) {
ob_start( 'orologio_clone_localize_output' );
}
}
function orologio_clone_localize_output( $html ) {
if ( ! is_string( $html ) || '' === $html ) {
return $html;
}
$origin = orologio_clone_current_origin();
$html = preg_replace( '#https?://(www\.)?butparkerkhacten\.com#i', $origin, $html );
$html = preg_replace( '#https?://but(?:%20|\+|\s)+parker(?:%20|\+|\s)+khac(?:%20|\+|\s)+ten#i', $origin, $html );
$html = preg_replace( '#https?://(?:localhost|127\.0\.0\.1)(?::\d+)?#i', $origin, $html );
$html = preg_replace( "#<link rel=['\"]dns-prefetch['\"] href=['\"]//butparkerkhacten\.com['\"]\s*/>\s*#i", '', $html );
return $html;
}
function oc_prepare_rich_html( $content ) {
if ( ! is_string( $content ) || '' === trim( $content ) ) {
return '';
}
$html = apply_filters( 'the_content', $content );
$html = wp_kses_post( $html );
return force_balance_tags( $html );
}
function generatepress_child_enqueue_styles() {
wp_enqueue_style( 'generatepress-parent-style', get_template_directory_uri() . '/style.css' );
$child_uri = get_stylesheet_directory_uri();
wp_enqueue_style(
'orologio-clone-fonts',
'https://fonts.googleapis.com/css2?family=Montserrat:ital,wght@0,300..800;1,300..800&display=swap',
array(),
null
);
wp_enqueue_style(
'orologio-clone',
$child_uri . '/assets/css/orologio-clone.css',
array( 'generatepress-parent-style', 'orologio-clone-fonts' ),
'1.6.100'
);
if ( orologio_clone_is_surface() ) {
wp_enqueue_script(
'orologio-clone',
$child_uri . '/assets/js/orologio-clone.js',
array(),
'1.6.41',
true
);
wp_localize_script(
'orologio-clone',
'OCQuickOrder',
array(
'ajax_url' => admin_url( 'admin-ajax.php' ),
'loading' => 'Đang gửi đơn hàng...',
'success' => 'Đã nhận thông tin. Cửa hàng sẽ liên hệ xác nhận đơn hàng.',
'error' => 'Chưa gửi được đơn hàng. Vui lòng thử lại hoặc gọi trực tiếp.',
)
);
}
}
function orologio_clone_dequeue_plugin_assets() {
if ( ! orologio_clone_is_surface() ) {
return;
}
wp_dequeue_script( 'zurcf7_front_js' );
wp_deregister_script( 'zurcf7_front_js' );
wp_dequeue_script( 'affwp-tracking' );
wp_deregister_script( 'affwp-tracking' );
wp_dequeue_style( 'affwp-forms' );
wp_deregister_style( 'affwp-forms' );
}
add_filter( 'woocommerce_product_description_heading', '__return_false' );
function oc_local_url( $url ) {
return orologio_clone_localize_url( $url );
}
function oc_origin() {
return orologio_clone_current_origin();
}
function oc_asset_base() {
return get_stylesheet_directory_uri() . '/assets';
}
function oc_upload_base() {
$uploads = wp_upload_dir();
return untrailingslashit( $uploads['baseurl'] );
}
function oc_shop_url() {
return oc_local_url( function_exists( 'wc_get_page_permalink' ) ? wc_get_page_permalink( 'shop' ) : home_url( '/' ) );
}
function oc_cart_url() {
return oc_local_url( function_exists( 'wc_get_cart_url' ) ? wc_get_cart_url() : home_url( '/cart/' ) );
}
function oc_handle_quick_order() {
if ( ! function_exists( 'wc_create_order' ) ) {
wp_send_json_error( array( 'message' => 'WooCommerce chưa sẵn sàng để tạo đơn hàng.' ), 500 );
}
$product_id = absint( $_POST['product_id'] ?? 0 );
$quantity = max( 1, absint( $_POST['quantity'] ?? 1 ) );
$nonce = sanitize_text_field( wp_unslash( $_POST['nonce'] ?? '' ) );
if ( ! $product_id || ! wp_verify_nonce( $nonce, 'oc_quick_order_' . $product_id ) ) {
wp_send_json_error( array( 'message' => 'Phiên đặt hàng không hợp lệ. Vui lòng tải lại trang.' ), 403 );
}
$product = wc_get_product( $product_id );
if ( ! $product ) {
wp_send_json_error( array( 'message' => 'Không tìm thấy sản phẩm.' ), 404 );
}
$name = sanitize_text_field( wp_unslash( $_POST['customer_name'] ?? '' ) );
$phone = sanitize_text_field( wp_unslash( $_POST['customer_phone'] ?? '' ) );
$email = sanitize_email( wp_unslash( $_POST['customer_email'] ?? '' ) );
$address = sanitize_text_field( wp_unslash( $_POST['customer_address'] ?? '' ) );
$note = sanitize_textarea_field( wp_unslash( $_POST['customer_note'] ?? '' ) );
if ( ! $name || ! $phone || ! $address ) {
wp_send_json_error( array( 'message' => 'Vui lòng nhập họ tên, số điện thoại và địa chỉ giao hàng.' ), 400 );
}
try {
$order = wc_create_order();
$order->add_product( $product, $quantity );
$address_data = array(
'first_name' => $name,
'phone' => $phone,
'email' => $email,
'address_1' => $address,
'country' => 'VN',
);
$order->set_address( $address_data, 'billing' );
$order->set_address( $address_data, 'shipping' );
$order->set_payment_method( 'cod' );
$order->set_payment_method_title( 'Trả tiền mặt khi nhận hàng' );
$order->add_order_note( 'Đơn đặt hàng nhanh từ popup sản phẩm.' . ( $note ? "\nGhi chú khách hàng: " . $note : '' ) );
if ( $note ) {
$order->set_customer_note( $note );
}
$order->calculate_totals();
$order->update_status( 'processing', 'Đơn hàng nhanh đang chờ cửa hàng liên hệ xác nhận.' );
$order->save();
wp_send_json_success(
array(
'message' => 'Đã nhận đơn hàng #' . $order->get_order_number() . '. Cửa hàng sẽ liên hệ xác nhận sớm.',
'order_id' => $order->get_id(),
)
);
} catch ( Exception $exception ) {
wp_send_json_error( array( 'message' => 'Không tạo được đơn hàng. Vui lòng thử lại.' ), 500 );
}
}
function oc_history_asset( $filename ) {
return esc_url( oc_upload_base() . '/' . ltrim( $filename, '/' ) );
}
function oc_render_services_page_sections() {
$services = array(
array(
'number' => '01.',
'title' => 'Khắc laser',
'copy' => 'Khắc tên, ký hiệu hoặc lời chúc trực tiếp lên thân bút với nét khắc gọn, sắc và phù hợp từng chất liệu.',
'image' => 'parker-service-laser-ai.png',
),
array(
'number' => '02.',
'title' => 'In logo bút',
'copy' => 'Tư vấn vị trí logo, màu in và phương án hoàn thiện cho quà tặng doanh nghiệp, sự kiện và tri ân khách VIP.',
'image' => 'parker-service-logo-ai.png',
),
array(
'number' => '03.',
'title' => 'Set quà tặng',
'copy' => 'Đóng hộp, thiệp chúc, tem nhận diện và gói quà theo yêu cầu để mỗi cây Parker sẵn sàng được trao tặng.',
'image' => 'parker-service-gift-ai.png',
),
);
$steps = array(
array( '01', 'Tư vấn dòng bút', 'Chọn Parker IM, Vector, Sonnet hoặc set quà phù hợp ngân sách và dịp tặng.' ),
array( '02', 'Chốt nội dung', 'Rà soát tên, ký hiệu, logo, font và vị trí trước khi tiến hành cá nhân hóa.' ),
array( '03', 'Test vật liệu', 'Điều chỉnh màu khắc hoặc màu in theo bề mặt sơn, thép, chrome hoặc mạ vàng.' ),
array( '04', 'Hoàn thiện', 'Khắc laser, in logo và kiểm tra độ sắc nét dưới ánh sáng showroom.' ),
array( '05', 'Đóng gói', 'Lắp hộp Parker, thiệp, túi và phụ kiện quà tặng theo tiêu chuẩn từng đơn.' ),
array( '06', 'Giao hàng', 'Xác nhận thông tin nhận hàng, gửi ảnh hoàn thiện và giao toàn quốc.' ),
);
$faqs = array(
array( 'Khắc laser mất bao lâu?', 'Thông thường đơn lẻ có thể xử lý trong ngày sau khi chốt nội dung. Đơn số lượng lớn sẽ được báo tiến độ theo mẫu bút và số lượng.' ),
array( 'Có in logo doanh nghiệp trên bút Parker được không?', 'Có. Đội ngũ sẽ tư vấn kích thước, vị trí và màu logo để phù hợp thân bút, hộp quà và nhận diện thương hiệu.' ),
array( 'Tôi có được xem ảnh trước khi giao không?', 'Có. Với đơn cá nhân hóa, cửa hàng có thể gửi ảnh thành phẩm để khách xác nhận trước khi đóng gói và giao hàng.' ),
);
?>
<section class="oc-services-hero oc-services-section" aria-labelledby="oc-services-title">
<div class="oc-services-hero-inner">
<header class="oc-services-heading oc-reveal">
<p>Discover</p>
<h1 id="oc-services-title"><em>Dịch vụ</em> Parker</h1>
</header>
<p class="oc-services-lead oc-reveal">Từ khắc laser cá nhân hóa đến in logo doanh nghiệp và set quà tặng theo yêu cầu, mỗi dịch vụ được hoàn thiện như một phần của trải nghiệm Parker cao cấp.</p>
<div class="oc-services-card-grid" aria-label="Các dịch vụ Parker">
<?php foreach ( $services as $item ) : ?>
<article class="oc-services-card oc-reveal">
<a href="<?php echo esc_url( oc_local_url( home_url( '/lien-he/' ) ) ); ?>">
<figure>
<img src="<?php echo oc_history_asset( $item['image'] ); ?>" alt="<?php echo esc_attr( $item['title'] ); ?>">
</figure>
<div>
<h2><span><?php echo esc_html( $item['number'] ); ?></span> <em><?php echo esc_html( $item['title'] ); ?></em></h2>
<p><?php echo esc_html( $item['copy'] ); ?></p>
</div>
</a>
</article>
<?php endforeach; ?>
</div>
</div>
</section>
<section class="oc-services-signature oc-services-section">
<div class="oc-services-signature-copy oc-reveal">
<p>01.</p>
<h2><em>Khắc laser</em><br>chuẩn từng nét ký</h2>
<p>Bút được kiểm tra vị trí khắc, căn chỉnh theo chiều thân bút và chất liệu hoàn thiện. Mục tiêu là nét khắc rõ, sang và không phá vỡ tỷ lệ thanh lịch của Parker.</p>
<a class="oc-services-link" href="<?php echo esc_url( oc_local_url( home_url( '/lien-he/' ) ) ); ?>">Tư vấn khắc tên</a>
</div>
<figure class="oc-services-signature-media oc-reveal">
<img src="<?php echo oc_history_asset( 'parker-service-laser-ai.png' ); ?>" alt="Dịch vụ khắc laser bút Parker">
</figure>
</section>
<section class="oc-services-process oc-services-section">
<header class="oc-services-split-head oc-reveal">
<p>02.</p>
<h2><em>Quy trình</em><br>dịch vụ</h2>
<p>Mỗi đơn hàng đều đi qua các bước kiểm tra rõ ràng để nội dung cá nhân hóa, hộp quà và thời gian giao hàng khớp với nhu cầu thực tế.</p>
</header>
<div class="oc-services-step-grid">
<?php foreach ( $steps as $step ) : ?>
<article class="oc-services-step oc-reveal">
<span><?php echo esc_html( $step[0] ); ?></span>
<h3><?php echo esc_html( $step[1] ); ?></h3>
<p><?php echo esc_html( $step[2] ); ?></p>
</article>
<?php endforeach; ?>
</div>
</section>
<section class="oc-services-proof oc-services-section">
<header class="oc-services-split-head oc-reveal">
<p>03.</p>
<h2><em>Bảo chứng</em><br>dịch vụ</h2>
<p>Trang dịch vụ được thiết kế để khách hiểu nhanh: làm gì, làm như thế nào và vì sao có thể yên tâm đặt bút Parker cá nhân hóa.</p>
</header>
<div class="oc-services-proof-grid">
<article>
<img src="<?php echo oc_history_asset( 'parker-service-logo-ai.png' ); ?>" alt="In logo doanh nghiệp trên bút Parker">
<h3>Logo đúng nhận diện</h3>
<p>Tư vấn màu, kích thước và vị trí logo để quà tặng doanh nghiệp giữ được sự trang trọng.</p>
</article>
<article>
<img src="<?php echo oc_history_asset( 'parker-service-gift-ai.png' ); ?>" alt="Set quà tặng Parker theo yêu cầu">
<h3>Hộp quà sẵn trao</h3>
<p>Đóng gói đồng bộ hộp, thiệp và phụ kiện theo từng dịp tri ân, ký kết hoặc vinh danh.</p>
</article>
<article>
<img src="<?php echo oc_history_asset( 'parker-duofold-hero.jpg' ); ?>" alt="Bút Parker cao cấp">
<h3>Parker chính hãng</h3>
<p>Kiểm tra sản phẩm, tư vấn dòng bút và hoàn thiện trước khi giao đến tay khách hàng.</p>
</article>
</div>
</section>
<section class="oc-services-faq oc-services-section">
<header class="oc-services-heading oc-reveal">
<p>Read</p>
<h2><em>Câu hỏi</em> thường gặp</h2>
</header>
<div class="oc-services-faq-list">
<?php foreach ( $faqs as $faq ) : ?>
<details class="oc-services-faq-item oc-reveal">
<summary><?php echo esc_html( $faq[0] ); ?></summary>
<p><?php echo esc_html( $faq[1] ); ?></p>
</details>
<?php endforeach; ?>
</div>
</section>
<?php
}
function oc_render_history_page_sections() {
$timeline = array(
array(
'year' => '1888',
'title' => 'Di sản Parker ra đời',
'copy' => 'Parker khởi đầu với tinh thần cải tiến trải nghiệm viết, đặt nền móng cho những cây bút bền bỉ, lịch lãm và được tin dùng qua nhiều thế hệ.',
'image' => 'parker-duofold-hero.jpg',
),
array(
'year' => '2020',
'title' => 'Tuyển chọn chính hãng',
'copy' => 'But Parker Khắc Tên tập trung vào các dòng Parker chính hãng, tư vấn đúng nhu cầu ký tên, quà tặng cá nhân và quà tặng doanh nghiệp.',
'image' => 'parker-gift-set-wide.jpg',
),
array(
'year' => '2023',
'title' => 'Khắc tên theo yêu cầu',
'copy' => 'Dịch vụ khắc tên, ký hiệu và logo được hoàn thiện cẩn trọng theo từng chất liệu bút, đảm bảo nét khắc rõ, sang và bền.',
'image' => 'parker-workshop.jpg',
),
array(
'year' => 'Hôm nay',
'title' => 'Sẵn sàng trao tặng',
'copy' => 'Mỗi đơn hàng được kiểm tra, tư vấn hộp quà và đóng gói chỉn chu để cây bút Parker trở thành một dấu ấn cá nhân đáng nhớ.',
'image' => 'parker-gift-set-wide.jpg',
),
);
?>
<section class="oc-history-hero-section">
<div class="oc-history-hero-inner">
<header class="oc-history-hero-title">
<p>Giới thiệu</p>
<h1><em>Bút</em> Parker</h1>
</header>
<div class="oc-history-quote-stage">
<div class="oc-history-quote-bg" aria-hidden="true"></div>
<div class="oc-history-quote">
<h2>"<em>Một cây bút Parker</em> không chỉ để viết - mỗi chi tiết phải tôn vinh cả <em>dấu ấn cá nhân</em> lẫn khoảnh khắc được trao tặng."</h2>
</div>
<div class="oc-history-founder">
<div class="oc-history-signature">.But Parker</div>
<p>Parker chính hãng - khắc tên - quà tặng cao cấp</p>
</div>
</div>
</div>
</section>
<section class="oc-history-intro-cta oc-history-section">
<div class="oc-history-intro-inner">
<div class="oc-history-intro-copy oc-reveal">
<p>At But Parker, chúng tôi tin rằng một cây bút tốt có thể lưu giữ phong thái của người ký và cảm xúc của người nhận. Mỗi sản phẩm được chọn, khắc và đóng gói như một món quà có giá trị sử dụng lâu dài.</p>
<a class="oc-history-text-link" href="#oc-history-timeline">Xem hành trình dịch vụ</a>
</div>
<figure class="oc-history-intro-media oc-reveal">
<img src="<?php echo oc_history_asset( 'parker-workshop.jpg' ); ?>" alt="Nghệ nhân kiểm tra và hoàn thiện bút Parker">
</figure>
</div>
</section>
<section class="oc-history-family oc-history-section">
<div class="oc-history-family-head">
<p>Quy trình</p>
<h2><em>Ba</em> bước tạo nên<br>dấu ấn Parker</h2>
</div>
<div class="oc-history-family-band">
<h3><em>Chọn</em> đúng bút <em>Khắc</em> đúng nét<br>Trao tặng đúng khoảnh khắc</h3>
</div>
<div class="oc-history-family-gallery">
<article>
<img src="<?php echo oc_history_asset( 'parker-duofold-hero.jpg' ); ?>" alt="Bút Parker cao cấp trên nền đen">
<span>Chọn mẫu bút</span>
</article>
<article>
<img src="<?php echo oc_history_asset( 'parker-workshop.jpg' ); ?>" alt="Hoàn thiện và kiểm tra bút Parker">
<span>Khắc tên</span>
</article>
<article>
<img src="<?php echo oc_history_asset( 'parker-gift-moment.jpg' ); ?>" alt="Hộp quà Parker được trao tặng">
<span>Trao tặng</span>
</article>
</div>
</section>
<section id="oc-history-timeline" class="oc-history-timeline-section oc-history-section">
<header class="oc-history-timeline-head">
<p>Timeline</p>
<h2>DẤU ẤN <em>từ</em> 1888</h2>
<h3>Từ di sản Parker đến dịch vụ khắc tên hôm nay, mỗi mốc đều xoay quanh sự chuẩn xác, phong thái và trải nghiệm trao tặng.</h3>
</header>
<div class="oc-history-timeline-rail" aria-label="Hành trình Parker">
<?php foreach ( $timeline as $item ) : ?>
<article class="oc-history-timeline-card">
<figure>
<img src="<?php echo oc_history_asset( $item['image'] ); ?>" alt="<?php echo esc_attr( $item['title'] ); ?>">
</figure>
<div>
<span><?php echo esc_html( $item['year'] ); ?></span>
<h4><?php echo esc_html( $item['title'] ); ?></h4>
<p><?php echo esc_html( $item['copy'] ); ?></p>
</div>
</article>
<?php endforeach; ?>
</div>
</section>
<section class="oc-history-today oc-history-section">
<div class="oc-history-today-copy">
<p>Today</p>
<h2><em>Nghệ thuật</em> trong từng nét ký</h2>
<p>Chúng tôi kết hợp tư vấn sản phẩm, cá nhân hóa nội dung khắc và đóng gói quà tặng để mỗi cây Parker sẵn sàng xuất hiện trong những cuộc gặp quan trọng.</p>
</div>
<div class="oc-history-today-media">
<img src="<?php echo oc_history_asset( 'parker-gift-set-square.jpg' ); ?>" alt="Set quà tặng Parker sang trọng">
</div>
</section>
<section class="oc-history-video oc-history-section">
<div class="oc-history-video-frame">
<img src="<?php echo oc_history_asset( 'parker-gift-set-wide.jpg' ); ?>" alt="Showroom quà tặng bút Parker">
<div class="oc-history-video-caption">
<p>Showroom</p>
<h2>Parker gift experience</h2>
</div>
</div>
</section>
<?php
}
function oc_render_contact_page_sections() {
$services = array(
array( '01', 'Khắc laser', 'Gửi tên, ký hiệu hoặc lời chúc cần khắc để được tư vấn font, vị trí và màu khắc theo từng chất liệu bút.' ),
array( '02', 'In logo bút', 'Tư vấn logo doanh nghiệp, số lượng, thời gian hoàn thiện và phương án đồng bộ hộp quà.' ),
array( '03', 'Set quà tặng', 'Thiết kế set Parker theo dịp tặng: tri ân khách hàng, ký kết, vinh danh nhân sự hoặc quà VIP.' ),
);
?>
<section class="oc-contact-hero oc-contact-section" style="--oc-contact-image: url('<?php echo oc_history_asset( 'parker-contact-consult-ai.png' ); ?>');">
<div class="oc-contact-hero-inner oc-reveal">
<p>Contact</p>
<h1><em>Liên hệ</em> tư vấn Parker</h1>
<p>Để lại yêu cầu về khắc laser, in logo bút hoặc set quà tặng theo yêu cầu. Đội ngũ sẽ gọi lại để chốt mẫu bút, nội dung cá nhân hóa và thời gian giao hàng.</p>
<div class="oc-contact-hero-actions">
<a href="tel:0938974299">Gọi 0938 974 299</a>
<a href="#oc-contact-form">Gửi yêu cầu</a>
</div>
</div>
</section>
<section class="oc-contact-service-strip oc-contact-section" aria-label="Nhóm yêu cầu tư vấn">
<?php foreach ( $services as $item ) : ?>
<article class="oc-reveal">
<span><?php echo esc_html( $item[0] ); ?></span>
<h2><?php echo esc_html( $item[1] ); ?></h2>
<p><?php echo esc_html( $item[2] ); ?></p>
</article>
<?php endforeach; ?>
</section>
<section id="oc-contact-form" class="oc-contact-panel oc-contact-section">
<div class="oc-contact-panel-copy oc-reveal">
<p>Consultation</p>
<h2><em>Gửi</em><br>yêu cầu tư vấn</h2>
<p>Thông tin càng rõ, đội ngũ càng tư vấn nhanh: dòng bút mong muốn, số lượng, nội dung khắc/in logo và thời hạn cần nhận hàng.</p>
</div>
<form class="oc-contact-form oc-reveal" action="mailto:service@butparkerkhacten.vn" method="post" enctype="text/plain">
<label>
<span>Họ và tên</span>
<input type="text" name="name" placeholder="Nhập họ và tên" required>
</label>
<label>
<span>Số điện thoại</span>
<input type="tel" name="phone" placeholder="0938 974 299" required>
</label>
<label>
<span>Email</span>
<input type="email" name="email" placeholder="email của bạn">
</label>
<label>
<span>Dịch vụ quan tâm</span>
<select name="service" required>
<option value="">Chọn dịch vụ</option>
<option>Khắc laser</option>
<option>In logo bút</option>
<option>Set quà tặng theo yêu cầu</option>
<option>Tư vấn chọn bút Parker</option>
</select>
</label>
<label class="oc-contact-form-full">
<span>Nội dung cần tư vấn</span>
<textarea name="message" rows="6" placeholder="Ví dụ: Tôi cần 20 bút Parker IM, khắc tên từng người, đóng hộp quà giao trước thứ Sáu..."></textarea>
</label>
<button type="submit">Gửi yêu cầu</button>
</form>
</section>
<section class="oc-contact-visit oc-contact-section">
<article class="oc-reveal">
<h2>Hotline</h2>
<p><a href="tel:0938974299">0938 974 299</a></p>
<span>Tư vấn nhanh mẫu bút, nội dung khắc và báo giá.</span>
</article>
<article class="oc-reveal">
<h2>Email</h2>
<p><a href="mailto:service@butparkerkhacten.vn">service@butparkerkhacten.vn</a></p>
<span>Gửi logo, danh sách tên hoặc brief quà tặng doanh nghiệp.</span>
</article>
<article class="oc-reveal">
<h2>Thời gian</h2>
<p>9:00 - 18:00</p>
<span>Thứ 2 - Thứ 7, hỗ trợ giao hàng toàn quốc.</span>
</article>
</section>
<?php
}
function oc_home_defaults() {
$asset_base = oc_asset_base();
$upload_base = oc_upload_base();
return array(
'asset_set_version' => 'parker-home-images-2026-07-v1',
'hero_kicker' => 'Dấu ấn chữ ký',
'hero_line_1' => 'ONE STROKE',
'hero_em' => 'at a',
'hero_line_2' => 'TIME',
'hero_copy' => 'Trải nghiệm bút Parker chính hãng, khắc tên tinh xảo và đóng gói sang trọng cho từng lần ký kết, tri ân và trao tặng.',
'hero_button' => 'Xem bộ sưu tập',
'hero_image' => $asset_base . '/images/generated/parker-duofold-dark.jpg',
'intro_kicker' => 'Khám phá',
'intro_title' => 'BỘ SƯU TẬP PARKER',
'intro_copy' => 'Các nhóm sản phẩm được sắp xếp như một showroom bút ký cao cấp: Parker IM hiện đại, set quà tặng doanh nghiệp và những mẫu bút kim loại sang trọng để khắc tên.',
'collection_button' => 'Xem bộ sưu tập',
'collection_1_title' => 'Parker IM',
'collection_1_copy' => 'Lựa chọn cân bằng giữa thiết kế hiện đại, độ bền và phong thái lịch lãm cho chữ ký mỗi ngày.',
'collection_1_image' => $asset_base . '/images/generated/parker-gift-square.jpg',
'collection_2_title' => 'Set quà tặng',
'collection_2_copy' => 'Hoàn thiện hộp quà, khắc tên, in logo và thông điệp riêng cho đối tác, nhân sự và khách hàng VIP.',
'collection_2_image' => $asset_base . '/images/generated/parker-couple-gift.jpg',
'collection_3_title' => 'Signature',
'collection_3_copy' => 'Những mẫu Parker kim loại, sắc trầm và chi tiết mạ vàng phù hợp bàn làm việc lẫn lễ ký kết.',
'collection_3_image' => $asset_base . '/images/generated/parker-duofold-dark.jpg',
'products_kicker' => 'Sản phẩm',
'products_title' => 'MẪU BÚT NỔI BẬT',
'products_link' => 'Xem tất cả',
'editorial_kicker' => 'Khắc tên',
'editorial_title' => 'Hoàn thiện cho ấn tượng lâu dài',
'editorial_copy' => 'Từ nét khắc tên đến hộp quà, mỗi chi tiết được cân chỉnh để cây bút Parker trở thành vật phẩm xứng đáng trên bàn làm việc và trong lễ trao tặng.',
'editorial_image_1' => $asset_base . '/images/generated/parker-artisan-workshop.jpg',
'editorial_image_2' => $asset_base . '/images/generated/parker-gift-wide.jpg',
'marquee_text' => 'est. 1888|Parker chính hãng|nghệ thuật viết',
'brand_title' => '.Parker',
'brand_copy' => 'Một cây bút ký cao cấp không chỉ để viết. Nó đại diện cho phong thái, sự chỉn chu và ấn tượng mà bạn để lại trên từng văn bản.',
'brand_link' => 'Về thương hiệu',
'brand_image' => $asset_base . '/images/generated/parker-artisan-workshop.jpg',
'latest_kicker' => 'Mẫu nổi bật',
'latest_title' => 'PARKER SIGNATURE',
'latest_subtitle' => 'Thân kim loại sang trọng, nét khắc cá nhân hóa và hoàn thiện sẵn sàng để trao tặng.',
'latest_button' => 'Khám phá ngay',
'latest_image_1' => $asset_base . '/images/generated/parker-duofold-dark.jpg',
'latest_image_2' => $asset_base . '/images/generated/parker-gift-wide.jpg',
'social_copy' => 'Chia sẻ khoảnh khắc ký kết cùng #ParkerSignature.',
'social_image' => $asset_base . '/images/generated/parker-couple-gift.jpg',
'seo_content' => '<h3>Chọn bút Parker phù hợp nhu cầu</h3><p>Bút Parker được yêu thích nhờ thiết kế cân đối, độ hoàn thiện chỉn chu và trải nghiệm viết ổn định. Với nhu cầu sử dụng hằng ngày, <strong><a href="/but-bi-parker/">bút bi Parker</a></strong> là lựa chọn thuận tiện cho công việc, ký kết và ghi chú. Những dòng Parker IM hoặc Vector phù hợp người dùng trẻ, nhân sự văn phòng và quà tặng có tính ứng dụng cao.</p><h3>Khắc tên tạo dấu ấn cá nhân</h3><p>Dịch vụ <strong><a href="/dich-vu/">khắc laser trên bút Parker</a></strong> giúp thể hiện tên, ký hiệu hoặc lời chúc ngắn trên thân bút. Mỗi mẫu bút có màu khắc và vị trí phù hợp riêng, vì vậy cửa hàng kiểm tra chất liệu trước khi tư vấn để thành phẩm rõ nét, hài hòa với thiết kế nguyên bản.</p><h3>Quà tặng doanh nghiệp chỉn chu</h3><p>Parker phù hợp các dịp tri ân khách hàng, vinh danh nhân sự, ký kết hợp tác và quà tặng lãnh đạo. Cửa hàng hỗ trợ in logo, khắc danh sách tên, hoàn thiện hộp quà và thiệp theo yêu cầu để từng set quà đồng bộ nhận diện nhưng vẫn giữ phong thái sang trọng.</p><h3>Parker chính hãng và hỗ trợ sau mua</h3><p>Sản phẩm được kiểm tra trước khi giao, tư vấn ruột thay thế và bảo quản theo từng dòng bút. Khách hàng có thể xem bộ sưu tập trực tuyến hoặc <strong><a href="/lien-he/">liên hệ tư vấn Parker</a></strong> để chọn đúng mẫu, ngân sách và thời gian hoàn thiện.</p>',
'footer_heading' => 'Đăng ký tư vấn PARKER',
'footer_intro' => 'Bút Parker Khắc Tên, Hà Nội - TP. Hồ Chí Minh. Parker chính hãng, in logo và khắc tên theo yêu cầu.',
'footer_contact' => '19008159 | service@butparkerkhacten.vn',
'footer_hours' => '9:00 - 18:00, Thứ 2 - Thứ 7',
'footer_copyright' => '@2026 - But Parker Khắc Tên. All rights reserved.',
'header_logo' => '.But Parker',
'menu_primary' => "Trang chủ|/\nBộ sưu tập|/shop/\nBút Parker IM|/product-category/but-parker-im/\nKhắc tên|/lien-he/\nQuà tặng doanh nghiệp|/lien-he/\nLiên hệ|/lien-he/",
'menu_secondary' => "Giới thiệu|/gioi-thieu/\nCâu chuyện Parker|/gioi-thieu/\nDịch vụ khắc tên|/dich-vu/\nSet quà tặng|/dich-vu/\nTin tức|/tin-tuc/",
'menu_address' => 'But Parker Khắc Tên, Hà Nội - TP. Hồ Chí Minh',
'menu_contact' => '19008159 | service@butparkerkhacten.vn',
'menu_note' => 'Parker chính hãng, khắc tên, in logo và set quà tặng cao cấp.',
);
}
function oc_home_settings() {
$saved = get_option( 'oc_home_settings', array() );
if ( ! is_array( $saved ) ) {
$saved = array();
}
$defaults = oc_home_defaults();
if ( ( $saved['asset_set_version'] ?? '' ) !== $defaults['asset_set_version'] ) {
foreach ( oc_home_image_keys() as $key ) {
$saved[ $key ] = $defaults[ $key ];
}
$saved['asset_set_version'] = $defaults['asset_set_version'];
update_option( 'oc_home_settings', $saved, false );
}
return wp_parse_args( $saved, $defaults );
}
function oc_home_image_keys() {
return array(
'hero_image',
'collection_1_image',
'collection_2_image',
'collection_3_image',
'editorial_image_1',
'editorial_image_2',
'brand_image',
'latest_image_1',
'latest_image_2',
'social_image',
);
}
function oc_home_field( $key ) {
$settings = oc_home_settings();
return isset( $settings[ $key ] ) ? $settings[ $key ] : '';
}
function oc_home_sanitize_settings( $input ) {
$defaults = oc_home_defaults();
$output = array();
foreach ( $defaults as $key => $default ) {
$value = isset( $input[ $key ] ) ? wp_unslash( $input[ $key ] ) : $default;
if ( false !== strpos( $key, 'image' ) ) {
$output[ $key ] = esc_url_raw( $value );
} elseif ( 'seo_content' === $key ) {
$output[ $key ] = wp_kses_post( $value );
} elseif ( in_array( $key, array( 'menu_primary', 'menu_secondary' ), true ) ) {
$output[ $key ] = sanitize_textarea_field( $value );
} else {
$output[ $key ] = sanitize_text_field( $value );
}
}
return $output;
}
function oc_home_front_page_id() {
return (int) get_option( 'page_on_front' );
}
function oc_home_is_front_page_post( $post_id ) {
return $post_id && (int) $post_id === oc_home_front_page_id();
}
function oc_home_disable_block_editor( $use_block_editor, $post ) {
if ( $post instanceof WP_Post && 'page' === $post->post_type && oc_home_is_front_page_post( $post->ID ) ) {
return false;
}
return $use_block_editor;
}
function oc_home_prepare_edit_screen() {
$post_id = isset( $_GET['post'] ) ? absint( $_GET['post'] ) : 0;
if ( oc_home_is_front_page_post( $post_id ) ) {
remove_post_type_support( 'page', 'editor' );
}
}
function oc_home_render_edit_panel( $post ) {
if ( ! $post instanceof WP_Post || ! oc_home_is_front_page_post( $post->ID ) ) {
return;
}
?>
<div id="oc-home-settings" class="postbox oc-home-settings-panel">
<div class="postbox-header">
<h2>Thiết lập giao diện trang chủ</h2>
</div>
<div class="inside">
<?php oc_home_edit_meta_box( $post ); ?>
</div>
</div>
<?php
}
function oc_home_save_page_settings( $post_id ) {
if ( ! oc_home_is_front_page_post( $post_id ) ) {
return;
}
if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE ) {
return;
}
if ( wp_is_post_revision( $post_id ) || ! current_user_can( 'edit_post', $post_id ) ) {
return;
}
if ( ! isset( $_POST['oc_home_settings_nonce'] ) || ! wp_verify_nonce( sanitize_text_field( wp_unslash( $_POST['oc_home_settings_nonce'] ) ), 'oc_home_save_settings' ) ) {
return;
}
$input = isset( $_POST['oc_home_settings'] ) && is_array( $_POST['oc_home_settings'] )
? $_POST['oc_home_settings']
: array();
update_option( 'oc_home_settings', oc_home_sanitize_settings( $input ), false );
}
function oc_home_admin_bar_edit_link( $wp_admin_bar ) {
$front_page_id = oc_home_front_page_id();
if ( is_admin() || ! is_front_page() || ! $front_page_id || ! current_user_can( 'edit_post', $front_page_id ) ) {
return;
}
$wp_admin_bar->remove_node( 'edit' );
$wp_admin_bar->add_node(
array(
'id' => 'edit',
'title' => 'Sửa giao diện trang chủ',
'href' => admin_url( 'post.php?post=' . $front_page_id . '&action=edit' ),
'meta' => array(
'title' => 'Mở phần thiết lập nội dung và hình ảnh trang chủ',
),
)
);
}
function oc_home_admin_assets( $hook ) {
if ( 'post.php' !== $hook ) {
return;
}
$screen = get_current_screen();
$post_id = isset( $_GET['post'] ) ? absint( $_GET['post'] ) : 0;
if ( ! $screen || 'page' !== $screen->post_type || ! oc_home_is_front_page_post( $post_id ) ) {
return;
}
wp_enqueue_media();
wp_enqueue_script( 'jquery' );
wp_add_inline_script(
'jquery',
"jQuery(function(\$){\$('.oc-image-button').on('click',function(e){e.preventDefault();var input=\$(\$(this).data('target'));var frame=wp.media({title:'Chọn ảnh showroom Parker',button:{text:'Dùng ảnh này'},multiple:false});frame.on('select',function(){var file=frame.state().get('selection').first().toJSON();input.val(file.url).trigger('change');});frame.open();});});"
);
wp_add_inline_style(
'common',
'.oc-home-settings-panel{margin:18px 0 24px;border-top:3px solid #9f7b4f}.oc-home-settings-panel>.postbox-header h2{font-size:16px}.oc-home-settings-panel>.inside{padding:0 20px 22px}.oc-home-admin-intro{max-width:920px;margin:18px 0 10px;color:#50575e}.oc-home-admin-section{border-top:1px solid #dcdcde;padding:0 0 10px}.oc-home-admin-section>summary{cursor:pointer;font-size:18px;font-weight:600;padding:18px 2px;list-style:none}.oc-home-admin-section>summary::-webkit-details-marker{display:none}.oc-home-admin-section>summary:after{content:"+";float:right;font-size:22px;font-weight:400}.oc-home-admin-section[open]>summary:after{content:"-"}.oc-home-admin-section .form-table{margin-top:0}.oc-home-admin-section .regular-text{width:min(100%,680px)}@media(max-width:782px){.oc-home-settings-panel>.inside{padding:0 12px 18px}.oc-home-admin-section>summary{font-size:16px}.oc-home-admin-section .form-table th{padding-bottom:4px}.oc-home-admin-section .form-table td{padding-top:4px}.oc-home-admin-section .oc-image-button{margin-top:8px}}'
);
}
function oc_home_render_text_field( $key, $label, $type = 'text' ) {
$settings = oc_home_settings();
$value = isset( $settings[ $key ] ) ? $settings[ $key ] : '';
$id = 'oc_home_' . $key;
?>
<tr>
<th scope="row"><label for="<?php echo esc_attr( $id ); ?>"><?php echo esc_html( $label ); ?></label></th>
<td>
<?php if ( 'html' === $type ) : ?>
<textarea id="<?php echo esc_attr( $id ); ?>" name="oc_home_settings[<?php echo esc_attr( $key ); ?>]" rows="14" class="large-text code"><?php echo esc_textarea( $value ); ?></textarea>
<p class="description">Cho phép heading, đoạn văn, danh sách, chữ đậm và liên kết nội bộ.</p>
<?php elseif ( 'textarea' === $type ) : ?>
<textarea id="<?php echo esc_attr( $id ); ?>" name="oc_home_settings[<?php echo esc_attr( $key ); ?>]" rows="3" class="large-text"><?php echo esc_textarea( $value ); ?></textarea>
<?php elseif ( 'image' === $type ) : ?>
<input id="<?php echo esc_attr( $id ); ?>" name="oc_home_settings[<?php echo esc_attr( $key ); ?>]" type="url" class="regular-text" value="<?php echo esc_attr( $value ); ?>">
<button class="button oc-image-button" data-target="#<?php echo esc_attr( $id ); ?>">Chọn ảnh</button>
<?php else : ?>
<input id="<?php echo esc_attr( $id ); ?>" name="oc_home_settings[<?php echo esc_attr( $key ); ?>]" type="text" class="regular-text" value="<?php echo esc_attr( $value ); ?>">
<?php endif; ?>
</td>
</tr>
<?php
}
function oc_home_edit_meta_box( $post ) {
?>
<div class="oc-home-admin">
<?php wp_nonce_field( 'oc_home_save_settings', 'oc_home_settings_nonce' ); ?>
<p class="oc-home-admin-intro">Đây là trang quản trị chính thức của giao diện trang chủ. Chỉnh nội dung hoặc hình ảnh bên dưới, sau đó nhấn <strong>Cập nhật</strong> để lưu.</p>
<details class="oc-home-admin-section" open>
<summary>01. Hero</summary>
<table class="form-table" role="presentation">
<?php
oc_home_render_text_field( 'hero_kicker', 'Kicker' );
oc_home_render_text_field( 'hero_line_1', 'Dòng tiêu đề 1' );
oc_home_render_text_field( 'hero_em', 'Chữ nghiêng' );
oc_home_render_text_field( 'hero_line_2', 'Dòng tiêu đề 2' );
oc_home_render_text_field( 'hero_copy', 'Mô tả', 'textarea' );
oc_home_render_text_field( 'hero_button', 'Nút CTA' );
oc_home_render_text_field( 'hero_image', 'Ảnh hero', 'image' );
?>
</table>
</details>
<details class="oc-home-admin-section">
<summary>02. Header / Menu popup</summary>
<p>Nhập mỗi mục menu theo định dạng <code>Tên hiển thị|/duong-dan/</code>, mỗi mục một dòng.</p>
<table class="form-table" role="presentation">
<?php
oc_home_render_text_field( 'header_logo', 'Logo text' );
oc_home_render_text_field( 'menu_primary', 'Menu chính', 'textarea' );
oc_home_render_text_field( 'menu_secondary', 'Menu phụ', 'textarea' );
oc_home_render_text_field( 'menu_address', 'Địa chỉ trong menu' );
oc_home_render_text_field( 'menu_contact', 'Liên hệ trong menu' );
oc_home_render_text_field( 'menu_note', 'Mô tả ngắn trong menu', 'textarea' );
?>
</table>
</details>
<details class="oc-home-admin-section">
<summary>03. Bộ sưu tập</summary>
<table class="form-table" role="presentation">
<?php
oc_home_render_text_field( 'intro_kicker', 'Kicker' );
oc_home_render_text_field( 'intro_title', 'Tiêu đề' );
oc_home_render_text_field( 'intro_copy', 'Mô tả', 'textarea' );
oc_home_render_text_field( 'collection_button', 'Nút bộ sưu tập' );
for ( $i = 1; $i <= 3; $i++ ) {
oc_home_render_text_field( 'collection_' . $i . '_title', 'Bộ sưu tập ' . $i . ' - tiêu đề' );
oc_home_render_text_field( 'collection_' . $i . '_copy', 'Bộ sưu tập ' . $i . ' - mô tả', 'textarea' );
oc_home_render_text_field( 'collection_' . $i . '_image', 'Bộ sưu tập ' . $i . ' - ảnh', 'image' );
}
?>
</table>
</details>
<details class="oc-home-admin-section">
<summary>04. Các section còn lại</summary>
<table class="form-table" role="presentation">
<?php
oc_home_render_text_field( 'products_kicker', 'San pham - kicker' );
oc_home_render_text_field( 'products_title', 'San pham - tieu de' );
oc_home_render_text_field( 'products_link', 'San pham - link text' );
oc_home_render_text_field( 'editorial_kicker', 'Editorial - kicker' );
oc_home_render_text_field( 'editorial_title', 'Editorial - tieu de' );
oc_home_render_text_field( 'editorial_copy', 'Editorial - mo ta', 'textarea' );
oc_home_render_text_field( 'editorial_image_1', 'Editorial - anh 1', 'image' );
oc_home_render_text_field( 'editorial_image_2', 'Editorial - anh 2', 'image' );
oc_home_render_text_field( 'marquee_text', 'Marquee text, ngan cach bang dau |' );
oc_home_render_text_field( 'brand_title', 'Brand - tieu de' );
oc_home_render_text_field( 'brand_copy', 'Brand - mo ta', 'textarea' );
oc_home_render_text_field( 'brand_link', 'Brand - link text' );
oc_home_render_text_field( 'brand_image', 'Brand - anh', 'image' );
oc_home_render_text_field( 'latest_kicker', 'Latest - kicker' );
oc_home_render_text_field( 'latest_title', 'Latest - tieu de' );
oc_home_render_text_field( 'latest_subtitle', 'Latest - mo ta', 'textarea' );
oc_home_render_text_field( 'latest_button', 'Latest - nut CTA' );
oc_home_render_text_field( 'latest_image_1', 'Latest - anh 1', 'image' );
oc_home_render_text_field( 'latest_image_2', 'Latest - anh 2', 'image' );
oc_home_render_text_field( 'social_copy', 'Social - copy', 'textarea' );
oc_home_render_text_field( 'social_image', 'Social - anh', 'image' );
oc_home_render_text_field( 'seo_content', 'Nội dung SEO cuối trang chủ', 'html' );
oc_home_render_text_field( 'footer_heading', 'Footer CTA - tieu de' );
oc_home_render_text_field( 'footer_intro', 'Footer CTA - mo ta', 'textarea' );
oc_home_render_text_field( 'footer_contact', 'Footer - lien he' );
oc_home_render_text_field( 'footer_hours', 'Footer - gio lam viec' );
oc_home_render_text_field( 'footer_copyright', 'Footer - copyright' );
?>
</table>
</details>
</div>
<?php
}
function oc_product_spec_fields() {
$fields = array(
'_oc_spec_kicker' => array(
'label' => 'Kicker section',
'default' => 'PRODUCT DETAILS',
),
'_oc_spec_title' => array(
'label' => 'Tieu de section',
'default' => 'Chi tiet tao nen mot cay but Parker',
),
);
for ( $group = 1; $group <= 3; $group++ ) {
$fields[ '_oc_spec_group_' . $group . '_title' ] = array(
'label' => 'Nhom ' . $group . ' - tieu de',
'default' => '',
);
for ( $row = 1; $row <= 3; $row++ ) {
$fields[ '_oc_spec_group_' . $group . '_label_' . $row ] = array(
'label' => 'Nhom ' . $group . ' - dong ' . $row . ' label',
'default' => '',
);
$fields[ '_oc_spec_group_' . $group . '_value_' . $row ] = array(
'label' => 'Nhom ' . $group . ' - dong ' . $row . ' noi dung',
'default' => '',
);
}
}
return $fields;
}
function oc_product_spec_register_acf_fields() {
if ( ! function_exists( 'acf_add_local_field_group' ) ) {
return;
}
$fields = array();
foreach ( oc_product_spec_fields() as $key => $field ) {
$fields[] = array(
'key' => 'field' . $key,
'label' => $field['label'],
'name' => $key,
'type' => 'text',
'instructions' => 'De trong de dung gia tri mac dinh cua theme cho san pham nay.',
'default_value' => '',
'wrapper' => array(
'width' => 50,
),
);
}
acf_add_local_field_group(
array(
'key' => 'group_oc_product_spec_details',
'title' => 'But Parker - thong tin chi tiet san pham',
'fields' => $fields,
'location' => array(
array(
array(
'param' => 'post_type',
'operator' => '==',
'value' => 'product',
),
),
),
'position' => 'normal',
'style' => 'default',
)
);
}
function oc_product_spec_add_meta_box() {
if ( function_exists( 'acf_add_local_field_group' ) ) {
return;
}
add_meta_box(
'oc_product_spec_details',
'But Parker - thong tin chi tiet san pham',
'oc_product_spec_render_meta_box',
'product',
'normal',
'default'
);
}
function oc_product_spec_render_meta_box( $post ) {
wp_nonce_field( 'oc_product_spec_save', 'oc_product_spec_nonce' );
?>
<p>Nhap thong tin rieng cho tung san pham. De trong field nao thi frontend se dung gia tri mac dinh tu WooCommerce/theme.</p>
<style>
.oc-product-spec-admin-grid { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 14px 18px; }
.oc-product-spec-admin-grid label { display: grid; gap: 6px; font-weight: 600; }
.oc-product-spec-admin-grid input { width: 100%; }
@media (max-width: 782px) { .oc-product-spec-admin-grid { grid-template-columns: 1fr; } }
</style>
<div class="oc-product-spec-admin-grid">
<?php foreach ( oc_product_spec_fields() as $key => $field ) : ?>
<label>
<span><?php echo esc_html( $field['label'] ); ?></span>
<input type="text" name="oc_product_spec[<?php echo esc_attr( $key ); ?>]" value="<?php echo esc_attr( get_post_meta( $post->ID, $key, true ) ); ?>" placeholder="<?php echo esc_attr( $field['default'] ); ?>">
</label>
<?php endforeach; ?>
</div>
<?php
}
function oc_product_spec_save_meta_box( $post_id ) {
if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE ) {
return;
}
if ( ! current_user_can( 'edit_post', $post_id ) ) {
return;
}
if ( function_exists( 'acf_add_local_field_group' ) ) {
return;
}
if (
! isset( $_POST['oc_product_spec_nonce'] )
|| ! wp_verify_nonce( sanitize_text_field( wp_unslash( $_POST['oc_product_spec_nonce'] ) ), 'oc_product_spec_save' )
) {
return;
}
$input = isset( $_POST['oc_product_spec'] ) && is_array( $_POST['oc_product_spec'] ) ? wp_unslash( $_POST['oc_product_spec'] ) : array();
$fields = oc_product_spec_fields();
foreach ( $fields as $key => $field ) {
$value = isset( $input[ $key ] ) ? sanitize_text_field( $input[ $key ] ) : '';
if ( '' === $value ) {
delete_post_meta( $post_id, $key );
} else {
update_post_meta( $post_id, $key, $value );
}
}
}
function oc_product_media_add_meta_box() {
add_meta_box(
'oc_product_media_settings',
'But Parker - media san pham',
'oc_product_media_render_meta_box',
'product',
'side',
'default'
);
}
function oc_product_media_render_meta_box( $post ) {
$video_url = get_post_meta( $post->ID, '_oc_product_video_url', true );
if ( '' === trim( (string) $video_url ) ) {
$video_url = get_post_meta( $post->ID, '_pp_video_url', true );
}
wp_nonce_field( 'oc_product_media_save', 'oc_product_media_nonce' );
?>
<p style="margin-top:0;">Dan link YouTube Shorts hoac TikTok review rieng cho san pham nay.</p>
<label for="oc-product-video-url" style="display:block;font-weight:600;margin-bottom:6px;">Video review</label>
<input
id="oc-product-video-url"
type="url"
name="oc_product_media[video_url]"
value="<?php echo esc_attr( $video_url ); ?>"
placeholder="https://youtube.com/shorts/..."
style="width:100%;"
>
<p class="description">De trong neu san pham khong co video. Trang san pham se tu dung layout anh.</p>
<?php
}
function oc_product_media_save_meta_box( $post_id ) {
if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE ) {
return;
}
if ( ! current_user_can( 'edit_post', $post_id ) ) {
return;
}
if (
! isset( $_POST['oc_product_media_nonce'] )
|| ! wp_verify_nonce( sanitize_text_field( wp_unslash( $_POST['oc_product_media_nonce'] ) ), 'oc_product_media_save' )
) {
return;
}
$input = isset( $_POST['oc_product_media'] ) && is_array( $_POST['oc_product_media'] ) ? wp_unslash( $_POST['oc_product_media'] ) : array();
$video_url = isset( $input['video_url'] ) ? esc_url_raw( trim( (string) $input['video_url'] ) ) : '';
if ( '' === $video_url ) {
delete_post_meta( $post_id, '_oc_product_video_url' );
} else {
update_post_meta( $post_id, '_oc_product_video_url', $video_url );
}
}
function oc_woocommerce_placeholder_img_src( $src ) {
$fallback = oc_upload_base() . '/2023/11/BUT-PARKER-KHAC-TEN_butky_website-02.jpg';
return esc_url_raw( $fallback ? $fallback : $src );
}
function oc_product_spec_meta( $post_id, $key, $fallback = '' ) {
$value = get_post_meta( $post_id, $key, true );
return '' !== trim( (string) $value ) ? $value : $fallback;
}
function oc_product_spec_defaults( $context = array() ) {
$category_name = $context['category_name'] ?? 'Bút Parker';
$stock_label = $context['stock_label'] ?? 'Còn hàng';
$sku = $context['sku'] ?? 'Parker chính hãng';
$attribute_rows = $context['attribute_rows'] ?? array();
$spec_rows = array();
if ( $attribute_rows ) {
foreach ( array_slice( $attribute_rows, 0, 3 ) as $row ) {
$spec_rows[] = array(
'label' => $row['label'],
'value' => $row['value'],
);
}
} else {
$spec_rows = array(
array( 'label' => 'Mã sản phẩm', 'value' => $sku ),
array( 'label' => 'Xuất xứ thương hiệu', 'value' => 'Pháp' ),
array( 'label' => 'Kiểm tra', 'value' => 'Trước khi giao hàng' ),
);
}
return array(
'kicker' => 'PRODUCT DETAILS',
'title' => 'Chi tiết tạo nên một cây bút Parker',
'groups' => array(
array(
'title' => 'Sản phẩm',
'rows' => array(
array( 'label' => 'Thương hiệu', 'value' => 'Parker' ),
array( 'label' => 'Dòng sản phẩm', 'value' => $category_name ),
array( 'label' => 'Tình trạng', 'value' => $stock_label ),
),
),
array(
'title' => 'Cá nhân hóa',
'rows' => array(
array( 'label' => 'Khắc tên', 'value' => 'Hỗ trợ theo yêu cầu' ),
array( 'label' => 'Logo doanh nghiệp', 'value' => 'Tư vấn theo số lượng' ),
array( 'label' => 'Hộp quà', 'value' => 'Hoàn thiện sẵn sàng trao tặng' ),
),
),
array(
'title' => 'Thông số',
'rows' => $spec_rows,
),
),
);
}
function oc_product_spec_data( $post_id, $context = array() ) {
$defaults = oc_product_spec_defaults( $context );
$data = array(
'kicker' => oc_product_spec_meta( $post_id, '_oc_spec_kicker', $defaults['kicker'] ),
'title' => oc_product_spec_meta( $post_id, '_oc_spec_title', $defaults['title'] ),
'groups' => array(),
);
foreach ( $defaults['groups'] as $group_index => $group_defaults ) {
$group_number = $group_index + 1;
$group = array(
'title' => oc_product_spec_meta( $post_id, '_oc_spec_group_' . $group_number . '_title', $group_defaults['title'] ),
'rows' => array(),
);
foreach ( $group_defaults['rows'] as $row_index => $row_defaults ) {
$row_number = $row_index + 1;
$label = oc_product_spec_meta( $post_id, '_oc_spec_group_' . $group_number . '_label_' . $row_number, $row_defaults['label'] );
$value = oc_product_spec_meta( $post_id, '_oc_spec_group_' . $group_number . '_value_' . $row_number, $row_defaults['value'] );
if ( '' !== trim( (string) $label ) || '' !== trim( (string) $value ) ) {
$group['rows'][] = array(
'label' => $label,
'value' => $value,
);
}
}
if ( $group['rows'] ) {
$data['groups'][] = $group;
}
}
return $data;
}
function oc_menu_items_from_setting( $value ) {
$items = array();
$lines = preg_split( '/\r\n|\r|\n/', (string) $value );
foreach ( $lines as $line ) {
$line = trim( $line );
if ( '' === $line ) {
continue;
}
$parts = array_map( 'trim', explode( '|', $line, 2 ) );
$label = $parts[0] ?? '';
$url = $parts[1] ?? '#';
if ( '' === $label ) {
continue;
}
if ( preg_match( '#^https?://#i', $url ) ) {
$href = oc_local_url( $url );
} elseif ( 0 === strpos( $url, '#' ) ) {
$href = $url;
} else {
$href = oc_local_url( home_url( '/' . ltrim( $url, '/' ) ) );
}
$items[] = array(
'label' => $label,
'url' => $href,
);
}
return $items;
}
function oc_clone_header() {
$home = oc_home_settings();
$primary_items = oc_menu_items_from_setting( $home['menu_primary'] ?? '' );
$secondary_items = oc_menu_items_from_setting( $home['menu_secondary'] ?? '' );
?>
<header class="oc-header" aria-label="<?php esc_attr_e( 'Đầu trang', 'generatepress-child' ); ?>">
<button class="oc-menu-button" type="button" aria-label="Mở menu chính" aria-expanded="false" aria-controls="oc-menu-popup">
<span></span>
<span></span>
<span></span>
</button>
<a class="oc-logo" href="<?php echo esc_url( oc_local_url( home_url( '/' ) ) ); ?>"><?php echo esc_html( $home['header_logo'] ); ?></a>
<div class="oc-actions">
<a class="oc-hotline-link" href="tel:0938974299" aria-label="Gọi hotline 0938 974 299">
<span>Hotline</span>
<strong>0938 974 299</strong>
</a>
</div>
</header>
<aside class="oc-menu-popup" id="oc-menu-popup" role="dialog" aria-modal="true" aria-label="Điều hướng chính" aria-hidden="true" inert>
<div class="oc-menu-popup-inner">
<button class="oc-menu-close" type="button" aria-label="Đóng menu chính">
<span></span>
<span></span>
</button>
<div class="oc-menu-columns">
<nav class="oc-menu-primary" aria-label="Menu chính">
<?php foreach ( $primary_items as $index => $item ) : ?>
<a class="<?php echo 0 === $index ? 'is-active' : ''; ?>" href="<?php echo esc_url( $item['url'] ); ?>" <?php echo is_front_page() && 0 === $index ? 'aria-current="page"' : ''; ?>><?php echo esc_html( $item['label'] ); ?></a>
<?php endforeach; ?>
</nav>
<nav class="oc-menu-secondary" aria-label="Menu giới thiệu và dịch vụ">
<?php foreach ( $secondary_items as $index => $item ) : ?>
<a class="<?php echo 0 === $index ? 'is-active' : ''; ?>" href="<?php echo esc_url( $item['url'] ); ?>"><?php echo esc_html( $item['label'] ); ?></a>
<?php endforeach; ?>
</nav>
<div class="oc-menu-info">
<h2><?php echo esc_html( $home['header_logo'] ); ?></h2>
<p><?php echo esc_html( $home['menu_address'] ); ?></p>
<p><?php echo esc_html( $home['menu_contact'] ); ?></p>
<p><?php echo esc_html( $home['menu_note'] ); ?></p>
</div>
</div>
</div>
</aside>
<?php
}
function oc_clone_footer_cta() {
$home = oc_home_settings();
?>
<div class="oc-newsletter">
<section class="oc-newsletter-signup" aria-labelledby="oc-newsletter-title">
<h2 id="oc-newsletter-title"><?php echo esc_html( $home['footer_heading'] ); ?></h2>
<form action="<?php echo esc_url( oc_local_url( home_url( '/lien-he/' ) ) ); ?>" method="get" aria-label="Đăng ký nhận tư vấn Parker">
<label class="screen-reader-text" for="oc-newsletter-email">Địa chỉ email</label>
<input id="oc-newsletter-email" type="email" name="email" placeholder="Email của bạn" autocomplete="email" required>
<button type="submit">Gửi</button>
</form>
</section>
<footer class="oc-footer-main" aria-label="Chân trang">
<h3>.But Parker</h3>
<p class="oc-footer-intro"><?php echo esc_html( $home['footer_intro'] ); ?></p>
<div class="oc-footer-columns">
<nav aria-labelledby="oc-footer-links-title">
<h4 id="oc-footer-links-title">LINKS</h4>
<a href="<?php echo esc_url( oc_local_url( home_url( '/gioi-thieu/' ) ) ); ?>">Giới thiệu</a>
<a href="<?php echo esc_url( oc_shop_url() ); ?>">Bộ sưu tập</a>
<a href="<?php echo esc_url( oc_local_url( home_url( '/lien-he/' ) ) ); ?>">Liên hệ</a>
</nav>
<nav aria-labelledby="oc-footer-social-title">
<h4 id="oc-footer-social-title">SOCIAL</h4>
<a href="<?php echo esc_url( oc_local_url( home_url( '/lien-he/' ) ) ); ?>">Khắc tên</a>
<a href="<?php echo esc_url( oc_shop_url() ); ?>">Quà tặng</a>
<a href="<?php echo esc_url( oc_local_url( home_url( '/lien-he/' ) ) ); ?>">Doanh nghiệp</a>
</nav>
<nav aria-labelledby="oc-footer-service-title">
<h4 id="oc-footer-service-title">SERVICE</h4>
<a href="<?php echo esc_url( oc_shop_url() ); ?>">Parker chính hãng</a>
<a href="<?php echo esc_url( oc_local_url( home_url( '/lien-he/' ) ) ); ?>">Khắc tên</a>
<a href="<?php echo esc_url( oc_local_url( home_url( '/lien-he/' ) ) ); ?>">In logo</a>
</nav>
<div role="group" aria-labelledby="oc-footer-contact-title">
<h4 id="oc-footer-contact-title">CONTACT</h4>
<p><?php echo esc_html( $home['footer_contact'] ); ?></p>
<p><?php echo esc_html( $home['footer_hours'] ); ?></p>
</div>
</div>
<div class="oc-footer-bottom">
<span><?php echo esc_html( $home['footer_copyright'] ); ?></span>
<nav aria-label="Điều khoản và chính sách">
<a href="<?php echo esc_url( oc_local_url( home_url( '/gioi-thieu/' ) ) ); ?>">Privacy Policy</a>
<a href="<?php echo esc_url( oc_local_url( home_url( '/lien-he/' ) ) ); ?>">Terms of Use</a>
<a href="<?php echo esc_url( oc_shop_url() ); ?>">Conditions of Sale</a>
</nav>
</div>
</footer>
</div>
<?php
}