Trang web WordPress $ wpdb-> get_results


8

Do cấu hình đa trang phức tạp, tôi có một truy vấn kết hợp các bài đăng từ hai blog và tôi muốn phân trang kết quả . Tôi biết ơn bất kỳ sự giúp đỡ. Tôi đã đăng câu hỏi của tôi.

            $latestposts = $wpdb->get_results(

            "
            (SELECT * FROM net_5_posts
            INNER JOIN net_5_term_relationships ON net_5_posts.ID=net_5_term_relationships.object_id  
            WHERE post_type = 'post' 
            AND post_status = 'publish' 
            AND term_taxonomy_id = '151' 
            )

            UNION ALL

            (SELECT * FROM net_7_posts
            INNER JOIN net_7_term_relationships ON net_7_posts.ID=net_7_term_relationships.object_id  
            WHERE post_type = 'post' 
            AND post_status = 'publish' 
            AND term_taxonomy_id = '20' 
            )

            ORDER BY post_date
            DESC LIMIT 5",'ARRAY_A');

            foreach ($latestposts as $latestpost) {

            $da_id = $latestpost['ID'];
            $da_title = $latestpost['post_title'];
            $da_content = strip_tags($latestpost['post_content']);
            $da_content = limit_words($da_content,55);
            $da_link = $latestpost['guid'];
            $da_date = $latestpost['post_date'];
            $da_date = date('F j, Y', strtotime($da_date));

            echo '
            <div class="ldapost">
            <h2 class="lheader"><a href="'.$da_link.'">'.$da_title.'</a></h2>
            <span class="ldate">'.$da_date.'</span>
            <span class="lcontent">'.$da_content.'…</span><br>
            <a class="button btnright" href="'.$da_link.'">Continue Reading</a>
            </div>
            ';

            }

Câu trả lời:


13

Cập nhật

Tôi đã thử nghiệm điều này và nó hoạt động trên trang web của tôi. Một vài thứ:

  • Thay thế tôi $querybằng của bạn
  • global $wpdb (theo nhận xét của bạn về các biến toàn cầu) vì nó nằm ngoài phạm vi!
  • get_results() trả về một đối tượng khi không được nói khác (tham số thứ hai là kiểu trả về)
  • Tôi đã đặt nó trong một plugin, nhưng bạn có thể trích xuất mã và đặt nó vào chủ đề của bạn hoặc chỉ cần đặt nó vào functions.php.

Đây là chức năng:

function test_function() {

    global $wpdb;

    $query = "
        (SELECT * FROM wp_18_posts
        INNER JOIN wp_18_term_relationships ON wp_18_posts.ID=wp_18_term_relationships.object_id  
        WHERE post_type = 'post' 
        AND post_status = 'publish' 
        AND term_taxonomy_id = '2')

        UNION ALL

        (SELECT * FROM wp_17_posts
        INNER JOIN wp_17_term_relationships ON wp_17_posts.ID=wp_17_term_relationships.object_id  
        WHERE post_type = 'post' 
        AND post_status = 'publish' 
        AND term_taxonomy_id = '2')";

    $total_query = "SELECT COUNT(1) FROM (${query}) AS combined_table";
    $total = $wpdb->get_var( $total_query );
    $items_per_page = 1;
    $page = isset( $_GET['cpage'] ) ? abs( (int) $_GET['cpage'] ) : 1;
    $offset = ( $page * $items_per_page ) - $items_per_page;
    $latestposts = $wpdb->get_results( $query . " ORDER BY post_date LIMIT ${offset}, ${items_per_page}" );

    foreach ($latestposts as $latestpost) {
        $da_id = $latestpost->ID;
        $da_title = $latestpost->post_title;
        $da_content = strip_tags($latestpost->post_content);
        $da_content = wp_trim_words($da_content, 55);
        $da_link = $latestpost->guid;
        $da_date = $latestpost->post_date;
        $da_date = date('F j, Y', strtotime($da_date));

        echo '
        <div class="ldapost">
        <h2 class="lheader"><a href="'.$da_link.'">'.$da_title.'</a></h2>
        <span class="ldate">'.$da_date.'</span>
        <span class="lcontent">'.$da_content.'…</span><br>
        <a class="button btnright" href="'.$da_link.'">Continue Reading</a>
        </div>
        ';
    }

    echo paginate_links( array(
        'base' => add_query_arg( 'cpage', '%#%' ),
        'format' => '',
        'prev_text' => __('&laquo;'),
        'next_text' => __('&raquo;'),
        'total' => ceil($total / $items_per_page),
        'current' => $page
    ));
}

Bài gốc

Hàm paginate_links độc lập với truy vấn của bạn. Đưa ra một vài tham số, như tổng số mục và trang hiện tại, nó có thể cung cấp phân trang mà bạn đang tìm kiếm. Vì vậy, bạn cần tính toán:

  1. Tổng số mặt hàng
  2. Số trang hiện tại, dựa trên 1
  3. Phần bù cho câu lệnh giới hạn mysql.

Tôi đã suy nghĩ một cái gì đó như thế này (chưa được kiểm tra, xin lỗi!):

$query = "
    (SELECT * FROM net_5_posts
    INNER JOIN net_5_term_relationships ON net_5_posts.ID=net_5_term_relationships.object_id  
    WHERE post_type = 'post' 
    AND post_status = 'publish' 
    AND term_taxonomy_id = '151' 
    )

    UNION ALL

    (SELECT * FROM net_7_posts
    INNER JOIN net_7_term_relationships ON net_7_posts.ID=net_7_term_relationships.object_id  
    WHERE post_type = 'post' 
    AND post_status = 'publish' 
    AND term_taxonomy_id = '20' 
    )";

$total = $wpdb->get_var( "SELECT COUNT(1) FROM (${query}) AS combined_table" );
$items_per_page = 5;
$page = isset( $_GET['cpage'] ) ? abs( (int) $_GET['cpage'] ) : 1;
$offset = ( $page * $items_per_page ) - $items_per_page;
$latestposts = $wpdb->get_results( $query . " ORDER BY post_date LIMIT ${offset}, ${items_per_page}" );

foreach ($latestposts as $latestpost) {
    // Your code here ...
}

echo paginate_links( array(
    'base' => add_query_arg( 'cpage', '%#%' ),
    'format' => '',
    'prev_text' => __('&laquo;'),
    'next_text' => __('&raquo;'),
    'total' => ceil($total / $items_per_page),
    'current' => $page
));

Người giới thiệu:


cảm ơn, hmmm không thể làm việc với truy vấn của tôi, tôi có thể thiếu một cái gì đó.
uknowit2

Tôi đã cập nhật câu trả lời của mình để rõ ràng hơn, với một số mã giả. Hy vọng điều này hoạt động! Nếu không, hãy bình luận! :)
getWeberForStackExchange

