Plugin Directory

Changeset 1306180


Ignore:
Timestamp:
12/11/2015 01:44:33 PM (10 years ago)
Author:
phuisman
Message:

Added Private More and other features/fixes

Location:
flickr-field-for-advanced-custom-fields/trunk
Files:
5 added
4 edited

Legend:

Unmodified
Added
Removed
  • flickr-field-for-advanced-custom-fields/trunk/acf-flickr-v4.php

    r1231799 r1306180  
    2828            'flickr_user_id'        => '',
    2929            'flickr_content_type'   => 'sets',
     30        'flickr_private_mode'   => 0,
     31      'flickr_secret_key'     => '',
     32      'flickr_private_token'  => '',
    3033            'flickr_sets_amount'    => '9999',
    3134            'flickr_max_selected'   => '0',
     
    5154    }
    5255
     56  /*
     57  *  field_group_admin_enqueue_scripts()
     58  *
     59  *  This action is called in the admin_enqueue_scripts action on the edit screen where your field is edited.
     60  *  Use this action to add css + javascript to assist your create_field_options() action.
     61  *
     62  *  $info        http://codex.wordpress.org/Plugin_API/Action_Reference/admin_enqueue_scripts
     63  *  @type        action
     64  *  @since        3.6
     65  *  @date        23/01/13
     66  */
     67  function field_group_admin_enqueue_scripts()
     68  {
     69    wp_register_script('acf-input-image-crop-options', $this->settings['dir'] . 'js/options.js', array('jquery'), $this->settings['version']);
     70    wp_enqueue_script( 'acf-input-image-crop-options');
     71    wp_register_style('acf-input-image-crop-options', $this->settings['dir'] . 'css/options.css');
     72    wp_enqueue_style( 'acf-input-image-crop-options');
     73  }
    5374
    5475    /*
     
    79100            <td class="label">
    80101                <label><?php _e('Flickr User ID','acf-flickr'); ?><span class="required">*</span></label>
    81                 <p class="description">Find your User ID at <a href="http://idgettr.com/">http://idgettr.com/</a></p>
     102                <p class="description">Find your User ID at <a href="http://idgettr.com/" target="_blank">http://idgettr.com/</a>. Alternatively, you can set the constant <strong>FLICKR_FIELD_USER_ID</strong>.</p>
    82103            </td>
    83104            <td>
     
    94115            <td class="label">
    95116                <label><?php _e('Flickr API Key','acf-flickr'); ?><span class="required">*</span></label>
    96                 <p class="description"><?php _e('Find or register your API key at <a href="http://www.flickr.com/services/apps/">http://www.flickr.com/services/apps</a>', 'acf-flickr');?></p>
     117                <p class="description"><?php _e('Find or register your API key at <a href="http://www.flickr.com/services/apps/" target="_blank">http://www.flickr.com/services/apps</a>', 'acf-flickr');?></p>
    97118            </td>
    98119            <td>
     
    102123                    'name'      =>  'fields['.$key.'][flickr_api_key]',
    103124                    'value'     =>  $field['flickr_api_key'],
     125                ));
     126                ?>
     127            </td>
     128        </tr>
     129        <tr class="field_option field_option_<?php echo $this->name; ?>">
     130            <td class="label">
     131                <label><?php _e('Flickr Private Mode','acf-flickr'); ?></label>
     132                <p class="description"><?php _e('When private mode is enabled you <strong>need to supply a token</strong> in order to get private photos.', 'acf-flickr');?></p>
     133            </td>
     134            <td>
     135                <?php
     136                do_action('acf/create_field', array(
     137                    'type'      =>  'radio',
     138                    'layout'  =>    'horizontal',
     139                    'name'      =>  'fields['.$key.'][flickr_private_mode]',
     140                    'value'     =>  $field['flickr_private_mode'],
     141                    'class'     =>  'flickr_private_mode_select',
     142                    'choices' => array(
     143                        '0' => 'Off',
     144                        '1' => 'On',
     145                    ),
     146                ));
     147                ?>
     148            </td>
     149        </tr>
     150        <tr class="field_option field_option_<?php echo $this->name; ?>" data-name="flickr_secret_key">
     151            <td class="label">
     152                <label><?php _e('Flickr Secret Key','acf-flickr'); ?><span class="required">*</span></label>
     153                <p class="description"><?php _e('Find or register your secret key at <a href="http://www.flickr.com/services/apps/" target="_blank">http://www.flickr.com/services/apps</a>', 'acf-flickr');?></p>
     154            </td>
     155            <td>
     156                <?php
     157                do_action('acf/create_field', array(
     158                    'type'  =>  'text',
     159                    'name'  =>  'fields['.$key.'][flickr_secret_key]',
     160                    'value' =>  $field['flickr_secret_key'],
     161                    'class' => 'flickr_secret_key',
     162                ));
     163                ?>
     164            </td>
     165        </tr>
     166        <tr class="field_option field_option_<?php echo $this->name; ?>" data-name="flickr_private_token">
     167            <td class="label">
     168                <label><?php _e('Flickr Private Token','acf-flickr'); ?><span class="required">*</span></label>
     169                <p class="description"><?php _e('If you haven\'t got a token yet you can try this modified phpFlickr script <a href="' . plugin_dir_url( __FILE__ ) . 'phpflickr/generate_flickr_token.php" target="_blank">to generate private flickr token</a>. Alternatively, you can set the constant <strong>FLICKR_FIELD_API_TOKEN</strong>.', 'acf-flickr');?></p>
     170            </td>
     171            <td>
     172                <?php
     173                do_action('acf/create_field', array(
     174                    'type'  =>  'text',
     175                    'name'  =>  'fields['.$key.'][flickr_private_token]',
     176                    'value' =>  $field['flickr_private_token'],
     177                    'class' => 'flickr_private_token',
    104178                ));
    105179                ?>
     
    184258                <?php
    185259                do_action('acf/create_field', array(
    186                     'type'  =>  'select',
     260                    'type'  =>  'radio',
     261                    'layout'    =>  'horizontal',
    187262                    'name'  =>  'fields['.$key.'][flickr_cache_enabled]',
    188263                    'value' =>  $field['flickr_cache_enabled'],
    189264                    'choices' => array(
    190                         '1' => 'Yes',
    191                         '0' => 'No',
     265                        '0' => 'Off',
     266                        '1' => 'On',
    192267                    ),
     268                    'class' => 'flickr_cache_select',
    193269                ));
    194270                ?>
    195271           </td>
    196272        </tr>
    197         <tr class="field_option field_option_<?php echo $this->name; ?>">
     273        <tr class="field_option field_option_<?php echo $this->name; ?>" data-name="flickr_cache_duration">
    198274            <td class="label">
    199275                <label><?php _e('Cache duration','acf-flickr'); ?></label>
    200                 <p class="description"><?php _e('The time your cache may last in minutes (this setting will be ignored when your cache is disabled).', 'acf-flickr');?></p>
     276                <p class="description"><?php _e('The time your cache may last in minutes.', 'acf-flickr');?></p>
    201277            </td>
    202278            <td>
     
    294370
    295371        // Get all Flickr sets by the given user ID and api key (both required)
    296         require_once(dirname(__FILE__) . '/phpFlickr.php');
    297         $f = new phpFlickr($field['flickr_api_key']);
     372        require_once(dirname(__FILE__) . '/phpflickr/phpFlickr.php');
     373
     374        if($field['flickr_private_mode']) {
     375            // Private Mode
     376            $f = new phpFlickr($field['flickr_api_key'], $field['flickr_secret_key'], true);
     377            $f->setToken($field['flickr_private_token']);
     378        }
     379        else {
     380            // Public Mode
     381            $f = new phpFlickr($field['flickr_api_key']);
     382        }
    298383
    299384        // Caching
     
    307392        }
    308393
    309         $field['choices'] = array();
    310         $field['choices'][''] = '';
     394        // Check if user id exists in constants, if so - use that one
     395        if(defined('FLICKR_FIELD_USER_ID')) {
     396            $field['flickr_user_id'] = FLICKR_FIELD_USER_ID;
     397        }
     398
     399        $field['choices'] = array(array());
    311400        ?>
    312401
     
    378467            }
    379468            elseif($field['flickr_content_type'] == 'photostream') {
    380                 $flickr_data = $f->people_getPublicPhotos ($field['flickr_user_id'], NULL, 'url_o', $field['flickr_sets_amount'], '');
     469                if($field['flickr_private_mode']) {
     470                    $flickr_data = $f->people_getPhotos($field['flickr_user_id'], array('privacy_filter' => 5, 'per_page' => $field['flickr_sets_amount']) );
     471                }
     472                else {
     473                    $flickr_data = $f->people_getPublicPhotos ($field['flickr_user_id'], NULL, 'url_o', $field['flickr_sets_amount'], '');
     474                }
    381475
    382476                if (is_array($flickr_data['photos']) && isset($flickr_data['photos']['photo'][0])):  ?>
     
    387481                            if (is_array($items)) {
    388482                                foreach ($items as $k => $item) {
    389                                     $item = get_object_vars($item);
    390                                     if(is_array($item) && in_array($photo['id'], $item)) {
    391                                         $active = ' active-row';
     483                                    if (is_object($item)) {
     484                                        $item = get_object_vars($item);
     485                                        if(is_array($item) && in_array($photo['id'], $item)) {
     486                                            $active = ' active-row';
     487                                        }
    392488                                    }
    393489                                }
     
    568664        $data['user_id']           = $field['flickr_user_id'];
    569665        $data['api_key']           = $field['flickr_api_key'];
     666        $data['private_mode']      = $field['flickr_private_mode'];
     667        $data['secret_key']        = $field['flickr_secret_key'];
     668        $data['private_token']     = $field['flickr_private_token'];
    570669
    571670        return $data;
     
    595694
    596695            // Initialize a new phpFlickr object based on your api key
    597             require_once(dirname(__FILE__) . '/phpFlickr.php');
    598             $f = new phpFlickr($value['api_key']);
     696            require_once(dirname(__FILE__) . '/phpflickr/phpFlickr.php');
     697
     698            if($value['private_mode']) {
     699                // Private Mode
     700                $f = new phpFlickr($value['api_key'], $value['secret_key'], true);
     701                $f->setToken($value['private_token']);
     702            }
     703            else {
     704                // Public Mode
     705                $f = new phpFlickr($value['api_key']);
     706            }
    599707
    600708            // enable phpFlickr caching if possible
     
    618726                foreach($value['items'] as $id) {
    619727                    if ($value['type'] == 'sets') {
    620                         $photos = $f->photosets_getPhotos($id, 'url_o', null, $value['flickr_show_limit']);
     728                        $privacy_filter = $value['private_mode'] == true ? 5 : 1;
     729                        $photos = $f->photosets_getPhotos($id, 'url_o', $privacy_filter, $value['flickr_show_limit']);
    621730                        $name = 'photoset';
    622731                    }
  • flickr-field-for-advanced-custom-fields/trunk/acf-flickr-v5.php

    r1231799 r1306180  
    4646            'flickr_api_key'        => '',
    4747            'flickr_user_id'        => '',
     48            'flickr_private_mode'   => 0,
     49            'flickr_secret_key'     => '',
     50            'flickr_private_token'  => '',
    4851            'flickr_content_type'   => 'sets',
    4952            'flickr_sets_amount'    => '9999',
     
    8184            'required'  => true,
    8285            'label'         => __('Flickr User ID','acf-flickr'),
    83             'instructions'  => __('Find your User ID at','acf-flickr') . ' <a href="http://idgettr.com/">http://idgettr.com/</a>',
     86            'instructions'  => __('Find your User ID at','acf-flickr') . ' <a href="http://idgettr.com/" target="_blank">http://idgettr.com/</a>. Alternatively, you can set the constant <strong>FLICKR_FIELD_USER_ID</strong>.',
    8487            'type'          => 'text',
    8588            'name'          => 'flickr_user_id',
     
    8992            'required'  => true,
    9093            'label'         => __('Flickr API Key','acf-flickr'),
    91             'instructions'  => __('Find or register your API key at','acf-flickr') . ' <a href="http://www.flickr.com/services/apps/">http://www.flickr.com/services/apps</a>',
     94            'instructions'  => __('Find or register your API key at','acf-flickr') . ' <a href="http://www.flickr.com/services/apps/" target="_blank">http://www.flickr.com/services/apps</a>',
    9295            'type'          => 'text',
    9396            'name'          => 'flickr_api_key',
    9497        ));
     98
     99        acf_render_field_setting( $field, array(
     100            'label'        => __('Flickr Private Mode','acf-flickr'),
     101            'instructions'  => __('When private mode is enabled you <strong>need to supply a token</strong> in order to get private photos.','acf-flickr'),
     102            'type'         => 'radio',
     103            'layout'       => 'horizontal',
     104            'name'         => 'flickr_private_mode',
     105            'class'              => 'flickr_private_mode_select',
     106            'choices'      => array(
     107                '0' => 'Off',
     108                '1' => 'On',
     109            ),
     110        ));
     111
     112        acf_render_field_setting( $field, array(
     113            'label'        => __('Flickr Secret Key','acf-flickr'),
     114            'instructions' => __('Find or register your Secret key at','acf-flickr') . ' <a href="http://www.flickr.com/services/apps/" target="_blank">http://www.flickr.com/services/apps</a>',
     115            'type'         => 'text',
     116            'name'         => 'flickr_secret_key',
     117            'class'        => 'flickr_secret_key',
     118        ));
     119
     120
     121        acf_render_field_setting( $field, array(
     122            'label'        => __('Flickr Private Token','acf-flickr'),
     123            'instructions' => __('If you haven\'t got a token yet you can try this modified phpFlickr script <a href="' . plugin_dir_url( __FILE__ ) . 'phpflickr/generate_flickr_token.php" target="_blank">to generate private flickr token</a>. Alternatively, you can set the constant <strong>FLICKR_FIELD_API_TOKEN</strong>.', 'acf-flickr'),
     124            'type'         => 'text',
     125            'name'         => 'flickr_private_token',
     126            'class'        => 'flickr_private_token',
     127        ));
     128
    95129
    96130        acf_render_field_setting( $field, array(
     
    112146            'name'         => 'flickr_sets_amount',
    113147            'choices'      => array(
    114                 '10'   =>'10',
    115                 '20'   =>'20',
    116                 '30'   =>'30',
    117                 '40'   =>'40',
    118                 '50'   =>'50',
    119                 '100'  =>'100',
    120                 '9999' =>'Unlimited',
     148                '10'   => '10',
     149                '20'   => '20',
     150                '30'   => '30',
     151                '40'   => '40',
     152                '50'   => '50',
     153                '100'  => '100',
     154                '9999' => 'Unlimited',
    121155            ),
    122156        ));
     
    141175            'label'        => __('Enable cache','acf-flickr'),
    142176            'instructions' => $instructions,
    143             'type'         => 'select',
     177            'type'         => 'radio',
     178            'layout'       => 'horizontal',
    144179            'name'         => 'flickr_cache_enabled',
     180            'class'              => 'flickr_cache_select',
    145181            'choices'      => array(
    146                 '1' => 'Yes',
    147                 '0' => 'No',
     182                '0' => 'Off',
     183                '1' => 'On',
    148184            ),
    149185        ));
     
    151187        acf_render_field_setting( $field, array(
    152188            'label'        => __('Cache duration','acf-flickr'),
    153             'instructions' => __('The time your cache may last in minutes (this setting will be ignored when your cache is disabled).','acf-flickr') . ' <a href="http://www.flickr.com/services/apps/">http://www.flickr.com/services/apps</a>',
     189            'instructions' => __('The time your cache may last in minutes.','acf-flickr'),
    154190            'type'         => 'text',
    155191            'name'         => 'flickr_cache_duration',
     192            'class'        => 'flickr_cache_duration',
    156193            'append'       => 'minutes',
    157194        ));
     
    216253
    217254        // Get all Flickr sets by the given user ID and api key (both required)
    218         require_once(dirname(__FILE__) . '/phpFlickr.php');
    219         $f = new phpFlickr($field['flickr_api_key']);
     255        require_once(dirname(__FILE__) . '/phpflickr/phpFlickr.php');
     256
     257        if($field['flickr_private_mode']) {
     258            // Private Mode
     259            $f = new phpFlickr($field['flickr_api_key'], $field['flickr_secret_key'], true);
     260          $f->setToken($field['flickr_private_token']);
     261        }
     262        else {
     263            // Public Mode
     264            $f = new phpFlickr($field['flickr_api_key']);
     265        }
    220266
    221267        // Caching
     
    229275        }
    230276
    231         $field['choices'] = array();
    232         $field['choices'][''] = '';
     277        // Check if user id exists in constants, if so - use that one
     278        if(defined('FLICKR_FIELD_USER_ID')) {
     279            $field['flickr_user_id'] = FLICKR_FIELD_USER_ID;
     280        }
     281
     282        $field['choices'] = array(array());
    233283        ?>
    234284
     
    300350            }
    301351            elseif($field['flickr_content_type'] == 'photostream') {
    302                 $flickr_data = $f->people_getPublicPhotos ($field['flickr_user_id'], NULL, 'url_o', $field['flickr_sets_amount'], '');
     352                if($field['flickr_private_mode']) {
     353                    $flickr_data = $f->people_getPhotos($field['flickr_user_id'], array('privacy_filter' => 5, 'per_page' => $field['flickr_sets_amount']) );
     354                }
     355                else {
     356                    $flickr_data = $f->people_getPublicPhotos ($field['flickr_user_id'], NULL, 'url_o', $field['flickr_sets_amount'], '');
     357                }
    303358                if (is_array($flickr_data['photos']) && isset($flickr_data['photos']['photo'][0])):  ?>
    304359                    <ul class="field_label photostream">
     
    485540    */
    486541
    487     /*
    488 
    489542    function field_group_admin_enqueue_scripts() {
    490 
    491     }
    492 
    493     */
     543        $dir = plugin_dir_url( __FILE__ );
     544
     545        wp_register_script('acf-input-flickr-field-options', $dir . 'js/options.js');
     546    wp_enqueue_script( 'acf-input-flickr-field-options');
     547
     548    wp_register_style('acf-input-flickr-field-options', $dir . 'css/options.css');
     549    wp_enqueue_style( 'acf-input-flickr-field-options');
     550    }
     551
    494552
    495553
     
    542600        $data['user_id']           = $field['flickr_user_id'];
    543601        $data['api_key']           = $field['flickr_api_key'];
     602        $data['private_mode']      = $field['flickr_private_mode'];
     603        $data['secret_key']        = $field['flickr_secret_key'];
     604        $data['private_token']     = $field['flickr_private_token'];
    544605
    545606        return $data;
    546 
    547607    }
    548608
     
    602662
    603663            // Initialize a new phpFlickr object based on your api key
    604             require_once(dirname(__FILE__) . '/phpFlickr.php');
    605             $f = new phpFlickr($value['api_key']);
     664            require_once(dirname(__FILE__) . '/phpflickr/phpFlickr.php');
     665
     666            if($value['private_mode']) {
     667                // Private Mode
     668                $f = new phpFlickr($value['api_key'], $value['secret_key'], true);
     669              $f->setToken($value['private_token']);
     670            }
     671            else {
     672                // Public Mode
     673                $f = new phpFlickr($value['api_key']);
     674            }
    606675
    607676            // enable phpFlickr caching if possible
     
    625694                foreach($value['items'] as $id) {
    626695                    if ($value['type'] == 'sets') {
    627                         $photos = $f->photosets_getPhotos($id, 'url_o', null, $value['flickr_show_limit']);
     696                        $privacy_filter = $value['private_mode'] == true ? 5 : 1;
     697
     698                        $photos = $f->photosets_getPhotos($id, 'url_o', $privacy_filter, $value['flickr_show_limit']);
     699
    628700                        $name = 'photoset';
    629701                    }
  • flickr-field-for-advanced-custom-fields/trunk/acf-flickr.php

    r1231833 r1306180  
    44Plugin URI: https://github.com/phuisman88/flickrfield
    55Description: Flickr field for Advanced Custom Fields. Display items from your photostream or entire sets/galleries along with your WordPress content.
    6 Version: 1.0.8
     6Version: 1.1.0
    77Author: Paul Huisman
    88Author URI: www.paulhuisman.com
     
    1818// $version = 5 and can be ignored until ACF6 exists
    1919function include_field_types_flickr( $version ) {
    20     include_once('acf-flickr-v5.php');
     20  include_once('acf-flickr-v5.php');
    2121}
    2222add_action('acf/include_field_types', 'include_field_types_flickr');
     
    2424// Include field type for ACF4
    2525function register_fields_flickr() {
    26     include_once('acf-flickr-v4.php');
     26  include_once('acf-flickr-v4.php');
    2727}
    2828add_action('acf/register_fields', 'register_fields_flickr');
  • flickr-field-for-advanced-custom-fields/trunk/readme.txt

    r1231811 r1306180  
    33Tags: flickr, acf, custom, fields, photostream, photosets
    44Requires at least: 3.0.1
    5 Tested up to: 4.3
    6 Stable tag: 1.0.8
     5Tested up to: 4.4
     6Stable tag: 1.1.0
    77License: GPLv2 or later
    88License URI: http://www.gnu.org/licenses/gpl-2.0.html
     
    5656== Changelog ==
    5757
     58= 1.1.0 =
     59* Added Private Mode - you can now enable a mode where you can display private photos from Flickr (those that are not publicly available)
     60
    5861= 1.0.8 =
    5962* Added possibility to set your own cache dir location with constant FLICKR_FIELD_CACHE_DIR
Note: See TracChangeset for help on using the changeset viewer.