Tutorial :How to make my own while Loop just like Wordpress Loop?



Question:

im new here and new in PHP too..

Just wondering how to make my own flexible loop just like in Wordpress... Note im not talking about wordpress.. I want to implement it on myown PHP application...

let's look back in WP, there is a code something like this:

while (have_post() : thepost())// .. bla bla...    echo the_title();  echo the_content();    endwhile; // this is just an ilustration  

Could you figure out how have_post() or the_post() interact with database, so that they can be loop..

thanks..


Solution:1

WordPress uses global variables that these functions modify when iterating through the loop. e.g.:

var $posts = null;  var $post = null;  var $post_count = 0;  var $post_index = 0;    function have_post() {      global $posts, $post_count, $post_index;        $post_index = 0;        // do a database call to retrieve the posts.      $posts = mysql_query('select * from posts where ...');        if ($posts) {          $post_count = count($posts);          return true;      } else {          $post_count = 0;          return false;      }  }    function thepost() {      global $posts, $post, $post_count, $post_index;        // make sure all the posts haven't already been looped through      if ($post_index > $post_count) {          return false;      }        // retrieve the post data for the current index      $post = $posts[$post_index];        // increment the index for the next time this method is called      $post_index++;        return $post;  }    function the_title() {      global $post;      return $post['title'];  }    function the_content() {      global $post;      return $post['content'];  }  

I would definitely recommend using OOP style coding over what WordPress does, however. This will keep variables definied within an instance of an object instead of being globally accessible. e.g.:

class Post {      function __construct($title, $content) {          $this->title = $title;          $this->content = $content;      }        function getTitle() {          return $title;      }        function getContent() {          return $content;      }  }    class Posts {      var $postCount = 0;      var $posts = null;        function __construct($conditions) {          $rs = mysql_query('select * from posts where $conditions...');            if ($rs) {              $this->postCount = count($rs);              $this->posts = array();                foreach ($rs as $row) {                  $this->posts[] = new Post($row['title'], $row['content']);              }          }      }        function getPostCount() {          return $this->postCount;      }        function getPost($index) {          return $this->posts[$index];      }  }  


Solution:2

You could implement the Iterator interface.


Solution:3

the idea is to use global scope variables, and then the functions will modify those variables:

// first define the global variables:  $post_index = 0;  $posts_count = 0;  $post = null;  $posts = null;  $connection = null;    $connection = new PDO('mysql:host=127.0.0.1;dbname=YOUR_DB', 'YOUR_DB_USERNAME', 'YOUR_DB_USER_PASSWORD', array(PDO::ATTR_FETCH_MODE => PDO::FETCH_ASSOC));    $query = $connection->query('SELECT * FROM posts');  $posts = $query->fetchAll();    $posts_count = count($posts); // or = $query->rowCount()    // now you create the functions that will deal with and change those variables    function have_posts()  {      global $post_index, $posts_count, $posts, $post;      // if posts found and if post_index < posts_count return true else return false      if($posts && $post_index < $post_count)          return true;        else          return false;  }    function the_post()  {      global $post_count, $post_index, $posts, $post;        if($post_index > $post_count)          return false;      // fetch the post of the current index      $post = $posts[$post_index];        // increment the $post_index so that the next call to this function grapes the next post      $post_index++;  }    function get_ID()  {      global $post;      return $post['ID'];  }      function get_title()  {      global $post;      return $post['title'];  }  

I hope that help.


Solution:4

Go to this problem again :D

finally I got the solution,

@Matt Huggins, i have made some revision to your code, and now it's work...

$posts = $wpdb->get_results('SELECT * FROM my_table',OBJECT);  $post = null;  $post_count = 0;  $post_index = 0;    function have_post() {      global $posts, $post_count, $post_index;        if ($posts && ($post_index <= $post_count)){          $post_count = count($posts);          return true;      }      else {          $post_count = 0;          return false;      }  }    function the_post() {      global $posts, $post, $post_count, $post_index;        // make sure all the posts haven't already been looped through      if ($post_index > $post_count) {          return false;      }        // retrieve the post data for the current index      $post = $posts[$post_index+1];        // increment the index for the next time this method is called      $post_index++;      return $post;    }    function the_title() {      global $post;      return $post->Title;  }    function the_content() {      global $post;      return $post->Content;  }    //and the output    if(have_post()) : while(have_post()) : the_post();  echo '<h2>'.the_title().'</h2>';  echo '<p>'.the_content().'</p>';  endwhile; endif;  

Many thanks... :)


Note:If u also have question or solution just comment us below or mail us on toontricks1994@gmail.com
Previous
Next Post »