1
Này Weberwithoneb cảm ơn vì đã gắn bó với tôi về điều này. Tôi đã thử truy vấn cập nhật nhưng nó đưa ra một khoảng trống, không có lỗi, chỉ là không có kết quả. Tôi có thể xác nhận rằng truy vấn trong câu hỏi của tôi không hoạt động. Tôi có cần thêm bất kỳ toàn cầu?
uknowit2

Ok tôi đã cập nhật câu trả lời của tôi với mã được thử nghiệm. Hãy bình luận với các câu hỏi!
getWeberForStackExchange

Chà !! Bạn là một GENIUS và tôi muốn nói CẢM ƠN BẠN !! Hoạt động như một giấc mơ !! Cảm ơn một lần nữa.
uknowit2

1
// This worked great for me so much thanks! I just adapted for what I needed. Right in template file, Sweet!
global $wpdb;
// QUERY HERE TO COUNT TOTAL RECORDS FOR PAGINATION $total = $wpdb->get_var("SELECT COUNT(*)
$post_per_page = 10;
$page = isset( $_GET['cpage'] ) ? abs( (int) $_GET['cpage'] ) : 1;
$offset = ( $page * $post_per_page ) - $post_per_page;

// QUERY HERE TO GET OUR RESULTS $results = $wpdb->get_results

// PHP FOR EACH LOOP HERE TO DISPLAY OUR RESULTS
// END OUR FOR EACH LOOP

// PAGINATION HERE IN NICE BOOTSTRAP STYLES
<?php 
echo '<div class="pagination">';
echo paginate_links( array(
'base' => add_query_arg( 'cpage', '%#%' ),
'format' => '',
'prev_text' => __('&laquo;'),
'next_text' => __('&raquo;'),
'total' => ceil($total / $post_per_page),
'current' => $page,
'type' => 'list'
));
echo '</div>';
?>
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.