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

これを試してください(テストされておらず、おそらく少し壊れていますが、正しい方向に進むはずです):

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

そして、次のようにループします。

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

WP のポスト メタ関数を使用する代わりに、$post から実際のメタ値を取得する必要がありますが、少なくとも 1 つのクエリでデータを取得できます。

さらに進んで完全なファイル情報を取得したい場合は、追加の結合を行う必要があります (繰り返しますが、正しく書かれていないと思いますが、正しい考えが得られます。必要なフィールドのみを取得する必要があります)

$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 に答える