【问题标题】:What's the correct way to work with WordPress posts from the API?从 API 处理 WordPress 帖子的正确方法是什么?
【发布时间】:2013-04-28 20:45:53
【问题描述】:

将 WordPress 帖子作为纯数据结构使用的诀窍是什么?

传统上,您使用“循环”并通过以下函数输出数据:

<?php the_title(); ?>
<?php the_content(); ?>

这些函数将文本直接转储到响应中。

使用 $wpdb,我可以返回一组这样的帖子:

$posts = $wpdb->get_results("SOME SQL HERE", OBJECT);

然后我得到一个 stdClass 对象数组,我猜这些对象是……Post-ish。它们具有“post_title”等属性,但没有固定链接,这让我认为这不是要使用的“正确” Post 对象。此外,“post_content”不是完整的 HTML——它仍然有换行符等。

在迭代这个数组时,我发现我必须这样做:

foreach ($events as $post)
{
   setup_postdata($post);
   ...

这会将帖子置于全局范围内。然后我可以使用上述函数写出内容,并使用这样的函数来获取元数据:

$display_date = get_custom_field('display_date');

有没有更好的方法?这看起来……很奇怪。有没有办法将帖子完整表示为一个对象,包含所有元数据以及我需要从数据级别操作它的所有其他内容,而不是仅仅假设我想将输出转储到响应?

【问题讨论】:

    标签: wordpress


    【解决方案1】:

    你可以改用WP_Query,就像

    $the_query = new WP_Query( $args );
    while ( $the_query->have_posts() ) : $the_query->the_post();
        echo '<li>' . get_the_title() . '</li>';
    endwhile;
    

    您只需准备$args 参数数组即可进行自定义查询,例如,您可以使用

    // Display posts that have "books" tag
    $the_query = new WP_Query( 'tag=books' );
    

    // Display posts that have these categories
    $the_query = new WP_Query( 'category_name=event,news' );
    

    或更复杂的类似

    // Display posts tagged with bob, under people custom taxonomy
    $args = array(
        'post_type' => 'post',
        'people' => 'bob'
    );
    $the_query = new WP_Query( $args );
    

    您也可以使用query_posts,但它与WP_Query 有点不同,您也可以使用get_post 并使用custom select query,仅当无法使用WordPress 的方式获得所需的结果时。关于WP_Query vs query_posts() vs get_posts() 有一个很好的答案,请阅读此内容以获得更好的理解。

    【讨论】:

    • 这是正确的。 wpdb 可以在某些情况下使用,但 WP_Query 几乎可以满足所有需求。它拥有有效使用帖子所需的所有东西。该循环本质上是建立在 WP_Query 之上的,但按照 Sheikh 的建议使用它可以进行自定义,而不会带来 WPDB 的缺点。
    • WP_Query 的结果是一个 WP_Post 对象数组,这是朝着正确方向迈出的一步,但它们似乎仍然没有永久链接。从该对象中,我如何获取帖子的 URL?那么帖子的自定义字段呢?那些似乎也不在对象上。
    • 我找到了:get_permalink($post-ID)。我仍然不明白为什么这不能成为对象的属性。另外,我发现虚拟属性会给你元数据——只要像它们存在一样处理它们:$post->my_custom_field_name。
    • 其实我不知道为什么this just can't be a property on the object但是如果你想使用元字段的过滤器那么你可以使用meta_query,你也可以使用全局$post变量,关于WP_Query 的解释还有很多,但在这种情况下是不可能的,无论如何,read this,希望对您有所帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-11
    • 2014-09-23
    • 2010-10-08
    相关资源
    最近更新 更多