如何在GET_POSTS()函数中通过某个页面的插件及其所有子页面获取页面ID数组?

时间:2020-04-29 作者:Victor

我的主题中有一个自定义函数,可以创建动态sitemap.xml 文件

我用的是$myVar = get_posts( array(...) ). 在该数组中,我需要排除一些页面。

我想排除某些父页面及其所有子页面。

我只想使用父页面slug来获取父页面和子页面的所有ID的数组。

问题是:\'exclude\' =>array() 仅接受ID数组。不是鼻涕虫。

如何通过某种函数(或其他方式)通过父页面slug返回ID数组(包括父ID及其所有子项)来实现它?

例如,假设父页面slug是abc.

谢谢你了。

1 个回复
最合适的回答,由SO网友:Pat J 整理而成

您可以使用get_page_by_path() 获取页面的WP_Post 对象,然后使用该对象获取子页ID数组,使用get_children().

// First we\'ll create the list of posts (pages) to exclude.
$exclude = array();
$parent_page_obj = get_page_by_path( \'abc\' );
if ( ! empty( $parent_page_obj ) ) {
    $parent_id = $parent_page_obj->ID;
    // Adds the parent page to the $exclude array.
    $exclude[] = $parent_id;
    $args = array(
        \'post_type\'   => \'page\',
        \'post_parent\' => $parent_id,
        \'numberposts\' => -1,
    );
    $children = get_children( $args );
    foreach ( $children as $child ) {
        $exclude[] = $child->ID;
    }
}

// Now you can use the $exclude array in your get_posts() call.
$get_posts_arg = array(
    // All your existing arguments here.
    //...
    \'exclude\' => $exclude,
);
$my_posts = get_posts( $get_post_args );
获取所有子代和孙辈,是的,直到第n代,下面的代码使用递归获取子代的子代,直到子代用完为止。我已经在当地的WP安装中快速测试了它,它已经运行了5代。

它应该对您正在做的事情起作用,但请注意递归可能会导致无限循环,因此请在将其投入生产之前在非生产站点中进行测试。

/**
 * Gets all the descendants of a give page slug.
 *
 * @param  int|string $id   The ID or slug of the topmost page.
 * @param  array      $kids The array of kids already discovered. Optional.
 * @return array            The array of kids found in the current pass.
 */
function wpse365429_get_kids( $id, $kids = null ) {
    if ( empty( $kids ) ) {
        $kids = array();
    }
    if ( is_string( $id ) ) {
        $obj = get_page_by_path( $id );
        if ( ! empty( $obj ) ) {
            $id = $obj->ID;
        }
    }
    if ( ! in_array( $id, $kids ) ) {
        $kids[] = $id;
    }
    $child_pages = get_children( $id );
    if ( ! empty( $child_pages ) ) {
        foreach ( $child_pages as $child ) {
            $kids = wpse365429_get_kids( $child->ID, $kids );
        }
    }

    return $kids;
}
$exclude = wpse365429_get_kids( \'abc\' );
// From this point, you can use the $exclude array as you did in the
// previous code snippet.

相关推荐

将wp_post.guid列的大小从VARCHAR(255)增加/更改为VARCHAR(2048)是否安全?

我计划使用External Media Without Import 插件,与任何现有媒体一样,使用post表的guid列存储媒体的URL(例如:jpg等)。My DB将此列定义为VARCHAR(255),这对于某些HTTP URL来说是不够的。增加到VARCHAR(2048)有什么缺点吗?在不改变DB的情况下,是否有其他方法可以实现这一点?注意:正如Tom在下面指出的,这确实是该插件的一个限制,它应该使用其他一些方法来存储外部URL