Wp nhận tất cả các trang phụ của cha mẹ bằng truy vấn wp


13

Đây là mã của tôi

$my_wp_query = new WP_Query();
$all_wp_pages = $my_wp_query->query(array('post_type' => 'page','post_parent'=>$parid,'orderby'=>'title','order'=>'ASC' ));

Nó chỉ hiển thị các trang phụ cấp đầu tiên. Tôi cần tất cả trang phụ, trang phụ ... và tất cả. Tôi đã tìm kiếm một giải pháp và tôi có thể nhận được tất cả các trang phụ bằng cách sử dụng get_pages và wp_list_pages.

Nhưng tôi thực sự cần phải sắp xếp thứ tự theo giá trị meta bài tùy chỉnh. Vì vậy, tôi phải sử dụng truy vấn tùy chỉnh.

xin vui lòng giúp đỡ. Cảm ơn


1
Dưới đây bạn nói bạn đã tìm thấy một câu trả lời, nó là gì?
Drew Baker

4
Bạn đã kiểm tra get_page_children chưa?
t31os

Câu trả lời:


6

Tại sao không chỉ sử dụng get_pages()?

ví dụ

<?php
// Determine parent page ID
$parent_page_id = ( '0' != $post->post_parent ? $post->post_parent : $post->ID );
// Get child pages as array
$page_tree_array = get_pages( array(
    'child_of' => $parent_page_id;
) );
?>

Nhưng nếu nó thực sự phải là một WP_Query()đối tượng, hãy sử dụng một phương thức tương tự:

<?php
// Determine parent page ID
$parent_page_id = ( '0' != $post->post_parent ? $post->post_parent : $post->ID );
// Build WP_Query() argument array
$page_tree_query_args = array(
    'post_parent' => $parent_page_id;
);
// Get child pages as a WP_Query() object
$page_tree_query = new WP_Query( $page_tree_query_args );
?>

Nếu chúng tôi sử dụng chức năng get_pages (), chúng tôi không thể thực hiện sắp xếp (sort_column) cho các trường tùy chỉnh. Nó chỉ chấp nhận các trường bảng bài mà thôi. Tôi cần thực hiện sắp xếp cho trường tùy chỉnh. Vì vậy, chỉ có tôi sử dụng truy vấn wp (). Có cách nào khác không?
phpuser

Bạn có thấy nửa sau câu trả lời của tôi, trong đó tôi sử dụng WP_Query()không?
Chip Bennett

Tôi đã thử mã này nhưng nó chỉ trả về các trang phụ cấp đầu tiên. Tôi cần trang phụ >> phụ của phụ >> vv ... (nhiều cấp độ trang thấp hơn.). Cuối cùng tôi đã tìm ra giải pháp. Cảm ơn câu trả lời của bạn
phpuser

7
giải pháp của bạn là gì!?
JCHASE11

Có một số dấu chấm phẩy bên trong các định nghĩa mảng ở trên gây ra lỗi cú pháp.
ptrin

4

Vấn đề

Điều bạn đang gặp vấn đề là "Làm thế nào để tôi làm X?" Đây không phải là một hành động 1 bước, nó là một quá trình nhiều bước và nó cần phải được phá vỡ.

Bạn không cần phải làm điều này:

get all the posts that are a child of X ordered by meta

Bạn cần phải làm điều này:

get all the posts that are a child of X
    for each child, get all the posts that are a child
        foreach child of that child get all the posts that are a child
            ...
                hmmm we don't have any more children left

Take our list of posts and order them by meta

Giải pháp chung

Vì vậy, để hiểu làm thế nào để thực hiện nó vô tận cho đến khi bạn đạt đến cuối cùng, mà không cần mã hóa nó, bạn cần hiểu các hàm đệ quy.

ví dụ

function make_zero( $amount ) {
    $amount = $amount - 1;
    if ( $amount > 1 ){
        return make_zero( $amount );
    }
    return $amount;
}

Áp dụng đệ quy cho vấn đề này cho một giải pháp

Vì vậy, cha mẹ của bạn là $parid, và meta bài đăng của bạn có một chìa khóa $metakey.

Cho phép vượt qua nó vào một chức năng để lấy con của nó.

$children = get_children_with_meta( $parid, $metakey );

