2

有没有办法获取 Wordpress 帖子,以便元调用实际上不进行数据库调用?

例如,我目前有:

$args = array(
  'posts_per_page' => 1000,
  'post_type' => 'portfoliosample'
  );
$query = new WP_Query($args);
while($query->have_posts()):
  $query->the_post();
  $style = '';
  if(has_post_thumbnail($post->ID)){
    $image = wp_get_attachment_image_src( get_post_thumbnail_id( $post->ID ), 'single-post-thumbnail' );
    $largeurl = $image[0];
    $style = ' style="background-image:url('.$largeurl.');"';
  }

?>
    <li id="post-<?php the_ID(); ?>" <?php post_class('half'); ?>>
      <a href="<?php the_permalink()?>"<?php echo $style?> ng-click="lightbox('portfolio','<?php the_permalink()?>')">
        <h3 class="entry-title caps"><?php echo strtoupper(the_title('', '', false)); ?></h3>
        </a>
    </li>
<?php
endwhile;

诸如the_title()不要进行数据库调用之类的事情,因为post有该信息。但是,$post似乎没有帖子的缩略图 ID 或该缩略图的图像源。
如果我执行这样的自定义查询:

global $wpdb;
$query = "
    SELECT posts.*
    FROM $wpdb->posts posts
    WHERE posts.post_type = 'portfoliosample'
    AND posts.post_status = 'publish'
    ORDER BY posts.menu_order ASC
";
$pageposts = $wpdb->get_results($query, OBJECT);
if($pageposts)
{
    global $post;
    foreach($pageposts as $post)
    {
        setup_postdata($post);
        $style = '';
        if(has_post_thumbnail($post->ID)){
            $image = wp_get_attachment_image_src( get_post_thumbnail_id( $post->ID ), 'single-post-thumbnail' );
            $largeurl = $image[0];
            $style = ' style="background-image:url('.$largeurl.');"';
        }
        ?>
        <li id="post-<?php the_ID(); ?>" <?php post_class('half'); ?>>
            <a href="<?php the_permalink()?>"<?php echo $style?> ng-click="lightbox('portfolio','<?php the_permalink()?>')">
                <h3 class="entry-title caps"><?php echo strtoupper(the_title('', '', false)); ?></h3>
            </a>
        </li><!-- #post-## -->
        <?php
    }
}

我可以同时获取元数据但仍然允许类似的功能get_post_thumbnail()吗?我希望setup_postdata()有办法处理这个问题。

4

2 回答 2

0

没有办法做我想做的事。您要么必须手动完成这些函数所做的一切,要么允许它们进行数据库调用。

于 2013-11-17T19:15:31.073 回答
-1

Try this (untested and probably a bit broken, but should get you moving in the right direction):

$querystr = "
SELECT $wpdb->posts.*, $wpdb->postmeta.*
FROM $wpdb->posts
LEFT JOIN $wpdb->postmeta ON {$wpdb->postmeta}.id = {$wpdb->post}.id
WHERE $wpdb->posts.post_status = 'publish' 
AND $wpdb->postmeta.key = '_thumbnail_id'
AND $wpdb->posts.post_type = 'portfoliosample'
";

$pageposts = $wpdb->get_results($querystr, OBJECT);

and then loop through it like this:

<?php if ($pageposts): ?>
<?php global $post; ?>
<?php foreach ($pageposts as $post): ?>
<?php setup_postdata($post); ?>

<div class="post" id="post-<?php the_ID(); ?>">
<h2><a href="<?php the_permalink() ?>" rel="bookmark" title="Permanent Link to <?php the_title(); ?>">
    <?php the_title(); ?></a></h2>
    <small><?php the_time('F jS, Y') ?> <!-- by <?php the_author() ?> --></small>
    <div class="entry">
      <?php the_content('Read the rest of this entry »'); ?>
    </div>
    <p class="postmetadata">Posted in <?php the_category(', ') ?> | <?php edit_post_link('Edit', '', ' | '); ?>  
    <?php comments_popup_link('No Comments »', '1 Comment »', '% Comments »'); ?></p>
</div>
<?php endforeach; ?>
<?php else : ?>
    <h2 class="center">Not Found</h2>
    <p class="center">Sorry, but you are looking for something that isn't here.</p>
    <?php include (TEMPLATEPATH . "/searchform.php"); ?>
<?php endif; ?>

You'll have to get the actual meta values from $post instead of using the WP post meta functions, but at least you'll have the data in one query.

If you want to take it further and grab the full file information, you'll have to do additional joins (again, I'm sure it's not written correctly, but it'll give you the right idea, and instead of * you'll want to grab only the fields you need)

$querystr = "
SELECT post.*, pm.*, attach.*
FROM $wpdb->posts post
LEFT JOIN $wpdb->postmeta pm ON pm.id = {$wpdb->post}.id
LEFT JOIN $wpdb->posts attach ON attach.id = pm.id
WHERE post.post_status = 'publish' 
AND pm.key = '_thumbnail_id'
AND post.post_type = 'portfoliosample'
";

$pageposts = $wpdb->get_results($querystr, OBJECT);
于 2013-11-17T15:32:49.717 回答