Hook là gì ? Nếu bạn sử dụng WordPress có lẽ bạn sẽ được nghe đến nó. Bạn còn được nghe đến nó nhiều hơn nếu bạn sử dụng các theme chuyên dụng như Genesis hoặc Thesis. Trong bài viết này mình muốn giới thiệu với các bạn về bộ Hook của Genesis.
Phụ mục
Hook để làm gì ?
Hook là một công cụ được viết để bạn bổ sung code vào theme của WordPress một cách dễ dàng và nhanh chóng mà không làm thay đổi những mặc định trong theme. Nói cách khác, Hook là chìa khóa giúp bạn custom theme WordPress được dễ dàng hơn.
Nhận diện “Hook” của theme Genesis
Rất đơn giản, bạn có thể mở và tìm thấy những đoạn code như sau:
<?php genesis_before_footer(); ?> <div id="footer"> <div class="wrap"> <?php genesis_footer(); ?> |
Dòng đầu tiên và cuối cùng trong đoạn code trên là 2 hook nằm trong file foooter.php của một theme Genesis. Những đoạn này sẽ được thay thế bằng các nội dung bạn tạo bổ sung.
Sử dụng Hook
Đây là phần quan trọng vì nó giúp bạn có thể điều khiển các Hook dễ dàng và tùy chỉnh theo ý mình. Việc nắm rõ cách sử dụng, tên các Hook có thể giúp bạn dễ dàng tùy biến nội dung theo ý mình., Vì vậy các bạn hãy chú ý nhé :)
Bước 1: tạo một file nội dung.
Bạn tạo một file php bất kì rồi đưa một vài nội dung cần hiển thị ở bên ngoài theme vào. Ví dụ ở đây, tôi tạo file bottom-widgets.php.
Bước 2: CSS và HTML.
Đây là bước làm đẹp cho nội dung trước khi đưa trang này lên thông qua Hook. Bạn sử dụng CSS để định dạng và căn chỉnh cho hợp lý.
Bước 3: Tạo hàm cho phép gọi file bottom-widgets.php. Hàm bạn tạo được đặt trong functions.php nằm trong child theme của bạn. Đây là đoạn code của mình:
function include_bottom_widgets() { require(CHILD_DIR.'/bottom-widgets.php'); } |
Nếu nội dung của bạn cần là một đoạn text ngắn, hoặc bạn có thể lập trình bằng PHP bạn có thể code trực tiếp tất cả trong hàm này. Việc thực thi bước 1, bước 2 vì tôi muốn các mã lập trình sáng sủa hơn và dễ tìm thấy hơn bằng cách chia nhỏ ra.
Bước 4: gọi Hook tương ứng
Bạn có thể đặt đoạn code sau vào phía trên đoạn code ở bước 3 để gọi Hook và truyền hàm tương ứng vào Hook này:
add_action('genesis_before_footer', 'include_bottom_widgets'); |
Ở đây NhanWeb gọi Hook genesis_before_footer và gọi hàm include_bottom_widgets đã viết ở bước 3 để thực thi tại vị trí trước vị trí footer.
Đoạn code đẹp và hoàn chỉnh cho bước 3 và 4 là
add_action('genesis_before_footer', 'include_bottom_widgets'); function _include_bottom_widgets() { require(CHILD_DIR.'/bottom-widgets.php'); } |
Danh sách các Hook bạn có thể sử dụng
Ở trên mình đã giới thiệu cách sử dụng Hook rồi, sau đây mình xin giới thiệu các bạn danh sách các Hook của Genesis để bạn có thể sử dụng. Bạn muốn sử dụng Hook nào thì gọi tương ứng như đã nói ở trên và đặt vào functions.php trong child theme nhé.
Internal Action Hooks
genesis_pre
This is the first hook to execute within Genesis. Think of any function hooked to it as being executed before any Genesis functions have loaded.genesis_pre_framework
This hook executes immediately before any of the Genesis Framework components have been loaded, but after all the constants have been defined.genesis_init
This hook fires at the end of the /lib/init.php file. Think of any function hooked to it as being executed after all Genesis functions have loaded, but before any custom code in the child functions.php file is run.
Document Head Action Hooks
genesis_title
This hook executes between tags and outputs the doctitle. You can find all doctitle related code in /lib/structure/header.php.genesis_meta
This hook executes in the section of the document source. By default, things like META descriptions and keywords are output using this hook, along with the default stylesheet and the reference to the favicon.
Structural Action Hooks
genesis_before
This hook executes immediately after the opening tag in the document source.genesis_after
This hook executes immediately before the closing tag in the document source.genesis_before_header
This hook executes immediately before the header (outside the #header div).genesis_header
By default, this hook outputs the header code, including the title, description, and widget area (if necessary).genesis_after_header
This hook executes immediately after the header (outside the #header div).genesis_site_title
By default, this hook outputs the site title, within the header area. It uses the user-specified SEO settings to build the site title markup appropriately.genesis_site_description
By default, this hook outputs the site description, within the header area. It uses the user-specified SEO settings to build the site description markup appropriately.genesis_before_content_sidebar_wrap
This hook executes immediately before the div block that wraps the content and the primary sidebar (outside the #content-sidebar-wrap div).genesis_after_content_sidebar_wrap
This hook executes immediately after the div block that wraps the content and the primary sidebar (outside the #content-sidebar-wrap div).genesis_before_content
This hook executes immediately before the content column (outside the #content div).genesis_after_content
This hook executes immediately after the content column (outside the #content div).genesis_sidebar
This hook outputs the content of the primary sidebar, including the widget area output.genesis_before_sidebar_widget_area
This hook executes immediately before the primary sidebar widget area (inside the #sidebar div).genesis_after_sidebar_widget_area
This hook executes immediately after the primary sidebar widget area (inside the #sidebar div).genesis_sidebar_alt
This hook outputs the content of the secondary sidebar, including the widget area output.genesis_before_sidebar_alt_widget_area
This hook executes immediately before the alternate sidebar widget area (inside the #sidebar-alt div).genesis_after_sidebar_alt_widget_area
This hook executes immediately after the alternate sidebar widget area (inside the #sidebar-alt div).genesis_before_footer
This hook executes immediately before the footer, outside the #footer div.genesis_footer
This hook, by default, outputs the content of the footer, including the #footer div wrapper.genesis_after_footer
This hook executes immediately after the footer, outside the #footer div.
Loop Action Hooks
genesis_before_loop
This hook executes immediately before all loop blocks. Therefore, this hook falls outside the loop, and cannot execute functions that require loop template tags or variables.genesis_loop
This hook outputs the actual loop. See lib/structure/loop.php and lib/structure/post.php for more details.genesis_after_loop
This hook executes immediately after all loop blocks. Therefore, this hook falls outside the loop, and cannot execute functions that require loop template tags or variables.genesis_after_endwhile
This hook executes after the endwhile; statement in all loop blocks.genesis_loop_else
This hook executes after the else : statement in all loop blocks.genesis_before_post
This hook executes before each post in all loop blocks (outside the post_class() div).genesis_after_post
This hook executes after each post in all loop blocks (outside the post_class() div).genesis_before_post_title
This hook executes immediately before each post title for each post within the loop.genesis_post_title
This hook outputs the actual post title, contextually, based on what type of page you are viewing.genesis_after_post_title
This hook executes immediately after each post title for each post within the loop.genesis_before_post_content
This hook executes immediately before the post/page content is output, outside the .entry-content div.genesis_post_content
This hook outputs the actual post content and if chosen, the post image (inside the #content div).genesis_after_post_content
This hook executes immediately after the post/page content is output, outside the .entry-content div.
Comment Action Hooks
genesis_before_comments
This hook executes immediately before the comments block (outside the #comments div).genesis_comments
This hook outputs the entire comments block, including the section title. It also executes the genesis_list_comments hook, which outputs the comment list.genesis_after_comments
This hook executes immediately after the comments block (outside the #comments div).genesis_list_comments()
This hook executes inside the comments block, inside the .comment-list OL. By default, it outputs a list of comments associated with a post via the genesis_default_list_comments() function.genesis_before_pings
This hook executes immediately before the pings block (outside the #pings div).genesis_pings
This hook outputs the entire pings block, including the section title. It also executes the genesis_list_pings hook, which outputs the ping list.genesis_after_pings
This hook executes immediately after the pings block (outside the #pings div).genesis_list_pings()
This hook executes inside the pings block, inside the .ping-list OL. By default, it outputs a list of pings associated with a post via the genesis_default_list_pings() function.genesis_before_comment
This hook executes before the output of each individual comment (author, meta, comment text).genesis_after_comment
This hook executes after the output of each individual comment (author, meta, comment text).genesis_before_comment_form
This hook executes immediately before the comment form, outside the #respond div.genesis_comment_form
This hook outputs the actual comment form, including the #respond div wrapper.genesis_after_comment_form
This hook executes immediately after the comment form, outside the #respond div.
Hầu hết các hướng dẫn tùy biến theme Genesis đều xoay quanh các Hook này, do đó đây là một thành phần bạn không thể không biết đến nếu muốn làm chủ blog cá nhân của mình :)
BKMetalx says
Cái Future ở Home của bác đẹp quá, bác làm bài hướng dẫn cho mình bắt chước cái được không? ^^
Nguyễn Duy Nhân says
Cái đó theme Extended Magazine có sẵn bác ah ;))
BKMetalx says
Mình tìm đc cái khác thay thế rồi ;)). Nhân tiện hỏi bác luôn, làm sao để cho phép comment trên page của child theme genesis thế? Child theme của mình nó không cho hiện comment trên page mới khổ chứ :((
Nguyễn Duy Nhân says
Trong Genesis theme settings. Phần Comments/Trackbacks trong đó có Enable comment on page và on post. Chọn on page nếu bác muốn hiện comment ở trên page :)
BKMetalx says
Hi, thanks bác nhiều, đơn giản thế mà mình cũng không tìm ra :swim:
Blog Cơ Khí says
Mà bác ơi, cái thông tin tác giả kia theme này có sẵn à? Mình muốn theme vào blog của mình mà không biết cách :P
Nguyễn Duy Nhân says
Uh ! Nó nằm trong phần thông tin tác giả ấy bác ah ! Bác chỉ việc enable nó lên thôi.
Nguyễn Tuấn Đạt says
Mọi người ai pro vào blog em giúp em xóa cái dòng trên đầu blog tí
Cảm ơn
CAA+ says
:(( Bác Nhân cho em hỏi chút, trong Settings của Child theme của em không có mục Header Settings (Use for blog title/logo) giống như trong Settings của theme mặc định. Vậy em phải làm thế nào để nó xuất hiện trong Settings của Child theme đang vậy bác?
=P~
Nguyễn Duy Nhân says
Bác code thêm phần đó vào functions.php
Nhưng xem bộ nếu bác không hiểu cấu trúc của theme framework thì hơi khó ah nha.
CAA+ says
vấn đề chính là chỗ đó đấy bác ạ, bác viết giúp em mấy dòng được không bác.
em là dân ngoại đạo nên cứ nói đến code là bó cả tay lẫn chân luôn
=P~
Nguyễn Duy Nhân says
Header setting là khái niệm chung chung, bạn cần những setting gì thì viết theo cái đó chứ nói vậy mình cũng bó tay :)
Chúc vui.
Phụng says
Hi, giờ mới biết hook là gì. :)
Tên vi phạm says
Em mới chuyển qua Genesis Framework nhưng em không thể nào cho logo hiện đc ra ngoài là sao ạ? Em đã bật chứ năng logo trong option của child rồi, bật chữ thì hiện nhưng bật logo ko hiện, mong anh giúp em với, Thank
Khanh says
Bác cho em hỏi em có sử dụng cái genesis_after_post_content nhưng nó không hoạt động được thì phải làm thế nào nhỉ cụ thể là
function like_face_hd() {
echo ‘nút like đây’;
echo ”;
}
add_filter( ‘ genesis_after_post_content’, ‘like_face_hd’ );
Nhưng ko thấy nó xuất hiện