Sau đó, chúng tôi sẽ sắp xếp mảng $ children, các khóa sẽ là ID bài đăng và các giá trị sẽ là các giá trị meta.

asort($children);

và cho phép định nghĩa hàm là:

function get_children_with_meta( $parent_id, $metakey ) {
    $q = new WP_Query( array( 'post_parent' => $parent_id, 'meta_key' => $metakey ));
    if ( $q->have_posts() ) {
        $children - array();
        while ( $q->have_posts() ) {
            $q->the_post();
            $meta_value = get_post_meta(get_the_ID(), $metakey, true );
            $children[get_the_ID() ] = $meta_value;
        }
        return $children;
    } else {
        // there are no children!!
        return array();
    }
}

Điều này cung cấp cho bạn một loạt các ID và giá trị bài đăng, được sắp xếp từ thấp nhất đến cao nhất. Bạn có thể sử dụng các hàm sắp xếp PHP khác để thực hiện nó từ cao nhất đến thấp nhất.

Bây giờ còn trẻ em thì sao?

Ở giữa vòng lặp của chúng tôi, chúng tôi cần thực hiện một cuộc gọi đệ quy, truyền vào con chứ không phải ID cha.

Vậy đây:

$q->the_post();
$meta_value = get_post_meta(get_the_ID(), $metakey, true );
$children[get_the_ID() ] = $meta_value;

Trở thành này:

$q->the_post();
$meta_value = get_post_meta(get_the_ID(), $metakey, true );
$children[get_the_ID() ] = $meta_value;

// now get the childrens children
$grandchildren = get_children_with_meta( get_the_ID(), $metakey );

// merge the grandchildren and the children into the same list
$children = array_merge( $children, $grandchildren );

Với sửa đổi này, chức năng bây giờ lấy ra trẻ em, trẻ em trẻ em, trẻ em trẻ em trẻ em ..... vv

Cuối cùng, bạn có thể cắt bớt các giá trị trên mảng để lấy ID như thế này:

$post_ids = array_keys( $children );
$q = new WP_Query( array( 'post__in' => $post_ids );
// etc

Sử dụng chiến lược này, bạn có thể thay thế giá trị khóa meta bằng bất kỳ số liệu nào khác hoặc sử dụng các hàm đệ quy theo các cách khác.

Vì mã đầy đủ chỉ cần một vài giây để hiểu cơ bản và dán sao chép nhanh, tôi sẽ không xúc phạm trí thông minh của bạn bằng một khối mã sao chép đầy đủ.

Ưu điểm

  • Với sửa đổi hoạt động cho bất kỳ loại bài và hình thức dữ liệu
  • Có thể được sửa đổi để tạo đánh dấu lồng nhau
  • Dễ dàng lưu trữ để tăng tốc bằng cách đặt các mảng được trả về trong quá độ
  • Có thể được thiết lập với phân trang bằng cách áp dụng phân trang cho cuối WP_Query

Những vấn đề bạn sẽ gặp phải

  • Bạn không có cách nào để biết có bao nhiêu trẻ em cho đến khi bạn tìm thấy chúng, vì vậy chi phí hiệu suất không quy mô
  • Những gì bạn muốn sẽ tạo ra rất nhiều truy vấn, và vốn đã rất tốn kém vì độ sâu tiềm năng có liên quan.

Đề nghị của tôi

Tôi sẽ khuyên bạn nên làm phẳng hệ thống phân cấp trang của bạn hoặc sử dụng phân loại thay thế. Ví dụ: nếu bạn xếp hạng bài đăng, hãy phân loại Xếp hạng Trang với các điều khoản 1,2,3,4 và 5, v.v ... Điều này sẽ cung cấp cho bạn một danh sách bài đăng ngoài hộp.

Ngoài ra, sử dụng menu nav và bỏ qua vấn đề này hoàn toàn


3

Đệ quy nhận tất cả các trang phụ hiện tại

Đây là một cách tiếp cận đệ quy bằng cách sử dụng get_children. Đặt những điều sau vào functions.php:

function get_all_subpages($page, $args = '', $output = OBJECT) {
    // Validate 'page' parameter
    if (! is_numeric($page))
        $page = 0;

    // Set up args
    $default_args = array(
        'post_type' => 'page',
    );
    if (empty($args))
        $args = array();
    elseif (! is_array($args))
        if (is_string($args))
            parse_str($args, $args);
        else
            $args = array();
    $args = array_merge($default_args, $args);
    $args['post_parent'] = $page;

    // Validate 'output' parameter
    $valid_output = array(OBJECT, ARRAY_A, ARRAY_N);
    if (! in_array($output, $valid_output))
        $output = OBJECT;

    // Get children
    $subpages = array();
    $children = get_children($args, $output);
    foreach ($children as $child) {
        $subpages[] = $child;

        if (OBJECT === $output)
            $page = $child->ID;
        elseif (ARRAY_A === $output)
            $page = $child['ID'];
        else
            $page = $child[0];

        // Get subpages by recursion
        $subpages = array_merge($subpages, get_all_subpages($page, $args, $output));
    }

    return $subpages;
}

Làm thế nào để sử dụng nó

Sử dụng chức năng trên bất cứ nơi nào bạn muốn, ví dụ như thế này:

$all_current_subpages = get_all_subpages(0);

Hàm này hỗ trợ một argstham số (chuỗi truy vấn hoặc mảng) và một outputloại (xem bên trên).

Vì vậy, bạn cũng có thể sử dụng nó như vậy:

$args = array(
    'post_status' => 'private',
    'order_by' => 'post_date',
    'order' => 'DESC',
);
$all_current_subpages = get_all_subpages(42, $args, ARRAY_A);

Và do sự phụ thuộc get_children=> get_posts=> WP_Querybạn có thể sử dụng các giá trị meta, như yêu cầu ban đầu của tác giả của câu hỏi này.



2

Tôi đã thực hiện một hàm đệ quy có được tất cả các id con của trang cha. Sau khi có id, chúng tôi thực hiện truy vấn cho các trang và có thể sắp xếp kết quả theo khóa / giá trị meta.

// Gets all the children ids of post_parent
function _get_children_ids( $post_parent ) {
    $results = new WP_Query( array(
        'post_type' => 'page',
        'post_parent' => $post_parent
    ) );

    $child_ids = array();
    if ( $results->found_posts > 0 )
        foreach ( $results->posts as $post ) // add each child id to array
            $child_ids[] = $post->ID;

    if ( ! empty( $child_ids ) )
        foreach ( $child_ids as $child_id ) // add further children to array
            $child_ids = array_merge( $child_ids, _get_children_ids( $child_id ) );

    return $child_ids;
}

$children_ids = _get_children_ids( 9 ); // use your numeric page id or get_the_id()

$results = new WP_Query( array(
    'post_type'   => 'page',
    'post__in'   => $children_ids
    #'meta_key'   => 'meta_key', // your meta key
    #'orderby'    => 'meta_key',
    /* 'meta_query' => array( // optional meta_query
        array(
            'key' => 'meta_key', // key
            'value' => array(3, 4), // values
            'compare' => 'IN', // operator
        )
    ) */
) );

var_dump( $results );

Nếu bạn cần sắp xếp các con theo khóa / giá trị meta theo cách phân cấp, bạn nên chuyển các giá trị meta_key và order_by cho WP_Query trong hàm _get_children_ids (thay vì WP_Query cuối cùng).

Nếu không, một phương pháp đơn giản hơn để lấy tất cả id con là:

$children = get_pages( 'child_of=9');

$children_ids = array();
if ( ! empty( $children ) )
    foreach ( $children as $post )
        $children_ids[] = $post->ID;

-1

TÔI LÀM VIỆC NÀY, CHỈ CẦN SAO CHÉP MÃ SỐ MÃ ĐẾN TRANG CỦA BẠN.PHP FILE

//REDIRECT TO FIRST CHILD FROM PARENT PAGE

// Build WP_Query() argument array
$page_tree_query_args = array(
    'post_parent' => $post -> ID,
    'post_type' => 'page',
    'order' => 'asc'
);
// Get child pages as a WP_Query() object
$page_tree_query = new WP_Query( $page_tree_query_args );
if(!empty($page_tree_query -> posts)){
    $first_subpage = $page_tree_query -> posts[0] -> ID;
    wp_redirect( get_permalink( $first_subpage ) );
    exit;   
}

Đây là A) không hoạt động ( $post -> ID?), B) không phải những gì được yêu cầu, C) không được giải thích rất tốt.
tfrommen
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.