EDIT REVISIT SỐ 2
Tôi chưa bao giờ chạm vào API thoáng qua , cho đến hôm nay khi tôi thấy câu trả lời @MikeSchinkel trong bài đăng này . Điều này truyền cảm hứng cho tôi để xem lại bài đăng này một lần nữa. Sau một số thử nghiệm, tôi đã đưa ra những điều sau đây:
Thời gian thực hiện đã giảm từ ~ 0,07 giây xuống ~ 0,002 giây
Thời gian truy vấn cơ sở dữ liệu đã giảm khoảng một nửa
Với tạm thời, chỉ có 2 truy vấn db được thực thi
Cách mã hoạt động (Chỉ cần thảo luận về các thay đổi từ mã gốc từ REVISIT ):
BƯỚC 1
Chúng ta cần lưu giá trị của $q
tạm thời, đây là giá trị giữ danh sách danh mục với tiêu đề bài.
BƯỚC 2
Trước tiên chúng ta cần kiểm tra xem có tồn tại tạm thời không và nếu không tồn tại, hãy tạo tạm thời. Nếu tạm thời tồn tại, lấy thông tin của nó
BƯỚC 3
Thông tin này hiện được truyền qua một foreach
vòng lặp để in danh sách với tên danh mục và tiêu đề bài.
BƯỚC 4
Khi nó đứng, thoáng qua sẽ được cập nhật cứ sau mười hai giờ. Điều này có thể được thiết lập để phù hợp với nhu cầu của bạn. Tuy nhiên, thoáng qua sẽ cần phải được xóa và tạo lại mỗi khi trạng thái của bài đăng thay đổi. Đây có thể là từ bản nháp để xuất bản, một bài đăng mới được xuất bản hoặc một bài đăng đang bị vùi dập. Để làm điều này, bạn cần sử dụng delete_transient
cái sẽ được nối với transition_post_status
cái sẽ được kích hoạt mỗi khi trạng thái của bài đăng thay đổi
Đây là mã hoàn chỉnh:
Trong hàm của bạn.php
add_action( 'transition_post_status', 'publish_new_post', 10, 3 );
function publish_new_post() {
delete_transient( 'category_list' );
}
Trong mẫu của bạn, nơi bạn cần hiển thị danh sách của bạn
<?php
if ( false === ( $q = get_transient( 'category_list' ) ) ) {
$args = array(
'posts_per_page' => -1
);
$query = new WP_Query($args);
$q = array();
while ( $query->have_posts() ) {
$query->the_post();
$a = '<a href="'. get_permalink() .'">' . get_the_title() .'</a>';
$categories = get_the_category();
foreach ( $categories as $key=>$category ) {
$b = '<a href="' . get_category_link( $category ) . '">' . $category->name . '</a>';
}
$q[$b][] = $a; // Create an array with the category names and post titles
}
/* Restore original Post Data */
wp_reset_postdata();
set_transient( 'category_list', $q, 12 * HOUR_IN_SECONDS );
}
foreach ($q as $key=>$values) {
echo $key;
echo '<ul>';
foreach ($values as $value){
echo '<li>' . $value . '</li>';
}
echo '</ul>';
}
?>
CÁCH MẠNG
Gần đây tôi đã đưa ra một giải pháp rất nhẹ nhanh hơn nhiều so với các giải pháp khả thi khác được đưa ra. Trên trang web thử nghiệm của tôi, tôi nhận được tổng thời gian tạo chỉ ~ 0,07 giây và chỉ có 6 truy vấn db theo Trình theo dõi truy vấn trong khi các phương thức khác cho tôi thời gian tạo ~ 0,35 giây và thêm 50 truy vấn db.
Đây là một sự cố về phương pháp của tôi
BƯỚC 1
Trước tiên bạn cần tạo một truy vấn tùy chỉnh WP_Query
để truy xuất tất cả các bài đăng được xuất bản
$args = array(
'posts_per_page' => -1
);
$query = new WP_Query($args);
$q = array();
while ( $query->have_posts() ) {
}
/* Restore original Post Data */
wp_reset_postdata();
Bước 2
Sử dụng get_the_category
, lấy danh sách tất cả các danh mục mà bài đăng thuộc về.
$categories = get_the_category();
foreach ( $categories as $key=>$category ) {
$b = '<a href="' . get_category_link( $category ) . '">' . $category->name . '</a>';
}
BƯỚC 3
Gán các biến cho tiêu đề bài viết và các thể loại của bài viết
$a = '<a href="'. get_permalink() .'">' . get_the_title() .'</a>';
và
$b = '<a href="' . get_category_link( $category ) . '">' . $category->name . '</a>';
BƯỚC 4
Kết hợp hai biến này để tạo thành một mảng nhiều chiều
$q[$b][] = $a;
Để xem những gì đang xảy ra trong mảng, chỉ cần làm một var_dump
?><pre><?php var_dump($q); ?></pre><?php
BƯỚC 5
Sử dụng foreach
các vòng lặp, tạo danh sách bài đăng của bạn được sắp xếp theo thể loại
foreach ($q as $key=>$values) {
echo $key;
echo '<ul>';
foreach ($values as $value){
echo '<li>' . $value . '</li>';
}
echo '</ul>';
}
TẤT CẢ MỌI THỨ NGAY BÂY GIỜ!
Đây là mã hoàn chỉnh
<?php
$args = array(
'posts_per_page' => -1
);
$query = new WP_Query($args);
$q = array();
while ( $query->have_posts() ) {
$query->the_post();
$a = '<a href="'. get_permalink() .'">' . get_the_title() .'</a>';
$categories = get_the_category();
foreach ( $categories as $key=>$category ) {
$b = '<a href="' . get_category_link( $category ) . '">' . $category->name . '</a>';
}
$q[$b][] = $a; // Create an array with the category names and post titles
}
/* Restore original Post Data */
wp_reset_postdata();
foreach ($q as $key=>$values) {
echo $key;
echo '<ul>';
foreach ($values as $value){
echo '<li>' . $value . '</li>';
}
echo '</ul>';
}
?>