Wp отримати всі підсторінки батьків, використовуючи wp-запит


13

Ось мій код

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

Він відображає лише підсторінки першого рівня. Мені потрібні всі під-сторінки, під-сторінки під-сайтів ... і все. Я шукав рішення, і я можу отримати всі підсторінки за допомогою get_pages та wp_list_pages.

Але мені дійсно потрібно сортувати порядок за спеціальним мета-значенням. Тому я повинен використовувати спеціальний запит.

будь ласка, допоможіть. Дякую


1
Нижче ви кажете, що знайшли відповідь, що це?
Дрю Бейкер

4
Ви перевірили get_page_children ?
t31os

Відповіді:


6

Чому б просто не використовувати get_pages()?

напр

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

Але якщо це дійсно має бути WP_Query()об’єктом, скористайтеся подібним методом:

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

Якщо ми використовуємо функцію get_pages (), ми не змогли реалізувати сортування (sort_column) для спеціальних полів. Він приймає лише поля таблиць публікацій. Мені потрібно реалізувати сортування за спеціальним полем. Тому я лише використовую wp query (). Чи є альтернативний спосіб?
phpuser

Ви бачили другу половину моєї відповіді, в якій я використовую WP_Query()?
Чіп Беннетт

Я спробував цей код, але він повертає лише підсторінки першого рівня. Мені потрібна підсторінка >> підмітка >> >> і т.д. ... (кілька нижчих рівнів сторінок.). Нарешті я знайшов рішення. Дякуємо за вашу відповідь
phpuser

7
яке ваше рішення !?
JCHASE11

Всередині визначень масиву вище є крапки з комою, що викликає помилки синтаксису.
ptrin

4

Проблема

У вас виникають проблеми з розумінням: "Як зробити X?" Це не одноетапна дія, це багатоступеневий процес, і його потрібно розбити.

Вам цього не потрібно:

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

Вам потрібно зробити це:

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

Загальне рішення

Отже, щоб зрозуміти, як нескінченно робити це до досягнення кінця, без жорсткого кодування, потрібно зрозуміти рекурсивні функції.

напр

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

Застосування рекурсії до цієї проблеми для вирішення

Отже, ваш батько є $parid, а у вашої мета-повідомлення є ключ $metakey.

Дозволяє передати це функції, щоб захопити своїх дітей.

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

Тоді ми відсортуємо дочірній масив $, ключі будуть ідентифікаторами пошти, а значення - метазначеннями.

asort($children);

і дозволить визначити функцію як:

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

Це дає вам масив ідентифікаторів та значень публікацій, упорядкованих від найнижчих до найвищих. Ви можете використовувати інші функції сортування PHP, щоб зробити це від найвищого до нижнього.

Тепер що робити з дітьми дітей?

У середині нашого циклу нам потрібно здійснити рекурсивний дзвінок, передаючи дитині, а не батьківському ідентифікатору.

Отже це:

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

Стає таким:

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

За допомогою цієї модифікації тепер функція отримує дітей, дітей, дітей, дітей, дітей ..... і т.д.

Наприкінці ви можете обрізати значення масиву, щоб отримати такі ідентифікатори:

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

За допомогою цієї стратегії ви можете замінити значення мета-ключа будь-яким іншим показником або використовувати рекурсивні функції іншими способами.

Оскільки повний код вимагає лише декількох секунд основного розуміння та швидкої копії пасти, я не буду ображати ваш інтелект повним блоком коду вставлення коду.

Переваги

  • З модифікацією працює для будь-якого типу та форми даних
  • Можна змінити для створення вкладеної розмітки
  • Легко кешуйте, щоб пришвидшити, поміщаючи повернені масиви в перехідні періоди
  • Можна налаштувати за допомогою підкачки, застосувавши підкачку до кінця WP_Query

Проблеми, з якими ви зіткнетесь

  • Ви не можете дізнатися, скільки дітей є, поки ви їх не знайшли, тому витрати на продуктивність не зменшуються
  • Те, що ви хочете, генерує безліч запитів і по суті коштує дорого через потенційні глибини.

Моя рекомендація

Я рекомендую вам або вирівняти ієрархію сторінки, або скористатися таксономією. Наприклад, якщо ви оцінюєте повідомлення, вкажіть таксономію рейтингу сторінок з умовами 1,2,3,4 та 5 тощо. Це забезпечить вам публікацію публікацій поза полем.

Крім того, використовуйте навігаційні меню та цілком обходьте цю проблему


3

Рекурсивно отримуйте всі поточні підсторінки

Ось рекурсивний підхід із використанням get_children. Помістіть у своєму 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;
}

Як ним користуватися

Використовуйте вищевказану функцію де завгодно, наприклад, наприклад:

$all_current_subpages = get_all_subpages(0);

Ця функція підтримує argsпараметр (рядок запиту чи масив) та outputтип (див. Вище).

Тож ви також можете його використовувати так:

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

І через залежність get_children=> get_posts=> WP_Queryви можете використовувати мета значення, як спочатку вимагав автор цього питання.



2

Я зробив рекурсивну функцію, яка отримує всі ідентифікаційні дані батьківської сторінки. Після того, як у нас з'явиться ідентифікатор, ми робимо запит на сторінки та можемо замовити результати за мета-ключем / значенням.

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

Якщо вам потрібно сортувати дітей за мета-ключем / значенням ієрархічно, вам слід передати значення meta_key та order_by до WP_Query у функції _get_children_ids (замість остаточного WP_Query).

Якщо ні, то більш простий метод отримати весь ідентифікатор дитини:

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

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

-1

Я РУБУЮ ЦІЙ РОБОТУ, ПРОСТО КОПІЮЙТЕ ВКЛЮЧИТИ КОД НА ВАШУ СТОРІНУ. ФАЙЛ

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

Це A) не працює ( $post -> ID?), B) не те, що просили, C) не дуже пояснено.
tfrommen
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.