久久精品水蜜桃av综合天堂,久久精品丝袜高跟鞋,精品国产肉丝袜久久,国产一区二区三区色噜噜,黑人video粗暴亚裔

WordPress:Displaying Posts Using a Custom Select Query

來自站長百科
跳轉至: 導航、? 搜索

描述

在你的WordPress發(fā)展歷程的某個時刻,或許你需要通過非WordPress的 query_posts 架構提供的選擇標準來顯示一篇或更多的文章。例如,你有時或許必須加入 WordPress表格以確定要顯示的文章或使用自己表格中的儲存數(shù)據(jù)來確定要顯示正在寫的文章。

以下概述的實例展示了這樣一個過程:選擇有 定制區(qū)域存入值的所有文章并把它們在建立在頁面模板基礎上的頁面顯示出來。這些編碼最初用來執(zhí)行文章標簽插件,它允許以比WordPress分類稍無序的構架來組織文章。你的使用或許有所不同,但以下的例子仍會給你提供些有用的一般過程說明。

文章假設

本文通常假設你擁有PHP, MySQL知識和WordPress 使用能力。

但此例的特定假設是:

  • 你至少擁有一篇定制區(qū)域數(shù)據(jù)文章。自定義區(qū)域有“標簽”鍵和“電子郵件”鍵值。
  • 由于這是稍先進的開發(fā)主題,推薦掌握循環(huán)的WordPress核心概念。

網(wǎng)頁模板編碼

查詢

首先,需要檢索[[WordPress:Glossary#Recordset|數(shù)據(jù)集],里面包含你要顯示的文章。要做到這一點,需要使用WordPress$wpdb 數(shù)據(jù)庫 類創(chuàng)建一個(結果集)。注意MySQL SELECT指令闡明了一個“簡單的” JOIN。$pageposts在此會包含數(shù)組對象。每個對象代表一篇有自定義字段key-value(鍵-鍵值)配對且鍵名為tag,值為email的“已發(fā)布”文章。


 <?php

 $querystr = "
    SELECT wposts.* 
    FROM $wpdb->posts wposts, $wpdb->postmeta wpostmeta
    WHERE wposts.ID = wpostmeta.post_id 
    AND wpostmeta.meta_key = 'tag' 
    AND wpostmeta.meta_value = 'email' 
    AND wposts.post_status = 'publish' 
    AND wposts.post_type = 'post' 
    ORDER BY wposts.post_date DESC
 ";

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


已修改的Loop(循環(huán))

現(xiàn)在,若要通過以前的SELECT 標準來顯示$pageposts中的文章,你需要用Qbased網(wǎng)頁模板中你自己的循環(huán)編碼來替代WordPress:The Loop。這需要創(chuàng)建一個已修改的循環(huán)(loop),使它能夠循環(huán)$pageposts中的文章并顯示它們。注意:下面loop(循環(huán))中的結構/標記取自WordPress“默認”主題. 。

 <?php if ($pageposts): ?>
 <?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; ?>

就是它!

一行一行地審查編碼的重要部分,你必須:

  • 測試以確保$pageposts中的查詢可以查到符合SELECT標準的文章:
<?php if ($pageposts): ?>
  • A foreach loop to go through the posts returned in $pageposts and display them:
<?php foreach($pageposts as $post): ?>
<?php if ($pageposts): ?>
  • foreach loop審查已返回$pageposts的文章,并顯示文章:
<?php foreach($pageposts as $post): ?>
  • 調用WordPress文章格式化函數(shù),setup_postdata(),自動填入所需變量:
<?php setup_postdata($post); ?>


Loop (循環(huán))內部

由于例子中調用了setup_postdata($post);,你可以使用可包括在正常Wordpress循環(huán)(loop)中的相同模板標簽,如the_content()the_permalink()。這意味著你能夠較方便地用網(wǎng)頁模板創(chuàng)建自己的文章顯示結果,并自動利用你的Wordpress博客已激活的各種插件提供額外的格式和功能。

已完成的網(wǎng)頁模板

這是Wordpress“默認”主題運行的新模板的完整事例。

<?php
/*
Template Name: Qbased
*/
?>

<?php get_header(); ?>

<div id="content" class="narrowcolumn">

<?php

 $querystr = "
    SELECT wposts.* 
    FROM $wpdb->posts wposts, $wpdb->postmeta wpostmeta
    WHERE wposts.ID = wpostmeta.post_id 
    AND wpostmeta.meta_key = 'tag' 
    AND wpostmeta.meta_value = 'email' 
    AND wposts.post_status = 'publish' 
    AND wposts.post_type = 'post' 
    AND wposts.post_date < NOW() 
    ORDER BY wposts.post_date DESC
 ";

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

?>
 <?php if ($pageposts): ?>
  <?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; ?>

</div>

<?php get_sidebar(); ?>

<?php get_footer(); ?>

這里值得注意的是,上述例子“只有”當$wpdb->get_results()是以"output_type"為參數(shù),面向對象通過時才運行。當ARRAY_A 或ARRAY_N在$wpdb->get_results()通過時,setup_postdata()似乎不運行。

定制區(qū)域和類別基礎上的查詢

此事例設置了上個事例中使用的$querystr變量以獲得類別1,2,和3中的有meta_key 'paragraf'的所有文章,并按meta_values升序排列。此例來源于Otto42在Forum Topic 121011. 中的回復。

 $querystr = "
    SELECT $wpdb->posts.*
    FROM $wpdb->posts
    LEFT JOIN $wpdb->postmeta ON ($wpdb->posts.ID = $wpdb->postmeta.post_id)
    LEFT JOIN $wpdb->post2cat ON ($wpdb->posts.ID = $wpdb->post2cat.post_id)
    WHERE $wpdb->postmeta.meta_key = 'paragraf'
    AND $wpdb->posts.post_status = 'publish'
    AND $wpdb->posts.post_type = 'post'
    AND $wpdb->post2cat.category_id IN (1,2,3)
    ORDER BY $wpdb->postmeta.meta_value ASC
    ";


使用 wordpress2.3,你需要把以上顯示的sql查詢更新為: 此例來源于kernow在Forum Topic 121011 中的回復


SELECT * FROM $wpdb->posts
LEFT JOIN $wpdb->postmeta ON($wpdb->posts.ID = $wpdb->postmeta.post_id)
LEFT JOIN $wpdb->term_relationships ON($wpdb->posts.ID = $wpdb->term_relationships.object_id)
LEFT JOIN $wpdb->term_taxonomy ON($wpdb->term_relationships.term_taxonomy_id = $wpdb->term_taxonomy.term_taxonomy_id)
WHERE $wpdb->term_taxonomy.term_id = 1,2,3
AND $wpdb->term_taxonomy.taxonomy = 'category'
AND $wpdb->posts.post_status = 'publish'
AND $wpdb->postmeta.meta_key = 'paragraf'
ORDER BY $wpdb->postmeta.meta_value ASC

致謝

非常感謝Kafkaesquii指出填寫適當全局變量等的更簡便方法:使用setup_postdata()。