WordPress.org

Plugin Directory

Changeset 1172968


Ignore:
Timestamp:
06/02/15 18:00:30 (3 years ago)
Author:
ChaseWiseman
Message:

Releasing v1.3.3

Location:
simmer/trunk
Files:
27 added
18 edited

Legend:

Unmodified
Added
Removed
  • simmer/trunk/core/admin/assets/admin.css

    r1151192 r1172968  
    436436    width: 100%; 
    437437} 
    438 .select2-dropdown { 
     438.select2-container .select2-dropdown { 
    439439    z-index: 100002; 
    440440} 
  • simmer/trunk/core/admin/assets/admin.js

    r1151192 r1172968  
    8787         
    8888        // Auto-focus on first input after the row is added. 
    89         clone.find( 'td input:not(.hide-if-js):first, td textarea:first' ).focus(); 
     89        clone.find( 'td input:not(.hide-if-js):not([type="hidden"]):first, td textarea:first' ).focus(); 
    9090         
    9191        setTimeout( function() { 
  • simmer/trunk/core/admin/class-simmer-admin-bulk-add.php

    r1151192 r1172968  
    1515final class Simmer_Admin_Bulk_Add { 
    1616     
    17     /** 
    18      * Construct the class. 
    19      *  
    20      * @since 1.2.0 
    21      */ 
    22     public function __construct() { 
    23          
    24         $this->add_actions(); 
    25     } 
    26      
    27     /** 
    28      * Add the necessary action hooks. 
    29      *  
    30      * @since  1.2.0 
     17    /** Singleton **/ 
     18     
     19    /** 
     20     * The singleton instance of the class. 
     21     * 
     22     * @since  1.3.3 
    3123     * @access private 
    32      */ 
    33     private function add_actions() { 
    34          
    35         add_action( 'admin_footer', array( $this, 'add_modal' ) ); 
    36          
    37         add_action( 'wp_ajax_simmer_process_bulk', array( $this, 'process_ajax' ) ); 
     24     * @var    object $instance. 
     25     */ 
     26    private static $instance = null; 
     27     
     28    /** 
     29     * Get the singleton instance of the class. 
     30     * 
     31     * @since 1.3.3 
     32     * 
     33     * @return object self::$instance The single instance of the class. 
     34     */ 
     35    public static function get_instance() { 
     36         
     37        if ( is_null( self::$instance ) ) { 
     38            self::$instance = new self(); 
     39        } 
     40         
     41        return self::$instance; 
     42    } 
     43     
     44    /** 
     45     * Prevent the class from being cloned. 
     46     * 
     47     * @since 1.3.3 
     48     */ 
     49    public function __clone() { 
     50         
     51        _doing_it_wrong( __FUNCTION__, __( 'The Simmer_Admin_Bulk_Add class can not be cloned', Simmer()->domain ), Simmer()->version ); 
     52    } 
     53     
     54    /** 
     55     * Prevent the class from being unserialized. 
     56     * 
     57     * @since 1.3.3 
     58     */ 
     59    public function __wakeup() { 
     60         
     61        _doing_it_wrong( __FUNCTION__, __( 'The Simmer_Admin_Bulk_Add class can not be unserialized', Simmer()->domain ), Simmer()->version ); 
    3862    } 
    3963     
     
    5074        if ( 'post' == $current_screen->base && $current_screen->post_type == simmer_get_object_type() ) { 
    5175             
    52             include_once( plugin_dir_path( __FILE__ ) . 'html/meta-boxes/bulk-add.php' ); 
     76            include_once( plugin_dir_path( __FILE__ ) . 'views/meta-boxes/bulk-add.php' ); 
    5377        } 
    5478    } 
  • simmer/trunk/core/admin/class-simmer-admin-recipes.php

    r1151192 r1172968  
    88 */ 
    99 
    10 // If this file is called directly, bail. 
    11 if ( ! defined( 'WPINC' ) ) { 
    12     die; 
    13 } 
    14  
    1510/** 
    1611 * Set up the recipes admin. 
     
    2015final class Simmer_Admin_Recipes { 
    2116     
    22     /** 
    23      * Construct the class. 
    24      *  
    25      * @since 1.0.0 
    26      */ 
    27     public function __construct() { 
    28          
    29         // Add the recipe metaboxes. 
    30         add_action( 'add_meta_boxes', array( $this, 'add_metaboxes' ) ); 
    31          
    32         // Save the recipe meta. 
    33         add_action( 'save_post_recipe', array( $this, 'save_recipe_meta' ) ); 
    34          
    35         // Add custom "updated" messages. 
    36         add_filter( 'post_updated_messages', array( $this, 'updated_messages' ) ); 
    37          
    38         // Add custom bulk 'recipe updated' messages. 
    39         add_filter( 'bulk_post_updated_messages', array( $this, 'bulk_updated_messages' ), 10, 2 ); 
    40          
    41         // Remove the recipe items on recipe deletion. 
    42         add_action( 'delete_post', array( $this, 'delete_recipe_items' ) ); 
    43          
    44         // Remove the "Quick Edit" link from the recipe row actions. 
    45         add_filter( 'post_row_actions', array( $this, 'hide_quick_edit_link' ), 10, 2 ); 
     17    /** Singleton **/ 
     18     
     19    /** 
     20     * The singleton instance of the class. 
     21     * 
     22     * @since  1.3.3 
     23     * @access private 
     24     * @var    object $instance. 
     25     */ 
     26    private static $instance = null; 
     27     
     28    /** 
     29     * Get the singleton instance of the class. 
     30     * 
     31     * @since 1.3.3 
     32     * 
     33     * @return object self::$instance The single instance of the class. 
     34     */ 
     35    public static function get_instance() { 
     36         
     37        if ( is_null( self::$instance ) ) { 
     38            self::$instance = new self(); 
     39        } 
     40         
     41        return self::$instance; 
     42    } 
     43     
     44    /** 
     45     * Prevent the class from being cloned. 
     46     * 
     47     * @since 1.3.3 
     48     */ 
     49    public function __clone() { 
     50         
     51        _doing_it_wrong( __FUNCTION__, __( 'The Simmer_Admin_Recipes class can not be cloned', Simmer()->domain ), Simmer()->version ); 
     52    } 
     53     
     54    /** 
     55     * Prevent the class from being unserialized. 
     56     * 
     57     * @since 1.3.3 
     58     */ 
     59    public function __wakeup() { 
     60         
     61        _doing_it_wrong( __FUNCTION__, __( 'The Simmer_Admin_Recipes class can not be unserialized', Simmer()->domain ), Simmer()->version ); 
    4662    } 
    4763     
     
    114130         * Include the meta box HTML. 
    115131         */ 
    116         include_once( 'html/meta-boxes/ingredients.php' ); 
     132        include_once( 'views/meta-boxes/ingredients.php' ); 
    117133         
    118134        /** 
     
    147163         * Include the meta box HTML. 
    148164         */ 
    149         include_once( 'html/meta-boxes/instructions.php' ); 
     165        include_once( 'views/meta-boxes/instructions.php' ); 
    150166         
    151167        /** 
     
    177193        do_action( 'simmer_before_information_metabox', $recipe ); 
    178194         
     195        // Get the servings & servings label. 
     196        $servings = get_post_meta( $recipe->ID, '_recipe_servings', true ); 
     197         
     198        // If the Servings value isn't a number (pre 1.3.3), switch it to the servings label to prevent data loss. 
     199        if ( is_numeric( absint( $servings ) ) ) { 
     200            $servings_label = get_post_meta( $recipe->ID, '_recipe_servings_label', true ); 
     201        } else { 
     202            $servings_label = $servings; 
     203            $servings = ''; 
     204        } 
    179205        /** 
    180206         * Include the meta box HTML. 
    181207         */ 
    182         include_once( 'html/meta-boxes/information.php' ); 
     208        include_once( 'views/meta-boxes/information.php' ); 
    183209         
    184210        /** 
     
    228254                } 
    229255                 
    230                 $amount = Simmer_Recipe_Ingredient::convert_amount_to_float( $ingredient['amount'] ); 
     256                $amount = ( isset( $ingredient['amount'] ) ) ? Simmer_Recipe_Ingredient::convert_amount_to_float( $ingredient['amount'] ) : ''; 
     257                $unit = ( isset( $ingredient['unit'] ) ) ? $ingredient['unit'] : ''; 
    231258                 
    232259                if ( isset( $ingredient['id'] ) && $ingredient['id'] ) { 
     
    234261                    $ingredient_id = simmer_update_recipe_ingredient( $ingredient['id'], array( 
    235262                        'amount'      => $amount, 
    236                         'unit'        => $ingredient['unit'], 
     263                        'unit'        => $unit, 
    237264                        'description' => $ingredient['description'], 
    238265                        'order'       => $ingredient['order'], 
     266                        'is_heading'  => $ingredient['heading'], 
    239267                    ) ); 
    240268                     
    241269                } else { 
    242270                     
    243                     $ingredient_id = simmer_add_recipe_ingredient( get_the_ID(), $ingredient['description'], $amount, $ingredient['unit'], $ingredient['order'] ); 
     271                    $ingredient_id = simmer_add_recipe_ingredient( get_the_ID(), $ingredient['description'], $amount, $unit, $ingredient['heading'], $ingredient['order'] ); 
    244272                     
    245273                } 
     
    352380         
    353381        // Maybe save the servings. 
    354         if ( ! empty( $_POST['simmer_servings'] ) ) { 
    355             update_post_meta( $id, '_recipe_servings', $_POST['simmer_servings'] ); 
     382        $servings = absint( $_POST['simmer_servings'] ); 
     383         
     384        if ( ! empty( $servings ) ) { 
     385            update_post_meta( $id, '_recipe_servings', absint( $_POST['simmer_servings'] ) ); 
    356386        } else { 
    357387            delete_post_meta( $id, '_recipe_servings' ); 
     388        } 
     389         
     390        // Maybe save the servings label. 
     391        if ( ! empty( $_POST['simmer_servings_label'] ) ) { 
     392            update_post_meta( $id, '_recipe_servings_label', $_POST['simmer_servings_label'] ); 
     393        } else { 
     394            delete_post_meta( $id, '_recipe_servings_label' ); 
    358395        } 
    359396         
     
    482519        } 
    483520    } 
    484      
    485     /** 
    486      * Remove the "Quick Edit" link from the recipe row actions. 
    487      * 
    488      * @since 1.0.0 
    489      * 
    490      * @param  array  $actions The list of post row actions. 
    491      * @param  object $object  The current object. 
    492      * @return array  $actions The list of post row actions. 
    493      */ 
    494     public function hide_quick_edit_link( $actions, $object ) { 
    495          
    496         // Only remove the link if this is a recipe. 
    497         if ( $object->post_type == simmer_get_object_type() ) { 
    498              
    499             unset( $actions['inline hide-if-no-js'] ); 
    500         } 
    501  
    502         return $actions; 
    503     } 
    504521} 
    505  
    506 new Simmer_Admin_Recipes(); 
  • simmer/trunk/core/admin/class-simmer-admin-settings.php

    r1151192 r1172968  
    88 */ 
    99  
    10 // If this file is called directly, bail. 
    11 if ( ! defined( 'WPINC' ) ) { 
    12     die; 
    13 } 
    14  
    1510/** 
    1611 * Set up the setting admin. 
     
    2015final class Simmer_Admin_Settings { 
    2116     
    22     /** 
    23      * Construct settings admin. 
    24      * 
    25      * @since 1.0.0 
    26      */ 
    27     public function __construct() { 
    28          
    29         // Add the settings submenu item. 
    30         add_action( 'admin_menu', array( $this, 'add_options_page' ) ); 
    31          
    32         // Register the available settings with the Settings API. 
    33         add_action( 'admin_init', array( $this, 'register_settings' ) ); 
    34          
    35         // Enqueue the admin styles. 
    36         add_action( 'admin_enqueue_scripts', array( $this, 'enqueue_styles' ) ); 
    37          
    38         // Enqueue the admin scripts. 
    39         add_action( 'admin_enqueue_scripts', array( $this, 'enqueue_scripts' ) ); 
     17    /** Singleton **/ 
     18     
     19    /** 
     20     * The singleton instance of the class. 
     21     * 
     22     * @since  1.3.3 
     23     * @access private 
     24     * @var    object $instance. 
     25     */ 
     26    private static $instance = null; 
     27     
     28    /** 
     29     * Get the singleton instance of the class. 
     30     * 
     31     * @since 1.3.3 
     32     * 
     33     * @return object self::$instance The single instance of the class. 
     34     */ 
     35    public static function get_instance() { 
     36         
     37        if ( is_null( self::$instance ) ) { 
     38            self::$instance = new self(); 
     39        } 
     40         
     41        return self::$instance; 
     42    } 
     43     
     44    /** 
     45     * Prevent the class from being cloned. 
     46     * 
     47     * @since 1.3.3 
     48     */ 
     49    public function __clone() { 
     50         
     51        _doing_it_wrong( __FUNCTION__, __( 'The Simmer_Admin_Settings class can not be cloned', Simmer()->domain ), Simmer()->version ); 
     52    } 
     53     
     54    /** 
     55     * Prevent the class from being unserialized. 
     56     * 
     57     * @since 1.3.3 
     58     */ 
     59    public function __wakeup() { 
     60         
     61        _doing_it_wrong( __FUNCTION__, __( 'The Simmer_Admin_Settings class can not be unserialized', Simmer()->domain ), Simmer()->version ); 
    4062    } 
    4163     
     
    5779         
    5880        add_options_page( 
    59             __( 'Recipes', Simmer()->domain ), 
    60             __( 'Recipes', Simmer()->domain ), 
     81            __( 'Simmer Settings', Simmer()->domain ), 
     82            __( 'Simmer', Simmer()->domain ), 
    6183            'manage_options', 
    6284            'simmer-settings', 
     
    6991     * 
    7092     * @since 1.0.0 
     93     * 
     94     * @global array $simmer_extensions A list of registered Simmer extensions. 
    7195     */ 
    7296    public function register_settings() { 
     
    174198        ); 
    175199         
    176         /** License **/ 
    177          
    178         // Add the license settings section. 
    179         add_settings_section( 
    180             'simmer_license_add', 
    181             __( 'Simmer License', Simmer()->domain ), 
    182             array( $this, 'license_section_callback' ), 
    183             'simmer_license' 
    184         ); 
    185          
    186         register_setting( 'simmer_license', 'simmer_license', array( $this, 'validate_license_input' ) ); 
    187          
    188         // Add the license settings fields. 
    189         add_settings_field( 
    190             'simmer_license_key', 
    191             __( 'License Key', Simmer()->domain ), 
    192             array( $this, 'license_key_callback' ), 
    193             'simmer_license', 
    194             'simmer_license_add' 
    195         ); 
    196          
    197         $license = new Simmer_License(); 
    198  
    199         if ( ! $license->get_status() ) { 
    200                  
    201             add_settings_field( 
    202                 'simmer_license_email', 
    203                 __( 'License Email', Simmer()->domain ), 
    204                 array( $this, 'license_email_callback' ), 
    205                 'simmer_license', 
    206                 'simmer_license_add' 
    207             ); 
    208              
    209         } 
     200        /** Licenses **/ 
    210201         
    211202        global $simmer_extensions; 
     
    213204        if ( ! empty( $simmer_extensions ) ) { 
    214205             
    215             // Add the extensions license settings section. 
    216             add_settings_section( 
    217                 'simmer_license_extensions', 
    218                 __( 'Extension Licenses', Simmer()->domain ), 
    219                 array( $this, 'license_extensions_section_callback' ), 
    220                 'simmer_license' 
    221             ); 
    222              
     206            foreach ( $simmer_extensions as $simmer_extension ) { 
     207                 
     208                if ( isset( $simmer_extension['license'] ) && true === $simmer_extension['license'] ) { 
     209                     
     210                    // Add the extensions license settings section. 
     211                    add_settings_section( 
     212                        'simmer_license_extensions', 
     213                        __( 'Extension Licenses', Simmer()->domain ), 
     214                        array( $this, 'license_extensions_section_callback' ), 
     215                        'simmer_license' 
     216                    ); 
     217                     
     218                    break; 
     219                } 
     220            } 
    223221        } 
    224222         
     
    324322         * Include the markup. 
    325323         */ 
    326         include_once( 'html/extend-page.php' ); 
     324        include_once( 'views/extend-page.php' ); 
    327325    } 
    328326     
     
    331329     *  
    332330     * @since 1.0.0 
     331     * 
     332     * @global array $simmer_extensions A list of registered Simmer extensions. 
    333333     */ 
    334334    public function settings_page_callback() { 
     335         
     336        global $simmer_extensions; 
    335337         
    336338        // Define the settings tabs. 
     
    348350        $tabs = apply_filters( 'simmer_settings_tabs', $tabs ); 
    349351         
    350         // Append the Licenses tab to the end. 
     352        // Append the "Advanced" tab to the end. 
    351353        $tabs['advanced'] = __( 'Advanced',  Simmer()->domain ); 
    352         $tabs['license'] = __( 'Licenses',  Simmer()->domain ); 
     354         
     355        // If any licensed extensions are registered, display the "Licenses" tab. 
     356        if ( ! empty( $simmer_extensions ) ) { 
     357             
     358            foreach ( $simmer_extensions as $simmer_extension ) { 
     359                 
     360                if ( isset( $simmer_extension['license'] ) && true === $simmer_extension['license'] ) { 
     361                    $tabs['license'] = __( 'Licenses',  Simmer()->domain ); 
     362                    break; 
     363                } 
     364            } 
     365        } 
    353366         
    354367        // Get current tab. 
    355         $current_tab = empty( $_GET['tab'] ) ? 'display' : sanitize_title( $_GET['tab'] ); 
     368        $current_tab = ( empty( $_GET['tab'] ) || ! array_key_exists( $_GET['tab'], $tabs ) ) ? 'display' : sanitize_title( $_GET['tab'] ); 
    356369         
    357370        // Flush the rewrite rules. 
     
    363376         * Include the markup. 
    364377         */ 
    365         include_once( 'html/settings/settings-page.php' ); 
     378        include_once( 'views/settings/settings-page.php' ); 
    366379    } 
    367380     
     
    383396         * Include the markup. 
    384397         */ 
    385         include_once( 'html/settings/ingredients-list-heading.php' ); 
     398        include_once( 'views/settings/ingredients-list-heading.php' ); 
    386399         
    387400        /** 
     
    410423         * Include the markup. 
    411424         */ 
    412         include_once( 'html/settings/ingredients-list-type.php' ); 
     425        include_once( 'views/settings/ingredients-list-type.php' ); 
    413426         
    414427        /** 
     
    437450         * Include the markup. 
    438451         */ 
    439         include_once( 'html/settings/units-format.php' ); 
     452        include_once( 'views/settings/units-format.php' ); 
    440453         
    441454        /** 
     
    464477         * Include the markup. 
    465478         */ 
    466         include_once( 'html/settings/instructions-list-heading.php' ); 
     479        include_once( 'views/settings/instructions-list-heading.php' ); 
    467480         
    468481        /** 
     
    491504         * Include the markup. 
    492505         */ 
    493         include_once( 'html/settings/instructions-list-type.php' ); 
     506        include_once( 'views/settings/instructions-list-type.php' ); 
    494507         
    495508        /** 
     
    518531         * Include the markup. 
    519532         */ 
    520         include_once( 'html/settings/enqueue-styles.php' ); 
     533        include_once( 'views/settings/enqueue-styles.php' ); 
    521534         
    522535        /** 
     
    545558         * Include the markup. 
    546559         */ 
    547         include_once( 'html/settings/recipe-accent-color.php' ); 
     560        include_once( 'views/settings/recipe-accent-color.php' ); 
    548561         
    549562        /** 
     
    572585         * Include the markup. 
    573586         */ 
    574         include_once( 'html/settings/recipe-text-color.php' ); 
     587        include_once( 'views/settings/recipe-text-color.php' ); 
    575588         
    576589        /** 
     
    583596     
    584597    /** 
    585      * Display the "license" section markup. 
    586      *  
    587      * @since 1.0.0 
    588      */ 
    589     public function license_section_callback() { 
    590          
    591         /** 
    592          * Include the markup. 
    593          */ 
    594         include_once( 'html/settings/license-section.php' ); 
    595          
    596     } 
    597      
    598     /** 
    599      * Display the "license key" setting markup. 
    600      *  
    601      * @since 1.0.0 
    602      */ 
    603     public function license_key_callback() { 
    604          
    605         /** 
    606          * Allow others to add to this field. 
    607          *  
    608          * @since 1.0.0 
    609          */ 
    610         do_action( 'simmer_before_license_key_settings_field' ); 
    611          
    612         /** 
    613          * Include the markup. 
    614          */ 
    615         include_once( 'html/settings/license-key.php' ); 
    616          
    617         /** 
    618          * Allow others to add to this field. 
    619          *  
    620          * @since 1.0.0 
    621          */ 
    622         do_action( 'simmer_after_license_key_settings_field' ); 
    623     } 
    624      
    625     /** 
    626      * Display the "license email" setting markup. 
    627      *  
    628      * @since 1.0.0 
    629      */ 
    630     public function license_email_callback() { 
    631          
    632         /** 
    633          * Allow others to add to this field. 
    634          *  
    635          * @since 1.0.0 
    636          */ 
    637         do_action( 'simmer_before_license_email_settings_field' ); 
    638          
    639         /** 
    640          * Include the markup. 
    641          */ 
    642         include_once( 'html/settings/license-email.php' ); 
    643          
    644         /** 
    645          * Allow others to add to this field. 
    646          *  
    647          * @since 1.0.0 
    648          */ 
    649         do_action( 'simmer_after_license_email_settings_field' ); 
    650     } 
    651      
    652     /** 
    653598     * Display the "extensions license" section markup. 
    654599     *  
     
    662607         * Include the markup. 
    663608         */ 
    664         include_once( 'html/settings/license-extensions-section.php' ); 
     609        include_once( 'views/settings/license-extensions-section.php' ); 
    665610         
    666611        do_action( 'simmer_after_license_extensions_section' ); 
     
    685630         * Include the markup. 
    686631         */ 
    687         include_once( 'html/settings/advanced/on-uninstall.php' ); 
     632        include_once( 'views/settings/advanced/on-uninstall.php' ); 
    688633         
    689634        /** 
     
    705650         * Include the markup. 
    706651         */ 
    707         include_once( 'html/settings/permalink-archive-base.php' ); 
     652        include_once( 'views/settings/permalink-archive-base.php' ); 
    708653    } 
    709654     
     
    718663         * Include the markup. 
    719664         */ 
    720         include_once( 'html/settings/permalink-recipe-base.php' ); 
     665        include_once( 'views/settings/permalink-recipe-base.php' ); 
    721666    } 
    722667     
     
    731676         * Include the markup. 
    732677         */ 
    733         include_once( 'html/settings/permalink-category-base.php' ); 
     678        include_once( 'views/settings/permalink-category-base.php' ); 
    734679    } 
    735680     
     
    752697        } 
    753698    } 
    754      
    755     /** 
    756      * Validate the license settings. 
    757      *  
    758      * @since 1.0.0 
    759      *  
    760      * @param  array $input The license settings field input. 
    761      * @return array $license 
    762      */ 
    763     public function validate_license_input( $input ) { 
    764          
    765         $license = new Simmer_License(); 
    766          
    767         $existing_license  = $license->license; 
    768          
    769         $existing_key      = ( isset( $existing_license['key'] ) )   ? trim( $existing_license['key'] )   : ''; 
    770         $existing_email    = ( isset( $existing_license['email'] ) ) ? trim( $existing_license['email'] ) : ''; 
    771          
    772         if ( isset( $input['deactivate'] ) && '1' == $input['deactivate'] ) { 
    773              
    774             $result = $license->deactivate( array( 
    775                 'licence_key' => $existing_key, 
    776                 'email'       => $existing_email, 
    777             ) ); 
    778              
    779             add_settings_error( 'simmer_license', 'simmer-deactivated', __( 'License deactivated.', Simmer()->domain ), 'error' ); 
    780              
    781             return false; 
    782              
    783         } else if ( $license->exists() ) { 
    784              
    785             return $existing_license; 
    786              
    787         } else { 
    788              
    789             $new_key   = ( isset( $input['key'] ) )   ? trim( $input['key'] )   : ''; 
    790             $new_email = ( isset( $input['email'] ) ) ? trim( $input['email'] ) : ''; 
    791              
    792             if ( ! $new_key && ! $new_email ) { 
    793                 return false; 
    794             } 
    795              
    796             $result = $license->activate( array( 
    797                 'licence_key' => $new_key, 
    798                 'email'       => $new_email, 
    799             ) ); 
    800              
    801             $new_license          = array(); 
    802             $new_license['key']   = $new_key; 
    803             $new_license['email'] = $new_email; 
    804              
    805             if ( isset( $result['activated'] ) && 1 == $result['activated'] ) { 
    806                  
    807                 add_settings_error( 'simmer_license', 'simmer-activated', __( 'License activated.', Simmer()->domain ), 'updated' ); 
    808                  
    809                 return $new_license; 
    810                  
    811             } 
    812              
    813             if ( false == $result ) { 
    814                  
    815                 add_settings_error( 'simmer_license', 'simmer-error', __( 'Could not connect to the Simmer API. Please try again later.', Simmer()->domain ), 'error' ); 
    816                  
    817                 return false; 
    818                  
    819             } else if ( isset( $result['code'] ) ) { 
    820          
    821                 add_settings_error( 'simmer_license', 'simmer-error', $result['error'] . '. ' . $result['additional_info'], 'error' ); 
    822                  
    823                 return false; 
    824                  
    825             } 
    826              
    827         } 
    828          
    829         return $existing_license; 
    830     } 
    831699} 
    832  
    833 new Simmer_Admin_Settings(); 
  • simmer/trunk/core/admin/class-simmer-admin-shortcode-ui.php

    r1151192 r1172968  
    77 * @package Simmer\Admin 
    88 */ 
    9  
    10 // If this file is called directly, bail. 
    11 if ( ! defined( 'WPINC' ) ) { 
    12     die; 
    13 } 
    149 
    1510class Simmer_Admin_Shortcode_UI { 
     
    2318     */ 
    2419    public $supported_post_types; 
     20     
     21    /** Singleton **/ 
     22     
     23    /** 
     24     * The singleton instance of the class. 
     25     * 
     26     * @since  1.3.3 
     27     * @access private 
     28     * @var    object $instance. 
     29     */ 
     30    private static $instance = null; 
     31     
     32    /** 
     33     * Get the singleton instance of the class. 
     34     * 
     35     * @since 1.3.3 
     36     * 
     37     * @return object self::$instance The single instance of the class. 
     38     */ 
     39    public static function get_instance() { 
     40         
     41        if ( is_null( self::$instance ) ) { 
     42            self::$instance = new self(); 
     43        } 
     44         
     45        return self::$instance; 
     46    } 
     47     
     48    /** 
     49     * Prevent the class from being cloned. 
     50     * 
     51     * @since 1.3.3 
     52     */ 
     53    public function __clone() { 
     54         
     55        _doing_it_wrong( __FUNCTION__, __( 'The Simmer_Admin_Shortcode_UI class can not be cloned', Simmer()->domain ), Simmer()->version ); 
     56    } 
     57     
     58    /** 
     59     * Prevent the class from being unserialized. 
     60     * 
     61     * @since 1.3.3 
     62     */ 
     63    public function __wakeup() { 
     64         
     65        _doing_it_wrong( __FUNCTION__, __( 'The Simmer_Admin_Shortcode_UI class can not be unserialized', Simmer()->domain ), Simmer()->version ); 
     66    } 
    2567     
    2668    /** 
     
    3678            'page', 
    3779        ); 
    38          
    39         // Add the necessary action hooks. 
    40         $this->add_actions(); 
    41     } 
    42      
    43     /** 
    44      * Add the necessary action hooks. 
    45      *  
    46      * @since  1.2.0 
    47      * @access private 
    48      */ 
    49     private function add_actions() { 
    50          
    51         // Enqueue the modal script. 
    52         add_action( 'admin_enqueue_scripts', array( $this, 'enqueue_script' ) ); 
    53          
    54         // Add the 'Add Recipe' button above the main content editor. 
    55         add_action( 'media_buttons', array( $this, 'add_media_button' ), 99 ); 
    56          
    57         add_action( 'admin_footer', array( $this, 'add_modal' ) ); 
    5880    } 
    5981     
     
    115137        if ( 'post' == $current_screen->base && in_array( $current_screen->post_type, $this->get_supported_post_types() ) ) { 
    116138             
    117             include_once( plugin_dir_path( __FILE__ ) . 'html/shortcode-modal.php' ); 
     139            include_once( plugin_dir_path( __FILE__ ) . 'views/shortcode-modal.php' ); 
    118140        } 
    119141    } 
  • simmer/trunk/core/class-simmer.php

    r1152966 r1172968  
    2727     * @var string VERSION The plugin version. 
    2828     */ 
    29     const VERSION = '1.3.2'; 
     29    const VERSION = '1.3.3'; 
    3030     
    3131    /** 
     
    112112        $this->require_files(); 
    113113         
    114         if ( is_admin() ) { 
    115              
    116             // Load the admin. 
    117             $this->admin = Simmer_Admin::get_instance(); 
    118              
    119         } else { 
     114        if ( ! is_admin() ) { 
    120115             
    121116            // Load the front-end. 
     
    168163         */ 
    169164        require( plugin_dir_path( __FILE__ ) . 'class-simmer-installer.php'  ); 
    170          
    171         /** 
    172          * The license class. 
    173          */ 
    174         require_once( plugin_dir_path( __FILE__ ) . 'class-simmer-license.php' ); 
    175165         
    176166        /** 
     
    220210             
    221211            /** 
    222              * The admin class. 
    223              */ 
    224             require_once( plugin_dir_path( __FILE__ ) . 'admin/class-simmer-admin.php' ); 
     212             * The admin dashboard class. 
     213             */ 
     214            require_once( plugin_dir_path( __FILE__ ) . 'admin/class-simmer-admin-dashboard.php' ); 
     215             
     216            /** 
     217             * The recipes admin class. 
     218             */ 
     219            require_once( plugin_dir_path( __FILE__ ) . 'admin/class-simmer-admin-recipes.php' ); 
     220             
     221            /** 
     222             * The admin bulk-add class. 
     223             */ 
     224            require_once( plugin_dir_path( __FILE__ ) . 'admin/class-simmer-admin-bulk-add.php' ); 
     225             
     226            /** 
     227             * The shortcode UI class. 
     228             */ 
     229            require_once( plugin_dir_path( __FILE__ ) . 'admin/class-simmer-admin-shortcode-ui.php' ); 
     230             
     231            /** 
     232             * The admin settings class. 
     233             */ 
     234            require_once( plugin_dir_path( __FILE__ ) . 'admin/class-simmer-admin-settings.php' ); 
     235             
     236            /** 
     237             * The admin functions. 
     238             */ 
     239            require_once( plugin_dir_path( __FILE__ ) . 'admin/functions.php' ); 
     240             
     241            /** 
     242             * The admin hooks. 
     243             */ 
     244            require_once( plugin_dir_path( __FILE__ ) . 'admin/hooks.php' ); 
    225245             
    226246        } else { 
  • simmer/trunk/core/frontend/templates/recipe-shortcode.php

    r1151192 r1172968  
    106106    </div><!-- .simmer-recipe-details --> 
    107107     
    108     <?php simmer_list_ingredients(); ?> 
     108    <div class="simmer-recipe-ingredients"> 
     109        <?php simmer_list_ingredients(); ?> 
     110    </div><!-- .simmer-recipe-ingredients --> 
    109111     
    110     <?php simmer_list_instructions(); ?> 
     112    <div class="simmer-recipe-instructions"> 
     113        <?php simmer_list_instructions(); ?> 
     114    </div><!-- .simmer-recipe-instructions --> 
    111115     
    112116    <div class="simmer-recipe-footer"> 
  • simmer/trunk/core/frontend/templates/recipe.php

    r1151192 r1172968  
    4949    <ul class="simmer-recipe-extras"> 
    5050         
    51         <?php if ( $servings = simmer_get_the_servings() ) : ?> 
     51        <?php $servings = simmer_get_the_servings(); ?> 
     52        <?php $servings_label = simmer_get_the_servings_label(); ?> 
     53         
     54        <?php if ( $servings || $servings_label ) : ?> 
    5255             
    5356            <li> 
    5457                <strong><?php _e( 'Serves', Simmer()->domain ); ?>:</strong>  
    55                 <span itemprop="recipeYield"><?php echo esc_html( $servings ); ?></span> 
     58                <span itemprop="recipeYield"> 
     59                    <?php echo esc_html( $servings ); ?> 
     60                    <?php echo esc_html( $servings_label ); ?> 
     61                </span> 
    5662            </li> 
    5763             
     
    8086</div><!-- .simmer-recipe-details --> 
    8187 
    82 <?php simmer_list_ingredients(); ?> 
     88<div class="simmer-recipe-ingredients"> 
     89    <?php simmer_list_ingredients(); ?> 
     90</div><!-- .simmer-recipe-ingredients --> 
    8391 
    84 <?php simmer_list_instructions(); ?> 
     92<div class="simmer-recipe-instructions"> 
     93    <?php simmer_list_instructions(); ?> 
     94</div><!-- .simmer-recipe-instructions --> 
    8595 
    8696<div class="simmer-recipe-footer"> 
  • simmer/trunk/core/recipes/class-simmer-recipe.php

    r1151192 r1172968  
    9191     * @since 1.3.0 
    9292     * 
     93     * @param array $args { 
     94     *     Optional. An array of arguments. 
     95     * 
     96     *     @type bool   $exclude_headings Whether returned ingredients should exclude headings. Default 'false'. 
     97     *     @type string $orderby          What to order the ingredients by. Default 'order' for their set order. 
     98     *                                    Accepts 'order', 'amount', 'unit', or 'random'. Requires $exclude_headings 
     99     *                                    be set to 'true'. 
     100     * } 
    93101     * @return array $ingredients An array of the recipe's ingredients. An empty array is returned when there 
    94102     *                            are no ingredients for the recipe. 
    95103     */ 
    96     public function get_ingredients() { 
     104    public function get_ingredients( $args = array() ) { 
     105         
     106        $defaults = array( 
     107            'exclude_headings' => false, 
     108            'orderby'          => 'order', 
     109        ); 
     110         
     111        $args = wp_parse_args( $args, $defaults ); 
     112         
     113        /** 
     114         * Filter the recipe's ingredients query args. 
     115         * 
     116         * @since 1.3.3 
     117         * 
     118         * @param array $args      The recipe's ingredients query args. @see Simmer_Recipe::get_ingredients(). 
     119         * @param int   $recipe_id The recipe ID. 
     120         */ 
     121        $args = apply_filters( 'simmer_get_recipe_ingredients_args', $args, $this->id ); 
    97122         
    98123        $items = $this->get_items( 'ingredient' ); 
     
    102127        foreach ( $items as $item ) { 
    103128             
     129            // Exclude headings if set to do so in the args. 
     130            if ( $args['exclude_headings'] && simmer_get_recipe_item_meta( $item->recipe_item_id, 'is_heading', true ) ) { 
     131                continue; 
     132            } 
     133             
    104134            $ingredients[] = new Simmer_Recipe_Ingredient( $item ); 
     135        } 
     136         
     137        // Maybe reorder the ingredients. 
     138        if ( $args['exclude_headings'] && 'order' !== $args['orderby'] ) { 
     139             
     140            if ( 'random' == $args['orderby'] ) { 
     141                shuffle( $ingredients ); 
     142            } else if ( method_exists( $this, 'sort_ingredients_by_' . $args['orderby'] ) ) { 
     143                usort( $ingredients, array( $this, 'sort_ingredients_by_' . $args['orderby'] ) ); 
     144            } 
    105145        } 
    106146         
     
    119159     
    120160    /** 
     161     * Sort two ingredients by their amounts. 
     162     * 
     163     * @since  1.3.3 
     164     * @access private 
     165     * 
     166     * @see usort() 
     167     * 
     168     * @param  object $a The first ingredient object. 
     169     * @param  object $b The second ingredient object. 
     170     * @return int       Whether first amount is greater than, less than, or equal to the second. 
     171     */ 
     172    private function sort_ingredients_by_amount( $a, $b ) { 
     173         
     174        // Get the filtered amounts. 
     175        $a = $a->get_amount(); 
     176        $b = $b->get_amount(); 
     177         
     178        // Convert the amounts to floats. 
     179        $a = Simmer_Recipe_Ingredient::convert_amount_to_float( $a ); 
     180        $b = Simmer_Recipe_Ingredient::convert_amount_to_float( $b ); 
     181         
     182        if( $a == $b ) { 
     183            return 0; 
     184        } 
     185         
     186        return ( $a < $b ) ? -1 : 1; 
     187    } 
     188     
     189    /** 
     190     * Sort two ingredients by their units (alphabetical). 
     191     * 
     192     * @since  1.3.3 
     193     * @access private 
     194     * 
     195     * @see usort() 
     196     * 
     197     * @param  object $a The first ingredient object. 
     198     * @param  object $b The second ingredient object. 
     199     * @return int       Which unit is alphabetically superior. 
     200     */ 
     201    private function sort_ingredients_by_unit( $a, $b ) { 
     202         
     203        return strcmp( $a->get_unit(), $b->get_unit() ); 
     204    } 
     205     
     206    /** 
    121207     * Get the instructions. 
    122208     * 
    123209     * @since 1.3.0 
    124210     * 
     211     * @param array $args { 
     212     *     Optional. An array of arguments. 
     213     * 
     214     *     @type bool $exclude_headings Whether returned instructions should exclude headings. Default 'false'. 
     215     * } 
    125216     * @return array $instructions An array of the recipe's instructions. An empty array is returned when there 
    126217     *                             are no instructions for the recipe. 
    127218     */ 
    128     public function get_instructions() { 
     219    public function get_instructions( $args = array() ) { 
     220         
     221        $defaults = array( 
     222            'exclude_headings' => false, 
     223        ); 
     224         
     225        $args = wp_parse_args( $args, $defaults ); 
     226         
     227        /** 
     228         * Filter the recipe's instructions query args. 
     229         * 
     230         * @since 1.3.3 
     231         * 
     232         * @param array $args      The recipe's instructions query args. @see Simmer_Recipe::get_instructions(). 
     233         * @param int   $recipe_id The recipe ID. 
     234         */ 
     235        $args = apply_filters( 'simmer_get_recipe_instructions_args', $args, $this->id ); 
    129236         
    130237        $items = $this->get_items( 'instruction' ); 
     
    133240         
    134241        foreach ( $items as $item ) { 
     242             
     243            // Exclude headings if set to do so in the args. 
     244            if ( $args['exclude_headings'] && simmer_get_recipe_item_meta( $item->recipe_item_id, 'is_heading', true ) ) { 
     245                continue; 
     246            } 
    135247             
    136248            $instructions[] = new Simmer_Recipe_Instruction( $item ); 
  • simmer/trunk/core/recipes/items/ingredients/class-simmer-recipe-ingredient.php

    r1151192 r1172968  
    8686        $this->unit        = $this->get_unit( true ); 
    8787        $this->description = $this->get_description( true ); 
     88        $this->is_heading  = $this->is_heading( true ); 
    8889         
    8990    } 
     
    181182         
    182183        return $description; 
     184    } 
     185     
     186    /** 
     187     * Determine if the ingredient is a heading. 
     188     * 
     189     * @since 1.3.3 
     190     * 
     191     * @param  bool   $raw        Whether to get the heading status unaltered from the database. 
     192     * @return string $is_heading Whether the ingredient is a heading.. 
     193     */ 
     194    public function is_heading( $raw = false ) { 
     195         
     196        $is_heading = simmer_get_recipe_item_meta( $this->id, 'is_heading', true ); 
     197         
     198        if ( $raw ) { 
     199            return $is_heading; 
     200        } 
     201         
     202        $is_heading = apply_filters( 'simmer_recipe_ingredient_is_heading', $is_heading, $this->id ); 
     203         
     204        return $is_heading; 
    183205    } 
    184206     
  • simmer/trunk/core/recipes/items/ingredients/class-simmer-recipe-ingredients.php

    r1151192 r1172968  
    8989     * @param  float    $amount      Optional. The ingredient amount. 
    9090     * @param  string   $unit        Optional. The ingredient unit. 
     91     * @param  bool     $is_heading  Optional. Whether the ingredient is a heading. 
    9192     * @param  int      $order       Optional. The ingredient order number. 
    9293     * @return int|bool $result      The new ingredient's ID or false on failure. 
    9394     */ 
    94     public function add_ingredient( $recipe_id, $description, $amount = null, $unit = '', $order = 0 ) { 
     95    public function add_ingredient( $recipe_id, $description, $amount = null, $unit = '', $is_heading = false, $order = 0 ) { 
    9596         
    9697        if ( ! absint( $recipe_id ) ) { 
     
    117118                simmer_add_recipe_item_meta( $item_id, 'unit', $unit ); 
    118119            } 
     120             
     121            simmer_add_recipe_item_meta( $item_id, 'is_heading', (bool) $is_heading ); 
    119122        } 
    120123         
     
    135138     *     @type string $unit        Optional. The ingredient unit. 
    136139     *     @type string $description Optional. The ingredient description. 
     140     *     @type bool   $is_heading  Whether the ingredient is a heading. 
    137141     *     @type int    $order       Optional. The ingredient order number. 
    138142     * } 
     
    198202                simmer_delete_recipe_item_meta( $ingredient_id, 'description' ); 
    199203            } 
     204        } 
     205         
     206        if ( isset( $args['is_heading'] ) ) { 
     207             
     208            simmer_update_recipe_item_meta( $ingredient_id, 'is_heading', (bool) $args['is_heading'] ); 
    200209        } 
    201210         
  • simmer/trunk/core/recipes/items/ingredients/functions.php

    r1151192 r1172968  
    3434 * @param  float    $amount      Optional. The ingredient amount. 
    3535 * @param  string   $unit        Optional. The ingredient unit. 
     36 * @param  bool     $is_heading  Optional. Whether the ingredient is a heading. 
    3637 * @param  int      $order       Optional. The ingredient order number. 
    3738 * @return int|bool $result      The new ingredient's ID or false on failure. 
    3839 */ 
    39 function simmer_add_recipe_ingredient( $recipe_id, $description, $amount = null, $unit = '', $order = 0 ) { 
     40function simmer_add_recipe_ingredient( $recipe_id, $description, $amount = null, $unit = '', $is_heading = false, $order = 0 ) { 
    4041     
    4142    $ingredients_api = new Simmer_Recipe_Ingredients; 
    4243     
    43     $ingredient_id = $ingredients_api->add_ingredient( $recipe_id, $description, $amount, $unit, $order ); 
     44    $ingredient_id = $ingredients_api->add_ingredient( $recipe_id, $description, $amount, $unit, $is_heading, $order ); 
    4445     
    4546    return $ingredient_id; 
  • simmer/trunk/core/recipes/items/ingredients/template-functions.php

    r1151192 r1172968  
    1313 * @since 1.0.0 
    1414 *  
     15 * @param  array      $args        Optional. @see Simmer_Recipe::get_ingredients(). 
    1516 * @return array|bool $ingredients The array of ingredients or false if none found. 
    1617 */ 
    17 function simmer_get_the_ingredients() { 
     18function simmer_get_the_ingredients( $args = array() ) { 
    1819     
    1920    $recipe = simmer_get_recipe( get_the_ID() ); 
    2021     
    21     $ingredients = $recipe->get_ingredients(); 
     22    $ingredients = $recipe->get_ingredients( $args ); 
    2223     
    2324    /** 
     
    9596        'list_class'   => 'simmer-ingredients', 
    9697        'item_type'    => apply_filters( 'simmer_ingredients_list_item_type', 'li' ), 
     98        'item_heading_type' => apply_filters( 'simmer_ingredients_list_item_heading_type', 'h4' ), 
    9799        'item_class'   => 'simmer-ingredient', 
    98100        'none_message' => __( 'This recipe has no ingredients', Simmer()->domain ), 
     
    155157        $list_attributes = (array) apply_filters( 'simmer_ingredients_list_attributes', $list_attributes ); 
    156158         
    157         // Build the list's opening tag based on the attributes above. 
    158         $output .= '<' . sanitize_html_class( $args['list_type'] ); 
    159              
    160             if ( ! empty( $list_attributes ) ) { 
    161                  
    162                 foreach( $list_attributes as $attribute => $value ) { 
    163                     $output .= ' ' . sanitize_html_class( $attribute ) . '="' . esc_attr( $value ) . '"'; 
     159        if ( $ingredients[0]->is_heading() ) { 
     160             
     161            $list_open = false; 
     162             
     163        } else { 
     164             
     165            // Build the list's opening tag based on the attributes above. 
     166            $output .= '<' . sanitize_html_class( $args['list_type'] ); 
     167                 
     168                if ( ! empty( $list_attributes ) ) { 
     169                     
     170                    foreach( $list_attributes as $attribute => $value ) { 
     171                        $output .= ' ' . sanitize_html_class( $attribute ) . '="' . esc_attr( $value ) . '"'; 
     172                    } 
    164173                } 
    165             } 
    166              
    167         $output .= '>'; 
    168              
     174                 
     175            $output .= '>'; 
     176             
     177            $list_open = true; 
     178             
     179        } 
    169180            // Loop through the ingredients. 
    170181            foreach ( $ingredients as $ingredient ) { 
     
    179190                do_action( 'simmer_before_ingredients_list_item', $ingredient ); 
    180191                 
    181                 /** 
    182                  * Create an array of attributes for the list element. 
    183                  * 
    184                  * Instead of hardcoding these into the tag itself, 
    185                  * we use an associative array so folks can easily add 
    186                  * custom attributes like data-*="" for JavaScript. 
    187                  */ 
    188                 $item_attributes = array( 
    189                     'itemprop' => 'ingredients', 
    190                 ); 
    191                  
    192                 if ( ! empty( $args['item_class'] ) ) { 
    193                     $item_attributes['class'] = $args['item_class']; 
     192                // If this is an ingredient heading, change the item tag. 
     193                if ( $ingredient->is_heading() ) { 
     194                     
     195                    if ( true == $list_open ) { 
     196                         
     197                        // Close the previous list. 
     198                        $output .= '</' . sanitize_html_class( $args['list_type'] ) . '>'; 
     199                         
     200                        $list_open = false; 
     201                         
     202                    } 
     203                     
     204                    // Build the heading. 
     205                    $output .= '<' . sanitize_html_class( $args['item_heading_type'] ) . '>'; 
     206                        $output .= esc_html( $ingredient->get_description() ); 
     207                    $output .= '</' . sanitize_html_class( $args['item_heading_type'] ) . '>'; 
     208                     
     209                    // Build the new list's opening tag based on the attributes above. 
     210                    $output .= '<' . sanitize_html_class( $args['list_type'] ); 
     211                         
     212                        if ( ! empty( $list_attributes ) ) { 
     213                             
     214                            foreach( $list_attributes as $attribute => $value ) { 
     215                                $output .= ' ' . sanitize_html_class( $attribute ) . '="' . esc_attr( $value ) . '"'; 
     216                            } 
     217                        } 
     218                         
     219                    $output .= '>'; 
     220                     
     221                    $list_open = true; 
     222                     
     223                } else { 
     224                     
     225                    /** 
     226                     * Create an array of attributes for the list element. 
     227                     * 
     228                     * Instead of hardcoding these into the tag itself, 
     229                     * we use an associative array so folks can easily add 
     230                     * custom attributes like data-*="" for JavaScript. 
     231                     */ 
     232                    $item_attributes = array( 
     233                        'itemprop' => 'ingredients', 
     234                    ); 
     235                     
     236                    if ( ! empty( $args['item_class'] ) ) { 
     237                        $item_attributes['class'] = $args['item_class']; 
     238                    } 
     239                     
     240                    /** 
     241                     * Allow others to filter the list item attributes. 
     242                     * 
     243                     * @since 1.0.0 
     244                     *  
     245                     * @param array $item_attributes { 
     246                     *     The attributes in format $attribute => $value. 
     247                     * } 
     248                     */ 
     249                    $item_attributes = (array) apply_filters( 'simmer_ingredients_list_item_attributes', $item_attributes, $ingredient ); 
     250                     
     251                    // Build the list item opening tag based on the attributes above. 
     252                    $output .= '<' . sanitize_html_class( $args['item_type'] ); 
     253                         
     254                        if ( ! empty( $item_attributes ) ) { 
     255                             
     256                            foreach( $item_attributes as $attribute => $value ) { 
     257                                $output .= ' ' . sanitize_html_class( $attribute ) . '="' . esc_attr( $value ) . '"'; 
     258                            } 
     259                        } 
     260                         
     261                    $output .= '>'; 
     262                         
     263                        if ( $amount = $ingredient->get_amount() ) { 
     264                            $output .= '<span class="simmer-ingredient-amount">' . esc_html( $amount ) . '</span> '; 
     265                        } 
     266                         
     267                        if ( $unit = $ingredient->get_unit() ) { 
     268                            $output .= '<span class="simmer-ingredient-unit">' . esc_html( $unit ) . '</span> '; 
     269                        } 
     270                         
     271                        if ( $description = $ingredient->get_description() ) { 
     272                            $output .= '<span class="simmer-ingredient-description">' . esc_html( $description ) . '</span>'; 
     273                        } 
     274                         
     275                    // Close the list item. 
     276                    $output .= '</' . sanitize_html_class( $args['item_type'] ) . '>'; 
     277                     
    194278                } 
    195                  
    196                 /** 
    197                  * Allow others to filter the list item attributes. 
    198                  * 
    199                  * @since 1.0.0 
    200                  *  
    201                  * @param array $item_attributes { 
    202                  *     The attributes in format $attribute => $value. 
    203                  * } 
    204                  */ 
    205                 $item_attributes = (array) apply_filters( 'simmer_ingredients_list_item_attributes', $item_attributes, $ingredient ); 
    206                  
    207                 // Build the list item opening tag based on the attributes above. 
    208                 $output .= '<' . sanitize_html_class( $args['item_type'] ); 
    209                      
    210                     if ( ! empty( $item_attributes ) ) { 
    211                          
    212                         foreach( $item_attributes as $attribute => $value ) { 
    213                             $output .= ' ' . sanitize_html_class( $attribute ) . '="' . esc_attr( $value ) . '"'; 
    214                         } 
    215                     } 
    216                      
    217                 $output .= '>'; 
    218                      
    219                     if ( $amount = $ingredient->get_amount() ) { 
    220                         $output .= '<span class="simmer-ingredient-amount">' . esc_html( $amount ) . '</span> '; 
    221                     } 
    222                      
    223                     if ( $unit = $ingredient->get_unit() ) { 
    224                         $output .= '<span class="simmer-ingredient-unit">' . esc_html( $unit ) . '</span> '; 
    225                     } 
    226                      
    227                     if ( $description = $ingredient->get_description() ) { 
    228                         $output .= '<span class="simmer-ingredient-description">' . esc_html( $description ) . '</span>'; 
    229                     } 
    230                      
    231                 // Close the list item. 
    232                 $output .= '</' . sanitize_html_class( $args['item_type'] ) . '>'; 
    233279                 
    234280                /** 
  • simmer/trunk/core/recipes/items/instructions/template-functions.php

    r1151192 r1172968  
    1313 * @since 1.0.0 
    1414 *  
    15  * @param  int        $recipe_id    Optional. A recipe's ID. 
     15 * @param  array      $args         Optional. @see Simmer_Recipe::get_instructions(). 
    1616 * @return array|bool $instructions The array of instructions or false if none set. 
    1717 */ 
    18 function simmer_get_the_instructions() { 
     18function simmer_get_the_instructions( $args = array() ) { 
    1919     
    2020    $recipe = simmer_get_recipe( get_the_ID() ); 
    2121     
    22     $instructions = $recipe->get_instructions(); 
     22    $instructions = $recipe->get_instructions( $args ); 
    2323     
    2424    /** 
  • simmer/trunk/core/recipes/template-functions.php

    r1151192 r1172968  
    130130function simmer_the_servings( $before = '', $after = '' ) { 
    131131     
    132     if ( $servings = simmer_get_the_servings() ) { 
    133         echo $before . esc_html( $servings ) . $after; 
     132    $servings = simmer_get_the_servings(); 
     133    $servings_label = simmer_get_the_servings_label(); 
     134     
     135    if ( $servings || $servings_label ) { 
     136        echo $before; 
     137    } 
     138     
     139    if ( $servings ) { 
     140        echo esc_html( $servings ); 
     141    } 
     142     
     143    if ( $servings_label ) { 
     144        echo esc_html( $servings_label ); 
     145    } 
     146     
     147    if ( $servings || $servings_label ) { 
     148        echo $after; 
    134149    } 
    135150} 
     
    150165     
    151166    $servings = get_post_meta( $recipe_id, '_recipe_servings', true ); 
     167     
     168    if ( ! is_numeric( $servings ) ) { 
     169        $servings = false; 
     170    } 
    152171     
    153172    /** 
     
    162181     
    163182    return $servings; 
     183} 
     184 
     185/** 
     186 * Get the recipe's servings label. 
     187 * 
     188 * @since 1.3.3 
     189 *  
     190 * @param  int    $recipe_id      Optional. A recipe's ID. 
     191 * @return string $servings_label The recipe's servings label 
     192 */ 
     193function simmer_get_the_servings_label( $recipe_id = null ) { 
     194     
     195    if ( ! is_numeric( $recipe_id ) ) { 
     196        $recipe_id = get_the_ID(); 
     197    } 
     198     
     199    $servings_label = get_post_meta( $recipe_id, '_recipe_servings_label', true ); 
     200     
     201    /** 
     202     * Filter the returned servings label value. 
     203     *  
     204     * @since 1.3.3 
     205     *  
     206     * @param string|bool $servings_label The returned servings label or '' if none set. 
     207     * @param int         $recipe_id      The recipe's ID. 
     208     */ 
     209    $servings_label = apply_filters( 'simmer_get_the_servings_label', $servings_label, $recipe_id ); 
     210     
     211    return $servings_label; 
    164212} 
    165213 
  • simmer/trunk/readme.txt

    r1152966 r1172968  
    33Tags: recipes, recipe, cooking, food, food blog, content marketing, food content marketing, drinks, drink recipes, tutorial maker, tutorials, recipe maker, baking, crafts, DIY, do it yourself 
    44Requires at least: 3.8 
    5 Tested up to: 4.2.1 
    6 Stable tag: 1.3.2 
     5Tested up to: 4.2.2 
     6Stable tag: 1.3.3 
    77License: GPLv2 or later 
    88License URI: http://www.gnu.org/licenses/gpl-2.0.html 
     
    1212== Description == 
    1313 
    14 We all love the simple, human act of sharing how to prepare a favorite meal. Simmer enables WordPress users to quickly and easily publish their recipes with minimal hassle. With a focus on the key areas necessary for a great recipe publishing experience, Simmer stays lightweight and easy to use and doesn't get bogged down by 101 half-baked features. 
     14We all love the simple, human act of sharing how to prepare a favorite meal. Simmer enables WordPress users to quickly and easily publish their recipes with minimal hassle. With a focus on the key areas necessary for a great recipe & food data publishing experience, Simmer stays lightweight and easy to use. Check out Simmer for Recipes in a [live demo](http://demo.simmerwp.com). 
    1515 
    1616**Elegant UI** 
     
    1818Add ingredients, step-by-step instructions, sub-headings, structured cook times, and a lot more all within a user-friendly drag and drop interface. 
    1919 
    20 **Built for Discovery** 
     20**Food Data Discovery** 
    2121 
    22 Simmer automatically bakes semantic structure and [schema.org](http://schema.org) microdata in to the core of every recipe you publish. This allows Google to standardize and serve your recipes across a variety of devices and platforms. 
     22Simmer automatically bakes semantic structure and [schema.org](http://schema.org) microdata in to the core of every recipe you publish. This allows Google to standardize and serve your recipes across a variety of devices and platforms. In addition, our easy to understand recipe index structure allows you to create endless libraries and collections of specific recipes. 
    2323 
    2424**Easily Extendable** 
    2525 
    26 Simmer is built with developers in mind. Utilize the many actions and filters detailed in the [Developer API](http://develop.simmerwp.com) to customize Simmer to fit any project. Or, check out the official [Extensions Library](https://simmerwp.com/extensions/) to find an extension that meets your needs. Check back often as new extensions are always being developed! 
     26Simmer is built with developers in mind. Utilize the many actions and filters detailed in the [Developer API](http://develop.simmerwp.com) to customize Simmer to fit any project. Or, check out the official [Add-Ons Library](https://simmerwp.com/extensions/) to find an extension (including content e-commerce) that meets your needs. Check back often as new extensions are always being developed! 
    2727 
    2828**Additional Features** 
    2929 
    30 * Bulk-add ingredients & instructions 
     30* Bulk-add ingredients & instructions as blocks of text 
     31* Work with any social sharing tools including [AddThis](http://www.addthis.com) 
     32* All recipes are fully responsive & ready for mobile depending on your theme out of the box 
     33* Create custom recipe card themes & styling easily 
     34* Widgets: display your most recent recipes and/or recipe categories in your sidebar 
    3135* Recipe categories 
    32 * Add recipe servings, yield, and source name and/or link 
     36* Recipe authors 
     37* Add recipe servings, yield, cook times, and source name and/or link 
    3338* Embed recipes anywhere in your posts or pages 
     39* Featured thumbnail for each recipe 
    3440* Front-end recipe printing 
    3541 
    36 **Follow Simmer's development on [Github](http://github.com/bwdinc/simmer/)** 
     42**Follow Simmer's development on [Github](http://github.com/bwdinc/simmer/) and [simmerwp.com](https://simmerwp.com/blog).** 
    3743 
    3844== Installation == 
     
    6975 
    7076== Changelog == 
     77 
     78= 1.3.3 = 
     79* New: Ingredient heading support, just like instructions 
     80* New: 'orderby' param for ingredient queries 
     81* New: Optionally exclude headings in ingredient & instruction queries 
     82* Tweak: Separate serving number & label meta fields & values 
     83* Tweak: Reinstate the 'Quick Edit' post row action for recipes 
     84* Tweak: Improve file & folder structure 
     85* Tweak: Remove core plugin licensing 
     86* Tweak: Improve add-on license detection 
     87* Fix: Input autofocus for ingredients UI 
    7188 
    7289= 1.3.2 = 
  • simmer/trunk/simmer.php

    r1152966 r1172968  
    99 
    1010/** 
    11  * Plugin Name: Simmer 
     11 * Plugin Name: Simmer for Recipes 
    1212 * Plugin URI:  https://simmerwp.com 
    1313 * Description: A recipe publishing tool for WordPress. 
    14  * Version:     1.3.2 
    15  * Author:      BWD inc. 
    16  * Author URI:  http://gobwd.com 
     14 * Version:     1.3.3 
     15 * Author:      Team Simmer 
     16 * Author URI:  https://simmerwp.com/about/ 
    1717 * License:     GPL-2.0+ 
    1818 * License URI: http://www.gnu.org/licenses/gpl-2.0.txt 
Note: See TracChangeset for help on using the changeset viewer.