Phải thú thật là hôm nay có hơi mệt nên có thể không còn tỉnh táo để viết cho các bạn nhưng biết các bạn chờ tutorial tiếp theo cũng lâu nên đành cố gắng viết tiếp. Trong phần này, chúng ta sẽ tiếp tục học cách xây dựng giao diện WordPress với phần trình bày trang chủ bằng cách dùng vòng lặp (loop) để lấy các tin cần thiết. Trước tiên chúng ta đọc lại phần 5 để biết công việc đang ở đâu nhé.
Vậy là ở phần trước chúng ta đã import thành công giao diện được thiết kế bằng photoshop(hoặc cái gì đại loại thế không quan trọng, quan trọng là sau cùng 1 template bằng HTML). Tiếp theo chúng ta sẽ trình bày trang chủ. Bạn hãy mở template file index.php mà chúng ta đã có ra:
[php]
<?php
/**
* The main template file.
*
*/
get_header();
?>
<div id="content">Content</div>
<?php get_sidebar(); ?>
<?php get_footer(); ?>
[/php]
Trước tiên chúng ta thay
[php] <div id="content">Content</div>[/php]
bằng một đoạn code PHP như sau:
[php] <div id="content"><?php if(have_posts()) : ?>
<?php while(have_posts()) : the_post(); ?>
<?php endwhile; ?>
<?php endif; ?>
</div>
[/php]
Giải thích đoạn code này như thế này:
- Quá trình gọi file index.php, hệ thống WordPress đã chuẩn bị dữ liệu sẵn trước khi show ra giao diện. Hàm have_posts() sẽ kiểm tra xem dữ liệu đã sẵn sàng hay chưa. Nếu dữ liệu đã được lấy ra(lấy cách nào chúng ta tạm thời chưa cần quan tâm), hàm này sẽ trả về true và đoạn code phía trong sẽ hoạt động. Ngược lại sẽ không làm gì cả. Bạn cũng có thể bổ sung else nếu muốn show 1 thông tin nào đó nếu không có dữ liệu.
- Nếu kiện có bài viết được thỏa mãn, vòng lặp while phía trong sẽ được kích hoạt và vòng lặp này sẽ chạy từ đầu cho đến cuối danh sách (nghĩa là sẽ duyệt qua từng bài viết mà nó có).
- Hàm the_post() là hàm sẽ chịu trách nhiệm lấy ra từng bài viết cụ thể.
- endwhile dùng để thông báo rằng vòng lặp sẽ chạy từ đoạn bắt đầu while đến endwhile và những đoạn mã phía sau sẽ không thuộc vòng lặp, không được lặp lại như những thành phần phía trong vòng while này.
Được rồi ! Giờ nhiệm vụ của chúng ta là lấy ra cái chúng ta cần.
Trong vòng lặp while chúng ta sẽ bổ sung đoạn code như sau:
[php] <div class="row"><div class="row">
<h4><a href="<?php the_permalink() ?>" title="<?php the_title(); ?>"><?php echo the_title(); ?></a></h4>
<?php echo the_excerpt(); ?>
</div>
</div>
[/php]
Bạn chú ý là đoạn code này phải nằm sau while và trước endwhile nhé. Đại loại nó sẽ thế này:
[php] <?php while(have_posts()) : the_post(); ?><div class="row">
<div class="row">
<h4><a href="<?php the_permalink() ?>" title="<?php the_title(); ?>"><?php echo the_title(); ?></a></h4>
<?php echo the_excerpt(); ?>
</div>
</div>
<?php endwhile; ?>
<?php endif; ?>
[/php]
Trong vòng lặp, những phần tử của mảng được đưa vào lần lượt và chúng ta sử dụng một số hàm được WordPress xây dựng sẵn để lấy dữ liệu. Chúng ta có:
- the_permalink(): lấy đường dẫn chính xác đến vài viết.
- the_title(): lấy tiêu đề bài viết.
- the_excerpt(): lấy một đoạn trong bài viết để làm phần mô tả bài. Ngoài the_excerpt(), bạn có thể sử dụng the_content() để lấy nội dung đều được.
Trong các giải thích trên mình đều có gắn liên kết đến phần document của từng hàm để các bạn tìm hiểu thêm cách sử dụng chúng. Nếu có thời gian các bạn nên xem nhé, nhất là điểm khác nhau khi sử dụng the_excerpt() và the_content().
Kết quả:
Bạn thấy đấy, tuy chưa hoàn chỉnh nhưng đó là những gì một theme wordpress show ra ở trang chủ. Bạn chỉ cần tùy chỉnh 1 tí cho CSS nữa là sẽ đẹp như mơ :)
Phạm Thị Thùy Trang says
Em có trường hợp cụ thể thế này, anh Nhân giúp giùm:
Home page của em có 3 cột. Cột bên trái tự động tăng giảm chiều dài phụ thuộc vào món hàng được đăng bán, cột giữa và cột bên phải viết bằng HTML. Thường thì 3 cột không bằng nhau nên mất cân đối. Liệu mình có thể soạn một vòng lặp cho cột giữa và cột phải (lặp chèn 1 điểm ảnh trắng chẳng hạn) tự tăng giảm chiều dài tới footer (dài bằng cột bên trái) được không? Ý em là soạn thẳng vào widget của 2 sidebar này chứ không can thiệp vào code theme, cái Genesis này khó cán thiệp code theme quá.
Các bạn xem trang http://vietnamstamp.net và giúp mình với. Chân thành cám ơn.
Nguyễn Duy Nhân says
Ca này hơi khó ah nha B-)
Ngay cả khi bạn có thể can thiệp vào theme đi chăng nữa thì cũng rất khó fix chiều rộng và chiều cao do dữ liệu của bạn là dữ liệu động. WP sử dụng JQuery, bạn có thể ứng dụng JQuery lấy chiều rộng và chiều cao từng cột sau đó set các cột còn lại thành chiều rộng và chiều cao tương ứng.
Ý tưởng là thế, bạn thực hiện thử xem nhé :hello:
Phạm Thị Thùy Trang says
Vậy là thực sự chịu rồi. Em suy nghĩ là mình đặt thuật toán sao cho nó luôn dài đụng đến footer là được, không cần biết chiều dài chính xác của sidebar bên trái là bao nhiêu. Footer lại lệ thuộc vào sidebar bên trái, vì vậy chúng sẽ luôn bằng nhau. >:D<
Minh Phúc says
Thầy Nhân ơi, phần hiển thị danh sách bài viết em làm tương tự như thầy, nhưng khi sử dụng wp-pagenavi thì nó không hiển thị được phần phân trang,nó chỉ hiển thị :Page 1 of 11 . Để phân trang ngoại trừ cái thêm plugin : wp-pagenavi, mình có cần thêm cái gì cho theme của mình không thầy
Minh Phúc says
Thầy ơi em tìm ra nguyên nhân rồi, phải hơn 10 bài nó mới hiển thị phân trang. CÓ cách hàn giới hạn nó lại còn 9 bài không thầy ?
Minh Phúc says
Thầy ơi, em tìm ra được chỗ luôn rồi. Thôi cám ơn thầy vậy. Sẽ làm phiền thầy lần sau. Chúc thầy luôn vui vẻ mạnh khỏe :D
lao ái đại nhân says
bạn ơi mình dùng plugin WP-pagenavi và cũng ko hiển thị phân trang được, bạn chỉ mình cách fix đi mình mò hoài mà ko dc :((
Khoa says
Chào anh, cho em hỏi mình thiết kế 1 website thương mại điện tử, em thấy trong cái post không hỗ trợ đăng kiểu sảng phẩm nhưcái dạng girdview show ra từng sản phẩm vậy em phải làm như thế nào. nó giống như plugin wooecernomer gì đấy