Lưu trữ tác giả: Nguyen Toan

Vô hiệu hóa các phân đoạn giỏ hàng WooCommerce Ajax

Nội dung
    Việc vô hiệu hóa hoàn toàn các phân đoạn giỏ hàng WooCommerce AJAX trở nên cần thiết vì nó làm chậm tốc độ trang web của bạn bằng cách đưa ra các yêu cầu liên tục Bởi WordPress admin-ajax.php. Yêu cầu trong WooCommerce hoặc các đoạn giỏ hàng ảnh hưởng đến tốc độ tải trang WooCommerce của bạn lên đến 15 giây, ảnh hưởng đến doanh thu trực tiếp từ trang web Thương mại điện tử của bạn. Và trong bài viết cuối cùng của tôi về Công cụ Kiểm tra Tốc độ Trang và Hiệu suất Trang Tốc độ Trang , Tốc độ trang được đề cập rõ ràng ảnh hưởng đến SEO trang web của bạn và xếp hạng trong google. Ngay cả Matt Cutt cũng nói những điều tương tự.

    Bây giờ chúng ta hãy đến với những điểm chính. Do số lượng lớn các yêu cầu AJAX ( wc-ajax = get_refreshed_fragment ) trên trang web của bạn. Các yêu cầu AJAX thường không được lưu vào bộ nhớ cache và mất vài giây để tải, dẫn đến tăng thời gian tải trang của bạn. Để giải quyết vấn đề này, bạn phải vô hiệu hóa các phân đoạn giỏ hàng WooCommerce AJAX. Hãy xem nó là gì và nó hoạt động như thế nào. gomahamaya.com/disable-woocommerce-cart-fragments-ajax

    Phân đoạn giỏ hàng WooCommerce là gì?

    Vô hiệu hóa WooCommerce Cart Fragment  wc-ajax = get_refreshed_fragment , là một tập lệnh sử dụng quản trị viên AJAX. Tập lệnh cố gắng thu thập thông tin giỏ hàng của bạn bằng cách gọi tập lệnh và do đó cập nhật giỏ hàng của bạn mà không cần làm mới trang. Nó cố gắng thu thập thông tin chi tiết về giỏ hàng chưa được lưu trữ, làm chậm tốc độ trang web của bạn và tiêu tốn nhiều tài nguyên máy chủ. Vấn đề chính là nó cũng hoạt động trên các trang không chứa thông tin chi tiết về giỏ hàng hoặc thông tin liên quan đến sản phẩm. Lệnh gọi AJAX thường ghi đè plugin bộ nhớ đệm mà bạn thực hiện để tối ưu hóa Thương mại điện tử của mình. Nó phù hợp với trang web của bạn về mặt giao diện người dùng nhưng mặt khác, tiêu tốn rất nhiều thời gian tải trang.

    Ví dụ: các phân đoạn giỏ hàng trên các bài đăng tĩnh hoặc trang nguồn cấp dữ liệu như trang Giới thiệu về chúng tôi, trang liên hệ với chúng tôi, trang blog không yêu cầu thông tin giỏ hàng sẽ làm chậm tốc độ trang web của bạn và dẫn đến hiệu suất trang web kém. Do đó, thay vì xóa nút giỏ hàng khỏi các trang này, chúng tôi phải vô hiệu hóa các phân đoạn giỏ hàng hoặc tắt cập nhật giỏ hàng.

    Để xác định các phân đoạn giỏ hàng trên trang web của bạn, bạn cần chạy kiểm tra tốc độ trang như Google Page Speed ​​Insights Tool hoặc GTMetrix. Vì vậy, để Khắc phục sự cố phân đoạn giỏ hàng, chúng tôi đã tách blog thành hai phương pháp. Một phương pháp sử dụng  plugin và phương pháp thứ hai được thực hiện bằng cách lập trình mã hóa mà không cần plugin .

    Vo Hieu Hoa Cac Phan Doan Gio Hang Woocommerce Ajax

    Cách vô hiệu hóa các phân đoạn giỏ hàng trong WooCommerce mà không cần plugin.

    Có ba cách để tắt các phân đoạn giỏ hàng WooCommerce Ajax mà không cần plugin.

    1. Tắt các phân đoạn giỏ hàng khỏi tất cả các trang

    /** Disable Ajax Call from WooCommerce */add_action( ‘wp_enqueue_scripts’, ‘gomaya_dequeue_woocommerce_cart_fragments’, 11);
    /** Disable Ajax Call from WooCommerce on entire website*/add_action( 'wp_enqueue_scripts', 'gomaya_dequeue_woocommerce_cart_fragments', 11);
    function gomaya_dequeue_woocommerce_cart_fragments() { wp_dequeue_script( 'wc-cart-fragments' ); return true; }

    2. Tắt trên trang đầu

    Đi tới bảng điều khiển WordPress của bạn để vô hiệu hóa các phân đoạn giỏ hàng WooCommerce AJAX trên trang đầu. Sau đó, điều hướng đến Giao diện và nhấp vào Trình chỉnh sửa. Tại đây, bạn phải thêm mã để vô hiệu hóa Cuộc gọi Ajax từ WooCommerce ở cuối tệp này. Sau khi thêm mã vào tệp này, hãy nhấp vào nút Cập nhật để lưu các thay đổi của bạn.

    Vô hiệu hóa các phân đoạn giỏ hàng WooCommerce Ajax

    
    /** Disable Ajax Call from WooCommerce front page */add_action( 'wp_enqueue_scripts', 'gomaya_dequeue_woocommerce_cart_fragments', 11);
    function gomaya_dequeue_woocommerce_cart_fragments() { if (is_front_page()) wp_dequeue_script('wc-cart-fragments'); }
    
    

    Bạn cũng có thể sử dụng Giao thức truyền tệp (FTP) để vô hiệu hóa tập lệnh Phân đoạn giỏ hàng WooCommerce Ajax trên trang đầu của trang web của bạn. Để bắt đầu, hãy đăng nhập vào tài khoản FTP của bạn và điều hướng đến wp-content. Bên trong wp-content, bạn phải tìm chủ đề của mình và định vị tệp functions.php.

    Tại đây, bạn phải thêm mã để vô hiệu hóa Cuộc gọi Ajax từ WooCommerce vào cuối tệp này. Sau đó, tải tệp cập nhật lên máy chủ của bạn.
    Sau khi cập nhật tệp lên máy chủ, hãy truy cập WooCommerce và nhấp vào tab cài đặt. Sau đó, chuyển đến tab sản phẩm và nhấp vào phần “Hiển thị”. Tại đây, bạn sẽ tìm thấy phần có tên “Hành vi Thêm vào giỏ hàng” Bạn phải bật hộp kiểm với tùy chọn “Chuyển hướng đến trang giỏ hàng sau khi thêm thành công” trong phần này.

    Vô hiệu hóa các phân đoạn giỏ hàng WooCommerce Ajax

    3.Tắt trên trang đầu và bài đăng

    Để vô hiệu hóa các phân đoạn giỏ hàng WooCommerce trên trang đầu của bạn, bạn phải làm theo các bước trên.

    Vô hiệu hóa các phân đoạn giỏ hàng WooCommerce Ajax

    Nếu bạn muốn tắt tập lệnh WooCommerce Cart Fragment trên các bài đăng của mình, bạn phải thêm mã sau vào cuối tệp function.php của chủ đề.

    
    /**
    * @snippet Disable Ajax Call from WooCommerce on front page and posts - WooCommerce
    * @author Gomahamaya.com
    * @donate $5 https://www.paypal.com/paypalme/gomahamaya
    */add_action( 'wp_enqueue_scripts', 'gomaya_dequeue_woocommerce_cart_fragments', 11);
    function gomaya_dequeue_woocommerce_cart_fragments() {
    if (is_front_page() || is_single() ) wp_dequeue_script('wc-cart-fragments');
    }
    
    

    4.Đang tắt trên tất cả các trang ngoại trừ trang cửa hàng.

    WooCommerce bao gồm một số bảng định kiểu và tập lệnh sử dụng tài nguyên máy chủ của bạn để tải, do đó, làm chậm tốc độ trang web của bạn. Bạn có thể tắt tập lệnh phân đoạn giỏ hàng trên tất cả các bài đăng trên blog của mình để tiết kiệm việc sử dụng tài nguyên của máy chủ và nâng cao thời gian tải trang web của bạn. Bạn chỉ có thể áp dụng các tập lệnh liên quan đến WooCommerce trên các trang cửa hàng của mình. Điều này sẽ giúp trang web của bạn tải nhanh hơn và cung cấp cho người dùng trải nghiệm liền mạch trên trang web của bạn.

    
    /** Disable All WooCommerce Styles and Scripts Except Shop Pages*/add_action( 'wp_enqueue_scripts', 'gomaya_dequeue_woocommerce_styles_scripts', 99 );
    function gomaya_dequeue_woocommerce_styles_scripts() { if ( function_exists( 'is_woocommerce' ) ) { if ( ! is_woocommerce() && ! is_cart() && ! is_checkout() ) { # Styles wp_dequeue_style( 'woocommerce-general' ); wp_dequeue_style( 'woocommerce-layout' );
    wp_dequeue_style( 'woocommerce-smallscreen' );
    wp_dequeue_style( 'woocommerce_frontend_styles' );
    wp_dequeue_style( 'woocommerce_fancybox_styles' );
    wp_dequeue_style( 'woocommerce_chosen_styles' );
    wp_dequeue_style( 'woocommerce_prettyPhoto_css' );
    # Scripts
    wp_dequeue_script( 'wc_price_slider' );
    wp_dequeue_script( 'wc-single-product' );
    wp_dequeue_script( 'wc-add-to-cart' );
    wp_dequeue_script( 'wc-cart-fragments' );
    wp_dequeue_script( 'wc-checkout' );
    wp_dequeue_script( 'wc-add-to-cart-variation' );
    wp_dequeue_script( 'wc-single-product' );
    wp_dequeue_script( 'wc-cart' );
    wp_dequeue_script( 'wc-chosen' );
    wp_dequeue_script( 'woocommerce' );
    wp_dequeue_script( 'prettyPhoto' );
    wp_dequeue_script( 'prettyPhoto-init' );
    wp_dequeue_script( 'jquery-blockui' );
    wp_dequeue_script( 'jquery-placeholder' );
    wp_dequeue_script( 'fancybox' );
    wp_dequeue_script( 'jqueryui' ); } }
    
    

    Bạn phải áp dụng bất kỳ khối mã nào trong số ba khối mã này để vô hiệu hóa các tập lệnh phân đoạn giỏ hàng WooCommerce, tức là, wc-ajax = get_refreshed_fragment, từ tất cả các trang và bài đăng ngoại trừ các trang mua sắm trên trang WooCommerce của bạn.

    5. Tắt phân đoạn giỏ hàng bằng plugin

    a. WP Rocket

    Đây là một trong những plugin bộ nhớ đệm WordPress tốt nhất giúp bạn nâng cao tốc độ trang web của mình và bạn cũng không cần sử dụng bất kỳ mã nào. Thiết lập và sử dụng plugin này không phải là khoa học tên lửa. Tất cả những gì bạn cần làm là cài đặt và kích hoạt plugin, và sau đó, nó sẽ làm cho bạn. Khi bạn kích hoạt plugin trên trang WooCommerce của mình, nó sẽ tự động phát hiện và vô hiệu hóa các đoạn dấu mũ WooCopmmerce trên tất cả các trang của trang web của bạn.

    Plugin phát hiện các đoạn giỏ hàng trong mã nguồn của các trang của bạn và kiểm tra xem giỏ hàng có trống trong khi tải trang hay không. Nếu cả hai điều kiện được đáp ứng, WP Rocket sẽ lưu vào bộ nhớ cache của trang và vô hiệu hóa các lệnh gọi AJAX trên trang của bạn.

    b. Disable Cart Fragments by Optimocha

    Vô hiệu hóa phân đoạn giỏ hàng của Optimocha là một plugin dễ sử dụng vô hiệu hóa tất cả các tập lệnh phân đoạn giỏ hàng WooCommerce và giúp trang web của bạn tải nhanh hơn. Plugin chỉ hoạt động khi giỏ hàng trống. Khi sản phẩm có trong giỏ hàng, plugin cũng sắp xếp lại tập lệnh. Do đó, plugin này hoạt động tốt nhất trong cả hai trường hợp, i., E., Nó giúp bạn lưu vào bộ nhớ cache trang web của mình và hiển thị tổng số giỏ hàng khi và khi người dùng thêm sản phẩm vào giỏ hàng. Phần tốt nhất về plugin này là bạn không cần phải thực hiện cài đặt. Bạn phải cài đặt và kích hoạt plugin, sau đó nó sẽ tự động làm nhiệm vụ cho bạn.

    c. Perfmatters

    Plugin Perfmatters giúp bạn Vô hiệu hóa (wc-ajax = get_refreshed_fragment)   các đoạn giỏ hàng WooCommerce AJAX. Để vô hiệu hóa các phân đoạn giỏ hàng WooCommerce bằng Perfamatters, hãy đảm bảo rằng bạn đã cài đặt và kích hoạt WooCommerce.

    Vô hiệu hóa các phân đoạn giỏ hàng WooCommerce Ajax

    Sau đó, chuyển đến plugin Perfamatters và nhấp vào tab cài đặt.

    Vô hiệu hóa các phân đoạn giỏ hàng WooCommerce Ajax

    Sau đó, điều hướng đến tab Tùy chọn và chọn menu Chung.

    Vô hiệu hóa các phân đoạn giỏ hàng WooCommerce Ajax

    Sau đó, bạn phải cuộn xuống và tìm phần WooCommerce. Bên trong phần WooCommerce, chuyển đổi “Tắt phân mảnh giỏ hàng”. và nhấp vào nút “Lưu thay đổi”. Điều này sẽ giải quyết vấn đề của bạn và giúp trang web của bạn tải nhanh hơn.

    Vô hiệu hóa các phân đoạn giỏ hàng WooCommerce Ajax

    Kiểm tra tốc độ trang

    Sau khi thêm mã vào tệp function.php của the3mes, bạn phải xóa bộ nhớ cache của plugin bộ nhớ đệm. Sau khi vô hiệu hóa các phân đoạn giỏ hàng, hãy kiểm tra tốc độ tải trang web bằng cách sử dụng công cụ tốc độ . Bây giờ, chúng tôi có thể khắc phục sự cố tải tập lệnh wc-ajax = get_refreshed_fragment trong phần JavaScript chặn hiển thị trên Google PageSpeed ​​Insights.

    WooCommerce giúp bạn xây dựng một cửa hàng trực tuyến trong WordPress. Tuy nhiên, nó bao gồm một số bảng định kiểu và tập lệnh, điều này làm chậm trang web của bạn. Trong trường hợp như vậy, bạn có thể tắt tập lệnh phân đoạn giỏ hàng WooCommerce trên tất cả các trang và bài đăng ngoại trừ các trang cửa hàng để cải thiện tốc độ trang web của bạn.

    Xóa jQuery Migrate khỏi WordPress

    Xóa jQuery Migrate khỏi WordPress
    Nội dung
      Cách xóa jQuery Migrate khỏi WordPress Bạn có muốn xóa jQuery Migrate khỏi WordPress không? Chỉ để hỗ trợ các phiên bản cũ hơn của tệp jQuery của các chủ đề và plugin chưa được cập nhật, WordPress tải jquery-migrate.min.js. Hầu như tất cả các chủ đề và plugin không sử dụng các tệp này nữa.Xóa jQuery Migrate khỏi WordPressChỉ cần tải một tệp mà không có bất kỳ lý do nào là không thể phân chia được. Vì vậy, nhiều người đề xuất để tăng tốc độ nên loại bỏ các tập tin này. Nó sẽ ảnh hưởng đến tổng thời gian tải của trang web. Nhưng nếu nó đang tạo ra một vấn đề với trang web của bạn, vui lòng tránh những điều này.Xóa jQuery Migrate khỏi WordPress1 Bằng cách sử dụng plugin Xóa miễn phí jQuery Migrate By Hendy Tarnando. Bạn chỉ cần kích hoạt plugin này và bạn đã sẵn sàng. Nó sẽ vô hiệu hóa hoàn toàn jquery-migrate.min.js. Sau khi bạn kích hoạt plugin, chỉ cần bật tùy chọn Remove jQuery Migrate là xong. 2 Bạn chỉ cần dán đoạn mã được đề cập bên dưới vào trong tệp function.php để vô hiệu hóa jquery-migrate.min.js này khỏi trang web WordPress của bạn.  
      function gomahamaya_remove_jquery_migrate( $scripts ) {
      
      if ( ! is_admin() && isset( $scripts->registered['jquery'] ) ) {
      
      $script = $scripts->registered['jquery'];
      
      if ( $script->deps ) {
      $script->deps = array_diff( $script->deps, array( 'jquery-migrate' ) );
      }
      }
      }
      add_action( 'wp_default_scripts', 'gomahamaya_remove_jquery_migrate' );

      gomahamaya.com/remove-jquery-migrate-wordpress/

      Sử dụng BOT gửi tin nhắn tự động về Messenger

      Gui Tin Nhan Tu Dong Ve Facebook Messenger 3 768x130 1
      Nội dung

        Hiện nay có khá nhiều giải pháp giúp tích hợp từ các bên thứ 3 giúp cho các Website có thể dễ dàng gửi các tin nhắn hoặc đơn hàng về các ứng dụng trên trên điện thoại như: messenger, Telegram, Whatsapp,…

        Hướng dẫn BOT gửi tin nhắn tự động về Facebook Messenger

        Callmebot là 1 trang web chuyên cung cấp 1 số API hỗ trợ người dùng tạo được các đoạn mã ngắn hỗ trợ gửi tin nhắn về Facebook. Cách sử dụng siêu dễ dàng bằng cách sử dụng một lệnh gọi API đơn giản từ bất kỳ thiết bị nào (Home Assistant, Uptime Robot, OpenHab, ioBroker, IFTTT, v.v.). Tin nhắn hầu như nhận được ngay tức thì.

        +Ưu điểm sử dụng Callmebot
        API chạy nhanh, hoạt động ổn định
        Dễ dàng cấu hình.
        +Nhược điểm của Callmebot
        Cần phải có người biết về thiết kế website chuyên nghiệp để tiến hành tích hợp vào hệ thống website
        Không tùy chỉnh được thông báo gửi thành công.
        +Ứng dụng của việc gửi tin tự động về tin nhắn Facebook Messernger
        Gửi đơn hàng woocommerce về Facebook
        Gửi thông tin form bất kỳ về Facebook
        Gửi thông tin contact form 7 về Facebook
        Thông báo gia hạn dịch vụ, vv …

        Để chức năng gửi tin nhắn Facebook hoạt động được, thì ta cần phải có một KEY API của Callmebot. Cách tạo như sau:
        – Truy cập vào link https://m.me/api.callmebot
        – Gõ vào lệnh “create apikey”
        – Bot sẽ tạo một apikey cho bạn

        Bạn có thể sử dụng lệnh help để xem thêm các thông tin, các lệnh hỗ trợ gồm có:
        stop – xóa toàn bộ các api key
        info – xem thông tin về Callmebot
        create apikey – tạo lại key mới

        Sau khi đã có apikey rồi thì ta sẽ tiến hành giai đoạn tiếp theo là gửi thông điệp để kiểm tra API hoạt động tốt không.

        • Phần tin nhắn, bạn có thể sử dụng urlencoder để soạn nội dung có xuống dòng để tạo độ gọn gàng, dễ nhìn.
        • Để thêm icon, bạn xem danh sách icon được hỗ trợ, muốn sử dụng icon nào chỉ việc copy icon đó và dán vào form đang nhập dữ liệu bên trên.

        Hướng dẫn tạo text để gửi tin nhắn tự động về Facebook Messenger

        Sử dụng link sau để tạo tin nhắn gửi tin tự động về tin nhắn Facebook

        https://api.callmebot.com/facebook/send.php?apikey=[your_apikey]&text=[tin nhắn của bạn]
        
        Markup

        Kết quả sau khi chạy API

        kết quả gửi tin nhắn tự động về Facebook Messenger

        Code mẫu gửi contact form 7 về Facebook Messenger.

        Code mẫu này bạn có thể dán vào file Functions.php của giao diện đang sử dụng nhé. Lưu ý quan trọng, đây chỉ là cách để các bạn hình dung về việc hỗ trợ gửi thông tin đi, vì cách code này không tối ưu, lộ api key ra ngoài và ngay cả trên phiên bản mobile cũng sẽ không hoạt động, do ảnh hưởng của POPUP.

        //test send contact form 7 to FB Mess by www.phongmy.vn
        add_action( 'wp_footer', 'phongmyvn_cf7sent' );
        
        
        function phongmyvn_cf7sent()
        { ?>
        <script type="text/javascript">
                        document.addEventListener( 'wpcf7mailsent', function( event ) {
                            
                            var inputs = event.detail.inputs;
                            for ( var i = 0; i < inputs.length; i++ ) {
                                
                                //NAME FIELD
                                if ( 'your-name' == inputs[i].name ) {
                                    var name = inputs[i].value;
                                    // break;
                                }
                                //SUBJECT FIELD
                                if ( 'your-subject' == inputs[i].name ) {
                                        var subject = inputs[i].value;
                                        // break;
                                }
                                //EMAIL FIELD
                                if ( 'your-email' == inputs[i].name ) {
                                    var youremail = inputs[i].value;
                                    // break;
                                }
                                //MESSAGE
                                if ( 'your-message' == inputs[i].name ) {
                                    var mess = inputs[i].value;
                                    // break;
                                }
                            }
        
                            var currLink = window.location.href;
        
        
                            //SEND API
                            function new_popup(){
                                var popupwin = window.open('https://api.callmebot.com/facebook/send.php?apikey=vi7aecjT3Wy9MQaO&text=THÔNG TIN GỬI TỪ WEBSITE WWW.PHONGMY.VN%0A' +
                                    'Họ tên: '+name+'%0AEmail: '+youremail+'%0ATin nhắn: '+mess+'%0ALink: '+currLink+'',
                                    '_blank','width=1,height=1 ,scrollbars=no,status=yes');
                                setTimeout(function() { popupwin.close();}, 3000);
                            }
                            new_popup();
                        }, false );
                </script>
            <?php
        //Trong đó
        //your-name / your-subject / your-email / your-message là các biến Của Contact Form 7.
        //Bạn có thể review qua video nếu vẫn chưa hiểu nhé.

        Đẩy đơn hàng Wocommerce về Facebook Messenger

        Push Anything To Social: Phiên bản chỉ hỗ trợ đẩy đơn hàng từ Woocommerce về Facebook messenger.

        Dùng Excel quản lý số liệu công ty nhỏ đầy sai sót

        Dùng Excel quản lý số liệu công ty nhỏ đầy sai sót
        Nội dung

          Tính phổ biến, đa năng, và dễ sử dụng là những yếu tố khiến những phần mềm bảng tính như Microsoft Excel trở thành một phần không thể thiếu trong hoạt động của đa số doanh nghiệp. Tuy nhiên, chúng cũng đồng thời khiến Excel dễ bị ảnh hưởng bởi sai sót của người dùng hơn, như được minh chứng trong những trường hợp dưới đây.

          Những sai sót này thường rất đơn giản, nhưng có thể gây ra những thiệt hại khó lường. Trên thực tế, chúng ta có lẽ không bao giờ có thể loại bỏ hoàn toàn những lỗi của con người. Đó là lí do vì sao doanh nghiệp càng cần chú ý hơn đến các yếu tố khác như quy trình kiểm soát nội bộ, đào tạo người dùng, lựa chọn công nghệ phù hợp để thay thế hoặc bổ sung cho Excel v.v…

          Sau đây là những “thảm hoạ” gây ra bởi sai sót khi sử dụng Excel:

          Dùng Excel quản lý số liệu công ty nhỏ đầy sai sót

          Dấu (-) và sai sót 2,6 tỷ USD

          Một kế toán tại quỹ đầu tư tương hỗ Magellan Fund, thuộc Fidelity Investment, đã bỏ “quên” một dấu trừ và biến khoản lỗ 1,3 tỷ USD thành lãi. Sai sót này, xảy ra vào tháng 12/1994, dẫn đến việc Magellan Fund phải rút lại lời hứa chia cổ tức trị giá 4,32 USD cho mỗi cổ phần.

          Trong quá trình ước tính cổ tức, nhân viên kế toán thuế này phải chuyển số liệu lãi và lỗ ròng của các khoản đầu tư, đây đều là những số liệu chính xác, sang một file bảng tính độc lập. Lỗi xảy ra khi người này để sót dấu trừ trong một khoản lỗ trị giá 1,3 tỷ USD, đồng nghĩa với việc kết quả cuối cùng được tính ra cao hơn mức thực tế đến 2,6 tỷ USD.

          Sai sót trên đã không bị phát hiện trong bước kiểm tra sơ bộ mà chỉ được tìm ra trong bước chuẩn bị cuối cùng, với sự tham gia của các kiểm toán viên bên ngoài.

          Theo lời ông J. Gary Burkhead, chủ tịch Fidelity, thì: “Nhiều người đã đặt câu hỏi vì sao, trong thời đại công nghệ như hiện nay, lại xảy ra một lỗi lầm như vậy.” Ông cũng cam kết không để sai sót tương tự lập lại trong tương lai bằng cách tăng cường bước kiểm tra sơ bộ. Thay vì chỉ được thực hiện bởi các kế toán thì quy trình này giờ đây còn có các thủ quỹ và kiểm toán viên độc lập.

          Sự khác biệt giữa Ẩn (hide) và Xoá

          Vụ phá sản đình đám của ngân hàng đầu tư Lehman Brothers, một trong những ông lớn tại Phố Wall, là mồi thuốc súng cho cuộc khủng hoảng tài chính thế giới năm 2008. Nhưng ít người biết đến một biến cố khác có liên quan xảy ra không lâu sau đó, khi ngân hàng Barclays Capital suýt nữa đã “mua nhầm” 179 hợp đồng tương lai của Lehman

          Lehman Brothers tuyên bố phá sản vào ngày 15/9/2008. Ba ngày sau đó, Barclays Capital đồng ý mua lại một phần tài sản của Lehman, bao gồm một số lượng lớn các hợp đồng tương lai. Theo thoả thuận này, Barclays, thông qua hãng luật Cleary Gottlieb Steen & Hamilton, phải gửi một danh sách những tài sản mà hãng muốn mua của Lehman cho toà án trước nửa đêm ngày 18/9.

          Barclays gửi danh sách này, dưới dạng 1 file Excel, cho hãng luật vào lúc 7h50 tối ngày 18/9. File này chứa hơn 1.000 dòng và 24.000 ô, bao gồm 179 dòng liệt kê các hợp đồng mà Barclays không muốn mua. Song những dòng này chỉ bị ẩn đi thay vì xoá.

          Một luật sư tập sự tại Cleary Gottlieb, người được giao nhiệm vụ xử lý tài liệu này, không nhận ra sự tồn tại của những dòng bị ẩn và đã chuyển file excel thành dạng file pdf để gửi lên trang web của toà án. Trong quá trình chuyển đổi này, những dòng bị ẩn đã xuất hiện trở lại trong phiên bản file pdf.

          Sai sót này chỉ được phát hiện vào ngày 1/10 và Barclays phải gửi một đơn kiến nghị đến toà án để yêu cầu loại bỏ các 179 hợp đồng này ra khỏi thoả thuận.

          Lỗi Copy & Paste trị giá 24 triệu USD

          Bất cứ người dùng Excel nào cũng đã quá quen thuộc với thao tác sao chép & dán (copy & paste). Song một sai sót với thao tác tưởng quá đơn giản này đã khiến TransAlta Corp, một công ty điện lực của Canada, mất 24 triệu USD vào năm 2003, tương đương 10% lợi nhuận năm đó của công ty.

          Hàng tháng, TransAlta, cùng với nhiều công ty cung cấp điện khác, tham gia đấu giá mua các hợp đồng cung cấp điện cho tháng tiếp theo. Mức giá bỏ thầu hiển nhiên tuỳ thuộc vào nhu cầu đường truyền. Những đường truyền có nhu cầu tiêu thụ cao sẽ được bỏ giá cao hơn.

          Cuối tháng 4/2003, TransAlta bất ngờ được thông báo rằng mình đã thắng thầu một loạt hợp đồng mà công ty không hề muốn, và với một mức giá cao hơn mức thông thường. Nguyên nhân nằm ở khâu chuẩn bị file Excel dùng cho quy trình đấu thầu. Một nhân viên đã sao chép và dán số liệu vào nhầm dòng và cột, khiến cho mức giá bỏ thầu cao, cho các hợp đồng có mức tiêu thụ cao, bị gắn vào các hợp đồng có nhu cầu tiêu thụ thấp.

          Theo quy định thì kết quả đấu thầu là không thể thay đổi vì bất cứ lí do nào. Vì vậy TransAlta không có lựa chọn nào khác ngoài việc phải chấp nhận khoản thiệt hại kinh tế này.

          Giới học thuật cũng là nạn nhân

          Giới học thuật cũng có thể trở thành nạn nhân của Excel. Trường hợp tiêu biểu nhất là một công trình nghiên cứu nổi tiếng của 2 giáo sư hàng đầu tại Đại học Havard.

          Báo cáo với tiêu đề “Growth in a time of debt” (“Tăng trưởng trong kỷ nguyên nợ công”) được công bố lần đầu vào năm 2010 và đã gây tiếng vang lớn trong bối cảnh kinh tế thế giới vẫn đang vật lộn với suy thoái. Hai đồng tác giả đều là những tên tuổi lớn: giáo sư Carmen Reinhart và Ken Rogoff, nguyên kinh tế trưởng của IMF (Quỹ Tiền tệ Quốc tế).

          Theo kết quả của nghiên cứu này những quốc gia có nợ công lớn hơn 90% GDP (tổng sản phẩm quốc nội) sẽ có tốc độ tăng trưởng kinh tế rất chậm. Kết luận này đã được nhiều chính khách và nhà làm chính sách trên thế giới sử dụng để đề xuất các biện pháp thắt lưng buộc bụng.

          Tuy nhiên, một sinh viên đại học khi tham khảo file số liệu của nghiên cứu này đã vô tình phát hiện ra lỗi nghiêm trọng. Khi tính tốc độ tăng trưởng GDP trung bình của 20 quốc gia trong nghiên cứu, các tác giả đã vô tình “bỏ quên” số liệu của 5 quốc gia nằm ở 5 dòng cuối cùng trong công thức Excel.

          Theo các tác giả thì lỗi này không làm thay đổi kết luận cuối cùng, nhưng nó cho thấy mối liên hệ giữa mức nợ công cao và tốc độ tăng trưởng trì trệ không còn rõ nét như trong kết quả ban đầu.

          Sai lầm khách quan trị giá 1.1 tỷ USD

          Trong năm 2003, Fannie Mae, một công ty cung cấp dịch vụ mua nhà trả góp tại Mỹ, phát hiện ra một lỗi trong quá trình tính cổ tức lên đến 1,136 tỷ USD, và được các lãnh đạo của công ty mô tả là một “lỗi khách quan khi sử dụng bảng tính Excel do việc áp dụng chuẩn kế toán mới.”

          Lỗi tính trợ cấp thôi việc 9 triệu USD của Kodak

          Eastman Kodak Company vào năm 2005 đã phải điều chỉnh bổ sung thêm 9 triệu USD vào khoản lỗ của quý 3 do một lỗi trong bảng tính Excel. Khoản lỗ sau khi điều chỉnh là 1,038 tỷ USD.

          Theo Robert Brust, CFO của Kodak, lỗi này do một nhân viên gây ra khi người này tính toán chi phí trợ cấp thôi việc. Kodak đã phải cắt giảm 15.000 việc làm trong năm đó khi hãng này đang phải vật lộn với quá trình tái cấu trúc để thích nghi với sự phổ biến của máy ảnh kỹ thuật số.

          Theo ông Brust thì sai sót này chỉ bắt nguồn từ một file Excel duy nhất và là một vấn đề trọng yếu, cho thấy lỗ hổng trong quy trình kiểm soát nội bộ.

          Thảm họa giao dịch tài chính London Whale

          Sai lầm tốn kém và đình đám nhất do lỗi Excel góp phần gây ra có lẽ là vụ JPMorgan Chase thiệt hại hơn 6,2 tỷ USD trong quá trình giao dịch tài chính vào năm 2012. Ngân hàng này còn phải gánh các khoản tiền phạt hơn 1 tỷ USD.

          Chi nhánh London của Văn phòng đầu tư (Chief Investment Office – CIO) trực thuộc JPMorgan Chase vào thời điểm đó đã thực hiện một loạt giao dịch sản phẩm tài chính phái sinh phức tạp và có độ rủi ro cao. Kết quả là số lỗ ngày càng tăng.

          Một số quản lý cấp cao và trader của CIO ban đầu tìm cách che giấu mức độ trầm trọng của vấn đề, và sau đó cứu vãn tình thế bằng cách thực hiện những giao dịch với mức độ rủi ro thậm chí còn cao hơn trước.

          Những cuộc điều tra sau đó phát hiện ra rằng các trader đã sử dụng 2 hệ thống sổ sách khác nhau. Và do đó 2 trader đã bị truy tố.

          Một trong những yếu tố góp phần gây nên thảm họa này là một mô hình tính toán rủi ro mới mà CIO áp dụng. Mô hình này không chỉ chưa được kiểm định một cách đầy đủ mà còn được sử dụng thông qua một loạt file Excel và dựa vào thao tác Cắt – Dán thủ công. Mô hình này được cho là đã ước tính mức độ rủi ro chỉ bằng 1 nửa so với thực tế.

          Loại bỏ Excel trong kế hoạch tài chính và dự toán ngân sách

          Nghiên cứu gần đây của công ty tư vấn Anaplan đã chỉ ra rằng hiện nay các giám đốc tài chính (CFO) ở khu vực châu Á Thái Bình Dương vẫn còn đang gặp khó khăn trong việc sử dụng bảng tính để lên kế hoạch tài chính và dự toán ngân sách. Ngoài ra, mức độ hài lòng với độ chính xác, tính kịp thời và dễ sử dụng của Excel trong công việc này là tương đối thấp.

          Hạn chế của Excel trong lập kế hoạch & ngân sách

          Cũng theo nghiên cứu này, 43% số người phản hồi sử dụng Microsoft Excel để lập kế hoạch tài chính và dự toán ngân sách và 19% sử dụng Excel để lên kế hoạch hoạt động cho đến 70% công việc của họ. Tuy nhiên, gần một phần ba những người sử dụng Excel trong 70%  số người sử dụng để lên kế hoạch tài chính và ngân sách không hài lòng với độ chính xác của nó. Đây là kết quả của việc Excel không đủ linh hoạt để đem lại một cái nhìn chủ động và đa dạng hơn, nghĩa là không những không chính xác trong tính toán mà Excel còn hạn chế trong việc cung cấp một cái nhìn toàn cảnh cho kế hoạch tài chính và ngân sách công ty.

          Download whitepaper “Why Smart CFOs Are Moving to the Cloud” here

          Biểu đồ dưới đây (Anaplan 2013) chỉ ra những công cụ mà các công ty sử dụng cho việc lập kế hoạch và dự toán ngân sách của họ:

          Dùng Excel quản lý số liệu công ty nhỏ đầy sai sót

          Từ biểu đồ trên, có thể thấy rõ rằng mặc dù còn nhiều giới hạn, Excel vẫn đang chi phối các hoạt động tài chính của CFO tại châu Á. Chỉ có khoảng 20% số người phản hồi sử dụng phần mềm doanh nghiệp cài đặt tại chỗ hoặc một hệ thống tự phát triển và chỉ 2% chọn giải pháp điện toán đám mây bên ngoài.

          Về mức độ hài lòng với độ chính xác của Excel trong việc lập kế hoạch và dự toán ngân sách, kết quả cho thấy những công ty chỉ sử dụng Excel trong ít hơn 30% quá trình lên kế hoạch và lập ngân sách của mình tương đối hài lòng hơn so với những người sử dụng nhiều hơn 70%.

          Theo lời giải thích, 59% số người được hỏi cho biết nguyên nhân phổ biến nhất là vì Excel không có khả năng phân tích giả định “what if” (Nếu thì), phân tích chi tiết tích hợp và kế hoạch hoạt động. 53% phàn nàn về sự khác biệt giữa các kết quả thực và kết quả dự báo. Ngoài ra, người dùng Excel cảm thấy tốn rất nhiều thời gian để lên kế hoạch tài chính và dự toán ngân sách. Họ mất rất nhiều thời gian để thu thập dữ liệu từ các phòng ban liên quan và xử lý nó trước khi họ có thể nhận được thông tin hữu ích nào đó. Một số vấn đề khác bao gồm cả sự thiếu đa dạng của Excel, giao diện không thân thiện, hay thiếu nhân lực có đủ kỹ năng, tất cả những vấn đề này đều khiến các CFO không cảm thấy hài lòng.

          Để trả lời cho câu hỏi “Điều gì sẽ làm cho bạn hài lòng hơn với việc lên kế hoạch và lập ngân sách tài chính?” Nhiều nhà hoạch định bày tỏ rằng họ muốn kết quả tốt hơn bằng cách áp dụng một quy trình dựa trên hệ thống chứ không phải chỉ đơn thuần là dựa trên một bảng tính. Họ yêu cầu một nền tảng có khả năng phân tích tình huống ‘nếu… thì’, có thể tăng độ chính xác cho dự đoán và khả năng thu thập dữ liệu từ tất cả mọi lĩnh vực kinh doanh. Ngoài ra, 69% số người được hỏi muốn có một hệ thống xử lý có thể thu giữ và tải dữ liệu  nhanh hơn, và 53% thích một hệ thống phân tích dữ liệu nhanh và thông minh hơn.

          Nhược điểm cố hữu của phần mềm bảng tính như Excel là chúng phụ thuộc vào quá trình nhập dữ liệu bằng tay, và do đó dễ xảy ra sai sót. Nếu xuất hiện lỗi, hầu như không có cách nào hiệu quả để lần ra và theo dõi lỗi đó.

          Một khi dữ liệu được xử lý, các quản lý cấp cao khó có thể lần ngược lại các cấp độ chi tiết của con số và tự tin rằng chúng được xây dựng trên các dữ liệu chính xác và minh bạch. Sử dụng bảng tính cũng tạo ra một hệ thống của các thông tin bị phân mảnh, không thuận lợi cho các hành động mau lẹ.

          Một hệ thống bảng tính điển hình có thể mất đến 30 ngày hoặc nhiều hơn để hoàn thành báo cáo hợp nhất. Kết quả là bạn còn lại rất ít thời gian cho bất cứ phân tích hữu ích nào. Trong kinh doanh ngày nay, tốc độ là tối cần thiết; và các nhà quản lý cần thông tin thời gian thực để đưa ra quyết định trong môi trường có nhịp độ nhanh. Ngoài ra, dữ liệu dựa trên bảng tính thông thường chỉ có thể thực hiện phân tích dữ liệu trong quá khứ, không phải loại thông tin hướng tới tương lai mà công ty cần.

          Phân tích kinh doanh đã vượt ra khỏi khả năng mô tả các dữ liệu của quá khứ. Đối với các giám đốc tài tính, việc trả lời câu hỏi ‘điều gì đã xảy ra?’ không còn đủ nữa. Trong Khảo sát Ưu tiên tài chính năm 2016, công ty tư vấn Protiviti đã hỏi 650 giám đốc tài chính để xếp hạng những ưu tiên hàng đầu của năm, và trong số 5 vấn đề hàng đầu trong năm 2016 có dự báo và lập ngân sách. Nếu công ty của bạn chỉ dựa vào bảng tính thì bạn sẽ không thấy được điều gì đang chờ mình phía trước.

          Các công cụ thay thế Excel

          Vậy nếu những người tham gia khảo sát có cơ hội để thiết kế và thực hiện các kế hoạch tài chính và dự toán ngân sách một lần nữa, họ sẽ làm gì và làm như thế nào? Mặc dù hiện nay có khá nhiều giải pháp khác nhau, đa số người được hỏi đều muốn một hệ thống nào đó tích hợp bao gồm phần mềm kế toánERP,  hoặc phần mềm quản lí hiệu suất. Hệ thống này phải có khả năng thao tác trên dữ liệu như tải lên, trích xuất, phân tích dữ liệu một cách nhanh chóng, tăng độ chính xác và tốc độ xử lý, đồng thời giao diện của nó phải linh hoạt và thân thiện với người dùng.

          Nguồn: blog.trginternational.com

          Tạo báo cáo Data Studio từ Google Search Console cho tìm kiếm gắn thương hiệu so với tìm kiếm khám phá

          Tạo báo cáo Data Studio từ Google Search Console cho tìm kiếm gắn thương hiệu so với tìm kiếm khám phá
          Nội dung

            Trong hướng dẫn này, bạn sẽ tìm hiểu lý do tại sao chia lưu lượng thành các vấn đề có thương hiệu và không có thương hiệu để phân tích nỗ lực SEO của bạn, cách thực hiện và mẫu Google Data Studio miễn phí sẽ giúp bạn tiết kiệm rất nhiều thời gian.

            Tại sao việc phân tích các tìm kiếm có thương hiệu và không có thương hiệu lại quan trọng

            Các tìm kiếm có thương hiệu có được tính vào nỗ lực SEO của bạn không?

            Ý tôi là, nếu bạn nhận được lưu lượng truy cập trên trang web của mình thông qua các tìm kiếm của Google mà người dùng đưa thương hiệu của bạn vào truy vấn của họ, đó có phải là kết quả của nỗ lực Tối ưu hóa Công cụ Tìm kiếm của bạn không?

            Về mặt kỹ thuật, có, họ làm.

            SEO là  tăng số lượng và chất lượng lưu lượng truy cập trang web thông qua các kết quả của công cụ tìm kiếm.

            Tuy nhiên, chiến lược SEO của bạn ảnh hưởng đến những tìm kiếm này ở mức độ nào?

            Trừ khi tên thương hiệu của bạn chung chung hoặc được sử dụng phổ biến — chẳng hạn như được đặt tên là “Dữ liệu” hoặc “Thú cưng” —cấp hạng trên trang đầu tiên của Google với loại truy vấn này sẽ không quá khó.

            Loại người dùng truy cập trang web của bạn sau khi thực hiện các tìm kiếm này có mục đích cho công ty hoặc sản phẩm của bạn; họ biết bạn rồi.

            Có thể họ biết bạn vì họ là khách hàng thường xuyên hoặc ai đó đã nói với họ về bạn, thương hiệu của bạn đã được giới thiệu trên một trang web lớn gần đây hoặc bạn đã lan truyền bằng cách nào đó.

            Bất kể kênh mua lại là gì, SEO không phải là một phần của thành công đó, mà là mọi thứ bạn làm để nhận biết và định vị thương hiệu.

            Mặc dù lưu lượng truy cập đến từ hoạt động khám phá, tìm kiếm không có thương hiệu — tức là khi ai đó tìm kiếm các sản phẩm mà bạn cung cấp, nhưng họ không tìm kiếm thương hiệu của bạn một cách cụ thể — được quy trực tiếp cho SEO, thì lưu lượng truy cập tìm kiếm có thương hiệu là một chức năng của thương hiệu.

            Nếu bạn vẫn còn bối rối về cách nghĩ các tìm kiếm có thương hiệu và không có thương hiệu, bảng này sẽ giúp:

            Có thương hiệuKhông có thương hiệu
            Tesla những mẫu xe mới nhất
            Tesla vs Toyota
            Có phải xe Tesla tốt nhất?
            Các thương hiệu ô tô điện
            Ô tô đang bán
            Cách chọn ô tô điện
            Sự khác biệt giữa tìm kiếm có thương hiệu và không có thương hiệu

            Một ví dụ khác, nếu công ty của bạn được giới thiệu trên WSJ hoặc NYT, rất có thể thương hiệu của bạn sẽ gây được tiếng vang và một số người sẽ tìm kiếm nó trên Google.

            Mặc dù Google Analytics sẽ báo cáo tất cả lưu lượng truy cập này là “Không phải trả tiền”, kênh chuyển đổi thực tế là PR.

            Bạn nên phân tích riêng lưu lượng truy cập không phải trả tiền đến từ các tìm kiếm có thương hiệu và không có thương hiệu, nhưng Google Search Console không đi kèm với bất kỳ thứ nguyên nào để thực hiện truy vấn hoặc phân tích như vậy.

            Nhưng Google Data Studio cho phép chúng tôi tạo các thứ nguyên như vậy thông qua Biểu thức chính quy và câu lệnh CASE.

            Bắt đầu nào.

            Yêu cầu

            Đây là hướng dẫn từng bước mà bất kỳ ai cũng có thể làm theo, nhưng sẽ tốt hơn nếu bạn có kiến ​​thức cơ bản về Google Data Studio.

            Bạn nên  tạo tài khoản Google Data Studio  (miễn phí).

            Sau đó, tạo một báo cáo và kết nối tài khoản Google Search Console của bạn với nó.

            Thiết lập báo cáo Google Data Studio

            Truy cập Google Data Studio và tạo một báo cáo mới.

            Tạo báo cáo Data Studio từ Google Search Console cho tìm kiếm gắn thương hiệu so với tìm kiếm khám phá

            Sau đó, chọn Google Search Console làm nguồn dữ liệu của bạn.

            Tạo báo cáo Data Studio từ Google Search Console cho tìm kiếm gắn thương hiệu so với tìm kiếm khám phá

            Chọn trang web bạn muốn báo cáo. Bạn cũng sẽ được yêu cầu chọn giữa hai bảng: Số lần hiển thị trang web và số lần hiển thị URL .

            Về cơ bản, số lần hiển thị trang web hiển thị vị trí trung bình của trang web trên mỗi từ khóa và số lần hiển thị URL hiển thị các trang đích được chia nhỏ.

            Đối với phân tích này, tôi khuyên bạn nên chọn Hiển thị trang web và nhấp vào Thêm ở bên trái.

            Khi bạn đang ở trong báo cáo Google Data Studio, chúng tôi sẽ tạo một bảng bằng cách chuyển đến Chèn và chọn Bảng .

            Tạo báo cáo Data Studio từ Google Search Console cho tìm kiếm gắn thương hiệu so với tìm kiếm khám phá

            Chọn Truy vấn làm thứ nguyên và Số lần hiển thị và Số lần nhấp làm chỉ số.

            Tạo báo cáo Data Studio từ Google Search Console cho tìm kiếm gắn thương hiệu so với tìm kiếm khám phá

            Trong ví dụ này, tôi có thể thấy các truy vấn thúc đẩy hầu hết lưu lượng truy cập từ các tìm kiếm của Google trên trang web của tôi (nhân tiện, nó bằng tiếng Tây Ban Nha).

            Đối với bài tập này, tôi sẽ nói rằng tên thương hiệu của chúng tôi là “ promociones ” bởi vì Porter không có đủ tìm kiếm thương hiệu :(.

            Như bạn có thể thấy, có rất nhiều truy vấn có chứa từ khóa “promociones”, nhưng có bao nhiêu lưu lượng truy cập trang web của chúng tôi chứa tên thương hiệu đó?

            Chúng tôi sẽ tạo một thứ nguyên mới để trực quan hóa các nhấp chuột và hiển thị với phân tích tìm kiếm có thương hiệu.

            Đi tới Thêm thứ nguyên và nhấp vào.

            Tạo báo cáo Data Studio từ Google Search Console cho tìm kiếm gắn thương hiệu so với tìm kiếm khám phá

            Trước khi thực hiện truy vấn của chúng tôi, tôi sẽ giải thích cho bạn cách hoạt động của nó.

            Tôi muốn Google Data Studio tạo một trường gắn thẻ mọi truy vấn là Được gắn thương hiệu hoặc Không được gắn thương hiệu nếu nó chứa các promociones ở bất kỳ vị trí nào trong chuỗi.

            Chúng tôi cần dịch yêu cầu này sang SQL và chúng tôi sẽ sử dụng Biểu thức chính quy hoặc REGEX. Đừng lo lắng, ví dụ này tôi đã đề cập đến bạn, nhưng nếu bạn muốn trở thành một nhà phân tích dữ liệu, bạn nên học chúng.

            Chúng tôi sẽ sao chép và dán lệnh sau vào canvas.

             

            case
            when REGEXP_MATCH(Query,’.promociones.‘) THEN “Branded”
            ELSE “Non branded”
            END

            Tạo báo cáo Data Studio từ Google Search Console cho tìm kiếm gắn thương hiệu so với tìm kiếm khám phá

            Bạn sẽ thay thế các quảng cáo bằng tên thương hiệu của mình *

            Tôi sẽ giải thích cho bạn lệnh này đại diện cho điều gì:

            Chúng tôi luôn sử dụng CASE để yêu cầu Google Data Studio hoặc SQL nêu một điều kiện giống như KHI điều này xảy ra, hãy làm điều đó; Nếu điều kiện không áp dụng, hãy làm điều gì đó ELSE và KẾT THÚC truy vấn.

            Đây là cách cấu trúc cơ bản của nó trông như thế nào:

            Bạn có thể sử dụng  WHEN  cho mỗi dòng để khai báo nhiều điều kiện. Các lệnh này không phân biệt chữ hoa chữ thường, nhưng tôi luôn nhập chúng dưới dạng chữ hoa như một phương pháp hay để phân biệt chúng với các giá trị khác.

            Bây giờ chúng ta sẽ chạy biểu thức chính quy đầu tiên của mình!

            Biểu thức chính quy  (hoặc REGEX) là một tập hợp các ký tự hoạt động như các lệnh để xác định một truy vấn mà bạn thực hiện trên một chuỗi.

            Ví dụ: nếu bạn muốn tìm các từ của một chuỗi sau chữ “A” thứ hai và nó phải là chữ hoa khi thực hiện một phân tích cụ thể, bạn sẽ cần một biểu thức chính quy để phần mềm có thể hiểu được yêu cầu như vậy.

            Google Data Studio có thể thực hiện ba loại chức năng hoặc tác vụ khi sử dụng biểu thức chính quy:  REGEXP_MATCH ,  REGEXP_EXTRACT  và  REGEX_REPLACE .

            Trong ví dụ này, chúng ta sẽ sử dụng REGEXP_MATVH vì chúng tôi muốn tag như  Nhãn hiệu  tất cả các truy vấn có chứa từ  promociones .

            Hãy quay lại truy vấn của chúng tôi:

            Tạo báo cáo Data Studio từ Google Search Console cho tìm kiếm gắn thương hiệu so với tìm kiếm khám phá

            Hãy xem truy vấn này đại diện cho điều gì:

            • Chúng tôi sẽ tìm kiếm các giá trị của thứ nguyên Truy vấn
            • Các promociones của REGEX ‘. *. *’ Chỉ ra rằng “promociones” có thể nằm trong bất kỳ phần nào của chuỗi. Các ký tự . * Có thể là những ký tự phổ biến nhất khi sử dụng REGEX vì chúng cho biết bắt đầu tìm kiếm từ đầu chuỗi và nếu được đặt ở cuối, từ cuối chuỗi. Khi được sử dụng ở cả phần đầu và phần cuối, chúng ta đang yêu cầu biểu thức chính quy tìm ở bất kỳ đâu, theo bất kỳ thứ tự nào cho điều kiện.
            • Chúng tôi sử dụng THEN để thể hiện một kết quả mà chúng tôi muốn nhận được nếu một điều kiện được đáp ứng. Trong trường hợp này, chúng tôi sẽ gắn thẻ là Được gắn thương hiệu tất cả các truy vấn có chứa promocione s.
            • Và chúng tôi sử dụng ELSE để đặt một giá trị cụ thể nếu không có điều kiện nào được đáp ứng. Trong trường hợp này, nó không có thương hiệu.
            • Chúng tôi đặt tên thứ nguyên mới của mình là Loại tìm kiếm .

            Bây giờ, hãy kiểm tra thứ nguyên mới của chúng ta trong biểu đồ:

            Tạo báo cáo Data Studio từ Google Search Console cho tìm kiếm gắn thương hiệu so với tìm kiếm khám phá

            Đối với bài tập này, chúng tôi đang nói rằng “Promociones” là một từ khóa được gắn thương hiệu. Nhưng nếu tôi muốn thêm nhiều từ khóa có thương hiệu như “Porter” thì sao?

            Mặc dù đây chỉ là một ví dụ, nhưng thương hiệu của bạn có thể sai chính tả hoặc có nhiều tên thương hiệu hoặc bạn có nhiều tên thương hiệu khác nhau.

            Hãy khắc phục điều đó.

            Bạn có thể điều chỉnh regex mà chúng tôi đã thực hiện để áp dụng nhiều biến thể.

            Đây là cách nó được thể hiện trên Data Studio.

            Tạo báo cáo Data Studio từ Google Search Console cho tìm kiếm gắn thương hiệu so với tìm kiếm khám phá

            Sao chép và dán công thức này:

            case
            when REGEXP_MATCH(Query,’.promociones.|.porter.‘) THEN “Branded”
            ELSE “Non branded”
            END

            Công thức hoạt động khá giống nhau. Sự khác biệt là thanh dọc (|), đại diện cho OR, và sau đó là một biểu thức chính quy khác khớp với “porter” .

            Bạn có thể sử dụng nhiều HOẶC nếu cần để thêm các biến thể truy vấn khác nhau mà bạn có thể coi là “được gắn thương hiệu”.

            Nếu bạn sử dụng (i?) Để chuẩn hóa các chữ cái viết hoa, bạn có thể ảnh hưởng đến truy vấn nếu bạn đang sử dụng dấu cách. Nếu truy vấn không hoạt động tốt, hãy xóa “(i?).

            Tìm kiếm có thương hiệu so với tìm kiếm không có thương hiệu Mẫu Google Data Studio

            Chúng tôi đã tạo một mẫu để tăng tốc thiết lập báo cáo của bạn. Hy vọng la bạn se thich no!

            Tạo báo cáo Data Studio từ Google Search Console cho tìm kiếm gắn thương hiệu so với tìm kiếm khám phá

            portermetrics.com/en/tutorial/branded-vs-discovery-seo-report-data-studio/

            Tối ưu web wordpress để pagespeed insights màu xanh

            Tối ưu web wordpress để pagespeed insights màu xanh
            Nội dung

              Chạy quảng cáo ads không phải bỏ tiền ra là có thể có khách hàng. Website cần tăng điểm trải nghiệm của khách hàng mà còn tính đểm của công cụ Google Pagespeed Insights. Các hạng mục điểm website đó rất quan trọng trong việc xếp thứ hạng trang. tham khảo: webmtp.com/toi-uu-hoa-website-wordpress-tren-pagespeed-insights

              https://www.gomahamaya.com/test-website-speed-page-speed-performance/

              https://www.gomahamaya.com/boost-site-speed/

              https://www.gomahamaya.com/defer-parsing-of-javascript/

              Chỉnh theo kết quả Pagespeed Insights

              Chuẩn bị những thứ cần thiết

              • Website muốn tối ưu: Ở đây tôi sẽ tối ưu hóa trên chính website trên nền wordpress của mình (webmtp.com)
              • Lựa chọn themes phù hợp. Trong website tối ưu của bài viết này, mình sử dụng theme Flatsome.
              • Công cụ Google Pagespeed
              • Công cụ Gtmetrix
              • Plugin Autoptimize
              • VPS / Hosting hỗ trợ Litespeed
              • Plugin Litespeed
              Đặc biệt, bạn cần ưu tiên sử dụng Hosting / VPS có cài đặt Litespeed để việc tối ưu được xảy ra suôn sẻ hơn. Ở đây tôi khuyến nghị bạn sử dụng Hosting / VPS tại công ty Web MTP để có thể theo sát với bài hướng dẫn này.

              Các hạng mục quan trọng cần thực hiện để tối ưu hóa website wordpress

              • Rút gọn CSS & JS và đặt chúng thành một dòng trên một file duy nhất
              • Trì hoãn tải các CSS & JS
              • Nội tiếng JS bên thứ 3 như analytics
              • Chuyển đổi liên kết thư viện của WordPress thành một subdomain
              • Tối ưu hình ảnh bằng cách dùng Photoshop, Pngyu và Base64

              Các kỹ năng cần có trước khi tối ưu hóa website wordpress

              • Kỹ năng đọc hiểu ngôn ngữ HTML / CSS / JS
              • Kỹ năng cơ bản về PHP
              • Kỹ năng cơ bản về Photoshop
              • Kỹ năng cơ bản về tìm kiếm và thay thế
              • Am hiểu cơ bản về cấu trúc của WordPress
              • Biết sử dụng Hosting / VPS

              Tại sao cần có các kỹ năng trên?

              Việc tối ưu một website thật sự không khó mà cũng không dễ, để dễ dàng hơn trong công cuộc tối ưu thì bạn cần có một người hướng dẫn tận tình nếu không tự tin thực hiện. Hoặc bạn cần phải có các kỹ năng trên để am hiểu các dòng code trong website của bạn, từ đó có thể tối ưu một cách dễ dàng.

              Bắt đầu tối ưu hóa website WordPress

              Trước tiên, mình sẽ show cho các bạn thấy website của mình trước khi tối ưu: Trên thiết bị di động nhìn rất là buồn luôn, lúc ban đầu mình cũng chẳng hiểu tại sao điểm lại thấp như vậy, có 9-20. Cảm giác như tuyệt vọng vậy =)) Tối ưu web wordpress để pagespeed insights màu xanh Trên máy tính để bàn thì khả quan hơn chút, nhưng so với thang điểm của Pagespeed thì điểm số trên máy tính để bàn như vậy cũng chưa ăn thua gì. Tối ưu web wordpress để pagespeed insights màu xanh Check thêm trên Gtmetrix thì thế này: Tối ưu web wordpress để pagespeed insights màu xanh Nhìn thôi đã muốn phá sản rồi các bạn ạ. Điểm load page lên tới 7.4s, tổng kích thước của page mà 1.69MB trong khi trang chủ của mình chẳng có cái gì nặng cả và thêm ông Requests khá cao lên tới 74. Sơ qua thì website này chưa thể kinh doanh được, chưa nói tới chuyện phải SEO được nữa. OK, bây giờ mình sẽ bắt tay vào làm ngay luôn cho nóng. Trước hết mình sẽ vào VPS / Hosting có hỗ trợ Lite Speed Full Option, bật nó lên và kết nối tới website webmtp.com.
              • Đối với các bạn đang xài VPS đã được cài sẵn Lite Speed rồi thì không cần bật trên VPS nữa mà chỉ cần cài plugin Lite Speed vào là được.
              • Đối với các bạn đang dùng hosting có Litespeed thì các bạn truy cập vào hosting, sau đó vào mục LiteSpeed Web Cache Manager > Nhấn WordPress Cache > Scan rồi Enable website của mình lên.
              Tối ưu web wordpress để pagespeed insights màu xanh Kế tiếp, vào quản lý trang website wordpress cài đặt Plugin Litespeed > Kích hoạt. Thường trên Hosting / VPS bên mình sẽ không cần thiết lập thông số gì cả, chỉ cần kích hoạt là xong (các bạn có thể mua Hosting hoặc VPS ngay). Còn các bạn xài bên khác thì sẽ có thông số thiết lập riêng, liên hệ bên nhà cung cấp Hosting / VPS để kiểm tra nhé. Sau khi cài đặt Litespeed xong, chúng ta check lại điểm page một lần nữa xem sao nhé! Tối ưu web wordpress để pagespeed insights màu xanh Tối ưu web wordpress để pagespeed insights màu xanh Nhìn có vẻ nhỉnh lên thêm chút so với lúc ban đầu rồi. Bây giờ mình sẽ check xem ông Google Pagespeed nói gì về website của mình nhé. Tối ưu web wordpress để pagespeed insights màu xanh Tối ưu web wordpress để pagespeed insights màu xanh Rồi, một mớ kinh hoàng mà các bạn sẽ không muốn gặp phải đã xuất hiện. Ở đây, webmtp đang gặp phải các lỗi như sau:
              • Trì hoãn tải các hình ảnh ngoài màn hình
              • Phân phối hình ảnh ở định dạng mới hiệu quả hơn
              • Loại bỏ các tài nguyên chặn hiển thị
              • Rút gọn Javascript
              • Xóa biểu định kiểu xếp chồng (CSS) không dùng
              • Đảm bảo văn bản vẫn hiển thị khi tải Font chữ web
              • Giảm thiểu công việc theo chuỗi chính
              • Phân phối các nội dung bằng chính sách bộ nhớ đệm hiệu quả
              • Tránh kích thước DOM quá lớn
              • Giảm thời gian thực thi JavaScript
              • Tránh các tài nguyên lớn trên mạng
              OK, bây giờ mình sẽ đi tối ưu từng lỗi một.

              Tối ưu hình ảnh trước khi tải lên website

              Trong mỗi website đều có các định dạng ảnh như JPG / JPEG / PNG / SVG, ngoài việc tạo cookie cho các hình ảnh này thì ta cần phải nén hoặc tối ưu các hình ảnh này trước khi tải lên website. Vì vậy, ở đây tôi chia thành 3 dạng hình ảnh cần tối ưu.
              1. Xem ngay cách tối ưu hình ảnh JPG / JPEG
              2. Tối ưu hình ảnh PNG
              3. Tối ưu hình ảnh SVG
              4. Chuyển đổi và sử dụng hiệu quả hình ảnh dạng Base64

              Trì hoãn tải các hình ảnh ngoài màn hình (Defer loading of off-screen images)

              Đây là mục đơn giản nhất mà ai cũng có thể làm được, trên theme Flatsome đã hỗ trợ sẵn công cụ Lazy Loading. Các bạn chỉ cần vào Flatsome > Advanced > Performance và tích 2 dòng Enable lazy loading of banner and section backgrounds và Enable lazy loading for images. It will generate an inline blank Base64 image with the same aspect ratio as the original image là xong. Tối ưu web wordpress để pagespeed insights màu xanh Đối với các bạn không xài theme Flatsome thì cài đặt plugin Autoptimize. Sau đó vào thiết lập > Images, tích chọn Lazy-load images và lưu lại. Tối ưu web wordpress để pagespeed insights màu xanh

              Phân phối hình ảnh ở định dạng mới hiệu quả hơn (Distribute images in the new format more effectively)

              Đây là phần các bên dịch vụ sẽ làm trước cho khách hàng hoặc các bạn phải tự mình làm lấy. Các định dạng hỗ trợ website tốt mà Google Pagespeed khuyên dùng là JPEG / WEBP. Thường thì mình sẽ dùng JPEG hoặc JPG là thân thiện nhất đối với người dùng website. Định dạng WEBP thường sẽ được tự chuyển đổi từ các định dạng ảnh khác sang WEBP khi website được kết nối với CDN (Content Delivery Network) và hỗ trợ tự động convert.

              Tại sao chỉ nên dùng WEBP trên CDN?

              Định dạng WEBP không được hỗ trợ trên trình duyệt Safari, như vậy người dùng iPhone, Mac mà đang sử dụng Safari sẽ không thể xem hình ảnh trên website của chúng ta được. Và đối với đa số mọi người sẽ không đi quá sâu vào để lập trình ra một công cụ có thể tự động hiển thị định dạng WEBP khi người truy cập không dùng trình duyệt Safari khi truy cập website. Và nếu chúng ta có lập trình ra được một công cụ như vậy thì cũng không nên kích hoạt nó, bởi sẽ làm cho dung lượng lưu trữ của website tăng lên cao hơn bình thường. Bạn nào thích sử dụng CDN thì có thể tham khảo các bên cung cấp như Cloudflare, viettelidc, vncdn,…

              Loại bỏ các tài nguyên chặn hiển thị (Remove Render Blocking Javascript and CSS)

              Google khuyến nghị xóa hoặc trì hoãn các tệp Javascript can thiệp vào việc tải website của chúng ta. Để làm được điều này, các bạn cần phải biết một chút về code (ít nhất là HTML). Trước hết chúng ta click vào hạng mục này trên Google Pagespeed để xác định xem website đã tải những tệp tin gì: Tối ưu web wordpress để pagespeed insights màu xanh Đến đây các bạn sẽ một website có thể chứa vô số các tệp tin, những tệp tin này có thể cần được sử dụng và cũng có thể không được sử dụng. Vì vậy, công việc của chúng ta là xác định xem các tệp tin nào không được sử dụng và ghi nó ra trong một notepad. Sau đó chúng ta tìm đến các tệp tin đó và xóa nó đi. Nhưng các bạn đừng nghĩ chỉ xóa rồi là xong nhé. Trong các dòng code của website có những dòng “GỌI” các tệp tin này. Chúng ta phải tìm được các dòng đó và xóa đi nữa thì việc xóa file không cần thiết trên website mới hoàn thành. Nói thật thì tôi cũng đã từng tự hỏi như vậy và sẽ giải thích cho các bạn hiểu một cách đơn giản là: Người lập trình ra theme này không phải chỉ dành riêng cho công việc kinh doanh của bạn, mà còn cho những người khác dùng nữa. Có người thì làm website bán mỹ phẩm, có người thì làm website bán điện lạnh, có người giày da, có người thì dép lào,… nên nhiệm vụ của người lập trình theme này là để có thể đáp ứng được tất cả những người dùng như vậy. Và đương nhiên nếu bạn đang bán mỹ phẩm thì chắc chắn sẽ không cần các chức năng của ông bán dép lào đúng ko? Vậy nên chúng ta phải loại bỏ các file của ông dép lào đi để website của chúng ta nhẹ hơn. Tiếp theo việc tối ưu. Chắc một điều, file nào không dùng thì xóa đi. Nhưng có những file không dùng ở thời điểm này, nhưng lại dùng ở thời điểm khác thì chúng ta không được xóa file đó đi, mà hãy hoãn tải các file đó lại hoặc đặt điều kiện sử dụng file đó. Để làm được điều này, chúng ta có thể sử dụng đoạn mã như sau: [code] function defer_parsing_of_js ( $url ) { if ( FALSE === strpos( $url, ‘.js’ ) ) return $url; if ( strpos( $url, ‘jquery.js’ ) ) return $url; return “$url’ defer “; } add_filter( ‘clean_url’, ‘defer_parsing_of_js’, 11, 1 ); [/code] Chèn đoạn mã trên vào file Function.php trên theme của bạn và lưu lại. Đoạn mã trên sẽ giúp các file jquery được trì hoãn tải trên trang. Hoặc / Và di chuyển các dòng gọi của file này xuống dưới thẻ <footer> thay vì đang ở <header>. Để áp dụng được điều này, các bạn cần tìm các dòng gọi trên header và xóa đi, sau đó thêm đoạn mã sau vào: [code] add_action(‘wp_enqueue_scripts’, ‘enqueue_my_scripts’); function enqueue_my_scripts() { wp_enqueue_script(‘wmtp-jquery-migrate’, get_template_directory_uri() . ‘/wp-includes/js/jquery/jquery-migrate.min.js’, array(‘jquery’), false, true); //Làm tương tự cho các tệp js / css khác. } [/code] Ở đoạn mã trên mình muốn đưa file jquery-migrate.min.js xuống <footer> sẽ dùng đến lệnh có cú pháp: [code] wp_enqueue_script($handle, $src, $deps, $ver, $in_footer) [/code] Giải thích về các biến bên trong:
              • $Handle – Handle là tên duy nhất mà file script của bạn có. Ví dụ script của tôi được gọi là “wmtp-jquery-migrate”.
              • $Src – src là vị trí đường dẫn của script. Bạn có thể sử dụng Plugins “What the file” để có được chính xác URL của thư mục plugins hoặc nếu biết code thì có thể sử dụng hàm plugin_url.
              • $DEPS – DEPS là dependence. Khi script sử dụng jQuery, thì website sẽ thêm jQuery vào dependence. WordPress sẽ tự động tải jQuery nếu nó không được tải sẵn trên trang web.
              • $Ver – Đây là số phiên bản của script. Tham số này là không cần thiết nên tôi đã đặt nó thành False.
              • $In_footer – Đây mới là biến quan trọng, chúng ta muốn tải JavaScripts và CSS vào footer nên chúng ta sẽ thiết lập nó là True.
              Khi các bạn đã làm được hết phần này, thì đã giải quyết được lỗi trì hoãn tải các hình ảnh ngoài màn hình (Defer loading of off-screen images)

              Rút gọn Javascript (Minify Javascript) và rút gọn CSS (Minify CSS)

              Đến phần này thì khỏe hơn xíu rồi. Để rút gọn Javascript hay CSS thì các bạn có thể sử dụng plugin Autoptimze click chọn như sau: Tối ưu web wordpress để pagespeed insights màu xanh Tối ưu web wordpress để pagespeed insights màu xanh Như vậy là đã giải quyết được lỗi Minify Javascript một cách dễ dàng. Công cụ Autoptimize đã khá mạnh rồi nên chúng ta có thể không cần sử dụng đến code nữa. Nếu bạn nào có nhã hứng sửa code thì có thể thử với gợi ý của tôi dưới đây: Gộp các file CSS thành 1 file duy nhất và các file Javascript thành 1 file duy nhất. Sau đó xóa các lệnh “gọi” file đi và để lại 1 lệnh gọi của file đã gộp. Như vậy, chúng ta đã giải quyết được bài toán Minify Javascript & CSS

              Xóa biểu định kiểu xếp chồng CSS không dùng (Remove Unused CSS)

              Mặc dù người thiết kế website có PRO đến đâu đi nữa, tôi cũng tin chắc họ sẽ để thừa một số dòng CSS không cần dùng đến vì đã có dòng khác thay thế. Công việc của chúng ta là loại bỏ các dòng CSS thừa đó đi là được. Để có thể xem các file nào có tỉ lệ css không dùng đến thì các bạn có thể sử dụng công cụ: purifycss.online kiểm tra và tải xuống bản CSS hoàn thiện hơn. Mặc khác, bạn có thể chuyển các dòng trong file css thành 1 dòng duy nhất và hạn chế khoảng trống bằng cách dùng công cụ sau: jonassebastianohlsson.com Khuyến nghị: Backup website trước khi thực hiện thay đổi các file CSS.

              Đảm bảo văn bản vẫn hiển thị khi tải Font chữ web

              Mặc định các theme wordpress thường sử dụng font từ Google Font, nhưng điều này làm cho website của chúng ta trong khi load sẽ phải kết nối đến Google Font và load font về website. Như vậy sẽ làm chậm tốc độ tải website của chúng ta. Vì vậy, để có thể khắc phục việc này, chúng ta cần phải đưa Font chữ từ Google Font lên website và kết nối cục bộ. Các bạn truy cập: fonts.google.com, sau đó chọn font chữ mình thích hoặc website của các bạn đang sử dụng font gì thì chọn font đó trên Google Font và tải về. Tối ưu web wordpress để pagespeed insights màu xanh Khi tải về, định dạng font sẽ là *.ttf và việc của chúng ta cần làm là convert định dạng *.ttf sang *.woff2. Các bạn có thể truy cập trang font-converter.net để thực hiện việc chuyển đổi định dạng. OK, sau khi chuyển đổi định dạng xong, chúng ta tải font *.woff2 lên hosting bằng cách sử dụng Winscp, Filezila hoặc truy cập trực tiếp vào hosting ở mục File Manager > Publish_html tạo một folder mới đặt tên là fonts. Tiếp theo, chúng ta vào tệp styles.css hoặc bất cứ nơi đâu bạn có thể chèn code CSS và dán đoạn mã dưới đây vào [code] @font-face { font-family: “roboto”; src: url(“./fonts/roboto.woff2”) format(“woff2”); /* Modern Browsers */ font-weight: normal; font-style: normal; font-display: swap; } h1,h2,h3,h4,h5,h6 {font-family: “roboto”;} p, span {font-family: “roboto”;} nav>li {font-family: “roboto”;} [/code] roboto: là tên font của bạn, đặt tên tùy ý. Sau đó bạn muốn gắn vào thẻ nào thì liệt kê thẻ đó ngay bên dưới. Ở đây tôi gắn các thẻ h, p, span và li trên menu sẽ dùng font roboto. font-display: swap cần được thêm vào để giúp font được tải tối ưu hơn. Và bạn có thể làm tương tự với các font khác để khắc phục lỗi Đảm bảo văn bản vẫn hiển thị khi tải Font chữ web.

              Phân phối các nội dung tĩnh bằng chính sách bộ nhớ đệm hiệu quả (Leverage browser caching)

              Để có thể kích hoạt bộ nhớ đệm thì ngoài việc chúng ta sử dụng Litespeed thì chúng ta thêm các đoạn mã dưới đây vào file .htaccess [code] ## EXPIRES CACHING ## ExpiresActive On ExpiresByType image/jpg “access 1 year” ExpiresByType image/jpeg “access 1 year” ExpiresByType image/gif “access 1 year” ExpiresByType image/png “access 1 year” ExpiresByType text/css “access 1 month” ExpiresByType text/html “access 1 month” ExpiresByType application/pdf “access 1 month” ExpiresByType text/x-javascript “access 1 month” ExpiresByType application/x-shockwave-flash “access 1 month” ExpiresByType image/x-icon “access 1 year” ExpiresDefault “access 1 month” ## EXPIRES CACHING ## [/code] Và thêm đoạn này: [code] # 1 Month for most static assets <filesMatch “.(css|jpg|jpeg|png|gif|js|ico)$”> Header set Cache-Control “max-age=2592000, public” [/code] Trên đây là các định dạng sẽ tạo cache. Nếu trên website của bạn có thêm định dạng khác thì bạn có thể thêm vào. Ví dụ đối với webmtp thì tôi có thêm định dạng ảnh SVG thì tôi thêm dòng [code] ExpiresByType image/svg+xml “access plus 1 year” [/code] Như vậy chúng ta đã tiếp tục hoàn thành thêm một lỗi nữa.

              Tránh kích thước DOM quá lớn

              Đây là lỗi mà các bạn sẽ rất hay gặp phải bởi tính cầu toàn của bản thân. Một trang có rất nhiều DOM, DOM ở đây là những thành phần trên trang web của chúng ta. Trên website cứ mỗi 1 element là 1 DOM, chỉ cần 1 khối tin như hình thôi là đã sinh ra mấy chục DOM rồi. Vậy chúng ta cần phải làm thế nào để hạn chế nhiều DOM? Cách tốt nhất là nhìn lại tổng website xem phần nào cảm thấy dư thừa thì hãy bỏ nó đi, có như vậy các bạn mới có thể giảm DOM cho website.

              Giảm thời gian thực thi JavaScript

              Cũng như lỗi chặn hiển thị JavaScript, các website WordPress luôn chứa nhiều JavaScript (JS) từ theme và plugin, bạn có thể tắt bớt plugin để giảm thời gian thực thi JavaScript hoặc nếu không thể tắt bớt plugin thì tìm cách loại bỏ bớt JavaScript nào không cần dùng đến trên plugin. Để làm được điều này, các bạn có thể sử dụng biện pháp wp_dequeue_stylewp_dequeue_script và wp_enqueue_stylewp_enqueue_script để tắt và thay thế các tệp tin tối ưu hơn. Ví dụ một function mà tôi đã sử dụng để tối ưu: [code] add_action( ‘wp_enqueue_scripts’, ‘wmtp_change_style_script’, 99 ); function wmtp_change_style_script() { wp_deregister_script(‘flatsome-js’); wp_register_script(‘flatsome-js’, get_stylesheet_directory_uri() . ‘/assets/js/flatsome.js’, false, false, true); wp_enqueue_script(‘flatsome-js’); } [/code]

              Tránh các tài nguyên lớn trên mạng

              Tránh các tài nguyên lớn trên mạng nghĩa là gì? Trang web của chúng ta sẽ luôn bắt buộc tích hợp các mã js từ bên thứ 3 như Google Analytics, Facebook Pixel, tích hợp Fanpage,… như vậy website của chúng ta sẽ phải tải một mớ tài nguyên đó về web để hiển thị. Điều này sẽ làm cho website của chúng ta tải chậm hơn. Vì vậy, nếu các bạn buộc phải tích hợp các mã js của bên thứ 3 vào thì lời khuyên của mình là đừng đưa nó vào công cụ Google Tag Manager rồi trỏ lên website. Có thể Tag Manager giúp các bạn quản lý các mã JS dễ dàng nhưng vô tình lại làm cho website của các bạn bị chậm đi. Và cố gắng loại bỏ các JS bên thứ 3 không cần thiết trên website của các bạn để giảm lỗi tài nguyên lớn này.

              Cách khác dùng plugin tăng điểm

              Plugin WP Meteor Page Speed Optimization Topping giúp chúng ta tăng tốc độ tải trang và đồng thời tăng điểm google pagespeed insights để chiều anh Google và chiều Khách hàng. Dù điểm số có thể cao nhưng đổi lại bạn phải chấp nhận đôi khi vào website có thể sẽ có 1 số phần tử bị load chậm hơn bình thường (nhập tên miền enter rồi để chuột yên đó chờ nó load nên cảm thấy chậm. Còn người dùng vào web cái sẽ có hành động di chuột thì lúc đó js sẽ dc load luôn và không phải chờ 2s mới load js dẫn đến không còn cảm giác chậm nữa). Plugin này thật sự làm mình bất ngờ khi nó tăng điểm 1 cách kinh khủng luôn. Plugin này đã làm cho các js (js của web và cả js của các công cụ khác như chat online, google tracking, facebook fixel…) không tải ngay khi khách vào website mà cho tới khi người dùng thực hiện hành động nào đó hoặc trễ trong khoảng thời gian nào đó do mình cài đặt. Sau đó vào cài đặt tại menu Cài đặt > WP Meteor và chọn mức độ bạn muốn. Hiện tại plugin có 3 mức độ là: 1, 2 và ∞. Như web demo mình để ở mức 2 nhé cả nhà Tối ưu web wordpress để pagespeed insights màu xanh Các mức độ đó có ý nghĩa gì?
              • Mức 1: Dành cho web nào hiện tại đang tốc độ load thực tế rất nhanh dưới 1s mà điểm google pagespeed insights vẫn thấp. Ở mức độ này sẽ ít ảnh hưởng tới trải nghiệm của người dùng nhất.
              • Mức 2: Dành cho website tốc độ load thực tế chưa được nhanh lắm. Ở mức độ này đa số là điểm google đã xanh lét lèn lẹt rồi nha cả nhà. Nhưng nhược điểm của nó là ở màn hình đầu tiên có thể 1 số phần tử sẽ bị load chậm hơn. ví dụ như ảnh mà để ở lazyload sẽ bị load chậm hơn bình thường
              • Mức ∞ tại mức độ này thì mọi js đều không được load cho tới khi nào người dùng thực hiện 1 hành động nào đó trên trang thì js mới được load. Mở mức này thì chắc chắn điểm web bạn sẽ xanh nhưng trải nghiệm người dùng cũng như bộ đếm google tracking có thể sẽ không làm việc
              Cài plugin này rồi có cần cài plugin cache khác không? ồ chắc chắn rồi. Plugin này chỉ hỗ trợ bạn tải chậm các js tránh gây ảnh hưởng ở thời gian đầu load trang thôi nên bạn vẫn cài các plugin cache khác như bình thường nhé. Để điểm số được như ý các bạn cần tối ưu ảnh, css và cache page tĩnh nữa nha. Ví dụ combo đầy đủ nhất mình hay dùng là
              • Redis cache để tối ưu cho sql
              • Opcache để lưu cache các file php
              • WP Rocket để lưu trang tĩnh. nếu dùng WP Rocket các bạn cứ bật full option lên nhé (Hoặc các plugin cache khác như Autoptimize, WP Total Cache, WP Super Cache, LiteSpeed Cache… tùy vào hosting của bạn)
              Tham khảo thêm cách cấu hình plugin cache https://thuthuatwp.com/cau-hinh-w3-total-cache-chuan/

              Dịch vụ tối ưu hóa tăng tốc website wordpress chuyên nghiệp

              WPVN.XYZ sẽ khiến bạn hài lòng với đội ngũ nhân viên chuyên nghiệp kết hợp cùng các kỹ năng thiết kế, lập trình và chăm sóc website từ các lập trình viên sẽ tư vấn và hỗ trợ khách hàng xây dựng một website 100% chuẩn SEO, tốc độ load trang “tiêu chuẩn”, nội dung thu hút, tăng traffic và tăng thứ hạng website lên TOP nhanh chóng. Nếu bạn đang có nhu cầu về tối ưu hóa website wordpress thì hãy liên hệ ngay với chúng tôi để được hỗ trợ.

              Trì hoãn chạy JavaScript trong WordPress

              Trì hoãn phân tích cú pháp JavaScript có nghĩa là chỉ tải tệp JavaScript sau khi tất cả tệp HTML và css được tải hoàn toàn. Đó là nhiều lý do khiến chúng ta nên trì hoãn việc tải javascript. Nhưng hầu hết mọi người đều cân nhắc đến tốc độ khi hoãn các tệp JavaScript. Các tệp JavaScript được đặt giữa thẻ head của trang web của chúng tôi và khi trình duyệt thực hiện lệnh gọi đến tất cả các tệp, nó được gửi theo trình tự nhất định của nó. Vì Google yêu cầu chúng tôi ưu tiên nội dung trong màn hình đầu tiên mà chỉ có thể được thực hiện bằng cách hoãn tất cả các tệp JavaScript và Loại bỏ JavaScript và CSS chặn hiển thị trong màn hình đầu tiên . Để nâng cao tốc độ, Google đã phát hành amp (các trang được tăng tốc trên thiết bị di động) tải mà không cần tệp javascript và ngày nay điều này rất quan trọng đối với tất cả các trang web.

              Lợi ích của việc Trì hoãn phân tích cú pháp JavaScript .

              • Tăng trải nghiệm người dùng bằng cách tải trang web trong mili giây.
              • Tăng thứ hạng SEO của bạn.
              • Google Bots sẽ thu thập dữ liệu trang web của bạn nhanh hơn
              Để làm được điều đó, bạn cần đăng nhập vào wp-admin của mình. Sau đó nhấp vào giao diện rồi đến trình chỉnh sửa chủ đề. Bên trong đó, tìm tệp Function.php và dán mã sau
              
              function defer_parsing_of_js ( $url ) {
              if ( FALSE === strpos( $url, ‘.js’ ) ) return $url;
              if ( strpos( $url, ‘jquery.js’ ) ) return $url;
              return “$url’ defer “;
              }
              add_filter( ‘clean_url’, ‘defer_parsing_of_js’, 11, 1 );
              
              

              Ngoài ra dùng sử dụng các plugin: Wp rocket, Comet cache, WP Deferred JavaScripts, Autoptimize, W3 Total Cache, Speed Booster Pack, Wp fastest cache. Ví dụ Wp rocket (gomahamaya.com/defer-parsing-of-javascript/)

              Tối ưu web wordpress để pagespeed insights màu xanh

              Hiệu ứng dùng CSS

              Hiệu ứng dùng CSS
              Nội dung

                Tạo hiệu ứng chuyển động trong CSS3 cho phép chúng ta tạo ra các hiệu ứng mà không cần phải sử dụng Javascript hay Flash. Animation giúp Website chúng ta trở nên chuyên nghiệp mà bắt mắt với người dùng hơn. Trong bài viết này sẽ góp nhặt đến các bạn những hiệu ứng nhỏ gọn cho một thẻ div nhờ sử dụng HTML5 và CSS3.
                Gắn css trong bài viết

                
                
                
                

                 

                 

                 

                Tạo hiệu ứng ánh sáng khi hover vào hình ảnh trong Flatsome

                Đoạn CSS sau theo đường dẫn: Giao diện > Tuỳ biến > Add custom CSS
                .product-small .box-image:hover::before{
                -webkit-animation:shine .75s;animation:shine .75s
                }
                @-webkit-keyframes shine{
                100%{left:125%}
                }
                @keyframes shine{
                100%{left:125%}
                }
                .product-small .box-image::before{
                position:absolute;
                top:0;
                left:-75%;
                z-index:2;
                display:block;
                content:'';
                width:50%;
                height:100%;
                background:-webkit-linear-gradient(left,rgba(255,255,255,0) 0,rgba(255,255,255,.3) 100%);
                background:linear-gradient(to right,rgba(255,255,255,0) 0,rgba(255,255,255,.3) 100%);
                -webkit-transform:skewX(-25deg);transform:skewX(-25deg)
                }

                Thu gọn tiêu đề sản phẩm thành 2 dòng

                p.name.product-title a {
                padding-top: 5px;
                text-align: center;
                color: #000;
                font-weight: 900;
                overflow: hidden;
                text-overflow: ellipsis;
                display: -webkit-box;
                -webkit-box-orient: vertical;
                -webkit-line-clamp: 2;

                Lưu ý: Sửa các thông tin sau theo ý của bạn

                • -webkit-line-clamp: 2; là số dòng các bạn muốn cắt, nếu chỉ muốn cắt thành 1 dòng thì thay bằng số 1,..
                • font-weight: là độ dày của chữ, các bạn muốn nó thanh mảnh hơn thì giảm còn 600

                Chia Form thành 2 cột & Chèn icon vào Contact Form 7

                Đoạn HTML chèn vào tab “Nội dung Form”

                <div class="form-contact-twocol">
                   <div id="info-left">
                   <p>
                [text]

                <i id=”icon-form” class=”icon-user”></i></p>
                </div>
                <div id=”info-right”>
                <p>[tel* your-number placeholder “Di động *”]<i id=”icon-form” class=”icon-phone”></i></p>
                </div>
                </div>
                <p>[email your-email placeholder “Email”]<i id=”icon-form” class=”icon-envelop”></i></p>
                <p>

                
                [text]

                <i id=”icon-form” class=”icon-pen-alt-fill”></i></p>
                <p>[textarea your-message placeholder “Nội dung email…”]<i id=”icon-form” class=”icon-chat”></i></p>
                <center>[submit class:button primary “Gửi Đi”]</center>

                 Đoạn CSS chia cột và chèn icon vào Form, các bạn dán vào mục “CSS tùy chỉnh” trong “Tùy biến” hoặc mục “Custom CSS” trong “Advance” của theme Flatsome.
                /*-- chia cột Form --*/#info-left {
                    width: 49%;
                    float: left;
                    margin-right:2%;
                }
                #info-right {
                    width: 49%;
                    float: right;
                }
                .form-contact-twocol:after {
                    content:"020";
                    display:block;
                    height:0;
                    clear:both;
                    visibility:hidden;
                    overflow:hidden;
                    margin-bottom:10px;
                }
                .form-contact-twocol {
                    display:block;
                }
                /*-- Chèn icons lên Form --*/.wpcf7 p{ position: relative; }
                #icon-form{
                  position: absolute;
                  color: #666666;
                  z-index: 100;
                  font-size: 18px;
                  top: 8px;
                  right: 10px;
                }

                Hiệu ứng dùng CSS


                .btn-11 {
                border: none;
                background: rgb(4 34 145);
                background: linear-gradient(0deg,rgb(7 35 124)0%,rgb(0 100 251)100%);
                color: #fff;
                overflow: hidden;
                }
                .btn-11:hover {
                text-decoration: none;
                color: #fff;
                }
                .btn-11:before {
                position: absolute;
                content: '';
                display: inline-block;
                top: -180px;
                left: 0;
                width: 30px;
                height: 100%;
                background-color: #fff;
                animation: shiny-btn1 3s ease-in-out infinite;
                }
                .btn-11:hover{
                opacity: .7;
                }
                .btn-11:active{
                box-shadow: 4px 4px 6px 0 rgba(255,255,255,.3),
                -4px -4px 6px 0 rgba(116, 125, 136, .2),
                inset -4px -4px 6px 0 rgba(255,255,255,.2),
                inset 4px 4px 6px 0 rgba(0, 0, 0, .2);
                }

                @-webkit-keyframes shiny-btn1 {
                0% { -webkit-transform: scale(0) rotate(45deg); opacity: 0; }
                80% { -webkit-transform: scale(0) rotate(45deg); opacity: 0.5; }
                81% { -webkit-transform: scale(4) rotate(45deg); opacity: 1; }
                100% { -webkit-transform: scale(50) rotate(45deg); opacity: 0; }
                }
                https://codepen.io/yuhomyan/pen/OJMejWJ
                https://codepen.io/derekmorash/pen/XddZJY

                https://www.laixe.xyz/2020/07/tao-hieu-ung-rung-lac-khi-re-chuot-vao-anh.html

                img.shake-image:hover {
                /* Start the shake animation and make the animation last for 0.5 seconds */
                animation: shake 0.5s;
                /* When the animation is finished, start again */
                animation-iteration-count: infinite;
                }

                @keyframes shake {
                0% { transform: translate(1px, 1px) rotate(0deg); }
                10% { transform: translate(-1px, -2px) rotate(-1deg); }
                20% { transform: translate(-3px, 0px) rotate(1deg); }
                30% { transform: translate(3px, 2px) rotate(0deg); }
                40% { transform: translate(1px, -1px) rotate(1deg); }
                50% { transform: translate(-1px, 2px) rotate(-1deg); }
                60% { transform: translate(-3px, 1px) rotate(0deg); }
                70% { transform: translate(3px, 1px) rotate(-1deg); }
                80% { transform: translate(-1px, -1px) rotate(1deg); }
                90% { transform: translate(1px, 2px) rotate(0deg); }
                100% { transform: translate(1px, -2px) rotate(-1deg); }
                }

                https://www.niemvuilaptrinh.com/article/Cach-Tao-Hieu-Ung-Zoom-Effect-Cho-Trang-Web2020
                https://codepen.io/haycuoilennao19/pen/NWNbdQJ
                https://dev.to/vaishali1192/create-zoom-in-zoom-out-animation-effect-in-css-5hmg


                .zoom-in-out {
                margin: 24px;
                width: 40%;
                animation: zoom-in-zoom-out 4s ease-out infinite;
                }
                .zoom-in-zoom-out {
                margin: 24px;
                width: 50px;
                height: 50px;
                background: green;
                animation: zoom-in-zoom-out 2s ease-out infinite;
                }
                @keyframes zoom-in-zoom-out {
                0% {
                transform: scale(1, 1);
                }
                50% {
                transform: scale(1.5, 1.5);
                }
                100% {
                transform: scale(1, 1);
                }
                }

                https://blog.hubspot.com/website/css-animation-examples https://blog.hubspot.com/website/css-animation

                Hiệu ứng 3 box xoay vòng

                https://dev.to/pixmy/create-waves-with-pure-css-5gp

                https://codepen.io/Pixmy/pen/qaYQoV

                 


                .boxwave {
                position: fixed;
                top: 0;
                transform: rotate(80deg);
                left: 0;
                }

                .wave {
                position: fixed;
                top: 0;
                left: 0;
                opacity: .4;
                position: absolute;
                top: 3%;
                left: 10%;
                background: #0af;
                width: 354px;
                height: 495px;
                margin-left: -150px;
                margin-top: -250px;
                transform-origin: 50% 48%;
                border-radius: 43%;
                animation: drift 7000ms infinite linear;
                }

                .wave.-three {
                animation: drift 7500ms infinite linear;
                position: fixed;
                background-color: #77daff;
                }

                .wave.-two {
                animation: drift 3000ms infinite linear;
                opacity: .1;
                background: black;
                position: fixed;
                }

                .boxwave:after {
                content: ”;
                display: block;
                left: 0;
                top: 0;
                width: 100%;
                height: 100%;
                z-index: 11;
                transform: translate3d(0, 0, 0);
                }
                @keyframes drift {
                from { transform: rotate(0deg); }
                from { transform: rotate(360deg); }
                }

                Hiệu ứng chuyển màu

                 

                code-boxx.com/css-animation-background-color

                 


                #animation-background-color {
                width: 100%;
                height: 100px;
                animation: morph 3s infinite alternate;
                }
                @keyframes morph {
                0% { background-color: rgba(0, 0, 0, 0); }
                50% { background-color: rgba(255, 0, 0, 0.5); }
                100% { background-color: rgba(0, 255, 0, 1); }
                }

                 

                Scrolling Text Animation

                https://codepen.io/yoannhel/pen/sJpDj

                Hello

                • world !
                • bob !
                • users !
                • everybody !

                .animation {
                position: absolute;
                left: 50%;
                transform: translate(-50%, -50%);
                height: 160px;
                overflow:hidden;
                }
                .animation__container {
                font-weight: 600;
                overflow: hidden;
                height: 40px;
                padding: 0 40px;
                }
                .animation__container:before {
                content: "[";
                left: 0;
                }

                .animation__container:after {
                content: “]”;
                position: absolute;
                right: 0;
                }

                .animation__container:after, .animation__container:before {
                position: absolute;
                top: 0;

                color: #16a085;
                font-size: 42px;
                line-height: 40px;

                -webkit-animation-name: opacity;
                -webkit-animation-duration: 2s;
                -webkit-animation-iteration-count: infinite;
                animation-name: opacity;
                animation-duration: 2s;
                animation-iteration-count: infinite;
                }
                .animation__container__text {
                display: inline;
                float: left;
                margin: 0;
                }

                .animation__container__list {
                margin-top: 0;
                padding-left: 110px;
                text-align: left;
                list-style: none;

                -webkit-animation-name: change;
                -webkit-animation-duration: 10s;
                -webkit-animation-iteration-count: infinite;
                animation-name: change;
                animation-duration: 10s;
                animation-iteration-count: infinite;
                }
                .animation__container__list__item {
                line-height:40px;
                margin:0;
                }

                @-webkit-keyframes opacity {
                0%, 100% {opacity:0;}
                50% {opacity:1;}
                }

                @-webkit-keyframes change {
                0%, 12.66%, 100% {transform:translate3d(0,0,0);}
                16.66%, 29.32% {transform:translate3d(0,-25%,0);}
                33.32%,45.98% {transform:translate3d(0,-50%,0);}
                49.98%,62.64% {transform:translate3d(0,-75%,0);}
                66.64%,79.3% {transform:translate3d(0,-50%,0);}
                83.3%,95.96% {transform:translate3d(0,-25%,0);}
                }

                @-o-keyframes opacity {
                0%, 100% {opacity:0;}
                50% {opacity:1;}
                }

                @-o-keyframes change {
                0%, 12.66%, 100% {transform:translate3d(0,0,0);}
                16.66%, 29.32% {transform:translate3d(0,-25%,0);}
                33.32%,45.98% {transform:translate3d(0,-50%,0);}
                49.98%,62.64% {transform:translate3d(0,-75%,0);}
                66.64%,79.3% {transform:translate3d(0,-50%,0);}
                83.3%,95.96% {transform:translate3d(0,-25%,0);}
                }

                @-moz-keyframes opacity {
                0%, 100% {opacity:0;}
                50% {opacity:1;}
                }

                @-moz-keyframes change {
                0%, 12.66%, 100% {transform:translate3d(0,0,0);}
                16.66%, 29.32% {transform:translate3d(0,-25%,0);}
                33.32%,45.98% {transform:translate3d(0,-50%,0);}
                49.98%,62.64% {transform:translate3d(0,-75%,0);}
                66.64%,79.3% {transform:translate3d(0,-50%,0);}
                83.3%,95.96% {transform:translate3d(0,-25%,0);}
                }

                @keyframes opacity {
                0%, 100% {opacity:0;}
                50% {opacity:1;}
                }

                @keyframes change {
                0%, 12.66%, 100% {transform:translate3d(0,0,0);}
                16.66%, 29.32% {transform:translate3d(0,-25%,0);}
                33.32%,45.98% {transform:translate3d(0,-50%,0);}
                49.98%,62.64% {transform:translate3d(0,-75%,0);}
                66.64%,79.3% {transform:translate3d(0,-50%,0);}
                83.3%,95.96% {transform:translate3d(0,-25%,0);}
                }

                 

                https://thichchiase.com/programing/css/30-hieu-ung-pure-css-animation-snippets/

                https://viblo.asia/p/14-css-tao-hieu-ung-cho-background-tuyet-dep-LzD5djaeZjY

                Gradient Background Animation


                .h100 {
                background: linear-gradient(-45deg, #ee7752, #e73c7e, #23a6d5, #23d5ab);
                background-size: 400% 400%;
                animation: gradient 15s ease infinite;
                width: 200px;
                height: 200px;
                }

                @keyframes gradient {
                0% {
                background-position: 0% 50%;
                }
                50% {
                background-position: 100% 50%;
                }
                100% {
                background-position: 0% 50%;
                }
                }

                Chống SPAM cho Contact Form 7

                Theo https://levantoan.com/chia-se-cach-chong-spam-cho-contact-form-7-hieu-qua-nhat/ có 4 cách

                1: Chống spam bằng field ẩn

                2: Format số điện thoại theo định dạng Việt Nam

                3: Thêm dạng câu hỏi – trả lời vào form

                4: Chống spam bằng cách kiểm tra người dùng đã cuộn chuột (scroll) hay chưa

                Mà bạn đã cài akismet, recaptcha, wordfence, format sđt theo Việt Nam mà vẫn bị spam.

                Thư viện Media dùng chung cho WordPress Multisite

                Thư viện Media dùng chung cho Wordpress Multisite
                Nội dung

                  WordPress Multisite là gì?

                  Một trong những các tính năng thú vị nhất của WordPress nhưng chúng ta lại ít khi tận dụng đó chính là tính năng tạo một mạng lưới nhiều website trên một mã nguồn WordPress duy nhất, tính năng này họ gọi là WordPress Multisite. Ví dụ như trang wpvn.xyz có nhiều trang con như design.wpvn.xyz, code.wpvn.xyz, music.wpvn.xyz và chúng ta có thể sử dụng WordPress Multisite để tạo nhiều trang con trong một mạng lưới như vậy, thậm chí có thể kết nối các người dùng ở mỗi website lại với nhau để họ có thể đăng nhập được trên bất kỳ trang nào trong mạng lưới.

                  Lợi ích và không nên dùng khi nào WordPress Multisite

                  Dễ dàng quản lý bản cập nhật của mã nguồn và của các plugin/theme bởi vì tất cả các website con trong mạng lưới đều dùng chung một mã nguồn, một phiên bản theme và plugin.
                  Có thể tạo ra bao nhiêu website con tùy thích và dễ dàng phân quyền, quản lý nó.
                  Tiết kiệm tài nguyên vì dùng một mã nguồn cho nhiều website sẽ tiết kiệm hơn là mỗi website một mã nguồn.

                  Tuy nhiên, chúng ta nên cân nhắc không nên sử dụng WordPress Multisite khi:

                  Bạn cần database riêng bởi vì tất cả các website con trong một mạng lưới sẽ dùng chung một database, chỉ là nó có những bảng dữ liệu riêng.
                  Hosting từng website riêng biệt.

                  Nhìn chung nếu bạn cần xây dựng một hệ thống website mà bạn tin rằng sẽ không có sự khác biệt quá lớn về hình thức thì có thể dùng tính năng này.

                  Bật Wordpress Multisite ở trang chính

                  Bây giờ bạn mở tập tin wp-config.php của website mẹ cần kích hoạt tính năng này và chèn đoạn sau vào

                  define( ‘WP_ALLOW_MULTISITE’, true );

                  Sau đó vào lại trang quản trị WordPress tìm mục Tools -> Network Setup để bắt đầu cài đặt.

                  Nhưng trước khi chúng ta cài đặt thì cần xác định sẽ sử dụng kiểu WordPress Multisite nào, hiện tại nó có 2 kiểu là:

                  • Subdomain: Các website con sẽ là một địa chỉ theo dạng subdomain của website mẹ. Ví dụ wordpress.thachpham.net, seo.thachpham.net, hosting.thachpham.net,…Và nếu bạn dùng kiểu này sẽ cần thiết lập wildcard DNS như mình hướng dẫn phía dưới.
                  • Sub-directory: Các website con sẽ là một địa chỉ theo dạng thư mục con. Ví dụ: thachpham.net/wordpress, thachpham.net/seo, thachpham.net/hosting,…

                  Phần Network Details bạn nhập tên mạng và địa chỉ email của người quản trị cao nhất vào nhé.

                  Sau đó nhấp nút Install để bắt đầu cài đặt. Nó sẽ chuyển bạn đến trang kế tiếp và bắt đầu chèn những code vào tập tin theo hướng dẫn. Cụ thể là chèn code phía trên vào bên dưới <?php trong wp-config.php và code phía là thay thế các code có sẵn trong .htaccess

                  Sau khi chèn xong các code theo yêu cầu bạn ấn nút Log In để đăng nhập lại và bây giờ bạn sẽ thấy trên menu quản trị có thêm phần My Sites để truy cập vào các website con.

                  Thiết lập trang Media dùng chung các website

                  Một thư viện Media dùng để quản lí tất cả hình ảnh, tập tin đính kèm trong quá trình đăng sản phẩm, tin tức mới. Việc có nhiều website dùng chung tài nguyên phải tốn upload nhiều lần cũng như làm tăng dung lượng hosting. Vi thế việc sử dụng chung như thế là điều cần thiết. Ở đây mình sẽ có 2 plugin cùng chung mục đích trung tâm Media được chia sẻ cho tất cả các trang web trên mạng Multisite.

                  Network Media Library

                  https://github.com/humanmade/network-media-library

                  Mô tả:

                  Plugin nhỏ này chia sẻ phương tiện một cách minh bạch từ một trang Media trung tâm đến tất cả các trang khác trên mạng. Tất cả các phương tiện được tải lên đều được chuyển hướng minh bạch đến trang web trung tâm và sau đó được cung cấp trên toàn mạng. Không có gì được sao chép, nhân bản, đồng bộ hóa hoặc nhân bản, vì vậy đối với mỗi tệp được tải lên chỉ có một tệp đính kèm và một bản sao của tệp.

                  Yêu cầu tối thiểu PHP: 7.0 WordPress: 4.9

                  Plugin phải được cài đặt dưới dạng kích hoạt cho mọi trang. Do đó không thể được kích hoạt trên các trang web riêng lẻ trên mạng.

                  Trước khi kích hoạt phải xem ID website trong mục Tất cả trang mạng (ở đây mặc định là 2) được sử dụng theo mặc định làm thư viện phương tiện trung tâm. Bạn nên định cấu hình ID trang web thư viện Media của mình thông qua chỉnh trong file network-media-library hoặc thông qua hook network-media-library/site_id. Ví dụ:

                  add_filter( 'network-media-library/site_id', function( $site_id ) {
                      return 123;
                  } );

                  Cách sử dụng

                  Sử dụng thư viện Media trên các trang web trong mạng của bạn giống như cách bạn làm bình thường. Tất cả các Media sẽ được lưu trữ minh bạch trên và cung cấp từ trang web thư viện Media trung tâm đã chọn. Chỉ có thể xóa các tệp đính kèm trong khu vực quản trị của thư viện Media trung tâm. Khả năng tương thích Thư viện Media mạng hoạt động minh bạch và liền mạch với tất cả chức năng phương tiện WordPress tích hợp sẵn, bao gồm tải lên tệp, cắt hình ảnh, chèn phương tiện vào bài đăng và xem tệp đính kèm. Chức năng của nó hoạt động với biểu tượng trang web, biểu trưng trang web, hình ảnh nền và tiêu đề, hình ảnh nổi bật, phòng trưng bày, tiện ích âm thanh và hình ảnh, và quản lý phương tiện thông thường. Plugin hoạt động với trình chỉnh sửa khối, trình chỉnh sửa cổ điển, API REST, XML-RPC và tất cả các điểm cuối Ajax tiêu chuẩn để quản lý phương tiện. Các liên kết đến phương tiện từ các trang khác hầu hết đều hoạt động. Khả năng tương thích với các plugin của bên thứ ba là tốt, nhưng không được đảm bảo. Các plugin và thư viện sau được Thư viện phương tiện mạng hỗ trợ rõ ràng:

                  • Advanced Custom Fields
                  • Regenerate Thumbnails
                  • WP User Avatars

                  Các plugin và thư viện sau đã được kiểm tra và xác nhận là tương thích ngay lập tức:

                  • BuddyPress
                  • Extended CPTs
                  • Gutenberg
                  • Stream
                  • User Profile Picture

                  Multisite Global Media

                  https://github.com/humanmade/Multisite-Global-Media

                  Plugin bổ sung một tab mới vào phương thức đa phương tiện, giúp bạn có cơ hội chia sẻ phương tiện từ một trang web đến tất cả các trang web khác của mạng. File multisite-global-media.php sử dụng ID của website trong mục Tất cả trang mạng sẽ là nơi lưu trữ phương tiện toàn cầu. Hiện tại ID trang được đặt ở const SITE_ID = 3; trong file multisite-global-media.php, bạn có thể thay đổi giá trị này để đặt một trong những trang khác làm mặc định để lưu trữ phương tiện toàn cầu. Thông thường chúng ta không nên thay đổi nguồn. Nó dễ dàng hơn nhiều cho việc bảo trì và các điểm khác. Vì vậy, nếu bạn quen thuộc với mã trong ngữ cảnh WordPress, hãy sử dụng hook để thay đổi ID trang web mặc định của plugin bằng một tùy chỉnh nhỏ. Bạn cũng có thể đặt bằng hook global_media.site_id, ví dụ:

                  add_filter( 'global_media.site_id', 1234 );

                  Thư viện Media dùng chung cho WordPress Multisite

                  Thư viện Media dùng chung cho WordPress Multisite

                   

                   

                  Những bài viết cần đọc trước khi cài odoo

                  Maxresdefault 4
                  Nội dung

                    Hướng dẫn cài đặt OpenSSL trên Windows 10

                    Hiện nay, rất nhiều dự án thương mại điện tử và ứng dụng, phát triển trên máy cục bộ Windows 10 của mình và tôi cần kiểm tra các khu vực an toàn của trang web như kiểm tra, hình thức thanh toán và đăng ký. Tất cả các loại biểu mẫu này đều yêu cầu dữ liệu được mã hóa bằng chứng chỉ SSL sử dụng HTTPS. Nhưng làm cách nào để HTTPS hoạt động trong Windows 10

                    PostgreSQL version 12.9 (Ubuntu 12.9-0ubuntu0.20.04.1)

                    https://stackjava.com/ssl/huong-dan-cai-dat-openssl-tren-windows-10.html

                    https://zeropointdevelopment.com/how-to-get-https-working-in-windows-10-localhost-dev-environment/

                    Cách cấp quyền truy cập cổng thông tin khách hàng trong Odoo

                    Odoo có mô-đun cổng thông tin khách hàng, với mô-đun này, khách hàng của chúng tôi có thể đăng nhập vào trang web odoo của chúng tôi và xem các giao dịch của họ. Trong cổng thông tin khách hàng, khách hàng có thể xem các đơn đặt hàng chưa xử lý, đơn đặt hàng đã hoàn thành, hóa đơn chưa thanh toán và các thông tin khác. Khách hàng cũng có thể tải xuống các tài liệu giao dịch của họ như hóa đơn và liên lạc với chúng tôi bằng cách gửi tin nhắn.

                    Bằng cách cung cấp quyền truy cập cổng thông tin khách hàng cho khách hàng của chúng tôi, tôi tin rằng nó có thể làm tăng sự tin tưởng vào các dịch vụ hoặc sản phẩm mà chúng tôi bán. Vì có sự minh bạch trong quá trình hoàn thành giao dịch của khách hàng.

                    Trước khi cấp quyền truy cập cổng thông tin khách hàng cho khách hàng của chúng tôi, hãy đảm bảo rằng máy chủ odoo của chúng tôi có thể được truy cập qua internet và đảm bảo rằng chúng tôi có miền web. Nếu khách hàng của chúng tôi không nhớ IP máy chủ của chúng tôi, thường không phải là một con số đẹp, chúng tôi không thể có miền web hoặc địa chỉ trang web. Nhưng tôi tin rằng họ sẽ phàn nàn nếu chúng tôi không có miền web. Tiếp theo, trong chế độ gỡ lỗi, hãy đảm bảo rằng mô-đun cổng (portal) đã được cài đặt.

                    Những bài viết cần đọc trước khi cài odoo

                    Sau đó, định cấu hình Máy chủ Email Đi trên menu Cài đặt >> Kỹ thuật >> Email >> Máy chủ Email Đi (Settings >> Technical >> Email >> Outgoing Email Servers). Máy chủ Email Đi là địa chỉ email sẽ được odoo sử dụng để gửi tin nhắn cho khách hàng của chúng tôi. Ví dụ, để mời họ đăng nhập vào trang cổng thông tin khách hàng.

                    Những bài viết cần đọc trước khi cài odoo

                    Hình trên là một ví dụ về cách cấu hình Máy chủ Email Đi bằng gmail. Nếu bạn đang sử dụng gmail, hãy đảm bảo rằng bạn đã tạo Mật khẩu ứng dụng . Sau đó Nhấp vào nút Kiểm tra kết nối và đảm bảo rằng không có lỗi.

                    Vào menu Settings >> Technical >> Parameters >> System Parameters , sau đó xem tham số bằng khóa của web.base.url . Thêm tên miền web odoo của chúng tôi, như bên dưới.

                    Những bài viết cần đọc trước khi cài odoo

                    Để cung cấp cho khách hàng hiện tại quyền truy cập cổng thông tin khách hàng, hãy mở biểu mẫu khách hàng chính và đảm bảo rằng email của họ đã được điền. Sau đó nhấp vào nút Hành động và chọn Cấp quyền truy cập Cổng thông tin .

                    Những bài viết cần đọc trước khi cài odoo

                    Sau đó, một cửa sổ mới sẽ xuất hiện. Trong cửa sổ đó, hãy đảm bảo rằng hộp kiểm Trong Cổng được chọn. Sau đó nhấp vào nút Áp dụng.

                    Những bài viết cần đọc trước khi cài odoo

                    Sau đó khách hàng sẽ nhận được một email như bên dưới.

                    Những bài viết cần đọc trước khi cài odoo

                    Nếu khách hàng nhấp vào liên kết trên email đó, khách hàng sẽ được chuyển hướng đến trang web odoo của chúng tôi và sẽ được yêu cầu điền mật khẩu cổng thông tin khách hàng của họ như bên dưới.

                    Những bài viết cần đọc trước khi cài odoo

                    Sau đó, khách hàng có thể đăng nhập vào trang cổng thông tin khách hàng của họ. Đây là một số thông tin mà khách hàng có thể xem trong trang cổng thông tin khách hàng của odoo 13.

                    Trang chủ cổng thông tin khách hàng, với số lượng Đơn đặt hàng và Hóa đơn.Những bài viết cần đọc trước khi cài odoo
                    Chi tiết đơn bán hàng với các thông tin về đơn đặt hàng đã hoàn thành, đơn giao hàng vẫn đang chuẩn bị và các hóa đơn chưa thanh toán.Những bài viết cần đọc trước khi cài odoo
                    Hóa đơn đã thanh toán với thông tin ngày thanh toán và tính năng trò chuyện.Những bài viết cần đọc trước khi cài odoo

                    Sau khi chúng tôi cấp quyền truy cập cổng thông tin khách hàng cho khách hàng của mình, odoo sẽ tạo một người dùng mới với loại Cổng thông tin . Để xem danh sách người dùng cổng thông tin khách hàng, hãy vào menu Cài đặt >> Người dùng & Công ty >> Người dùng , sau đó xóa bộ lọc Người dùng nội bộ.

                    Những bài viết cần đọc trước khi cài odoo

                    Bên cạnh việc có thể cấp quyền truy cập cổng thông tin khách hàng theo cách thủ công, chúng tôi cũng có thể định cấu hình để khách hàng có thể tự đăng ký. Vào menu Cài đặt , sau đó trên Cài đặt chung, đảm bảo rằng nút radio Đăng ký Miễn phí trên khối Tài khoản khách hàng đã được chọn, sau đó nhấp vào Lưu.

                    Những bài viết cần đọc trước khi cài odoo

                    Cách giải quyết lỗi “ProgrammingError: column does not exist” trong Odoo

                    Là một lập trình viên odoo, khi đang phát triển module hoặc addon, bạn đã bao giờ gặp phải điều gì đó khó chịu, chẳng hạn như sau khi làm mới trình duyệt, đột nhiên một thông báo Internal Server Error xuất hiện như bên dưới?

                    Những bài viết cần đọc trước khi cài odoo

                    Sau khi chúng tôi kiểm tra trong thiết bị đầu cuối hoặc tệp nhật ký, hóa ra là có thông báo lỗi ProgrammingError: column res_partner.max_order_item không tồn tại như hình dưới đây.

                    Những bài viết cần đọc trước khi cài odoo

                    Từ hình trên, có thể thấy rằng odoo cho chúng ta biết về cột hoặc trường max_order_item thực sự không tồn tại. Hmmm, nó thực sự không có ở đó? Đây, đây là ảnh chụp màn hình mã nguồn của tôi, rõ ràng có một trường tên là max_order_item .

                    Những bài viết cần đọc trước khi cài odoo

                    Nhưng tại sao odoo vẫn nghĩ rằng trường không tồn tại? Lạ lùng.

                    Thành thật mà nói, khi tôi bắt đầu sự nghiệp của mình với tư cách là một lập trình viên odoo, tôi đã coi lỗi này là lỗi khó chịu nhất. Vì không phải lúc nào lỗi này cũng xảy ra nên rất khó xác định nguyên nhân. Ví dụ trên máy tính của tôi không có lỗi, nhưng khi chúng tôi thử nó trên máy tính của người kiểm tra thì một lỗi xuất hiện. Hoặc trên máy tính của tôi và máy tính của người kiểm tra không có lỗi, nhưng khi chúng tôi tải mô-đun lên máy chủ của khách hàng thì lại xuất hiện lỗi.

                    Trước đây, tôi đã phải mất vài ngày để điều tra những lỗi này và tìm cách giải quyết chúng. Tạ ơn Chúa, cuối cùng nó cũng đơm hoa kết trái

                    Nó chỉ ra rằng lỗi này chỉ xảy ra nếu chúng ta thêm một lĩnh vực mới cho một mô hình nào đó – như xa như tôi biết điều đó chỉ xảy ra trong res.users và res.partner mô hình – trong khi mô-đun hoặc addon nơi chúng tôi thêm lĩnh vực mới này có đã được cài đặt, sau đó chúng tôi khởi động lại dịch vụ odoo và làm mới trình duyệt.

                    Trong trường hợp nghiên cứu, giả sử chúng ta tạo một mô-đun hoặc bổ trợ mới với tên là tutorial_field_not_found với một mô hình kế thừa mô hình res.partner như bên dưới.
                    # -*- coding: utf-8 -*-
                     
                    from odoo import api, fields, models, _
                     
                    class Partner(models.Model):
                        _inherit = 'res.partner'
                     
                        sales_limit = fields.Float(string='Sales Amount Limit')

                    Vì mô-đun tutorial_field_not_found là một mô-đun mới, nên tất nhiên chúng ta phải khởi động lại dịch vụ odoo và cài đặt nó. Không có vấn đề gì cho đến khi ở đây.

                    Sau đó, thêm một trường mới như mã bên dưới, sau khi cài đặt mô-đun hoặc phần bổ trợ.

                    # -*- coding: utf-8 -*-
                     
                    from odoo import api, fields, models, _
                     
                    class Partner(models.Model):
                        _inherit = 'res.partner'
                     
                        sales_limit = fields.Float(string='Sales Amount Limit')
                        # max_order_item field was added after the module has been installed
                        max_order_item = fields.Float(string='Maximum Item in One Order')

                    Khởi động lại dịch vụ odoo, sau đó làm mới trình duyệt của bạn. Tôi có thể chắc chắn rằng thông báo Lỗi máy chủ nội bộ như trong hình ảnh đầu tiên ở trên sẽ xuất hiện.

                    Nếu chúng tôi thay đổi các bước như trước khi thêm trường mới – trong trường hợp này là trường max_order_item – chúng tôi thực hiện hành động gỡ cài đặt trên mô-đun hướng dẫn_field_not_found , thì sau khi thêm các trường mới, chúng tôi cài đặt lại mô-đun, lỗi này sẽ không xuất hiện. Nhưng phương pháp này chắc chắn không thể được thực hiện trong cơ sở dữ liệu sản xuất, vì dữ liệu hiện có sẽ bị mất.

                    Hành động an toàn nhất mà chúng tôi có thể làm là thay đổi trạng thái của mô hình ir.module.module thành được gỡ cài đặt bằng lệnh SQL, thông qua thiết bị đầu cuối hoặc qua ứng dụng PGAdmin, trong cơ sở dữ liệu mà thông báo lỗi xuất hiện. Đây là cách làm.

                    -- change the state of the tutorial_field_not_found module to be uninstalled
                    -- so if we restarted the odoo service, this module will not be read by odoo
                    -- then the error will not occur
                    update ir_module_module set state = 'uninstalled' where name = 'tutorial_field_not_found';
                    

                    Sau khi trạng thái của mô-đun tutorial_field_not_found được gỡ cài đặt , hãy khởi động lại dịch vụ odoo, làm mới trình duyệt, sau đó vào menu Ứng dụng và tìm mô-đun.

                    Những bài viết cần đọc trước khi cài odoo

                    Từ hình trên, chúng ta có thể thấy rằng mô-đun tutorial_field_not_found chưa được cài đặt. Không sao đâu. Nhấp vào nút Cài đặt để cài đặt lại mô-đun.

                    Với cách này chúng ta có thể giải quyết cột không tồn tại lỗi một cách an toàn hơn. Đó là một chút phức tạp, nhưng may mắn thay không phải tất cả các mô hình sẽ gây ra lỗi này nếu chúng ta thêm một lĩnh vực mới để mô hình đó, như xa như tôi biết lỗi này chỉ xảy ra trong res.users và res.partner mô hình duy nhất.

                    Cách khác để giải quyết lỗi này, chúng ta có thể nâng cấp mô-đun thông qua dòng lệnh, không cần thay đổi trạng thái của mô hình ir.module.module .

                    https://en.ngasturi.id/2021/01/15/how-to-solve-the-programmingerror-column-does-not-exist-error-in-odoo/

                    Sao lưu và khôi phục cơ sở dữ liệu lớn trên Odoo

                    Odoo có chức năng sao lưu và khôi phục cơ sở dữ liệu khá dễ sử dụng. Trước đây tôi không gặp vấn đề gì với công việc sao lưu và khôi phục cơ sở dữ liệu. Trước khi điều này đến. Một dự án có cơ sở dữ liệu rất lớn với kích thước hơn 3 GB và vẫn đang tiếp tục phát triển. Lần cuối tôi kiểm tra kích thước cơ sở dữ liệu là hơn 6 GB.

                    Tôi định sao lưu cơ sở dữ liệu từ máy chủ A lớn và khôi phục lại máy chủ B. Tôi không biết nguyên nhân là do internet của tôi chậm hay máy chủ cấu hình không đúng. Quá trình sao lưu thường bị lỗi giữa chừng. Hoặc nó hoạt động nhưng không thể khôi phục kết quả sao lưu trên máy chủ B.

                    Cuối cùng, tôi đã phải sửa đổi một chút chức năng sao lưu và khôi phục của odoo, và cảm ơn Chúa là nó đã hoạt động. Đây là những gì tôi đã làm. Có thể hữu ích cho bạn.

                    Quy trình sao lưu

                    Trước khi bắt đầu, vui lòng xem lộ trình hoặc bộ điều khiển mặc định của chức năng sao lưu trong tệp /web/controllers/main.py bên dưới.

                    @http.route('/web/database/backup', type='http', auth="none", methods=['POST'], csrf=False)
                    def backup(self, master_pwd, name, backup_format = 'zip'):
                        try:
                            odoo.service.db.check_super(master_pwd)
                            ts = datetime.datetime.utcnow().strftime("%Y-%m-%d_%H-%M-%S")
                            filename = "%s_%s.%s" % (name, ts, backup_format)
                            headers = [
                                ('Content-Type', 'application/octet-stream; charset=binary'),
                                ('Content-Disposition', content_disposition(filename)),
                            ]
                            dump_stream = odoo.service.db.dump_db(name, None, backup_format)
                            response = werkzeug.wrappers.Response(dump_stream, headers=headers, direct_passthrough=True)
                            return response
                        except Exception as e:
                            _logger.exception('Database.backup')
                            error = "Database backup error: %s" % (str(e) or repr(e))
                            return self._render_template(error=error)

                    Từ tuyến đường hoặc bộ điều khiển ở trên, tôi sao chép nó và thực hiện một thay đổi nhỏ, vì vậy phương pháp được chấp nhận là GET thay vì POST . Tôi hy vọng, tôi có thể sử dụng lệnh wget từ máy chủ B, vì vậy tôi có thể sao lưu cơ sở dữ liệu tồn tại trong máy chủ A trực tiếp từ máy chủ B và lưu kết quả trực tiếp trong máy chủ B mà không cần sử dụng giao diện người dùng sao lưu và khôi phục mặc định của odoo, vì vậy Tôi không cần lưu kết quả sao lưu trong máy tính của mình và tải nó lên máy chủ B. Đây là tuyến đường hoặc bộ điều khiển mà tôi đã thêm.

                    @http.route('/web/database/backup-custom', type='http', auth="none", methods=['GET'], csrf=False)
                    def backup_custom(self, master_pwd, name, backup_format = 'zip'):
                        try:
                            odoo.service.db.check_super(master_pwd)
                            ts = datetime.datetime.utcnow().strftime("%Y-%m-%d_%H-%M-%S")
                            filename = "%s_%s.%s" % (name, ts, backup_format)
                            headers = [
                                ('Content-Type', 'application/octet-stream; charset=binary'),
                                ('Content-Disposition', content_disposition(filename)),
                            ]
                            dump_stream = odoo.service.db.dump_db(name, None, backup_format)
                            response = werkzeug.wrappers.Response(dump_stream, headers=headers, direct_passthrough=True)
                            return response
                        except Exception as e:
                            _logger.exception('Database.backup')
                            error = "Database backup error: %s" % (str(e) or repr(e))
                            return self._render_template(error=error)

                    Sau khi tôi thêm mã ở trên vào máy chủ A, ngay lập tức tôi khởi động lại dịch vụ odoo. Sau đó, trên máy chủ B thông qua ssh, tôi nhập thư mục / home / ubuntu / backup mà tôi muốn lưu kết quả sao lưu từ máy chủ A. Bạn có thể chọn một thư mục khác nếu muốn. Sau đó chạy lệnh này trên thiết bị đầu cuối B của máy chủ.

                    wget -O test.zip "http://33.33.33.33:8069/web/database/backup-custom?master_pwd=admin&name=test&backup_format=zip"

                    Ý nghĩa của đoạn mã trên là sao lưu cơ sở dữ liệu có tên là “test” trên máy chủ A (IP 33.33.33.33) và lưu nó dưới dạng tệp “test.zip” trên máy chủ B. Giả sử mật khẩu chính của odoo trên máy chủ A là “quản trị viên” và có định dạng sao lưu zip. Sau khi quá trình hoàn tất, tệp sao lưu sẽ được lưu trong /home/ubuntu/bakcup/test.zip trên máy chủ B.

                    Nếu kích thước cơ sở dữ liệu lớn hơn một chút nên mất nhiều thời gian hơn và gây ra lỗi wget timeout, thường thì tôi thêm tùy chọn timeout trong lệnh wget và thực hiện lệnh sao lưu trong máy chủ A thay vì máy chủ B. Sau khi quá trình sao lưu kết thúc. , Tôi gửi kết quả sao lưu đến máy chủ B bằng lệnh sftp . Đây là cách tôi thực hiện quá trình sao lưu trong máy chủ A với tùy chọn thời gian chờ.

                    wget -T 10800 -O test.zip "http://127.0.0.1:8069/web/database/backup-custom?master_pwd=admin&name=test&backup_format=zip"
                    

                    Với tùy chọn -T 10800 ở trên, wget sẽ tăng lỗi thời gian chờ sau 3 giờ. Bạn có thể thay đổi giá trị trong vài giây.

                    Quá trình khôi phục

                    Vui lòng xem tuyến đường mặc định của odoo hoặc bộ điều khiển chức năng khôi phục bên dưới

                    @http.route('/web/database/restore', type='http', auth="none", methods=['POST'], csrf=False)
                    def restore(self, master_pwd, backup_file, name, copy=False):
                        try:
                            data_file = None
                            db.check_super(master_pwd)
                            with tempfile.NamedTemporaryFile(delete=False) as data_file:
                                backup_file.save(data_file)
                            db.restore_db(name, data_file.name, str2bool(copy))
                            return http.local_redirect('/web/database/manager')
                        except Exception as e:
                            error = "Database restore error: %s" % (str(e) or repr(e))
                            return self._render_template(error=error)
                        finally:
                            if data_file:
                                os.unlink(data_file.name)

                    Từ đoạn mã trên, chúng ta có thể thấy rằng phương thức được hàm khôi phục chấp nhận là một ĐĂNG . Và backup_file mà chúng tôi gửi qua giao diện người dùng sẽ được lưu dưới dạng tệp tạm thời và sẽ bị xóa khi quá trình khôi phục hoàn tất. Đây là chức năng khôi phục mới mà tôi Thêm trên máy chủ B.

                    @http.route('/web/database/restore-custom', type='http', auth="none", methods=['GET'], csrf=False)
                    def restore_custom(self, master_pwd, backup_file, name, copy=False):
                        try:
                            data_file = None
                            db.check_super(master_pwd)
                            db.restore_db(name, backup_file, str2bool(copy))
                            return http.local_redirect('/web/database/manager')
                        except Exception as e:
                            error = "Database restore error: %s" % (str(e) or repr(e))
                            return self._render_template(error=error)
                        finally:
                            if data_file:
                                os.unlink(data_file.name)

                    Từ chức năng khôi phục bổ sung ở trên, chúng tôi không cần gửi tệp sao lưu đến máy chủ B và cũng không cần lưu nó dưới dạng tệp tạm thời vì tệp đã có trên máy chủ B. Hãy nhớ rằng chúng tôi đã sao lưu cơ sở dữ liệu từ máy chủ A và lưu trữ nó trong thư mục / home / ubuntu / backup . Chúng ta chỉ cần cung cấp tham số backup_file với đường dẫn đầy đủ của tệp sao lưu đã nén trên máy chủ B, ví dụ /home/ubuntu/backup/test.zip . Sau đó, sau khi khởi động lại dịch vụ odoo trên máy chủ B, tôi chạy lệnh sau để bắt đầu quá trình khôi phục.

                    wget "http://44.44.44.44:8069/web/database/restore-custom?master_pwd=admin&backup_file=%2Fhome%2Fubuntu%2Fbackup%2Ftest.zip&name=test_restore& copy=true"
                    

                    Ý nghĩa của đoạn mã trên là khôi phục tệp /home/ubuntu/backup/test.zip trên máy chủ B (IP 44.44.44.44) thành một cơ sở dữ liệu mới với tên test_restore .

                    Sau khi quá trình hoàn tất, một cơ sở dữ liệu mới với tên test_restore sẽ xuất hiện trên cài đặt máy chủ B odoo. Đây là cách tôi sao lưu và khôi phục cơ sở dữ liệu lớn trên odoo.

                    https://en.ngasturi.id/2020/12/05/how-i-backup-and-restore-large-database-on-odoo/

                    Dùng thư viện sao lưu và khôi phục cơ sở dữ liệu Odoo lớn

                    Trong bài viết trước, tôi đã thảo luận về cách sao lưu và khôi phục cơ sở dữ liệu odoo lớn, bằng cách sửa đổi bộ điều khiển odoo. Sau một thời gian sử dụng phương pháp này trong một số dự án, nó chỉ ra rằng phương pháp này có điểm yếu. Đôi khi không thể khôi phục tệp sao lưu. Tệp sao lưu dường như bị hỏng, vì vậy nó không thành công khi chúng tôi khôi phục nó trên một máy chủ khác. Tôi vẫn không biết những gì gây ra vấn đề này.
                    Để sử dụng thư viện trên, trước tiên chúng ta phải cài đặt nó.
                    sudo pip3 install click-odoo-contrib
                    Quan trọng!!!
                    Tùy thuộc vào cách bạn cài đặt odoo, bạn có thể không sử dụng được thư viện này trên máy chủ của mình. Theo như tôi biết, nếu chúng ta cài đặt odoo bằng tệp .deb thì thư viện này có thể được sử dụng trơn tru. Nhưng nếu chúng ta cài đặt odoo bằng Yenthe666 / InstallScript thì không thể sử dụng thư viện này. Kết luận của tôi cho đến nay là, nếu các tệp và thư mục odoo nằm trong thư mục thư viện python (/ usr / lib / python3 / dist-pack) thì thư viện này có thể được sử dụng, nếu không thì không. Tôi chưa thử thư viện này trên bất kỳ phương pháp cài đặt odoo nào khác, ngoài 2 phương pháp trên.
                    Để sao lưu cơ sở dữ liệu, chúng ta có thể sử dụng lệnh như trong tài liệu thư viện trên github. Nhưng tôi không khuyên bạn nên sao lưu cơ sở dữ liệu ở định dạng zip.
                    Bởi vì sau khi tôi thử nó, quá trình này diễn ra khá lâu. Theo kinh nghiệm của tôi, khi tôi sao lưu cơ sở dữ liệu với kích thước 1,2GB và sử dụng định dạng zip, quá trình này vẫn chưa kết thúc sau hơn 3 giờ đồng hồ. Trong khi đó, nếu tôi thay đổi định dạng thư mục thì quá trình sao lưu có thể hoàn tất trong vòng 1 giờ 30 phút.
                    Đây là lệnh cách sao lưu cơ sở dữ liệu với tên my_database để được lưu dưới dạng thư mục mới với tên my_database_backup trong thư mục / home / ngasturi / Documents giả sử tệp cấu hình odoo nằm trong / etc / odoo / odoo.conf
                    click-odoo-backupdb -c /etc/odoo/odoo.conf –format folder my_database /home/ngasturi/Documents/my_database_backup
                    Đây là lệnh cách khôi phục thư mục sao lưu ở trên thành cơ sở dữ liệu mới với tên my_restored_database.
                    click-odoo-restoredb -c /etc/odoo/odoo.conf my_restored_database /home/ngasturi/Documents/my_database_backup
                    Thật không may, khi chúng tôi khôi phục thư mục sao lưu, nội dung của nó, thư mục my_database_backup sẽ bị di chuyển (cắt) đến vị trí odoo my_database_backup vì vậy chúng tôi không thể thực hiện quá trình khôi phục lại lần thứ hai. Do đó, trước khi bạn thực hiện quá trình khôi phục, tôi khuyên bạn nên sao lưu thư mục.
                    Tôi đã cố gắng nén thư mục sao lưu thành tệp .zip nhưng kết quả là không thể khôi phục được. Nội dung của kết quả sao lưu với định dạng thư mục khác với nội dung của kết quả sao lưu với định dạng zip. Đó là đánh giá và kinh nghiệm của tôi về thư viện này. Cho đến nay tôi vẫn đang thử nghiệm thư viện này và vẫn chưa sử dụng nó nhiều trong các dự án mà tôi đang làm, vì vậy tôi vẫn không chắc liệu thư viện này có thể giải quyết vấn đề trong phương pháp đầu tiên hay không.
                    https://en.ngasturi.id/2021/08/21/a-library-for-backup-and-restore-big-odoo-database/

                    Xem log odoo, kiểm soát file log

                    Để xem 100 mục nhập cuối cùng, bao gồm yêu cầu hiện tại, hãy nhập:
                    sudo tail -f -n 100 /var/log/odoo/odoo-server.log
                    Đầu tiên, kiểm tra không gian được thực hiện: du -sh /var/log/journal/
                    du -sh /var/log/odoo/
                    Bạn cũng có thể sử dụng lệnh journalctl cho cùng một tác vụ, Cả hai lệnh sẽ cho kết quả gần giống nhau: journalctl –disk-usage
                    Bây giờ bạn đã biết nhật ký nhật ký chiếm bao nhiêu dung lượng, bạn có thể quyết định xem bạn có muốn xóa nhật ký hay không. Nếu bạn quyết định xóa nhật ký nhật ký, hãy để tôi chỉ cho bạn một vài cách để làm điều đó.
                    Điều đầu tiên bạn nên làm là xoay các tệp nhật ký. Thao tác này sẽ đánh dấu nhật ký nhật ký hiện đang hoạt động là kho lưu trữ và tạo nhật ký mới.
                    sudo journalctl –rotate
                    Hãy nhớ rằng nhật ký rất quan trọng cho mục đích kiểm tra, vì vậy bạn không nên xóa tất cả chúng cùng một lúc. Giả sử bạn muốn giữ lịch sử nhật ký chỉ trong hai ngày. Để xóa tất cả các mục cũ hơn hai ngày, hãy sử dụng lệnh này: sudo journalctl –vacuum-time=2d
                    journalctl –vacuum-time 1d
                    Một cách khác là hạn chế kích thước nhật ký. Thao tác này sẽ xóa các tệp nhật ký nhật ký cho đến khi dung lượng đĩa được lấy bởi nhật ký nhật ký giảm xuống dưới kích thước bạn đã chỉ định.
                    sudo journalctl –vacuum-size=100M
                    Bạn có thể chỉ định kích thước tính bằng GB với G, MB với M, KB với K, v.v.
                    Cách thứ ba là giới hạn số lượng tệp nhật ký. Journalctl thường có các tệp nhật ký cho hệ thống và cho người dùng. Khi nhật ký cũ, chúng được lưu trữ trong các tệp khác nhau.
                    Bạn có thể giới hạn số lượng tệp nhật ký lưu trữ. Giả sử bạn chỉ muốn có năm tệp nhật ký.
                    journalctl –vacuum-files=5
                    Những gì bạn vừa làm sẽ làm sạch các tệp nhật ký ngay bây giờ. Trong một tháng, nhật ký sẽ tăng trở lại. Bạn có thể làm sạch chúng bằng tay bằng một trong các phương pháp được mô tả ở trên. Nhưng đó là một công việc tẻ nhạt và bạn có thể không nhớ làm điều đó thường xuyên.
                    Điều tốt là bạn có thể cấu hình systemd để tự động xử lý các tệp nhật ký cũ.
                    Journalctl có file cấu hình tại /etc/systemd/journald.conf. Có những cài đặt cơ bản chỉ ra giá trị mặc định của các tham số cài đặt đó. Bạn có thể thay đổi một số cài đặt mặc định này để tự động làm sạch tệp nhật ký. SystemMaxUseNhật ký dung lượng đĩa tối đa có thể mất, SystemMaxFileSizeKích thước tối đa của tệp nhật ký CÁ NHÂN,
                    SystemMaxFilesTối đa số lượng tệp nhật ký.
                    Xin lưu ý rằng bạn nên cẩn thận trong khi chỉnh sửa các tệp cấu hình. Bạn phải cảm thấy thoải mái khi sử dụng trình soạn thảo văn bản dựa trên thiết bị đầu cuối như Vim, Emacs hoặc Nano để bạn không mắc lỗi ngớ ngẩn trong khi chỉnh sửa tệp conf.
                    Tôi khuyên bạn nên sao lưu tệp cấu hình trước: cp /etc/systemd/journald.conf /etc/systemd/journald.conf.back
                    Bây giờ, bạn nên bỏ ghi chú (xóa # ở đầu dòng) cài đặt bạn muốn sử dụng. Ví dụ: tôi muốn hạn chế dung lượng đĩa tối đa được thực hiện bởi các tệp nhật ký là 250 MB.
                    [Journal]
                    #Storage=auto
                    #Compress=yes
                    #Seal=yes
                    #SplitMode=uid
                    #SyncIntervalSec=5m
                    #RateLimitIntervalSec=30s
                    #RateLimitBurst=1000
                    SystemMaxUse=250M
                    #SystemKeepFree=
                    #SystemMaxFileSize=
                    #SystemMaxFiles=100
                    Hãy nhớ rằng sau khi chỉnh sửa tệp cấu hình, bạn nên tải các thay đổi: sudo systemctl restart systemd-journald

                    Cài đặt odoo12 trên windows 10 chạy môi trường 64bit

                    Odoo Apps Dn Vua Va Nho
                    Nội dung

                      Các bước cài đặt cũng như bản thông thường nhưng có phần thư viện phải nạp bổ sung khác 1 chút.

                      tham khảo: https://github.com/guohuadeng/odoo12-x64

                      Download and install Node.js LTS.

                      Launch Command Prompt as Administrator.

                      • Install Less.js by > npm install -g less less-plugin-clean-css

                      Download and install PostgreSQL, có thể dùng bản 64bit ver dưới 10 thôi.
                      add PostgreSQL’s bin directory (default: C:\Program Files\PostgreSQL\x.x\bin) to your PATH.

                      create a postgres user with a password using the PgAdmin GUI:

                      • open PgAdmin4,
                      • expand server node to create a connection,
                      • expand PostgreSQL node,
                      • select Object-> Create -> Login/Group Role,
                        • enter the username in the Role Name field (e.g. odoo),
                        • open the Definition tab and enter the password (e.g. odoo),
                        • open the Privileges tab and give login and create database rights,
                      • click save.

                      Download and install Microsoft Visual C++ 2015 Redistributable.
                      Download and install Python3 version 3.6.

                      • goto Python3 installation directory (default: C:\Users\{UserName}\AppData\Local\Programs\Python\PythonXX.
                      • rename python.exe to python3.exe and pythonw.exe to pythonw3.exe.
                      • add Python3 installation directory (default: C:\Users\{UserName}\AppData\Local\Programs\Python\PythonXX) to your PATH.

                      After Visual C++ 2015 Build Tools installation process completes, launch Command Prompt as Administrator

                      • Install pypiwin32 by > python3 -m pip install pypiwin32
                      • Install Pillow by > python3 -m pip install pillow
                      • Install gevent by > python3 -m pip install gevent
                      • Install lxml by > python3 -m pip install lxml
                      • Install psutil by > python3 -m pip install psutil
                      • Install psycopg2 by > python3 -m pip install psycopg2
                      • Install pyldap by > python3 -m pip install pyldap  (nếu bị lỗi hay chạy bằng whl)
                      • Install reportlab by > python3 -m pip install reportlab

                      Cài pyldap bị lỗi thì chạy bằng lệnh pip3 install pyldap-2.4.45-cp36-cp36m-win_amd64.whl

                      Download file pyldap-2.4.45-cp36-cp36m-win_amd64.whl

                      Download and install wkhtmltopdf.
                      Add wkhtmltopdf’s bin directory (default: C:\Program Files\wkhtmltopdf\bin) to your PATH.

                      Launch Command Prompt.
                      Switch to (cd) your desired odoo installation directory
                      clone odoo https://github.com/odoo/odoo/archive/12.0.zip

                      Switch to odoo installation directory and run odoo using
                      $ python3 odoo-bin -w odoo -r odoo --addons-path=addons --log-level=debug_rpc

                      Một vài lỗi có thể cài về version cũ trong file extra

                      pip3 install -r .\requirements.txt  -i https://mirrors.aliyun.com/pypi/simple
                      pip3 install .\extra\Pillow-5.4.1-cp36-cp36m-win_amd64.whl
                      pip3 install .\extra\psycopg2-2.7.7-cp36-cp36m-win_amd64.whl
                      pip3 install .\extra\pyldap-2.4.45-cp36-cp36m-win_amd64.whl
                      pip3 install .\extra\reportlab-3.5.13-cp36-cp36m-win_amd64.whl
                      pip3 install .\extra\Werkzeug-0.14.1-py2.py3-none-any.whl
                      pip3 install .\extra\pywin32-224-cp36-cp36m-win_amd64.whl
                      pip3 install .\extra\wandex-0.4.5-py3-none-any.whl
                      pip3 install .\extra\imageio-2.5.0-py3-none-any.whl
                      pip3 install .\extra\moviepy-1.0.0-py2.py3-none-any.whl
                      pip3 install .\extra\psutil-5.6.1-cp36-cp36m-win_amd64.whl
                      pip3 install .\extra\lxml-4.2.3-cp36-cp36m-win_amd64.whl
                      pip3 install .\extra\psutil-5.6.1-cp36-cp36m-win_amd64.whl Nếu lỗi không đọc được module web thì

                      pip3 uninstall jinja2

                      pip3 install Jinja2==2.10.1

                      pip3 install libsass==0.12.3