WordPress.org

Plugin Directory

Changeset 506227


Ignore:
Timestamp:
02/16/12 22:15:34 (2 years ago)
Author:
sorich87
Message:

Full support for (almost) all WP_Query possibilities and new template structure

Location:
the-loops/trunk
Files:
2 added
9 edited

Legend:

Unmodified
Added
Removed
  • the-loops/trunk/readme.txt

    r485582 r506227  
    44Requires at least: 3.3 
    55Tested up to: 3.4 
    6 Stable tag: 0.2 
     6Stable tag: 0.3 
    77 
    88Like Drupal Views but for WordPress, The Loops allows you to query the 
     
    2020(using shortcodes) or a widget. 
    2121 
    22 **Works with any theme and any 'custom post types' plugin!** 
     22[Check out my other free 
     23plugins.](http://wordpress.org/extend/plugins/profile/sorich87) 
    2324 
    2425= Features = 
    2526 
     27* Works with any theme without modification 
     28* Works with any 'custom post types' plugin 
    2629* Custom templates 
    27 * Query by post type 
    28 * Query by categories, tags or custom taxonomies 
    29 * Query by author 
    30 * Sort by ID, author, title, publication date, last modified date, 
    31 parent ID, number of comments, page order or randomly 
     30* Support all the WordPress post query possibilities 
    3231* Display the loops anywhere with a shortcode 
    3332* Display the loops in a widget 
    3433 
    35 **This plugin is in its earlier stages but stable and can be used in a 
    36 production environnement. Please be indulgent if it does not have some 
    37 features you need.** 
     34= Contributors = 
     35[Contributors are listed 
     36here](https://github.com/sorich87/the-loops/contributors) 
     37 
     38= Notes = 
    3839 
    3940For feature request and bug reports, [please use the 
     
    6667 
    67681. Visit [this 
    68 link](http://coveredwebservices.com/wp-plugin-install/?plugin=the-loops) and follow the instructions. 
     69link](http://coveredwebservices.com/wp-plugin-install/?plugin=the-loops) 
     70and follow the instructions. 
    6971 
    7072 
     
    102104== Changelog == 
    103105 
     106= 0.3 = 
     107* Support all the wordpress post query possibilities. 
     108* Improved custom templates. 
     109 
    104110= 0.2 = 
    105111* Custom templates. 
     
    111117== Upgrade Notice == 
    112118 
     119= 0.3 = 
     120This version supports all the wordpress post query possibilities and an 
     121improved template structure. It is not backward compatible with the 
     122previous versions. Check your loops after upgrading. 
     123 
    113124= 0.2 = 
    114125New features: custom templates & query by author. 
  • the-loops/trunk/the-loops.php

    r485582 r506227  
    55 * The Loops allows you to query the WordPress database for content and display it in a page without having to write php code. 
    66 * 
    7  * @package The Loops 
     7 * @package The_Loops 
    88 */ 
    99/** 
     
    1313 * Author: PubPoet 
    1414 * Author URI: http://pubpoet.com/ 
    15  * Version: 0.2 
     15 * Version: 0.3 
    1616 * License: GPL2 
    1717 */ 
     
    4040 * Main plugin class 
    4141 * 
    42  * @package The Loops 
     42 * @package The_Loops 
    4343 * @since 0.1 
    4444 */ 
     
    4848     * Class contructor 
    4949     * 
    50      * @package The Loops 
     50     * @package The_Loops 
    5151     * @since 0.1 
    5252     */ 
     
    6060     * Global variables 
    6161     * 
    62      * @package The Loops 
     62     * @package The_Loops 
    6363     * @since 0.1 
    6464     */ 
     
    7474     * Required files 
    7575     * 
    76      * @package The Loops 
     76     * @package The_Loops 
    7777     * @since 0.1 
    7878     */ 
     
    8888     * Setup the plugin main functions 
    8989     * 
    90      * @package The Loops 
     90     * @package The_Loops 
    9191     * @since 0.1 
    9292     */ 
     
    9898     * Register loop post type 
    9999     * 
    100      * @package The Loops 
     100     * @package The_Loops 
    101101     * @since 0.1 
    102102     */ 
    103103    public function register_post_type() { 
    104104        $labels = array( 
    105             'name' => _x( 'Loops', 'post type general name'), 
    106             'singular_name' => _x( 'Loop', 'post type singular name' ), 
    107             'add_new' => _x( 'Add New', 'loop' ), 
    108             'add_new_item' => __( 'Add New Loop' ), 
    109             'edit_item' => __( 'Edit Loop' ), 
    110             'new_item' => __( 'New Loop' ), 
    111             'all_items' => __( 'Loops' ), 
    112             'view_item' => __( 'View Loop' ), 
    113             'search_items' => __( 'Search Loops' ), 
    114             'not_found' => __( 'No loops found' ), 
     105            'name'               => _x( 'Loops', 'post type general name' ), 
     106            'singular_name'      => _x( 'Loop', 'post type singular name' ), 
     107            'add_new'            => _x( 'Add New', 'loop' ), 
     108            'add_new_item'       => __( 'Add New Loop' ), 
     109            'edit_item'          => __( 'Edit Loop' ), 
     110            'new_item'           => __( 'New Loop' ), 
     111            'all_items'          => __( 'Loops' ), 
     112            'view_item'          => __( 'View Loop' ), 
     113            'search_items'       => __( 'Search Loops' ), 
     114            'not_found'          => __( 'No loops found' ), 
    115115            'not_found_in_trash' => __( 'No loops found in Trash' ), 
    116             'parent_item_colon' => '', 
    117             'menu_name' => __( 'Loops' ) 
     116            'parent_item_colon'  => '', 
     117            'menu_name'          => __( 'Loops' ) 
    118118        ); 
    119119 
    120120        $args = array( 
    121             'labels' => $labels, 
    122             'show_ui' => true, 
    123             'show_in_menu' => 'themes.php', 
    124             'supports' => array( 'title' ) 
     121            'capabilities'    => array( 
     122                'edit_post'          => 'edit_theme_options', 
     123                'delete_post'        => 'edit_theme_options', 
     124                'read_post'          => 'read', 
     125                'edit_posts'         => 'edit_theme_options', 
     126                'edit_others_posts'  => 'edit_theme_options', 
     127                'publish_posts'      => 'edit_theme_options', 
     128                'read_private_posts' => 'edit_theme_options' 
     129            ), 
     130            'labels'          => $labels, 
     131            'show_ui'         => true, 
     132            'show_in_menu'    => 'themes.php', 
     133            'supports'        => array( 'title' ) 
    125134        ); 
    126135 
     
    129138} 
    130139 
    131 $GLOBALS['tl'] = new The_Loops(); 
     140$GLOBALS['the_loops'] = new The_Loops(); 
    132141 
    133142endif; 
  • the-loops/trunk/tl-admin.php

    r485582 r506227  
    44 * Admin class 
    55 * 
    6  * @package The Loops 
     6 * @package The_Loops 
    77 * @since 0.1 
    88 */ 
     
    1818     * Admin loader 
    1919     * 
    20      * @package The Loops 
    21      * @since 0.1 
    22      */ 
    23     function __construct() { 
    24         add_action( 'add_meta_boxes', array( $this, 'add_meta_boxes' ) ); 
    25         add_action( 'admin_menu', array( $this, 'remove_publish_meta_box' ) ); 
    26         add_action( 'save_post', array( $this, 'save_loop' ), 10, 2 ); 
    27         add_action( 'dbx_post_sidebar', array( $this, 'loop_save_button' ) ); 
    28         add_filter( 'post_updated_messages', array( $this, 'loop_updated_messages' ) ); 
    29         add_filter( 'screen_layout_columns', array( $this, 'loop_screen_layout_columns' ), 10, 2 ); 
    30     } 
     20     * @package The_Loops 
     21     * @since 0.1 
     22     */ 
     23    public static function init() { 
     24        add_action( 'add_meta_boxes', array( __CLASS__, 'add_meta_boxes' ) ); 
     25        add_action( 'admin_enqueue_scripts', array( __CLASS__, 'enqueue_scripts' ) ); 
     26        add_action( 'admin_menu', array( __CLASS__, 'remove_publish_meta_box' ) ); 
     27        add_action( 'before_wp_tiny_mce', array( __CLASS__, 'loop_list_script' ) ); 
     28        add_action( 'dbx_post_sidebar', array( __CLASS__, 'loop_save_button' ) ); 
     29        add_action( 'save_post', array( __CLASS__, 'save_loop' ), 10, 2 ); 
     30 
     31        add_filter( 'bulk_actions-edit-tl_loop', array( __CLASS__, 'remove_bulk_edit' ) ); 
     32        add_filter( 'get_user_option_closedpostboxes_tl_loop', array( __CLASS__, 'closed_meta_boxes' ) ); 
     33        add_filter( 'mce_buttons', array( __CLASS__, 'add_editor_button' ) ); 
     34        add_filter( 'mce_external_plugins', array( __CLASS__, 'add_editor_plugin' ) ); 
     35        add_filter( 'post_row_actions', array( __CLASS__, 'remove_quick_edit' ), 10, 2 ); 
     36        add_filter( 'post_updated_messages', array( __CLASS__, 'loop_updated_messages' ) ); 
     37        add_filter( 'screen_layout_columns', array( __CLASS__, 'loop_screen_layout_columns' ), 10, 2 ); 
     38        add_filter( 'script_loader_src', array( __CLASS__, 'disable_autosave' ), 10, 2 ); 
     39    } 
     40 
     41    /** 
     42     * Disable autosave on the loop edit screen by removing the src for the autosave script tag 
     43     * 
     44     * @package The_Loops 
     45     * @since 0.3 
     46     */ 
     47    public static function disable_autosave( $src, $handle ) { 
     48        if( 'autosave' == $handle && 'tl_loop' == get_current_screen()->id ) 
     49            return ''; 
     50 
     51        return $src; 
     52    } 
     53 
    3154 
    3255    /** 
    3356     * Add custom save button to the loop edit screen 
    3457     * 
    35      * @package The Loops 
    36      * @since 0.1 
    37      */ 
    38     public function loop_save_button() { 
    39         $current_screen = get_current_screen(); 
    40         if ( 'tl_loop' != $current_screen->id ) 
     58     * @package The_Loops 
     59     * @since 0.1 
     60     */ 
     61    public static function loop_save_button() { 
     62        if ( 'tl_loop' != get_current_screen()->id ) 
    4163            return; 
    4264 
     
    4567 
    4668    /** 
     69     * Enqueue script and style 
     70     * 
     71     * @package The_Loops 
     72     * @since 0.1 
     73     */ 
     74    public static function enqueue_scripts() { 
     75        global $the_loops; 
     76 
     77        if ( 'tl_loop' != get_current_screen()->id ) 
     78            return; 
     79 
     80        $suffix = defined( 'SCRIPT_DEBUG' ) && SCRIPT_DEBUG ? '.dev' : ''; 
     81 
     82        wp_enqueue_script( 'jquery-ui-datepicker' ); 
     83 
     84        wp_enqueue_script( 'tl-jquery-tagsinput', "{$the_loops->plugin_url}js/jquery-tagsinput$suffix.js", array( 'jquery' ), '20120213' ); 
     85 
     86        wp_enqueue_script( 'the-loops', "{$the_loops->plugin_url}js/script$suffix.js", array( 'jquery-ui-datepicker', 'tl-jquery-tagsinput' ), '20120215' ); 
     87 
     88        $l10n = array( 
     89            'addAValue' => __( 'add a value' ), 
     90        ); 
     91        wp_localize_script( 'the-loops', 'tlLoops', $l10n ); 
     92 
     93        if ( 'classic' == get_user_option( 'admin_color') ) 
     94            wp_enqueue_style ( 'jquery-ui-css', "{$the_loops->plugin_url}css/jquery-ui-classic$suffix.css", null, '20120211' ); 
     95        else 
     96            wp_enqueue_style ( 'jquery-ui-css', "{$the_loops->plugin_url}css/jquery-ui-fresh$suffix.css", null, '20120211' ); 
     97 
     98        wp_enqueue_style( 'the-loops', "{$the_loops->plugin_url}css/style$suffix.css", null, '20120213' ); 
     99    } 
     100 
     101    /** 
    47102     * Hide the screen options from the loop edit screen 
    48103     * 
    49      * @package The Loops 
    50      * @since 0.1 
    51      */ 
    52     public function loop_screen_layout_columns( $columns, $screen_id ) { 
     104     * @package The_Loops 
     105     * @since 0.1 
     106     */ 
     107    public static function loop_screen_layout_columns( $columns, $screen_id ) { 
    53108        if ( 'tl_loop' == $screen_id ) 
    54             $columns = 0; 
    55  
    56         add_screen_option( 'layout_columns', array( 'max' => 1 ) ); 
     109            add_screen_option( 'layout_columns', array( 'max' => 1, 'default' => 1 ) ); 
    57110 
    58111        return $columns; 
     
    62115     * Add loop content metabox 
    63116     * 
    64      * @package The Loops 
    65      * @since 0.1 
    66      */ 
    67     public function add_meta_boxes() { 
    68         add_meta_box( 'pp_contentdiv', __( 'Content' ), array( $this, 'meta_box_content' ), 'tl_loop', 'normal', 'high' ); 
     117     * @package The_Loops 
     118     * @since 0.1 
     119     */ 
     120    public static function add_meta_boxes() { 
     121        global $the_loops; 
     122 
     123        include( "{$the_loops->plugin_dir}tl-meta-boxes.php" ); 
     124 
     125        TL_Meta_Boxes::init(); 
     126    } 
     127 
     128    /** 
     129     * Define default closed metaboxes 
     130     * 
     131     * @package The_Loops 
     132     * @since 0.3 
     133     */ 
     134    public static function closed_meta_boxes( $closed ) { 
     135        if ( false === $closed ) 
     136            $closed = array( 'tl_otherdiv', 'tl_customfielddiv', 'tl_datediv', 'tl_orderpaginationdiv', 'tl_taxonomydiv' ); 
     137 
     138        return $closed; 
    69139    } 
    70140 
     
    72142     * Remove publish metabox from the loop edit screen 
    73143     * 
    74      * @package The Loops 
    75      * @since 0.1 
    76      */ 
    77     public function remove_publish_meta_box() { 
     144     * @package The_Loops 
     145     * @since 0.1 
     146     */ 
     147    public static function remove_publish_meta_box() { 
    78148        remove_meta_box( 'submitdiv', 'tl_loop', 'side' ); 
    79149    } 
    80150 
    81151    /** 
    82      * Display metabox for setting the content of the loop 
    83      * 
    84      * @package The Loops 
    85      * @since 0.1 
    86      */ 
    87     public function meta_box_content() { 
    88         global $post, $post_ID; 
    89  
    90         wp_nonce_field( 'tl_edit_loop', '_tlnonce' ); 
    91  
    92         $defaults = array( 
    93             'post_type' => 'post', 'orderby' => 'title', 'order' => 'ASC', 
    94             'not_found' => '<p>' . __( 'Nothing found!' ) . '</p>', 
    95             'authors' => '', 
    96             'shortcode' => array( 
    97                 'id'             => 0, 
    98                 'posts_per_page' => get_option( 'posts_per_page' ), 
    99                 'template'       => 'List of full posts' 
    100             ), 
    101             'widget' => array( 
    102                 'expose'         => 0, 
    103                 'posts_per_page' => get_option( 'posts_per_page' ), 
    104                 'template'       => 'List of titles' 
    105             ) 
    106         ); 
    107  
    108         $content = get_post_meta( $post_ID, 'tl_loop_content', true ); 
    109  
    110         $content = wp_parse_args( $content, $defaults ); 
    111  
    112         $loop_templates = tl_get_loop_templates(); 
    113 ?> 
    114 <table class="form-table"> 
    115     <tr valign="top"> 
    116     <th scope="row"><label for="loop_post_type"><?php _e( 'Display' ); ?></label></th> 
    117         <td> 
    118             <select id="loop_post_type" name="loop[post_type]"> 
    119             <option value="any"<?php selected( 'any', $content['post_type'] ); ?>><?php _e( 'Everything' ); ?></option> 
    120                 <?php 
    121                 $ptypes = get_post_types( array( 'public' => true ), 'objects' ); 
    122                 foreach ( $ptypes as $ptype_name => $ptype_obj ) { 
    123                     $selected = selected( $ptype_name, $content['post_type'], false ); 
    124                     echo "<option value='$ptype_name'$selected>{$ptype_obj->label}</option>"; 
    125                 } 
    126                 ?> 
    127             </select> 
    128         </td> 
    129     </tr> 
    130     <tr valign="top"> 
    131     <th scope="row"><label for="loop_orderby"><?php _e( 'Sorted by' ); ?></label></th> 
    132         <td> 
    133             <select id="loop_orderby" name="loop[orderby]"> 
    134                 <?php 
    135                 $orderby_params = array( 
    136                     'ID' => __( 'ID' ), 'author' => __( 'Author' ), 'title' => __( 'Title' ), 
    137                     'date' => __( 'Publication date' ), 'modified' => __( 'Last modified date' ), 'parent' => __( 'Parent ID' ), 
    138                     'rand' => __( 'Random order' ), 'comment_count' => __( 'Number of comments' ), 'menu_order' => __( 'Page Order' ) 
    139                 ); 
    140                 foreach ( $orderby_params as $key => $label ) { 
    141                     $selected = selected( $key, $content['orderby'] ); 
    142                     echo "<option value='$key'$selected>{$label}</option>"; 
    143                 } 
    144                 ?> 
    145             </select> 
    146             <select id="loop_order" name="loop[order]"> 
    147                 <option value="DESC"<?php selected( 'DESC', $content['order'], true ); ?>><?php _e( 'DESC' ); ?></option> 
    148                 <option value="ASC"<?php selected( 'ASC', $content['order'], true ); ?>><?php _e( 'ASC' ); ?></option> 
    149             </select> 
    150         </td> 
    151     </tr> 
    152     <tr valign="top"> 
    153         <th scope="row"><label for="loop_authors"><?php _e( 'Authors' ); ?></label></th> 
    154         <td> 
    155             <input type="text" id="loop_authors" name="loop[authors]" value="<?php echo isset( $content['authors'] ) ? $content['authors'] : ''; ?>" class="regular-text" /> 
    156             <span class="description"><?php _e( 'Comma-separated list of authors usernames' ); ?></span> 
    157         </td> 
    158     </tr> 
    159     <?php $taxs = get_taxonomies( array( 'public' => true ), 'objects' ); ?> 
    160     <?php foreach ( $taxs as $tax ) : ?> 
    161     <tr valign="top"> 
    162         <th scope="row"><label for="loop_<?php echo $tax->name; ?>"><?php printf( __( 'Limit to %s' ), $tax->labels->name ); ?></label></th> 
    163         <td> 
    164             <input type="text" id="loop_<?php echo $tax->name; ?>" name="loop[<?php echo $tax->name; ?>]" value="<?php echo isset( $content[$tax->name] ) ? $content[$tax->name] : ''; ?>" class="regular-text" /> 
    165             <span class="description"><?php _e( 'Comma-separated list of slugs' ); ?></span> 
    166         </td> 
    167     </tr> 
    168     <?php endforeach; ?> 
    169     <tr valign="top"> 
    170         <th scope="row"><label for="loop_not_found"><?php _e( 'Not found text' ); ?></label></th> 
    171         <td> 
    172             <input type="text" id="loop_not_found" name="loop[not_found]" value="<?php echo isset( $content['not_found'] ) ? $content['not_found'] : ''; ?>" class="regular-text" /> 
    173             <span class="description"><?php _e( 'Text to display when nothing found' ); ?></span> 
    174         </td> 
    175     </tr> 
    176 </table> 
    177  
    178 <h4><?php _e( 'Shortcode' ); ?></h4> 
    179 <table class="form-table"> 
    180     <tr valign="top"> 
    181         <th scope="row"><label for="loop_shortcode_expose"><?php _e( 'Expose a shortcode' ); ?></label></th> 
    182         <td> 
    183             <code><?php echo '[the-loop id="' . $post->ID . '"]'; ?></code> 
    184             <span class="description"><?php _e( 'Copy/paste this shortcode in the post or page where you want to display the loop' ); ?></span> 
    185         </td> 
    186     </tr> 
    187     <tr valign="top"> 
    188         <th scope="row"><label for="loop_posts_per_shortcode"><?php _e( 'Show' ); ?></label></th> 
    189         <td> 
    190             <input type="text" id="loop_posts_per_shortcode" name="loop[shortcode][posts_per_page]" value="<?php echo $content['shortcode']['posts_per_page']; ?>" size="3" /> 
    191             <span><?php _e( 'items on the page' ); ?></span> 
    192         </td> 
    193     </tr> 
    194     <tr valign="top"> 
    195         <th scope="row"><label for="loop_shortcode_template"><?php _e( 'Template' ); ?></label></th> 
    196         <td> 
    197             <select id="loop_shortcode_template" name="loop[shortcode][template]"> 
    198                 <?php 
    199                 foreach ( $loop_templates as $name => $file ) { 
    200                     $selected = selected( $name, $content['shortcode']['template'] ); 
    201                     echo "<option value='$name'$selected>{$name}</option>"; 
    202                 } 
    203                 ?> 
    204             </select> 
    205         </td> 
    206     </tr> 
    207 </table> 
    208  
    209 <h4><?php _e( 'Widget' ); ?></h4> 
    210 <table class="form-table"> 
    211     <tr valign="top"> 
    212         <th scope="row"><?php _e( 'Expose a widget' ); ?></th> 
    213         <td> 
    214             <span class="description"><?php printf( __( '<a href="%s">Go to the widgets management screen</a> and assign The Loops Widget to a sidebar' ), site_url( 'wp-admin/widgets.php' ) ) ?></span> 
    215         </td> 
    216     </tr> 
    217     <tr valign="top"> 
    218     <th scope="row"><label for="loop_posts_per_widget"><?php _e( 'Show' ); ?></label></th> 
    219         <td> 
    220             <input type="text" id="loop_posts_per_widget" name="loop[widget][posts_per_page]" size="3" value="<?php echo $content['widget']['posts_per_page']; ?>" /> 
    221             <span><?php _e( 'items in the widget' ); ?></span> 
    222         </td> 
    223     </tr> 
    224     <tr valign="top"> 
    225     <th scope="row"><label for="loop_widget_template"><?php _e( 'Template' ); ?></label></th> 
    226         <td> 
    227             <select id="loop_widget_template" name="loop[widget][template]"> 
    228                 <?php 
    229                 foreach ( $loop_templates as $name => $file ) { 
    230                     $selected = selected( $name, $content['widget']['template'] ); 
    231                     echo "<option value='$name'$selected>{$name}</option>"; 
    232                 } 
    233                 ?> 
    234             </select> 
    235         </td> 
    236     </tr> 
    237 </table> 
    238 <?php 
    239     } 
    240  
    241     /** 
    242152     * Save loop details 
    243153     * 
    244      * @package The Loops 
    245      * @since 0.1 
    246      */ 
    247     public function save_loop( $post_id, $post ) { 
     154     * @package The_Loops 
     155     * @since 0.1 
     156     */ 
     157    public static function save_loop( $post_id, $post ) { 
    248158        if ( 'tl_loop' !== $post->post_type ) 
    249159            return; 
     
    260170        $data = stripslashes_deep( $_POST['loop'] ); 
    261171 
    262         update_post_meta( $post_id, 'tl_loop_content', $data ); 
     172        // remove data added by template tables 
     173        array_pop( $data['taxonomies'] ); 
     174        array_pop( $data['custom_fields'] ); 
     175 
     176        update_post_meta( $post_id, '_tl_loop_parameters', $data ); 
    263177    } 
    264178 
     
    266180     * Messages displayed when a loop is updated. 
    267181     * 
    268      * @package The Loops 
    269      * @since 0.1 
    270      */ 
    271     public function loop_updated_messages( $messages ) { 
     182     * @package The_Loops 
     183     * @since 0.1 
     184     */ 
     185    public static function loop_updated_messages( $messages ) { 
    272186        global $post, $post_ID; 
    273187 
     
    276190            4 => __( 'Loop updated.'), 
    277191            6 => sprintf( __( 'Loop published.' ), esc_url( get_permalink( $post_ID ) ) ), 
    278             7 => __( 'Loop saved.' ), 
    279             8 => sprintf( __( 'Loop submitted.' ), esc_url( add_query_arg( 'preview', 'true', get_permalink( $post_ID ) ) ) ), 
    280             9 => sprintf( __( 'Loop scheduled for: <strong>%1$s</strong>.' ), date_i18n( __( 'M j, Y @ G:i' ), strtotime( $post->post_date ) ), esc_url( get_permalink( $post_ID ) ) ), 
    281             10 => sprintf( __( 'Loop draft updated.' ), esc_url( add_query_arg( 'preview', 'true', get_permalink( $post_ID ) ) ) ), 
     192            7 => __( 'Loop saved.' ) 
    282193        ); 
    283194 
    284195        return $messages; 
    285196    } 
     197 
     198    /** 
     199     * Remove quick edit 
     200     * 
     201     * @package The_Loops 
     202     * @since 0.3 
     203     */ 
     204    public static function remove_quick_edit( $actions, $post ) { 
     205        if( 'tl_loop' == $post->post_type ) 
     206            unset( $actions['inline hide-if-no-js'] ); 
     207 
     208        return $actions; 
     209    } 
     210 
     211    /** 
     212     * Remove bulk edit 
     213     * 
     214     * @package The_Loops 
     215     * @since 0.3 
     216     */ 
     217    public static function remove_bulk_edit( $actions ) { 
     218        if ( isset( $actions['edit'] ) ) 
     219            unset( $actions['edit'] ); 
     220 
     221        return $actions; 
     222    } 
     223 
     224    /** 
     225     * Add button to the tinymce editor 
     226     * 
     227     * @package The_Loops 
     228     * @since 0.3 
     229     */ 
     230    public static function add_editor_button( $buttons ) { 
     231        array_push( $buttons, 'separator', 'the_loops_selector' ); 
     232        return $buttons; 
     233    } 
     234 
     235    /** 
     236     * Add the tinymce plugin 
     237     * 
     238     * @package The_Loops 
     239     * @since 0.3 
     240     */ 
     241    public static function add_editor_plugin( $plugins ) { 
     242        global $the_loops; 
     243 
     244        $suffix = defined( 'SCRIPT_DEBUG' ) && SCRIPT_DEBUG ? '.dev' : ''; 
     245 
     246        $plugins['the_loops_selector'] = "{$the_loops->plugin_url}js/editor-plugin$suffix.js"; 
     247 
     248        return $plugins; 
     249    } 
     250 
     251    /** 
     252     * Print loops list in javascript for use in the editor 
     253     * 
     254     * @package The_Loops 
     255     * @since 0.3 
     256     */ 
     257    public static function loop_list_script() { 
     258        $loops = tl_get_loops(); 
     259        $loop_list = array(); 
     260        foreach ( $loops as $loop ) { 
     261            $loop_list[] = array( 
     262                'id'   => $loop->ID, 
     263                'name' => $loop->post_title 
     264            ); 
     265        } 
     266        $loop_list = json_encode( array( 
     267            'title' => __( 'Insert loop' ), 
     268            'loops' => $loop_list 
     269        ) ); 
     270?> 
     271<script type='text/javascript'> 
     272/* <![CDATA[ */ 
     273var tlLoopList = <?php echo $loop_list; ?>; 
     274/* ]]> */ 
     275</script> 
     276<?php 
     277    } 
     278 
    286279} 
    287280endif; 
     
    290283 * Setup admin 
    291284 * 
    292  * @package The Loops 
     285 * @package The_Loops 
    293286 * @since 0.1 
    294287 */ 
    295288function tl_admin() { 
    296     if ( ! is_admin() ) 
    297         return; 
    298  
    299     global $tl; 
    300     $tl->admin = new TL_Admin(); 
     289    TL_Admin::init(); 
    301290} 
    302291add_action ( 'init', 'tl_admin' ); 
  • the-loops/trunk/tl-functions.php

    r485582 r506227  
    44 * Helper functions 
    55 *  
    6  * @package The Loops 
     6 * @package The_Loops 
    77 * @since 0.1 
    88 */ 
     
    1515 * Returns a WP_Query based on a loop details. 
    1616 * 
    17  * @package The Loops 
     17 * @package The_Loops 
    1818 * @since 0.1 
    1919 * 
    20  * @param int $loop_id Loop ID. 
    21  * @param string $type Type of display (shortcode or widget). 
     20 * @param int $id Loop ID. 
    2221 * @param string|array $query URL query string or array. 
    2322 * @return WP_Query 
    2423 */ 
    25 function tl_WP_Query( $loop_id, $type, $query = '' ) { 
    26     if ( empty ( $loop_id ) ) 
    27         return; 
    28  
    29     $content = get_post_meta( $loop_id, 'tl_loop_content', true ); 
    30  
    31     $posts_per_page = $content[$type]['posts_per_page']; 
    32  
    33     $args = array( 
    34         'post_type'      => $content['post_type'], 
    35         'orderby'        => $content['orderby'], 
    36         'order'          => $content['order'], 
    37         'posts_per_page' => $posts_per_page 
    38     ); 
    39  
     24function tl_query( $id, $query = '' ) { 
     25    global $the_loop_context, $post_ID; 
     26 
     27    $content = tl_get_loop_parameters( $id ); 
     28 
     29    $args = array(); 
     30 
     31    // author 
    4032    $authors_logins = _tl_csv_to_array( $content['authors'] ); 
    4133    if ( $authors_logins ) { 
     34        $replacements = 1; 
     35 
    4236        $authors_ids = array(); 
    4337 
    4438        foreach ( $authors_logins as $author_login ) { 
    45             $authors_ids[] = get_user_by( 'login', $author_login )->ID; 
     39            $exclude_author = false; 
     40 
     41            if ( strpos( $author_login, '-' ) === 0 ) { 
     42                $exclude_author = true; 
     43                $author_login = str_replace( '-', '', $author_login, $replacements ); 
     44            } 
     45 
     46            $author_id = get_user_by( 'login', $author_login )->ID; 
     47 
     48            if ( $exclude_author ) 
     49                $authors_ids[] = "-$author_id"; 
     50            else 
     51                $authors_ids[] = $author_id; 
    4652        } 
    4753 
     
    5258    } 
    5359 
    54     $taxs = get_taxonomies( array( 'public' => true ), 'names' ); 
    55     if ( $taxs ) { 
     60    // taxonomy 
     61    if ( ! empty( $content['taxonomies'] ) ) { 
    5662        $tax_query = array(); 
    57         foreach ( $taxs as $tax ) { 
    58             if ( empty( $content[$tax] ) ) 
     63 
     64        foreach ( $content['taxonomies'] as $taxonomy ) { 
     65            if ( empty( $taxonomy['terms'] ) ) 
    5966                continue; 
    6067 
    61             $terms = _tl_csv_to_array( $content[$tax] ); 
     68            $terms = _tl_csv_to_array( $taxonomy['terms'] ); 
    6269 
    6370            $tax_query[] = array( 
    64                 'taxonomy' => $tax, 
    65                 'field'    => 'slug', 
    66                 'terms'    => $terms, 
    67                 'operator' => 'IN' 
     71                'taxonomy'         => $taxonomy['taxonomy'], 
     72                'field'            => 'slug', 
     73                'terms'            => array_map( 'sanitize_title', $terms ), 
     74                'include_children' => empty( $taxonomy['include_children'] ) ? false : true, 
     75                'operator'         => empty( $taxonomy['exclude'] ) ? 'IN' : 'NOT IN' 
    6876            ); 
    6977        } 
     
    7583    } 
    7684 
     85    // posts 
     86    $args['post_parent'] = $content['post_parent']; 
     87 
     88    $args['post__in'] = $args['post__not_in'] = array(); 
     89 
     90    if ( ! empty( $content['posts'] ) ) { 
     91        $posts = _tl_csv_to_array( $content['posts'] ); 
     92 
     93        if ( empty( $content['exclude_posts'] ) ) 
     94            $args['post__in'] = $posts; 
     95        else 
     96            $args['post__not_in'] = $posts; 
     97    } 
     98 
     99    // post type and status 
     100    $args['post_type']   = $content['post_type']; 
     101    $args['post_status'] = $content['post_status']; 
     102 
     103    // offset 
     104    if ( 'none' == $content['pagination'] ) 
     105        $args['offset'] = $content['offset']; 
     106 
     107    // order and orderby 
     108    $args['order'] = $content['order']; 
     109 
     110    if ( in_array( $content['orderby'], array( 'meta_value', 'meta_value_num' ) ) ) { 
     111        $content['meta_key'] = trim ( $content['meta_key'] ); 
     112 
     113        if ( ! empty( $content['meta_key'] ) ) { 
     114            $args['meta_key'] = $content['meta_key']; 
     115            $args['orderby']  = $content['orderby']; 
     116        } 
     117    } else { 
     118        $args['orderby'] = $content['orderby']; 
     119    } 
     120 
     121    // sticky post 
     122    switch( $content['sticky_posts'] ) { 
     123        case 'ignore' : 
     124            $args['ignore_sticky_posts'] = true; 
     125            break; 
     126 
     127        case 'only' : 
     128            $args['ignore_sticky_posts'] = true; 
     129            $args['post__in'] = array_merge( $args['post__in'], get_option( 'sticky_posts' ) ); 
     130            break; 
     131 
     132        case 'hide' : 
     133            $args['ignore_sticky_posts'] = true; 
     134            $args['post__not_in'] = array_merge( $args['post__not_in'], get_option( 'sticky_posts' ) ); 
     135            break; 
     136 
     137        default: 
     138            break; 
     139    } 
     140 
     141    // time 
     142    if ( 'period' == $content['date_type'] ) { 
     143        if ( ! empty( $content['year'] ) ) 
     144            $args['year'] = $content['year']; 
     145 
     146        if ( ! empty( $content['monthnum'] ) ) 
     147            $args['monthnum'] = $content['monthnum']; 
     148 
     149        if ( ! empty( $content['w'] ) ) 
     150            $args['w'] = $content['w']; 
     151 
     152        if ( ! empty( $content['day'] ) ) 
     153            $args['day'] = $content['day']; 
     154 
     155        if ( ! empty( $content['minute'] ) ) 
     156            $args['minute'] = $content['minute']; 
     157 
     158        if ( ! empty( $content['second'] ) ) 
     159            $args['second'] = $content['second']; 
     160    } 
     161 
     162    // custom field 
     163    if ( ! empty( $content['custom_fields'] ) ) { 
     164        $meta_query = array(); 
     165 
     166        foreach ( $content['custom_fields'] as $custom_field ) { 
     167            if ( empty( $custom_field['key'] ) ) 
     168                continue; 
     169 
     170            $values = _tl_csv_to_array( $custom_field['values'], "\t" ); 
     171 
     172            if ( in_array( $custom_field['compare'], array( 'LIKE', 'NOT LIKE' ) ) ) 
     173                $values = $values[0]; 
     174 
     175            $meta_query[] = array( 
     176                'key'     => trim( $custom_field['key'] ), 
     177                'value'   => $values, 
     178                'compare' => $custom_field['compare'], 
     179                'type'    => $custom_field['type'] 
     180            ); 
     181        } 
     182 
     183        if ( $meta_query ) { 
     184            $meta_query['relation'] = 'AND'; 
     185            $args['meta_query'] = $meta_query; 
     186        } 
     187    } 
     188 
     189    // pagination 
     190    $posts_per_page = absint( $content['posts_per_page'] ); 
     191    if ( empty( $posts_per_page ) ) { 
     192        $args['nopaging'] = true; 
     193    } else { 
     194        $args['posts_per_page'] = $posts_per_page; 
     195    } 
     196 
     197    if ( 'none' == $content['pagination'] ) { 
     198        $args['paged'] = 1; 
     199    } else { 
     200        $args['paged'] = max( 1, get_query_var( 'paged' ) ); 
     201    } 
     202 
     203    // permission 
     204    if ( in_array( 'private', $content['post_status'] ) && ! empty( $content['readable'] ) ) { 
     205        $args['perm'] = 'readable'; 
     206    } 
     207 
     208    // attachments mime type 
     209    if ( in_array( 'attachment', $content['post_type'] ) ) 
     210        $args['post_mime_type'] = $content['post_mime_type']; 
     211 
     212    // search 
     213    if ( ! empty( $content['s'] ) ) { 
     214        $args['s']        = $content['s']; 
     215        $args['exact']    = $content['exact']; 
     216        $args['sentence'] = $content['sentence']; 
     217    }    
     218 
    77219    $args = wp_parse_args( $query, $args ); 
    78220 
    79     return new WP_Query( $args ); 
     221    // if a shortcode is being used, don't display the post in which it was inserted 
     222    if ( 'shortcode' == $the_loop_context ) { 
     223        if ( ! empty( $args['post__in'] ) ) { 
     224            $key = array_search( get_the_ID(), $args['post__in'] ); 
     225            unset( $args['posts__in'][$key] ); 
     226        } else if ( ! empty( $args['post__not_in'] ) ) { 
     227            $args['post__not_in'] = array_merge( $args['post__not_in'], (array) get_the_ID() ); 
     228        } else { 
     229            $args['post__not_in'] = (array) get_the_ID(); 
     230        } 
     231    } 
     232 
     233    // if pagination is hidden, turn off SQL_CALC_FOUND_ROWS 
     234    if ( 'none' == $content['pagination'] ) 
     235        $args['no_found_rows'] = true; 
     236 
     237    add_filter( 'posts_where', 'tl_filter_where' ); 
     238    $query = new WP_Query( $args ); 
     239    remove_filter( 'posts_where', 'tl_filter_where' ); 
     240 
     241    return $query; 
     242} 
     243 
     244/** 
     245 * Filter WP_Query where clause 
     246 * 
     247 * @package The_Loops 
     248 * @since 0.3 
     249 */ 
     250function tl_filter_where( $where ) { 
     251    global $the_loop_id; 
     252 
     253    $content = tl_get_loop_parameters( $the_loop_id ); 
     254 
     255    if ( ! in_array( $content['date_type'], array( 'dynamic', 'static' ) ) ) 
     256        return $where; 
     257 
     258    if ( 'dynamic' == $content['date_type'] ) { 
     259        $min_date = ! empty( $content['days']['min'] ) ? strtotime( "-{$content['days']['min']} days" ) : null; 
     260        $max_date = ! empty( $content['days']['max'] ) ? strtotime( "-{$content['days']['max']} days" ) : null; 
     261    } else if( 'static' == $content['date_type'] ) { 
     262        $min_date = ! empty( $content['date']['min'] ) ? strtotime( $content['date']['min'] ) : null; 
     263        $max_date = ! empty( $content['date']['max'] ) ? strtotime( $content['date']['max'] ) : null; 
     264    } 
     265 
     266    if ( $max_date ) 
     267        $max_date = $max_date + 60 * 60 * 24; 
     268 
     269    $min_date = $min_date ? date( 'Y-m-d', $min_date ) : null; 
     270    $max_date = $max_date ? date( 'Y-m-d', $max_date ) : null; 
     271 
     272    if ( $min_date ) 
     273        $where .= " AND post_date >= '$min_date'"; 
     274 
     275    if ( $max_date ) 
     276        $where .= " AND post_date < '$max_date'"; 
     277 
     278    return $where; 
    80279} 
    81280 
     
    88287 * @return array Values 
    89288 */ 
    90 function _tl_csv_to_array( $string ) { 
     289function _tl_csv_to_array( $string, $delimiter = ',' ) { 
    91290    if ( ! $string ) 
    92291        return; 
    93292 
    94     $string = str_replace( array( ' , ', ', ', ' ,' ), ',', $string ); 
    95     return explode( ',', $string ); 
     293    $array = explode( $delimiter, $string ); 
     294    return array_unique( array_map( 'trim', $array ) ); 
    96295} 
    97296 
     
    99298 * Wrapper function for get_posts to get the loops. 
    100299 * 
    101  * @package The Loops 
     300 * @package The_Loops 
    102301 * @since 0.1 
    103302 */ 
     
    114313 
    115314/** 
     315 * Setup globals before displaying the loop 
     316 * 
     317 * @package The_Loops 
     318 * @since 0.1 
     319 */ 
     320function tl_setup_globals( $loop_id, $args, $context ) { 
     321    global $wp_query, $orig_query, $the_loop_id, $the_loop_context; 
     322 
     323    $the_loop_id      = $loop_id; 
     324    $the_loop_context = $context; 
     325 
     326    $tl_query = tl_query( $loop_id, $args ); 
     327    $orig_query = clone $wp_query; 
     328    $wp_query   = clone $tl_query; 
     329} 
     330 
     331/** 
     332 * Clear globals after displaying the loop 
     333 * 
     334 * @package The_Loops 
     335 * @since 0.3 
     336 */ 
     337function tl_clear_globals() { 
     338    global $wp_query, $orig_query, $the_loop_id, $the_loop_context; 
     339 
     340    $wp_query = clone $orig_query; 
     341    wp_reset_query(); 
     342 
     343    unset( $orig_query, $the_loop_id, $the_loop_context ); 
     344} 
     345 
     346/** 
    116347 * Display a loop 
    117348 * 
    118  * @package The Loops 
     349 * @package The_Loops 
    119350 * @since 0.1 
    120351 * 
    121352 * @param int $loop_id Loop ID. 
    122  * @param string $type Display type. 'shortcode' or 'widget' 
     353 * @param string $template_name Name of the template to use 
    123354 * @param array|string Custom query args 
    124  */ 
    125 function tl_display_loop( $loop_id, $type, $args = null ) { 
    126     $tl_query = tl_WP_Query( $loop_id, $type, $args ); 
     355 * @param string Context in which the loop is displayed 
     356 */ 
     357function tl_display_loop( $loop_id, $template_name, $args = null, $context = '' ) { 
     358    global $the_loops; 
     359 
     360    $loop_templates = tl_get_loop_templates(); 
     361    $loop_template = $loop_templates[$template_name]; 
     362 
     363    tl_setup_globals( $loop_id, $args, $context ); 
    127364 
    128365    ob_start(); 
    129366 
    130     echo '<div class="tl-loop">'; 
    131  
    132     if ( $tl_query->have_posts() ) : 
    133         while( $tl_query->have_posts() ) : 
    134             $tl_query->the_post(); 
    135  
    136             echo tl_display_post( $loop_id, $type ); 
    137         endwhile; 
    138         wp_reset_query(); 
    139     else: 
    140         tl_not_found( $loop_id ); 
    141     endif; 
    142  
    143     echo '</div>'; 
     367    include( "{$the_loops->plugin_dir}tl-template-tags.php" ); 
     368 
     369    tl_locate_template( $loop_template, true ); 
    144370 
    145371    $content = ob_get_contents(); 
    146372    ob_end_clean(); 
    147373 
     374    tl_clear_globals(); 
     375 
    148376    return $content; 
    149377} 
    150378 
    151379/** 
    152  * Display one post in the loop 
    153  * 
    154  * @package The Loops 
    155  * @since 0.1 
    156  * 
    157  * @param int $loop_id Loop ID. 
    158  */ 
    159 function tl_display_post( $loop_id, $type ) { 
    160     $content = get_post_meta( $loop_id, 'tl_loop_content', true ); 
    161     $loop_template_name = $content[$type]['template']; 
    162  
    163     $loop_templates = tl_get_loop_templates(); 
    164     $loop_template_file = $loop_templates[$loop_template_name]; 
    165  
    166     ob_start(); 
    167  
    168     global $tl_loop_context; 
    169     $tl_loop_context = $type; 
    170  
    171     tl_locate_template( $loop_template_file, true ); 
    172  
    173     $content = ob_get_contents(); 
    174     $loop_context = null; 
    175     ob_end_clean(); 
    176  
    177     return $content; 
    178 } 
    179  
    180 /** 
    181  * Display not found text 
    182  * 
    183  * @package The Loops 
    184  * @since 0.1 
    185  * 
    186  * @param int $loop_id Loop ID. 
    187  */ 
    188 function tl_not_found( $loop_id ) { 
    189     $content = get_post_meta( $loop_id, 'tl_loop_content', true ); 
    190  
    191     echo $content['not_found']; 
    192 } 
    193  
    194 /** 
    195380 * Add the loops shortcode which will render a loop from an id provided as attribute 
    196381 * 
    197  * @package The Loops 
     382 * @package The_Loops 
    198383 * @since 0.1 
    199384 */ 
     
    203388    ), $atts ) ); 
    204389 
    205     $post_id = get_the_ID(); 
    206  
    207     // Exclude current post/page where the shortcode will be displayed 
    208     $args = array( 
    209         'post__not_in' => array( $post_id ) 
    210     ); 
    211  
    212     return tl_display_loop( $id, 'shortcode', $args ); 
     390    $details = tl_get_loop_parameters( $id ); 
     391 
     392    return tl_display_loop( $id, $details['template'], null, 'shortcode' ); 
    213393} 
    214394add_shortcode( 'the-loop', 'tl_shortcode' ); 
     
    217397 * Get the default Loop Templates 
    218398 * 
    219  * @package The Loops 
     399 * @package The_Loops 
    220400 * @since 0.2 
    221401 */ 
    222402function tl_get_default_loop_templates() { 
    223     global $tl; 
    224     $templates_files = scandir( $tl->templates_dir ); 
     403    global $the_loops; 
     404 
     405    $templates_files = scandir( $the_loops->templates_dir ); 
    225406 
    226407    foreach ( $templates_files as $template ) { 
    227         if ( ! is_file( $tl->templates_dir . $template ) ) 
     408        if ( ! is_file( $the_loops->templates_dir . $template ) ) 
    228409            continue; 
    229410 
     
    232413            continue; 
    233414 
    234         $data = get_file_data( $tl->templates_dir. $template, array( 'name' => 'The Loops Template' ) ); 
     415        $data = get_file_data( $the_loops->templates_dir. $template, array( 'name' => 'The Loops Template' ) ); 
    235416 
    236417        if ( ! empty( $data['name'] ) ) 
     
    244425 * Get the Loop Templates available in the current theme or the default ones 
    245426 * 
    246  * @package The Loops 
     427 * @package The_Loops 
    247428 * @since 0.2 
    248429 */ 
     
    281462 * Searches in the plugin templates dir, then STYLESHEETPATH and TEMPLATEPATH. 
    282463 * 
    283  * @package The Loops 
     464 * @package The_Loops 
    284465 * @since 0.2 
    285466 * 
     
    289470 * @return string The template filename if one is located. 
    290471 */ 
    291 function tl_locate_template( $template_names, $load = false, $require_once = true ) { 
    292     global $tl; 
     472function tl_locate_template( $template_names, $load = false, $require_once = false ) { 
     473    global $the_loops; 
    293474 
    294475    $located = ''; 
     
    297478            continue; 
    298479 
    299         if ( file_exists($tl->templates_dir . $template_name) ) { 
    300             $located = $tl->templates_dir . $template_name; 
    301             break; 
    302         } else if ( file_exists(STYLESHEETPATH . '/' . $template_name) ) { 
     480        if ( file_exists( STYLESHEETPATH . '/' . $template_name ) ) { 
    303481            $located = STYLESHEETPATH . '/' . $template_name; 
    304482            break; 
    305         } else if ( file_exists(TEMPLATEPATH . '/' . $template_name) ) { 
     483        } else if ( file_exists( TEMPLATEPATH . '/' . $template_name ) ) { 
    306484            $located = TEMPLATEPATH . '/' . $template_name; 
     485            break; 
     486        } else if ( file_exists( $the_loops->templates_dir . $template_name ) ) { 
     487            $located = $the_loops->templates_dir . $template_name; 
    307488            break; 
    308489        } 
     
    316497 
    317498/** 
    318  * Return loop context. 'widget' or 'shortcode' 
    319  * 
    320  * @package The Loops 
    321  * @since 0.2 
    322  */ 
    323 function tl_loop_context() { 
    324     global $tl_loop_context; 
    325     return $tl_loop_context; 
    326 } 
    327  
     499 * Get loop parameters 
     500 * 
     501 * @package The_Loops 
     502 * @since 0.3 
     503 * 
     504 * @param int  $loop_id Loop ID 
     505 * @return array Loop parameters 
     506 */ 
     507function tl_get_loop_parameters( $loop_id ) { 
     508    return get_post_meta( $loop_id, '_tl_loop_parameters', true ); 
     509} 
     510 
  • the-loops/trunk/tl-templates/the-loops-excerpt.php

    r485582 r506227  
    1111 * @since 0.2 
    1212 */ 
     13?> 
    1314 
    14 if ( 'widget' == tl_loop_context() ) 
    15     $heading_tag = 'h4'; 
    16 else 
    17     $heading_tag = 'h2'; 
    18 ?> 
    19 <<?php echo $heading_tag; ?>> 
    20     <a href="<?php the_permalink(); ?>" title="<?php printf( esc_attr__( 'Permalink to %s', 'twentyeleven' ), the_title_attribute( 'echo=0' ) ); ?>" rel="bookmark"><?php the_title(); ?></a> 
    21 </<?php echo $heading_tag; ?>> 
    22 <?php the_excerpt(); ?> 
     15<div class="tl-loop"> 
     16 
     17    <?php if ( have_posts() ) : ?> 
     18 
     19        <?php while( have_posts() ) : the_post(); ?> 
     20 
     21            <?php if ( tl_in_widget() ) : ?> 
     22                <h4> 
     23            <?php else : ?> 
     24                <h2> 
     25            <?php endif; ?> 
     26 
     27                    <a href="<?php the_permalink(); ?>" title="<?php printf( esc_attr__( 'Permalink to %s' ), the_title_attribute( 'echo=0' ) ); ?>" rel="bookmark"><?php the_title(); ?></a> 
     28 
     29            <?php if ( tl_in_widget() ) : ?> 
     30                </h4> 
     31            <?php else : ?> 
     32                </h2> 
     33            <?php endif; ?> 
     34 
     35            <?php the_excerpt(); ?> 
     36 
     37        <?php endwhile; ?> 
     38 
     39    <?php else : ?> 
     40 
     41        <div class="tl-not-found"><?php tl_not_found_text(); ?></div> 
     42 
     43    <?php endif; ?> 
     44 
     45    <div class="tl-pagination"><?php tl_pagination(); ?></div> 
     46 
     47</div> 
  • the-loops/trunk/tl-templates/the-loops-full.php

    r485582 r506227  
    1111 * @since 0.2 
    1212 */ 
     13?> 
    1314 
    14 if ( 'widget' == tl_loop_context() ) 
    15     $heading_tag = 'h4'; 
    16 else 
    17     $heading_tag = 'h2'; 
    18 ?> 
    19 <<?php echo $heading_tag; ?>> 
    20     <a href="<?php the_permalink(); ?>" title="<?php printf( esc_attr__( 'Permalink to %s', 'twentyeleven' ), the_title_attribute( 'echo=0' ) ); ?>" rel="bookmark"><?php the_title(); ?></a> 
    21 </<?php echo $heading_tag; ?>> 
    22 <?php the_content(); ?> 
     15<div class="tl-loop"> 
     16 
     17    <?php if ( have_posts() ) : ?> 
     18 
     19        <?php while( have_posts() ) : the_post(); ?> 
     20 
     21            <?php if ( tl_in_widget() ) : ?> 
     22                <h4> 
     23            <?php else : ?> 
     24                <h2> 
     25            <?php endif; ?> 
     26 
     27                    <a href="<?php the_permalink(); ?>" title="<?php printf( esc_attr__( 'Permalink to %s' ), the_title_attribute( 'echo=0' ) ); ?>" rel="bookmark"><?php the_title(); ?></a> 
     28 
     29            <?php if ( tl_in_widget() ) : ?> 
     30                </h4> 
     31            <?php else : ?> 
     32                </h2> 
     33            <?php endif; ?> 
     34 
     35            <?php the_content(); ?> 
     36 
     37        <?php endwhile; ?> 
     38 
     39    <?php else : ?> 
     40 
     41        <div class="tl-not-found"><?php tl_not_found_text(); ?></div> 
     42 
     43    <?php endif; ?> 
     44 
     45    <div class="tl-pagination"><?php tl_pagination(); ?></div> 
     46 
     47</div> 
  • the-loops/trunk/tl-templates/the-loops-title.php

    r485582 r506227  
    1212 */ 
    1313?> 
    14 <p> 
    15     <a href="<?php the_permalink(); ?>" title="<?php printf( esc_attr__( 'Permalink to %s', 'twentyeleven' ), the_title_attribute( 'echo=0' ) ); ?>" rel="bookmark"><?php the_title(); ?></a> 
    16 </p> 
     14 
     15<div class="tl-loop"> 
     16 
     17    <?php if ( have_posts() ) : ?> 
     18 
     19        <ul> 
     20 
     21            <?php while( have_posts() ) : the_post(); ?> 
     22 
     23                <li> 
     24                    <a href="<?php the_permalink(); ?>" title="<?php printf( esc_attr__( 'Permalink to %s' ), the_title_attribute( 'echo=0' ) ); ?>" rel="bookmark"><?php the_title(); ?></a> 
     25                </li> 
     26 
     27            <?php endwhile; ?> 
     28 
     29        </ul> 
     30 
     31    <?php else : ?> 
     32 
     33        <div class="tl-not-found"><?php tl_not_found_text(); ?></div> 
     34 
     35    <?php endif; ?> 
     36 
     37    <div class="tl-pagination"><?php tl_pagination(); ?></div> 
     38 
     39</div> 
  • the-loops/trunk/tl-widget.php

    r485582 r506227  
    44 * Widget class 
    55 * 
    6  * @package The Loops 
     6 * @package The_Loops 
    77 * @since 0.1 
    88 */ 
    99class TL_Widget extends WP_Widget { 
    1010    function __construct() { 
    11         parent::WP_Widget( 'tl_widget', 'The Loops', array( 'description' => __( 'Use this widget to add one of your loops as a widget.' ) ) ); 
     11        parent::WP_Widget( 'tl_widget', __( 'The Loops' ), array( 'description' => __( 'Use this widget to add one of your loops as a widget.' ) ) ); 
    1212    } 
    1313 
     
    2222            echo $before_title . $instance['title'] . $after_title; 
    2323 
    24         echo tl_display_loop( $instance['loop_id'], 'widget', null ); 
     24        $args = array( 
     25            'offset'         => $instance['offset'], 
     26            'posts_per_page' => $instance['posts_per_page'] 
     27        ); 
     28 
     29        echo tl_display_loop( $instance['loop_id'], $instance['template'], $args, 'widget' ); 
    2530 
    2631        echo $after_widget; 
     
    2934    function update( $new_instance, $old_instance ) { 
    3035        $instance = $old_instance; 
    31         $instance['title']   = strip_tags($new_instance['title']); 
    32         $instance['loop_id'] = absint($new_instance['loop_id']); 
     36        $instance['loop_id']        = absint( $new_instance['loop_id'] ); 
     37        $instance['offset']         = absint( $new_instance['offset'] ); 
     38        $instance['posts_per_page'] = absint( $new_instance['posts_per_page'] ); 
     39        $instance['template']       = $new_instance['template']; 
     40        $instance['title']          = strip_tags( $new_instance['title'] ); 
    3341        return $instance; 
    3442    } 
    3543 
    3644    function form( $instance ) { 
    37         $instance = wp_parse_args( (array) $instance, array( 'title' => '', 'loop_id' => 0 ) ); 
    38         $title   = esc_attr($instance['title']); 
    39         $loop_id = $instance['loop_id']; 
     45        $defaults = array( 
     46            'loop_id'        => 0, 
     47            'offset'         => 0, 
     48            'posts_per_page' => get_option( 'posts_per_page' ) / 2, 
     49            'template'       => 'List of titles', 
     50            'title'          => '' 
     51        ); 
     52        $instance = wp_parse_args( (array) $instance, $defaults ); 
     53        $loop_id        = $instance['loop_id']; 
     54        $posts_per_page = $instance['posts_per_page']; 
     55        $offset         = $instance['offset']; 
     56        $template       = esc_attr( $instance['template'] ); 
     57        $title          = esc_attr( $instance['title'] ); 
    4058        ?> 
    4159        <p> 
     
    5573            </select> 
    5674        </p> 
     75        <p> 
     76            <label for="<?php echo $this->get_field_id('posts_per_page'); ?>"><?php _e( 'Number of items:' ); ?></label> 
     77            <input id="<?php echo $this->get_field_id('posts_per_page'); ?>" name="<?php echo $this->get_field_name('posts_per_page'); ?>" type="text" value="<?php echo $posts_per_page; ?>" class="small-text" /> 
     78        </p> 
     79        <p> 
     80            <label for="<?php echo $this->get_field_id('offset'); ?>"><?php _e( 'Offset:' ); ?></label> 
     81            <input id="<?php echo $this->get_field_id('offset'); ?>" name="<?php echo $this->get_field_name('offset'); ?>" type="text" value="<?php echo $offset; ?>" class="small-text" /> 
     82        </p> 
     83        <p> 
     84            <label for="<?php echo $this->get_field_id('template'); ?>"><?php _e( 'Template:' ); ?></label> 
     85            <select id="<?php echo $this->get_field_id('template'); ?>" name="<?php echo $this->get_field_name('template'); ?>" class="widefat"> 
     86                <?php 
     87                $loop_templates = tl_get_loop_templates(); 
     88                foreach ( $loop_templates as $name => $file ) { 
     89                    $selected = selected( $name, $template, false ); 
     90                    echo "<option value='". esc_attr( $name ) ."'$selected>{$name}</option>"; 
     91                } 
     92                ?> 
     93            </select> 
     94        </p> 
    5795        <?php 
    5896    } 
     
    62100 * Register widget 
    63101 * 
    64  * @package The Loops 
     102 * @package The_Loops 
    65103 * @since 0.1 
    66104 */ 
Note: See TracChangeset for help on using the changeset viewer.