Wp mendapatkan semua sub halaman dari induk menggunakan kueri wp

13

Ini kode saya

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

Ini hanya menampilkan sub halaman tingkat pertama. Saya membutuhkan semua sub halaman, sub halaman ... dan semua. Saya mencari solusi dan saya bisa mendapatkan semua sub halaman menggunakan get_pages dan wp_list_pages.

Tetapi saya benar-benar perlu mengurutkan pesanan berdasarkan nilai meta pos kustom. Jadi saya harus menggunakan permintaan khusus.

tolong bantu. Terima kasih

phpuser
sumber
1
Di bawah Anda mengatakan Anda menemukan jawaban, apa itu?
Drew Baker
4
Sudahkah Anda memeriksa get_page_children ?
t31os

Jawaban:

6

Kenapa tidak pakai saja get_pages()?

misalnya

<?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;
) );
?>

Tetapi jika itu benar-benar harus sebagai WP_Query()objek, gunakan metode serupa:

<?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 );
?>
Chip Bennett
sumber
Jika kami menggunakan fungsionalitas get_pages () kami tidak dapat mengimplementasikan sorting (sort_column) untuk bidang khusus. Ini hanya menerima kolom tabel postingan saja. Saya perlu menerapkan pengurutan untuk bidang khusus. Jadi hanya saya yang menggunakan query wp (). Apakah ada cara alternatif?
phpuser
Apakah Anda melihat bagian kedua dari jawaban saya, di mana saya gunakan WP_Query()?
Chip Bennett
Saya mencoba kode ini tetapi hanya mengembalikan halaman tingkat pertama saja. Saya membutuhkan sub halaman >> sub sub >> dll ... (beberapa level halaman lebih rendah.). Akhirnya saya menemukan solusinya. Terima kasih atas balasan Anda
phpuser
7
apa solusimu !?
JCHASE11
Ada beberapa titik koma di dalam definisi array di atas yang menyebabkan kesalahan sintaksis.
ptrin
4

Masalah

Apa yang Anda punyai kesulitan untuk memahami adalah "Bagaimana saya melakukan X?" Ini bukan tindakan 1 langkah, ini adalah proses multi-langkah, dan perlu dipisah-pisahkan.

Anda tidak perlu melakukan ini:

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

Anda perlu melakukan ini:

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

Solusi Umum

Jadi, untuk memahami cara melakukannya hingga Anda mencapai akhir, tanpa hardcoding, Anda perlu memahami fungsi rekursif.

misalnya

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

Menerapkan Rekursi Untuk Masalah Ini Sebagai Solusi

Jadi orang tua Anda $parid, dan meta pos Anda memiliki kunci $metakey.

Mari kita berikan fungsi untuk mengambil anak-anaknya.

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

Kemudian kita akan mengurutkan array $ children, kunci akan menjadi ID posting, dan nilainya akan menjadi nilai meta.

asort($children);

dan mari kita mendefinisikan fungsi sebagai:

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();
    }
}

Ini memberi Anda array ID dan nilai pos, dipesan dari terendah ke tertinggi. Anda dapat menggunakan fungsi penyortiran PHP lainnya untuk melakukannya dari tertinggi ke terendah.

Sekarang Bagaimana Dengan Anak-Anak?

Di tengah-tengah loop kita, kita perlu membuat panggilan rekursif, melewati anak daripada ID induk.

Jadi ini:

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

Menjadi ini:

$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 );

Dengan modifikasi ini fungsi sekarang mengambil anak-anak, anak-anak anak-anak, anak-anak anak-anak ..... dll

Pada akhirnya Anda dapat memotong nilai pada array untuk mendapatkan ID seperti ini:

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

Dengan menggunakan strategi ini, Anda dapat mengganti nilai kunci meta dengan metrik lainnya, atau menggunakan fungsi rekursif dengan cara lain.

Karena kode lengkap hanya memerlukan beberapa detik pemahaman dasar dan copy paste cepat, saya tidak akan menghina kecerdasan Anda dengan blok kode copy paste penuh kode.

Keuntungan

  • Dengan modifikasi berfungsi untuk semua jenis posting dan bentuk data
  • Dapat dimodifikasi untuk menghasilkan markup bersarang
  • Mudah cache untuk mempercepat dengan menempatkan array yang dikembalikan dalam transien
  • Dapat diseting dengan paging dengan menerapkan paging pada bagian akhir WP_Query

Masalah yang Akan Anda Temui

  • Anda tidak memiliki cara untuk mengetahui berapa banyak anak-anak di sana sampai Anda menemukannya, sehingga biaya kinerja tidak bertambah
  • Apa yang Anda inginkan akan menghasilkan banyak pertanyaan, dan secara inheren mahal karena kedalaman potensial yang terlibat.

Rekomendasi saya

Saya akan merekomendasikan Anda untuk meratakan hierarki halaman Anda atau menggunakan taksonomi sebagai gantinya. Misalnya, jika Anda memberi peringkat pada posting, miliki taksonomi Peringkat Halaman dengan ketentuan 1,2,3,4 dan 5, dll. Ini akan memberi Anda daftar posting di luar kotak.

Atau, gunakan menu nav dan bypass masalah ini sepenuhnya

Tom J Nowell
sumber
3

Secara rekursif dapatkan semua halaman saat ini

Berikut ini adalah pendekatan rekursif menggunakan get_children. Masukkan yang berikut ini di 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;
}

Bagaimana cara menggunakannya

Gunakan fungsi di atas di mana pun Anda inginkan, misalnya seperti ini:

$all_current_subpages = get_all_subpages(0);

Fungsi ini mendukung argsparameter (string atau array kueri) dan outputtipe (lihat di atas).

Jadi Anda juga bisa menggunakannya seperti ini:

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

Dan karena dependensi get_children=> get_posts=> WP_QueryAnda dapat menggunakan nilai meta, seperti yang awalnya diminta oleh penulis pertanyaan ini.

para pria
sumber
2

Tidak yakin apakah ini yang Anda cari, tetapi Anda bisa menggunakan fungsi wp_list_pages, dan menggunakan parameter 'child_of' dan 'depth'.

Lihat halaman berikut pada Codex untuk info lebih lanjut: http://codex.wordpress.org/Function_Reference/wp_list_pages

Kris Nielsen
sumber
2

Saya telah membuat fungsi rekursif yang membuat semua id anak-anak dari halaman orang tua. Setelah kami memiliki id, kami membuat permintaan untuk halaman dan dapat memesan hasilnya dengan kunci meta / nilai.

// 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 );

Jika Anda perlu mengurutkan anak-anak dengan kunci meta / nilai secara hierarkis, Anda harus meneruskan nilai meta_key dan order_by ke WP_Query di fungsi _get_children_ids (alih-alih WP_Query akhir).

Jika tidak, metode yang lebih sederhana untuk mendapatkan semua id anak adalah:

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

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

SAYA MEMBUAT KERJA INI, HANYA SALIN PASANG KODE KE FILE HALAMAN.PADA ANDA

//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;   
}
Bipin Sapkota
sumber
Ini A) tidak berfungsi ( $post -> ID?), B) bukan yang diminta, C) tidak dijelaskan dengan baik.
tfrommen