Chèn văn bản, quảng cáo vào giữa nội dung trong WordPress ?

Đăng ký tài khoản kiếm tiền với tiếp thị liên kết tại ACCESSTRADE, MasOffer, Lazada Việt Nam

Trong đợt thay đổi CSS cho Cafe Freelancer đợt rồi mình đã tích hợp thêm các Sidebar cần thiết cho Polygon Template cũng như tích hợp thêm những vị trí hook cần thiết cho child themes sau này. Trong các Sidebar bổ sung hiển thị mình có thêm 1 sidebar để hiển thị văn bản (quảng cáo/ nội dung) vào giữa nội dung chính của bài viết dạng Post hoặc Page như sau:

Sidebar đặt nội dung cần chèn vào giữa post/ page

Sidebar đặt nội dung cần chèn vào giữa post/ page

Sử dụng và chèn thế nào là hợp lý ?

Dĩ nhiên không phải bài viết nào chúng ta cũng chèn nội dung (văn bản/ quảng cáo) vào phải không ? Do đó, tiêu chí của mình là chỉ chèn khi nội dung thoả các điều kiện sau (đối với bạn thì có thể khác):
– Nội dung phải từ 4.000 ký tự trở lên (dĩ nhiên không tính các thẻ HTML định dạng).
– Nội dung phải tồn tại từ 8 thẻ p trở lên. Do trong WordPress khi soạn thảo các đoạn văn bản sẽ được chưa trong thẻ p. Theo tiêu chí này có nghĩa là mình chỉ chấp nhận nội dung có từ 8 phân đoạn, khi đó nội dung quảng cáo của Sidebar between sẽ hiển thị sau phân đoạn thứ 8/2 (tức là giữa nội dung).

Việc mình sử dụng song song 2 điều kiện trên là để tránh tình trạng nội dung trống và thoả điều kiện có từ 8 phân đoạn p. Đôi khi trong nội dung chúng ta cũng thường sinh ra nhiều phân đoạn p không có nội dung mà phải không ?

Đoạn code xử lý chèn nội dung (văn bản/ quảng cáo) vào giữa bài viết

P/s: mình sẽ không giải thích về code nhiều do nó là những đoạn code đơn giản mà khi bạn tìm hiểu đến đây rồi chắc chắn bạn đã có đủ kinh nghiệm về nó nhé !. Đối với các bạn mới nếu không hiểu rõ phần nào thì vui lòng cứ thẳng thắn đặt câu hỏi và chia sẻ để mình và mọi người hỗ trợ nhé 🙂

Update 28/02/2015
Trong quá trình sử dụng hàm polygon_do_between_entry có phát sinh LỖI không thể explode được thẻ <p> ở một số Themes mà nguyên nhân chính là index filter the_content. Nếu trước đó bạn có add_filter the_content ở đâu đó rồi thì khi get_the_content() được gọi có thể sẽ không lấy được nội dung đầu cuối tức là chưa xử lý add thẻ p (đây là định dạng nội dung WordPress hỗ trợ tự động). Vì vậy, việc thêm 1 index có giá trị lớn (mình đặt là 999) sẽ khắc phục được vấn đề này.

Thêm vào đó ở phần nội dung của bạn nếu có chứa <table> thì khi hiển thị cũng gây ảnh hưởng đến giao diện nếu thẻ <p> có chứa trong <td>. Vì vậy, bạn cần kiểm tra xem nếu nội dung có chứa <table> thì không thực thi việc chèn “nội dung” này để tránh ảnh hưởng đến giao diện. Nếu bạn có thể viết mã tốt hơn thì có thẻ viết mã sao cho khi chèn nội này thì né các thẻ <table>, việc này cũng có thể đáp ứng được nhưng đổi lại việc xử lý nội dung quá nhiều sẽ dẫn đến hiệu xuất giảm đi đáng kể 🙁

Do các nguyên nhân trên, mình bổ sung thêm 1 thay đổi cho hàm polygon_do_between_entry như sau (Bạn có thể thêm bớt, thay đổi lại tuỳ nhu cầu của mình):

