$POST->POST_META在WordPress/php中不拉取任何POST

时间:2020-07-06 作者:user1950349

我在php中有一个函数,如下所示:

function hello_world( $post ) {
    echo \'<pre>\'; print_r($post); echo \'</pre>\'; // Line A
    echo \'<pre>\'; print_r($post->post_meta); echo \'</pre>\'; // Line B
    return $post->post_meta;
}
我已添加Line ALine B 在上述函数中进行调试。在函数中hello_world 在上面Line A 返回EAS行B不返回任何内容的所有帖子的列表。

我想知道我需要在上面的wordpress或php代码中做些什么更改,以便Line B 返回帖子列表。

Edit 1:

添加的代码$loc_query

function area_search( $abc ) {
        if ( $abc ) {
            $loc_query = new \\WP_Query( [
                \'s\'           => $abc,
                \'post_type\'   => \'abc-xyz\',
                \'post_status\' => \'publish\',
            ] );
        } else {
            $loc_query = new \\WP_Query( [
                \'post_type\'   => \'abc-xyz\',
                \'post_status\' => \'publish\',
                \'ep_integrate\' => true,
                \'orderby\' => \'title\',
                \'order\'   => \'ASC\',
            ] );
        }
        $result = array_map( __NAMESPACE__ . \'\\hello_world\', $query->posts );
        echo \'<pre>\'; print_r($result); echo \'</pre>\'; // Line A
        return group( $result );
    }

1 个回复
SO网友:Tom J Nowell

您的代码正在干扰的内部结构WP_QueryWP_Post, 并对其工作原理做出假设。这是极不寻常的,在使用WordPress开发时不是最佳实践。

举个例子,官方没有post_meta 该类上的成员变量(https://developer.wordpress.org/reference/classes/wp_post/ ). 这不是获取posts元键/值的方式。

Instead, use a standard post loop, and standard API calls.

这是一个标准WP_Query post循环应如下所示:

$args = [
    // parameters go here
];
$query = new WP_Query( $args );
if ( $query->have_posts() ) { 
    while ( $query->have_posts() ) {
        $query->the_post();
        // display the post
        the_title();
        the_content();
    }
    wp_reset_postdata();
} else {
    echo "no posts were found";
}
请注意,标准的后循环生命周期以及所有预期的挂钩都会发生。您可以在while 每个帖子的循环。例如,获取所有post meta。为此,请使用get_post_meta 功能:

$all_meta = get_post_meta( get_the_ID() );
可能很容易想到WP_Post 对象遵循了朴素的OO梦想,即为帖子提供一个包罗万象的API,一个帖子的一站式表示,以及所有需要知道和可以做的事情。但实际上它是一个数据容器。您找不到类方法或对其进行子分类的方法。

此外,通过浏览和直接访问内部数据结构,您可以绕过许多功能,并冒着代码将来被破坏的风险。例如,post meta提前获取并存储在WP_Cache 避免查询重复。还有一些过滤器允许插件和其他代码进行更改或修复。