function polygon_do_between_entry($tmpcontent){
    add_filter('the_content', 'polygon_sidebar_to_between_entry',999);
   /*
   *giá trị index của filter là 1 số lớn hơn các filter khác trong Theme của bạn ứng với filter the_content;
   */
    function polygon_sidebar_to_between_entry($tmpcontent)
    {	
        
        if (is_single() || is_page()) {
            if (polygon_content_exist_tag('table',$tmpcontent)!=true){
                    $content_block = explode('<p>',$tmpcontent);
                    $characterCount=strlen(strip_tags($tmpcontent));//Đếm số ký tự nội dung hiện có;
                    $idxBlockPutSidebar=round(count($content_block)/2);//Vị trí sẽ add nội dung;
               
                    if($idxBlockPutSidebar>=4 && $characterCount>=4000){
                    if(!empty($content_block[$idxBlockPutSidebar]))
                    {	
                        ob_start();
                        do_action('polygon_between_entry'); 
                        $output = ob_get_contents();
                        ob_end_clean();
                        $content_block[$idxBlockPutSidebar] .=$output;
                    }
                    for($i=1;$i<count($content_block);$i++)
                    {	$content_block[$i] = ''<p>'.$content_block[$i];
                    }
                    $tmpcontent = implode('',$content_block);
                    }
                  }
        }
        return $tmpcontent;	
    }
}

Như đoạn code trên bạn thấy mình khai báo 1 hàm là polygon_do_between_entry() mà mình sẽ gọi trong quá trình hiển thị nội dung chính sau này (vì chúng ta cần phải kiểm tra xem Sidebar between có nội dung không phải không ?). Và sau đây mình sẽ gọi nó trong thân layout như sau:

if (is_single() || is_page()) {
        //...
        if (is_active_sidebar('sidebar-between-entry')){
            $tmpContent=get_the_content();
            polygon_do_between_entry($tmpContent);
        }
        the_content();
	//...
        
    }

Mặc định khi xây dựng layout ở đoạn hiển thị này thì trong WordPress bạn chỉ cần gọi the_content() để lấy nội dung bài viết. Tuy nhiên, do chúng ta cần kiểm tra xem có chèn và hiển thị vào giữa nội dung 1 văn bản khác mà sidebar-between-entry chứa vào không ? thì chúng ta cần kiểm tra is_active_sidebar(‘sidebar-between-entry’) xem sidebar này có nội dung không ? (có tức là trạng thái active của nó là true). Khi đó hàm polygon_do_between_entry() chúng ta viết ở trên sẽ được gọi, sau đó xử lý nội dung, và gán nó vào tiến trình của filter ‘the_content’ hiển thị the_content() sau này.

Kiểm chứng kết quả hiển thị đáp ứng

Bạn có thể kiểm tra kết quả hiển thị quảng cáo Google AdSense đáp ứng trong 2 trong số các bài viết thoả 2 điều kiện của hàm trên ngay sau đây:
1. Bài đáp ứng hiển thị đầu tiên chính là bài viết này :), bạn sẽ thấy quảng cáo của Google hiển thị ở phân đoạn ở vị trí giữa nội dung (tính theo thẻ p – bạn có thể tính theo thẻ khác tuỳ vào tiêu chí của bạn) trong nội dung này.

2. Bài tiếp theo KHÔNG hiển thị quảng cáo của Google AdSense do không đáp ứng 2 điều kiện hàm polygon_do_between_entry() là http://polygonexpress.com/vi/ung-dung-lay-toan-bo-thong-tin-video-youtube-tags-meta-description.html

Lời kết

Cảm ơn Damien đã chia sẻ 1 vài ý tưởng code để mình hoàn tất chức năng này, bạn có thể tham khảo thêm chi tiết tại http://www.maketecheasier.com/insert-ads-in-between-content-in-wordpress/

Vậy là bạn có thể dễ dàng chèn nội dung văn bản (quảng cáo/ văn bản ghi chú) vào giữa nội dung văn bản chính trong WordPress rồi đấy. Dĩ nhiên, các điều kiện trước khi kiểm tra xem có hiển thị văn bản đó hay không trong nội dung thì còn tuỳ vào tiêu chí của bạn. Với mình hiện tại do cần hiển thị nội dung banner quảng cáo của Google AdSense hoặc các banner quảng cáo khác, do đó việc kiểm tra độ dài văn bản trước khi hiển thị là tiêu chí của mình.

P/s: Mình chắc chắn bạn sẽ làm được rất nhiều điều hữu ích nếu phát triển chức năng này thành 1 plugin tích hợp riêng đấy 🙂 Hãy giữ riêng trí tưởng tượng đó cho riêng bạn ?

Thân !

Chèn văn bản, quảng cáo vào giữa nội dung trong WordPress ? 4.07/5 (81.33%) 15 votes
Nếu bạn mong muốn tìm hiểu rõ hơn về chia sẻ này và những chia sẻ khác, bạn có thể kết nối với mình qua các thông tin sau:
Facebook cá nhân: https://www.facebook.com/PExpress
Blog chia sẻ cá nhân: PolygonExpress.com
Group chia sẻ ứng dụng affiliate marketing & services: MMO tools
Web dịch vụ freelance: FMMSPolygon.com
Email liên hệ mình: fmmspolygon@gmail.com
Điện thoại: 0937.798.420 - 0868.929.024 (Kim Ngọc)

Related

Comments

  1. cannabjs say

    Hi bạn hết lỗi rồi nhưng vẫn chưa hiện được quảng cáo . Mình đã tạo sidebar phù hợp rồi nhưng mình thắc mắc đoạn này : do_action(‘polygon_between_entry’);

    • say

      Mình chào bạn, cảm ơn bạn đã ghé thăm và quan tâm chia sẻ của mình,
      Về vấn đề bạn mình trả lời bạn như sau:
      Do bài viết mình chỉ ở mức chia sẻ, đưa ra giải pháp cùng mọi người nên mình không đi chi tiết cụ thể và mình xin lỗi bạn vì thiếu xót này.
      Hàm do_action(‘polygon_between_entry’); nghĩa là tại đoạn này WP sẽ thực thi 1 action đã đăng ký trước đó tên là polygon_between_entry và action này sẽ ứng với 1 hàm nào đó ? tùy vào mục đích xử lý của bạn. Ở đây action này sẽ ứng với hàm kiểm tra sidebar-between-entry có ĐƯỢC ACTIVE không ? Nếu có nó sẽ lấy toàn bộ nội dung (mã quảng cáo hay nội dung nào đó) ra hiển thị.

      function polygon_sidebar_between_entry() {
          if (is_active_sidebar('sidebar-between-entry')) {
              dynamic_sidebar('sidebar-between-entry');
          }
      }
      add_action('polygon_between_entry', 'polygon_sidebar_between_entry');
      

      Tiện thể mình giải thích luôn về hàm ob_start() và ob_end_clean() trong trường hợp bạn có thể chưa rõ. Đoạn code giữa hai hàm này ám chỉ rằng DỮ LIỆU lấy ra từ do_action hay bất cứ hàm nào đó hỗ trợ echo thì sẽ không hiển thị mà được lưu trữ vào hàm ob_get_contents(); và từ đó bạn có thể gán nó vào biến để xử lý, nếu bạn không xử lý đoạn này thì dữ liệu sẽ được echo hiển thị. Tóm gọn là đoạn này sẽ lấy toàn bộ nội dung của bạn trong sidebar-between-entry và KHÔNG OUTPUT.

               ob_start();
               do_action('polygon_between_entry'); 
               $output = ob_get_contents();
               ob_end_clean();
      

      Mình nghĩ là bạn thêm hàm trên và add action vào là có thể chạy được rồi. Nếu có vấn đề cần hỗ trợ bạn vui lòng cứ phản hồi lại giúp mình… và nếu giải quyết được vấn đề nếu được bạn cũng để lại phản hồi giúp mình để những bạn sau có thể tham khảo tốt hơn…. mình cảm ơn !
      Chúc bạn buổi tối tốt lành !
      Thân !

      • cannabjs say

        Hi thanks bạn mình làm được rồi. Tại trong bài hướng dẫn của bạn không thấy có ghi hàm polygon_between_entry. Với cả bạn nên xóa cái đoạn polygon_content_exist_tag đi vì đây là hàm bạn tự định nghĩa các theme khác không có. Blog của bạn rất nhiều thông tin bổ ích 🙂

        • say

          Hi bạn,
          Cảm ơn bạn đã góp ý, mình sẽ để ý hơn về việc chia sẻ các thông tin dạng này cụ thể hơn vì sau. Do trước đây chia sẻ như đã đề xuất mình ở phương diện ý tưởng, chia sẻ, và việc sử dụng các hàm trong ví dụ mình nghĩ coder đều nắm các vấn đề dạng này…
          Thân !

  2. cannabjs say

    Bạn ơi mình ném hàm polygon_sidebar_to_between_entry() vào function.php thì web trắng tinh luôn ý

    • say

      Hi ông,
      Ông cần đăng ký thêm sidebar với WordPress trước nhé. Cụ thể là như sau:

      function polygon_sidebar_init() {
      /*
      *Danh sách các sidebar được đăng ký trong Theme;
      */
      register_sidebar(array(
              'name' => __('Entry (between entry)', 'polygon'),
              'description' => __('Between entry.'),
              'id' => 'sidebar-between-entry',
              'before_widget' => '<section id="%1$s" class="widget %2$s">',
              'after_widget' => "</section>",
              'before_title' => '<div class="widget-title">',
              'after_title' => '</div>',
          ));
      //Lưu ý ID của sidebar phải là duy nhất;
      /*
      *Danh sách các sidebar được đăng ký trong Theme;
      */
      }
      //Đăng ký hàm khởi tạo sidebar trên vào action widgets_init của WordPress để thực thi;
      add_action('widgets_init', 'polygon_sidebar_init');
      

      Chào ông !

      • say

        Cám ơn Ngọc nhé! Mình làm nó đã hiện thêm 1 sidebar đã thêm text vào rồi mà nó vẫn chưa xuất hiện đoạn quảng cáo giữa văn bản (mình đã chọn bài viết dài nhất và nhiều phân đoạn nhất để test).

        • say

          Hi ông,
          Cái này thực tế ông nên xem kỹ lại bài viết của tôi chia sẻ nhé !
          Điểm quan trọng là ông hiểu Theme của ông đang có gì và viết gì trong đó, tôi thì không nên không thể biết chính xác nguyên nhân.
          Lưu ý:

          add_filter('the_content', 'polygon_sidebar_to_between_entry');

          Đây là điều ông bắt buộc phải làm để trong quá trình gọi hàm the_content() thì hàm polygon_sidebar_to_between_entry (tên hàm ông viết có thể khác) được thực thi. Khi đó chắc chắn nội dung trước khi hiển thị sẽ được xử lý qua hàm đó.
          Hoặc ông add Skype tôi sanddesert88, sau đó tôi connect với ông bằng teamviewer để hỗ trợ ông.
          Thân !

  3. Thang say

    Bạn ơi cho mình hỏi mình chỉ cần chèn 1 nội dung cố định nào đó vào (như banner) và không dùng SideBar thì làm thế nào bạn nhỉ ? Theme mình đang dùng không có cái SideBar như của bạn. Mình có tham khảo mấy cách thêm qua functions.php nhưng vẫn chưa làm được, nếu được bạn hướng dẫn mình nhé ? 🙁

    • say

      Hi bạn,
      Nếu bạn không dùng sidebar/ theme bạn không hỗ trợ thì bạn có thể xem thêm bài viết mình tham khảo tại http://www.maketecheasier.com/insert-ads-in-between-content-in-wordpress/

      Khi đó mã có thể được viết như sau trong tập tin functions.php

      add_filter('the_content', 'polygon_content_to_between_entry');
          function polygon_content_to_between_entry()
          {	
              if (is_single() || is_page()) {
                          $content=get_the_content();
                          $content_inject='Nội dung chèn hoặc mã hiển thị Quảng Cáo';
                          $content_block = explode('<p>',$content);
                          $characterCount=strlen(strip_tags($content));//Count characters;
                          $idxBlockPutSidebar=round(count($content_block)/2);//Index put sidebar
                          if($idxBlockPutSidebar>=4 && $characterCount>=4000){
                          if(!empty($content_block[$idxBlockPutSidebar]))
                          {	
                              $content_block[$idxBlockPutSidebar] .=$content_inject;
                          }
                          for($i=1;$i<count($content_block);$i++)
                          {	$content_block[$i] = '<p>'.$content_block[$i];
                          }
                          $content = implode('',$content_block);
                          }
              }
              return $content;	
          }

      Đoạn mã trên mình thêm vào 1 biến $content_inject để chứa thông tin nội dung bạn cần chèn.
      Bạn lưu lại và chạy thử nhé ! Đối với cách viết này thì bạn không thể dễ dàng thay đổi được nội dung bạn muốn hiển thị, vì mỗi lần thay đổi bạn phải vào chỉnh code của hàm và thay đổi giá trị biến $content_inject
      Thân !

Leave a Reply

Your email address will not be published. Required fields are marked *