Making WordPress.org

Ticket #2711: 2711.meta.3.diff

File 2711.meta.3.diff, 78.9 KB (added by davidmosterd, 7 years ago)

Added not applicable as a default state

  • wordcamp.org/public_html/wp-content/plugins/wc-post-types/views/sponsors/metabox-sponsor-info.php

    diff --git wordcamp.org/public_html/wp-content/plugins/wc-post-types/views/sponsors/metabox-sponsor-info.php wordcamp.org/public_html/wp-content/plugins/wc-post-types/views/sponsors/metabox-sponsor-info.php
    index 9bbd174a..e6934331 100644
     
    141141</ul>
    142142
    143143<ul class="wcpt-form">
     144        <li>
     145                <label for="_wcpt_sponsor_country">
     146                        <?php _e( 'Country:', 'wordcamporg' ) ?>
     147                </label>
     148
     149                <?php // todo add selected attribute to select and change first option value to empty string ?>
     150                <select id="_wcpt_sponsor_country" name="_wcpt_sponsor_country">
     151                        <option value="null" <?php selected( $country, 'null' ); ?>>
     152                                <?php _e( '-- Select a Country --', 'wordcamporg' ); ?>
     153                        </option>
     154
     155                        <?php foreach ( $available_countries as $available_country ) : ?>
     156                                <option value="<?php echo esc_attr( $available_country ); ?>" <?php selected( $available_country, $country ); ?>>
     157                                        <?php echo esc_html( $available_country ); ?>
     158                                </option>
     159                        <?php endforeach; ?>
     160                </select>
     161
     162                <?php $this->render_form_field_required_indicator(); ?>
     163        </li>
     164
    144165        <li class="wcpt-form-header">
    145166                <?php _e( 'Address', 'wordcamporg' ); ?>
    146167        </li>
     
    204225                        id="_wcpt_sponsor_state"
    205226                        name="_wcpt_sponsor_state"
    206227                        value="<?php echo esc_attr( $state ); ?>"
    207                     required
    208228                />
    209229
    210                 <?php $this->render_form_field_required_indicator(); ?>
     230                <span class="description">
     231                        <?php esc_html_e( 'Only necessary if you want this to be shown on your invoice', 'wordcamporg' ); ?>
     232                </span>
    211233        </li>
    212234
    213235        <li>
     
    227249
    228250                <?php $this->render_form_field_required_indicator(); ?>
    229251        </li>
    230 
    231         <li>
    232                 <label for="_wcpt_sponsor_country">
    233                         <?php _e( 'Country:', 'wordcamporg' ) ?>
    234                 </label>
    235 
    236                 <?php // todo add selected attribute to select and change first option value to empty string ?>
    237                 <select id="_wcpt_sponsor_country" name="_wcpt_sponsor_country">
    238                         <option value="null" <?php selected( $country, 'null' ); ?>>
    239                                 <?php _e( '-- Select a Country --', 'wordcamporg' ); ?>
    240                         </option>
    241 
    242                         <?php foreach ( $available_countries as $available_country ) : ?>
    243                                 <option value="<?php echo esc_attr( $available_country ); ?>" <?php selected( $available_country, $country ); ?>>
    244                                         <?php echo esc_html( $available_country ); ?>
    245                                 </option>
    246                         <?php endforeach; ?>
    247                 </select>
    248 
    249                 <?php $this->render_form_field_required_indicator(); ?>
    250         </li>
    251252</ul>
    252253
    253254<span class="wcpt-form-required">
  • wordcamp.org/public_html/wp-content/plugins/wc-post-types/wc-post-types.php

    diff --git wordcamp.org/public_html/wp-content/plugins/wc-post-types/wc-post-types.php wordcamp.org/public_html/wp-content/plugins/wc-post-types/wc-post-types.php
    index 43f3413e..2f26492c 100644
    class WordCamp_Post_Types_Plugin { 
    2929
    3030                add_action( 'save_post', array( $this, 'save_post_speaker' ), 10, 2 );
    3131                add_action( 'save_post', array( $this, 'save_post_session' ), 10, 2 );
    32                 add_action( 'save_post', array( $this, 'save_post_organizer' ), 10, 2);
    33                 add_action( 'save_post', array( $this, 'save_post_sponsor' ), 10, 2);
     32                add_action( 'save_post', array( $this, 'save_post_organizer' ), 10, 2 );
     33                add_action( 'save_post', array( $this, 'save_post_sponsor' ), 10, 2 );
    3434
    3535                add_filter( 'manage_wcb_speaker_posts_columns', array( $this, 'manage_post_types_columns' ) );
    3636                add_filter( 'manage_wcb_session_posts_columns', array( $this, 'manage_post_types_columns' ) );
    class WordCamp_Post_Types_Plugin { 
    110110         * Renders the Order Sponsor Levels admin page.
    111111         */
    112112        function render_order_sponsor_levels() {
    113                 if ( ! isset( $_REQUEST['updated'] ) )
     113                if ( ! isset( $_REQUEST['updated'] ) ) {
    114114                        $_REQUEST['updated'] = false;
     115                }
    115116
    116117                $levels = $this->get_sponsor_levels();
    117118                ?>
    class WordCamp_Post_Types_Plugin { 
    129130                                        <?php _e( 'Change the order of sponsor levels are displayed in the sponsors page template.', 'wordcamporg' ); ?>
    130131                                </div>
    131132                                <ul class="sponsor-order">
    132                                 <?php foreach( $levels as $term ): ?>
    133                                         <li class="level">
    134                                                 <input type="hidden" class="level-id" name="wcb_sponsor_level_order[]" value="<?php echo esc_attr( $term->term_id ); ?>" />
    135                                                 <?php echo esc_html( $term->name ); ?>
    136                                         </li>
    137                                 <?php endforeach; ?>
     133                                        <?php foreach ( $levels as $term ): ?>
     134                                                <li class="level">
     135                                                        <input type="hidden" class="level-id" name="wcb_sponsor_level_order[]" value="<?php echo esc_attr( $term->term_id ); ?>"/>
     136                                                        <?php echo esc_html( $term->name ); ?>
     137                                                </li>
     138                                        <?php endforeach; ?>
    138139                                </ul>
    139140                                <p class="submit">
    140                                         <input type="submit" class="button-primary" value="<?php _e( 'Save Options', 'wordcamporg' ); ?>" />
     141                                        <input type="submit" class="button-primary" value="<?php _e( 'Save Options', 'wordcamporg' ); ?>"/>
    141142                                </p>
    142143                        </form>
    143144                </div>
    class WordCamp_Post_Types_Plugin { 
    164165         * Returns the sponsor level terms in set order.
    165166         */
    166167        function get_sponsor_levels() {
    167                 $option         = get_option( 'wcb_sponsor_level_order' );
    168                 $term_objects   = get_terms( 'wcb_sponsor_level', array( 'get' => 'all' ) );
    169                 $terms          = array();
    170                 $ordered_terms  = array();
     168                $option = get_option( 'wcb_sponsor_level_order' );
     169                $term_objects = get_terms( 'wcb_sponsor_level', array( 'get' => 'all' ) );
     170                $terms = array();
     171                $ordered_terms = array();
    171172
    172173                foreach ( $term_objects as $term ) {
    173174                        $terms[ $term->term_id ] = $term;
    174175                }
    175176
    176                 if ( empty( $option ) )
     177                if ( empty( $option ) ) {
    177178                        $option = array();
     179                }
    178180
    179181                foreach ( $option as $term_id ) {
    180182                        if ( isset( $terms[ $term_id ] ) ) {
    class WordCamp_Post_Types_Plugin { 
    192194         * @param WP_Query $query
    193195         */
    194196        function admin_pre_get_posts( $query ) {
    195                 if ( ! is_admin() || ! $query->is_main_query() )
     197                if ( ! is_admin() || ! $query->is_main_query() ) {
    196198                        return;
     199                }
    197200
    198201                $current_screen = get_current_screen();
    199202
    class WordCamp_Post_Types_Plugin { 
    228231                        <script type="text/javascript">
    229232                                jQuery( document ).ready( function( $ ) {
    230233                                        $( '#wcpt-session-date' ).datepicker( {
    231                                                 dateFormat: 'yy-mm-dd',
    232                                                 changeMonth: true,
    233                                                 changeYear: true
     234                                                dateFormat : 'yy-mm-dd',
     235                                                changeMonth : true,
     236                                                changeYear : true
    234237                                        } );
    235238                                } );
    236239                        </script>
    class WordCamp_Post_Types_Plugin { 
    289292                }
    290293
    291294                $attr['show_avatars'] = $this->str_to_bool( $attr['show_avatars'] );
    292                 $attr['orderby']      = in_array( $attr['orderby'],      array( 'date', 'title', 'rand' ) ) ? $attr['orderby']      : 'date';
    293                 $attr['order']        = in_array( $attr['order'],        array( 'asc', 'desc'           ) ) ? $attr['order']        : 'desc';
    294                 $attr['speaker_link'] = in_array( $attr['speaker_link'], array( 'permalink'             ) ) ? $attr['speaker_link'] : '';
    295                 $attr['track']        = array_filter( explode( ',', $attr['track'] ) );
    296                 $attr['groups']       = array_filter( explode( ',', $attr['groups'] ) );
     295                $attr['orderby'] = in_array( $attr['orderby'], array( 'date', 'title', 'rand' ) ) ? $attr['orderby'] : 'date';
     296                $attr['order'] = in_array( $attr['order'], array( 'asc', 'desc' ) ) ? $attr['order'] : 'desc';
     297                $attr['speaker_link'] = in_array( $attr['speaker_link'], array( 'permalink' ) ) ? $attr['speaker_link'] : '';
     298                $attr['track'] = array_filter( explode( ',', $attr['track'] ) );
     299                $attr['groups'] = array_filter( explode( ',', $attr['groups'] ) );
    297300
    298301                // Fetch all the relevant sessions
    299302                $session_args = array(
    class WordCamp_Post_Types_Plugin { 
    361364
    362365                $speakers = new WP_Query( $speaker_args );
    363366
    364                 if ( ! $speakers->have_posts() )
     367                if ( ! $speakers->have_posts() ) {
    365368                        return '';
     369                }
    366370
    367371                // Render the HTML for the shortcode
    368372                ob_start();
    class WordCamp_Post_Types_Plugin { 
    373377                        <?php while ( $speakers->have_posts() ) : $speakers->the_post(); ?>
    374378
    375379                                <?php
    376                                         $speaker_classes = array( 'wcorg-speaker', 'wcorg-speaker-' . sanitize_html_class( $post->post_name ) );
     380                                $speaker_classes = array( 'wcorg-speaker', 'wcorg-speaker-' . sanitize_html_class( $post->post_name ) );
    377381
    378                                         if ( isset( $speakers_tracks[ get_the_ID() ] ) ) {
    379                                                 foreach ( $speakers_tracks[ get_the_ID() ] as $track ) {
    380                                                         $speaker_classes[] = sanitize_html_class( 'wcorg-track-' . $track );
    381                                                 }
     382                                if ( isset( $speakers_tracks[ get_the_ID() ] ) ) {
     383                                        foreach ( $speakers_tracks[ get_the_ID() ] as $track ) {
     384                                                $speaker_classes[] = sanitize_html_class( 'wcorg-track-' . $track );
    382385                                        }
     386                                }
    383387                                ?>
    384388
    385389                                <!-- Organizers note: The id attribute is deprecated and only remains for backwards compatibility, please use the corresponding class to target individual speakers -->
    class WordCamp_Post_Types_Plugin { 
    406410                <?php
    407411
    408412                wp_reset_postdata();
     413
    409414                return ob_get_clean();
    410415        }
    411416
    class WordCamp_Post_Types_Plugin { 
    426431                $attr['orderby'] = ( in_array( $attr['orderby'], array( 'date', 'title', 'rand' ) ) ) ? $attr['orderby'] : 'date';
    427432
    428433                $query_args = array(
    429                         'post_type' => 'wcb_organizer',
     434                        'post_type'      => 'wcb_organizer',
    430435                        'posts_per_page' => intval( $attr['posts_per_page'] ),
    431                         'orderby' => $attr['orderby'],
     436                        'orderby'        => $attr['orderby'],
    432437                );
    433438
    434439                if ( ! empty( $attr['teams'] ) ) {
    class WordCamp_Post_Types_Plugin { 
    443448
    444449                $organizers = new WP_Query( $query_args );
    445450
    446                 if ( ! $organizers->have_posts() )
     451                if ( ! $organizers->have_posts() ) {
    447452                        return '';
     453                }
    448454
    449455                ob_start();
    450456                ?>
    class WordCamp_Post_Types_Plugin { 
    468474                wp_reset_postdata();
    469475                $content = ob_get_contents();
    470476                ob_end_clean();
     477
    471478                return $content;
    472479        }
    473480
    class WordCamp_Post_Types_Plugin { 
    491498                        $attr[ $key_for_case_sensitive_value ] = strtolower( $attr[ $key_for_case_sensitive_value ] );
    492499                }
    493500
    494                 if ( ! in_array( $attr['speaker_link'], array( 'anchor', 'wporg', 'permalink', 'none' ) ) )
     501                if ( ! in_array( $attr['speaker_link'], array( 'anchor', 'wporg', 'permalink', 'none' ) ) ) {
    495502                        $attr['speaker_link'] = 'anchor';
     503                }
    496504
    497                 if ( ! in_array( $attr['session_link'], array( 'permalink', 'anchor', 'none' ) ) )
     505                if ( ! in_array( $attr['session_link'], array( 'permalink', 'anchor', 'none' ) ) ) {
    498506                        $attr['session_link'] = 'permalink';
     507                }
    499508
    500509                $columns = array();
    501510                $tracks = array();
    class WordCamp_Post_Types_Plugin { 
    504513                        'post_type'      => 'wcb_session',
    505514                        'posts_per_page' => -1,
    506515                        'meta_query'     => array(
    507                                 'relation'   => 'AND',
     516                                'relation' => 'AND',
    508517                                array(
    509518                                        'key'     => '_wcpt_session_time',
    510519                                        'compare' => 'EXISTS',
    class WordCamp_Post_Types_Plugin { 
    520529                        $terms = array_map( 'trim', explode( ',', $attr['tracks'] ) );
    521530                        foreach ( $terms as $term_slug ) {
    522531                                $term = get_term_by( 'slug', $term_slug, 'wcb_track' );
    523                                 if ( $term )
     532                                if ( $term ) {
    524533                                        $tracks[ $term->term_id ] = $term;
     534                                }
    525535                        }
    526536
    527537                        // If tracks were provided, restrict the lookup in WP_Query.
    class WordCamp_Post_Types_Plugin { 
    536546
    537547                if ( $attr['date'] && strtotime( $attr['date'] ) ) {
    538548                        $query_args['meta_query'][] = array(
    539                                 'key'   => '_wcpt_session_time',
    540                                 'value' => array(
     549                                'key'     => '_wcpt_session_time',
     550                                'value'   => array(
    541551                                        strtotime( $attr['date'] ),
    542552                                        strtotime( $attr['date'] . ' +1 day' ),
    543553                                ),
    class WordCamp_Post_Types_Plugin { 
    548558
    549559                // Use tracks to form the columns.
    550560                if ( $tracks ) {
    551                         foreach ( $tracks as $track )
     561                        foreach ( $tracks as $track ) {
    552562                                $columns[ $track->term_id ] = $track->term_id;
     563                        }
    553564                } else {
    554                         $columns[ 0 ] = 0;
     565                        $columns[0] = 0;
    555566                }
    556567
    557568                unset( $tracks );
    class WordCamp_Post_Types_Plugin { 
    566577                        $time = absint( get_post_meta( $session->ID, '_wcpt_session_time', true ) );
    567578                        $tracks = get_the_terms( $session->ID, 'wcb_track' );
    568579
    569                         if ( ! isset( $sessions[ $time ] ) )
     580                        if ( ! isset( $sessions[ $time ] ) ) {
    570581                                $sessions[ $time ] = array();
     582                        }
    571583
    572584                        if ( empty( $tracks ) ) {
    573                                 $sessions[ $time ][ 0 ] = $session->ID;
     585                                $sessions[ $time ][0] = $session->ID;
    574586                        } else {
    575                                 foreach ( $tracks as $track )
     587                                foreach ( $tracks as $track ) {
    576588                                        $sessions[ $time ][ $track->term_id ] = $session->ID;
     589                                }
    577590                        }
    578591                }
    579592
    class WordCamp_Post_Types_Plugin { 
    584597                if ( 'all' == $attr['tracks'] ) {
    585598                        $used_terms = array();
    586599
    587                         foreach ( $sessions as $time => $entry )
    588                                 if ( is_array( $entry ) )
    589                                         foreach ( $entry as $term_id => $session_id )
     600                        foreach ( $sessions as $time => $entry ) {
     601                                if ( is_array( $entry ) ) {
     602                                        foreach ( $entry as $term_id => $session_id ) {
    590603                                                $used_terms[ $term_id ] = $term_id;
     604                                        }
     605                                }
     606                        }
    591607
    592608                        $columns = array_intersect( $columns, $used_terms );
    593609                        unset( $used_terms );
    class WordCamp_Post_Types_Plugin { 
    641657                                }
    642658
    643659                                // Gather relevant data about the session
    644                                 $colspan              = 1;
    645                                 $classes              = array();
    646                                 $session              = get_post( $entry[ $term_id ] );
    647                                 $session_title        = apply_filters( 'the_title', $session->post_title );
    648                                 $session_tracks       = get_the_terms( $session->ID, 'wcb_track' );
     660                                $colspan = 1;
     661                                $classes = array();
     662                                $session = get_post( $entry[ $term_id ] );
     663                                $session_title = apply_filters( 'the_title', $session->post_title );
     664                                $session_tracks = get_the_terms( $session->ID, 'wcb_track' );
    649665                                $session_track_titles = is_array( $session_tracks ) ? implode( ', ', wp_list_pluck( $session_tracks, 'name' ) ) : '';
    650                                 $session_type         = get_post_meta( $session->ID, '_wcpt_session_type', true );
     666                                $session_type = get_post_meta( $session->ID, '_wcpt_session_type', true );
    651667
    652                                 if ( ! in_array( $session_type, array( 'session', 'custom' ) ) )
     668                                if ( ! in_array( $session_type, array( 'session', 'custom' ) ) ) {
    653669                                        $session_type = 'session';
     670                                }
    654671
    655672                                // Fetch speakers associated with this session.
    656673                                $speakers = array();
    class WordCamp_Post_Types_Plugin { 
    678695                                $classes[] = 'wcb-session-' . $session->post_name;
    679696
    680697                                // Determine the session title
    681                                 if ( 'permalink' == $attr['session_link'] && 'session' == $session_type )
     698                                if ( 'permalink' == $attr['session_link'] && 'session' == $session_type ) {
    682699                                        $session_title_html = sprintf( '<a class="wcpt-session-title" href="%s">%s</a>', esc_url( get_permalink( $session->ID ) ), $session_title );
    683                                 elseif ( 'anchor' == $attr['session_link'] && 'session' == $session_type )
     700                                } elseif ( 'anchor' == $attr['session_link'] && 'session' == $session_type ) {
    684701                                        $session_title_html = sprintf( '<a class="wcpt-session-title" href="%s">%s</a>', esc_url( $this->get_wcpt_anchor_permalink( $session->ID ) ), $session_title );
    685                                 else
     702                                } else {
    686703                                        $session_title_html = sprintf( '<span class="wcpt-session-title">%s</span>', $session_title );
     704                                }
    687705
    688706                                $content = $session_title_html;
    689707
    class WordCamp_Post_Types_Plugin { 
    692710                                        $speaker_name = apply_filters( 'the_title', $speaker->post_title );
    693711
    694712                                        if ( 'anchor' == $attr['speaker_link'] ) // speakers/#wcorg-speaker-slug
     713                                        {
    695714                                                $speaker_permalink = $this->get_wcpt_anchor_permalink( $speaker->ID );
    696                                         elseif ( 'wporg' == $attr['speaker_link'] ) // profiles.wordpress.org/user
     715                                        } elseif ( 'wporg' == $attr['speaker_link'] ) // profiles.wordpress.org/user
     716                                        {
    697717                                                $speaker_permalink = $this->get_speaker_wporg_permalink( $speaker->ID );
    698                                         elseif ( 'permalink' == $attr['speaker_link'] ) // year.city.wordcamp.org/speakers/slug
     718                                        } elseif ( 'permalink' == $attr['speaker_link'] ) // year.city.wordcamp.org/speakers/slug
     719                                        {
    699720                                                $speaker_permalink = get_permalink( $speaker->ID );
     721                                        }
    700722
    701                                         if ( ! empty( $speaker_permalink ) )
     723                                        if ( ! empty( $speaker_permalink ) ) {
    702724                                                $speaker_name = sprintf( '<a href="%s">%s</a>', esc_url( $speaker_permalink ), esc_html( $speaker_name ) );
     725                                        }
    703726
    704727                                        $speakers_names[] = $speaker_name;
    705728                                }
    706729
    707730                                // Add speakers names to the output string.
    708                                 if ( count( $speakers_names ) )
     731                                if ( count( $speakers_names ) ) {
    709732                                        $content .= sprintf( ' <span class="wcpt-session-speakers">%s</span>', implode( ', ', $speakers_names ) );
     733                                }
    710734
    711735                                $columns_clone = $columns;
    712736
    713737                                // If the next element in the table is the same as the current one, use colspan
    714738                                if ( $key != key( array_slice( $columns, -1, 1, true ) ) ) {
    715739                                        while ( $pair = each( $columns_clone ) ) {
    716                                                 if ( $pair['key'] == $key )
     740                                                if ( $pair['key'] == $key ) {
    717741                                                        continue;
     742                                                }
    718743
    719744                                                if ( ! empty( $entry[ $pair['value'] ] ) && $entry[ $pair['value'] ] == $session->ID ) {
    720745                                                        $colspan++;
    class WordCamp_Post_Types_Plugin { 
    728753                                $columns_html .= sprintf( '<td colspan="%d" class="%s" data-track-title="%s">%s</td>', $colspan, esc_attr( implode( ' ', $classes ) ), $session_track_titles, $content );
    729754                        }
    730755
    731                         $global_session      = $colspan == count( $columns ) ? ' global-session' : '';
     756                        $global_session = $colspan == count( $columns ) ? ' global-session' : '';
    732757                        $global_session_slug = $global_session ? ' ' . sanitize_html_class( sanitize_title_with_dashes( $session->post_title ) ) : '';
    733758
    734759                        $html .= sprintf( '<tr class="%s">', sanitize_html_class( 'wcpt-time-' . date( $time_format, $time ) ) . $global_session . $global_session_slug );
    class WordCamp_Post_Types_Plugin { 
    739764
    740765                $html .= '</tbody>';
    741766                $html .= '</table>';
     767
    742768                return $html;
    743769        }
    744770
    class WordCamp_Post_Types_Plugin { 
    749775         */
    750776        function get_speaker_wporg_permalink( $speaker_id ) {
    751777                $post = get_post( $speaker_id );
    752                 if ( $post->post_type != 'wcb_speaker' || $post->post_status != 'publish' )
     778                if ( $post->post_type != 'wcb_speaker' || $post->post_status != 'publish' ) {
    753779                        return;
     780                }
    754781
    755782                $wporg_user_id = get_post_meta( $speaker_id, '_wcpt_user_id', true );
    756                 if ( ! $wporg_user_id )
     783                if ( ! $wporg_user_id ) {
    757784                        return;
     785                }
    758786
    759787                $user = get_user_by( 'id', $wporg_user_id );
    760                 if ( ! $user )
     788                if ( ! $user ) {
    761789                        return;
     790                }
    762791
    763792                $permalink = sprintf( 'http://profiles.wordpress.org/%s', strtolower( $user->user_nicename ) );
     793
    764794                return esc_url_raw( $permalink );
    765795        }
    766796
    class WordCamp_Post_Types_Plugin { 
    784814                        return '';
    785815                }
    786816
    787                 switch( $anchor_target->post_type ) {
     817                switch ( $anchor_target->post_type ) {
    788818                        case 'wcb_speaker':
    789819                                $permalink = has_shortcode( $post->post_content, 'speakers' ) ? get_permalink( $post->id ) : $this->get_wcpt_permalink( 'speakers' );
    790820                                $anchor_id = $anchor_target->post_name;
    class WordCamp_Post_Types_Plugin { 
    890920
    891921                // Convert bools to real booleans.
    892922                $bools = array( 'show_meta', 'show_avatars' );
    893                 foreach ( $bools as $key )
     923                foreach ( $bools as $key ) {
    894924                        $attr[ $key ] = $this->str_to_bool( $attr[ $key ] );
     925                }
    895926
    896927                // Clean up other attributes.
    897928                foreach ( array( 'track', 'speaker_link', 'orderby', 'order' ) as $key_for_case_sensitive_value ) {
    class WordCamp_Post_Types_Plugin { 
    900931
    901932                $attr['avatar_size'] = absint( $attr['avatar_size'] );
    902933
    903                 if ( ! in_array( $attr['speaker_link'], array( 'anchor', 'wporg', 'permalink', 'none' ) ) )
    904                         $attr['speaker_link'] = 'anchor';   // todo this is inconsistent with the values passed to shortcode_atts, and probably not needed if the default above is changed to 'anchor'
     934                if ( ! in_array( $attr['speaker_link'], array( 'anchor', 'wporg', 'permalink', 'none' ) ) ) {
     935                        $attr['speaker_link'] = 'anchor';
     936                }   // todo this is inconsistent with the values passed to shortcode_atts, and probably not needed if the default above is changed to 'anchor'
    905937
    906938                $attr['orderby'] = ( in_array( $attr['orderby'], array( 'date', 'title', 'rand' ) ) ) ? $attr['orderby'] : 'date';
    907939
    class WordCamp_Post_Types_Plugin { 
    918950
    919951                        // Only ones marked "session" or where the meta key does
    920952                        // not exist, for backwards compatibility.
    921                         'meta_query' => array(
     953                        'meta_query'     => array(
    922954                                'relation' => 'AND',
    923955
    924956                                array(
    class WordCamp_Post_Types_Plugin { 
    935967                                                'value'   => '',
    936968                                                'compare' => 'NOT EXISTS',
    937969                                        ),
    938                                 )
     970                                ),
    939971                        ),
    940972                );
    941973
    class WordCamp_Post_Types_Plugin { 
    962994                // Fetch sessions.
    963995                $sessions = new WP_Query( $args );
    964996
    965                 if ( ! $sessions->have_posts() )
     997                if ( ! $sessions->have_posts() ) {
    966998                        return;
     999                }
    9671000
    9681001                ob_start();
    9691002                ?>
    class WordCamp_Post_Types_Plugin { 
    9731006                        <?php while ( $sessions->have_posts() ) : $sessions->the_post(); ?>
    9741007
    9751008                                <?php
    976                                         // Things to be output, or not.
    977                                         $session_meta = '';
    978                                         $speakers_avatars = '';
    979                                         $links            = array();
    980 
    981                                         // Fetch speakers associated with this session.
    982                                         $speakers = array();
    983                                         $speakers_ids = array_map( 'absint', (array) get_post_meta( get_the_ID(), '_wcpt_speaker_id' ) );
    984                                         if ( ! empty( $speakers_ids ) ) {
    985                                                 $speakers = get_posts( array(
    986                                                         'post_type'      => 'wcb_speaker',
    987                                                         'posts_per_page' => -1,
    988                                                         'post__in'       => $speakers_ids,
    989                                                 ) );
    990                                         }
     1009                                // Things to be output, or not.
     1010                                $session_meta = '';
     1011                                $speakers_avatars = '';
     1012                                $links = array();
    9911013
    992                                         // Should we add avatars?
    993                                         if ( $attr['show_avatars'] ) {
    994                                                 foreach ( $speakers as $speaker ) {
    995                                                         $speakers_avatars .= get_avatar( get_post_meta( $speaker->ID, '_wcb_speaker_email', true ), absint( $attr['avatar_size'] ) );
    996                                                 }
    997                                         }
     1014                                // Fetch speakers associated with this session.
     1015                                $speakers = array();
     1016                                $speakers_ids = array_map( 'absint', (array) get_post_meta( get_the_ID(), '_wcpt_speaker_id' ) );
     1017                                if ( ! empty( $speakers_ids ) ) {
     1018                                        $speakers = get_posts( array(
     1019                                                'post_type'      => 'wcb_speaker',
     1020                                                'posts_per_page' => -1,
     1021                                                'post__in'       => $speakers_ids,
     1022                                        ) );
     1023                                }
    9981024
    999                                         // Should we output meta?
    1000                                         if ( $attr['show_meta'] ) {
    1001                                                 $speaker_permalink = '';
    1002                                                 $speakers_names = array();
    1003                                                 $tracks_names = array();
     1025                                // Should we add avatars?
     1026                                if ( $attr['show_avatars'] ) {
     1027                                        foreach ( $speakers as $speaker ) {
     1028                                                $speakers_avatars .= get_avatar( get_post_meta( $speaker->ID, '_wcb_speaker_email', true ), absint( $attr['avatar_size'] ) );
     1029                                        }
     1030                                }
    10041031
    1005                                                 foreach ( $speakers as $speaker ) {
    1006                                                         $speaker_name = apply_filters( 'the_title', $speaker->post_title );
     1032                                // Should we output meta?
     1033                                if ( $attr['show_meta'] ) {
     1034                                        $speaker_permalink = '';
     1035                                        $speakers_names = array();
     1036                                        $tracks_names = array();
     1037
     1038                                        foreach ( $speakers as $speaker ) {
     1039                                                $speaker_name = apply_filters( 'the_title', $speaker->post_title );
     1040
     1041                                                if ( 'anchor' == $attr['speaker_link'] ) // speakers/#wcorg-speaker-slug
     1042                                                {
     1043                                                        $speaker_permalink = $this->get_wcpt_anchor_permalink( $speaker->ID );
     1044                                                } elseif ( 'wporg' == $attr['speaker_link'] ) // profiles.wordpress.org/user
     1045                                                {
     1046                                                        $speaker_permalink = $this->get_speaker_wporg_permalink( $speaker->ID );
     1047                                                } elseif ( 'permalink' == $attr['speaker_link'] ) // year.city.wordcamp.org/speakers/slug
     1048                                                {
     1049                                                        $speaker_permalink = get_permalink( $speaker->ID );
     1050                                                }
    10071051
    1008                                                         if ( 'anchor' == $attr['speaker_link'] ) // speakers/#wcorg-speaker-slug
    1009                                                                 $speaker_permalink = $this->get_wcpt_anchor_permalink( $speaker->ID );
    1010                                                         elseif ( 'wporg' == $attr['speaker_link'] ) // profiles.wordpress.org/user
    1011                                                                 $speaker_permalink = $this->get_speaker_wporg_permalink( $speaker->ID );
    1012                                                         elseif ( 'permalink' == $attr['speaker_link'] ) // year.city.wordcamp.org/speakers/slug
    1013                                                                 $speaker_permalink = get_permalink( $speaker->ID );
     1052                                                if ( ! empty( $speaker_permalink ) ) {
     1053                                                        $speaker_name = sprintf( '<a href="%s">%s</a>', esc_url( $speaker_permalink ), esc_html( $speaker_name ) );
     1054                                                }
    10141055
    1015                                                         if ( ! empty( $speaker_permalink ) )
    1016                                                                 $speaker_name = sprintf( '<a href="%s">%s</a>', esc_url( $speaker_permalink ), esc_html( $speaker_name ) );
     1056                                                $speakers_names[] = $speaker_name;
     1057                                        }
    10171058
    1018                                                         $speakers_names[] = $speaker_name;
     1059                                        $tracks = get_the_terms( get_the_ID(), 'wcb_track' );
     1060                                        if ( is_array( $tracks ) ) {
     1061                                                foreach ( $tracks as $track ) {
     1062                                                        $tracks_names[] = apply_filters( 'the_title', $track->name );
    10191063                                                }
    1020 
    1021                                                 $tracks = get_the_terms( get_the_ID(), 'wcb_track' );
    1022                                                 if ( is_array( $tracks ) )
    1023                                                         foreach ( $tracks as $track )
    1024                                                                 $tracks_names[] = apply_filters( 'the_title', $track->name );
    1025 
    1026                                                 // Add speakers and tracks to session meta.
    1027                                                 if ( ! empty( $speakers_names ) && ! empty( $tracks_names ) )
    1028                                                         $session_meta .= sprintf( __( 'Presented by %1$s in %2$s.', 'wordcamporg' ), implode( ', ', $speakers_names ), implode( ', ', $tracks_names ) );
    1029                                                 elseif ( ! empty( $speakers_names ) )
    1030                                                         $session_meta .= sprintf( __( 'Presented by %s.', 'wordcamporg' ), implode( ', ', $speakers_names ) );
    1031                                                 elseif ( ! empty( $tracks_names ) )
    1032                                                         $session_meta .= sprintf( __( 'Presented in %s.', 'wordcamporg' ), implode( ', ', $tracks_names ) );
    1033 
    1034                                                 if ( ! empty( $session_meta ) )
    1035                                                         $session_meta = sprintf( '<p class="wcpt-session-meta">%s</p>', $session_meta );
    10361064                                        }
    10371065
    1038                                         // Gather data for list of links
    1039                                         if ( $url = get_post_meta( $post->ID, '_wcpt_session_slides', true ) ) {
    1040                                                 $links['slides'] = array(
    1041                                                         'url'   => $url,
    1042                                                         'label' => __( 'Slides', 'wordcamporg' ),
    1043                                                 );
     1066                                        // Add speakers and tracks to session meta.
     1067                                        if ( ! empty( $speakers_names ) && ! empty( $tracks_names ) ) {
     1068                                                $session_meta .= sprintf( __( 'Presented by %1$s in %2$s.', 'wordcamporg' ), implode( ', ', $speakers_names ), implode( ', ', $tracks_names ) );
     1069                                        } elseif ( ! empty( $speakers_names ) ) {
     1070                                                $session_meta .= sprintf( __( 'Presented by %s.', 'wordcamporg' ), implode( ', ', $speakers_names ) );
     1071                                        } elseif ( ! empty( $tracks_names ) ) {
     1072                                                $session_meta .= sprintf( __( 'Presented in %s.', 'wordcamporg' ), implode( ', ', $tracks_names ) );
    10441073                                        }
    10451074
    1046                                         if ( $url = get_post_meta( $post->ID, '_wcpt_session_video', true ) ) {
    1047                                                 $links['video'] = array(
    1048                                                         'url'   => $url,
    1049                                                         'label' => __( 'Video', 'wordcamporg' ),
    1050                                                 );
     1075                                        if ( ! empty( $session_meta ) ) {
     1076                                                $session_meta = sprintf( '<p class="wcpt-session-meta">%s</p>', $session_meta );
    10511077                                        }
     1078                                }
     1079
     1080                                // Gather data for list of links
     1081                                if ( $url = get_post_meta( $post->ID, '_wcpt_session_slides', true ) ) {
     1082                                        $links['slides'] = array(
     1083                                                'url'   => $url,
     1084                                                'label' => __( 'Slides', 'wordcamporg' ),
     1085                                        );
     1086                                }
     1087
     1088                                if ( $url = get_post_meta( $post->ID, '_wcpt_session_video', true ) ) {
     1089                                        $links['video'] = array(
     1090                                                'url'   => $url,
     1091                                                'label' => __( 'Video', 'wordcamporg' ),
     1092                                        );
     1093                                }
    10521094
    10531095                                ?>
    10541096
    1055                                 <div id="wcorg-session-<?php the_ID(); ?>" class="wcorg-session" >
     1097                                <div id="wcorg-session-<?php the_ID(); ?>" class="wcorg-session">
    10561098                                        <h2><?php the_title(); ?></h2>
    10571099                                        <div class="wcorg-session-description">
    10581100                                                <?php the_post_thumbnail(); ?>
    class WordCamp_Post_Types_Plugin { 
    10621104
    10631105                                                <?php if ( $links ) : ?>
    10641106                                                        <ul class="wcorg-session-links">
    1065                                                                 <?php foreach( $links as $link ) : ?>
     1107                                                                <?php foreach ( $links as $link ) : ?>
    10661108                                                                        <li>
    10671109                                                                                <a href="<?php echo esc_url( $link['url'] ); ?>">
    10681110                                                                                        <?php echo esc_html( $link['label'] ); ?>
    class WordCamp_Post_Types_Plugin { 
    10831125                wp_reset_postdata();
    10841126                $content = ob_get_contents();
    10851127                ob_end_clean();
     1128
    10861129                return $content;
    10871130        }
    10881131
    class WordCamp_Post_Types_Plugin { 
    10931136                global $post;
    10941137
    10951138                $attr = shortcode_atts( array(
    1096                         'link' => 'none'
     1139                        'link' => 'none',
    10971140                ), $attr );
    10981141
    10991142                $attr['link'] = strtolower( $attr['link'] );
    class WordCamp_Post_Types_Plugin { 
    11031146                ?>
    11041147
    11051148                <div class="wcorg-sponsors">
    1106                 <?php foreach ( $terms as $term ) : ?>
    1107                         <?php
     1149                        <?php foreach ( $terms as $term ) : ?>
     1150                                <?php
    11081151                                $sponsors = new WP_Query( array(
    11091152                                        'post_type'      => 'wcb_sponsor',
    11101153                                        'order'          => 'ASC',
    class WordCamp_Post_Types_Plugin { 
    11131156                                        'term'           => $term->slug,
    11141157                                ) );
    11151158
    1116                                 if ( ! $sponsors->have_posts() )
     1159                                if ( ! $sponsors->have_posts() ) {
    11171160                                        continue;
    1118                         ?>
     1161                                }
     1162                                ?>
    11191163
    1120                         <div class="wcorg-sponsor-level-<?php echo sanitize_html_class( $term->slug ); ?>">
    1121                                 <h2><?php echo esc_html( $term->name ); ?></h2>
     1164                                <div class="wcorg-sponsor-level-<?php echo sanitize_html_class( $term->slug ); ?>">
     1165                                        <h2><?php echo esc_html( $term->name ); ?></h2>
    11221166
    1123                                 <?php while ( $sponsors->have_posts() ) : $sponsors->the_post(); ?>
    1124                                 <?php $website = get_post_meta( get_the_ID(), '_wcpt_sponsor_website', true ); ?>
     1167                                        <?php while ( $sponsors->have_posts() ) : $sponsors->the_post(); ?>
     1168                                                <?php $website = get_post_meta( get_the_ID(), '_wcpt_sponsor_website', true ); ?>
    11251169
    1126                                 <div id="wcorg-sponsor-<?php the_ID(); ?>" class="wcorg-sponsor">
    1127                                         <?php if ( 'website' == $attr['link'] && $website ) : ?>
    1128                                                 <h3><a href="<?php echo esc_attr( esc_url( $website ) ); ?>"><?php the_title(); ?></a></h3>
    1129                                         <?php else : ?>
    1130                                                 <h3><?php the_title(); ?></h3>
    1131                                         <?php endif; ?>
     1170                                                <div id="wcorg-sponsor-<?php the_ID(); ?>" class="wcorg-sponsor">
     1171                                                        <?php if ( 'website' == $attr['link'] && $website ) : ?>
     1172                                                                <h3><a href="<?php echo esc_attr( esc_url( $website ) ); ?>"><?php the_title(); ?></a></h3>
     1173                                                        <?php else : ?>
     1174                                                                <h3><?php the_title(); ?></h3>
     1175                                                        <?php endif; ?>
    11321176
    1133                                         <div class="wcorg-sponsor-description">
    1134                                                 <?php if ( 'website' == $attr['link'] && $website ) : ?>
    1135                                                         <a href="<?php echo esc_attr( esc_url( $website ) ); ?>">
    1136                                                                 <?php the_post_thumbnail( 'wcb-sponsor-logo-horizontal-2x' ); ?>
    1137                                                         </a>
    1138                                                 <?php else : ?>
    1139                                                         <?php the_post_thumbnail( 'wcb-sponsor-logo-horizontal-2x' ); ?>
    1140                                                 <?php endif; ?>
     1177                                                        <div class="wcorg-sponsor-description">
     1178                                                                <?php if ( 'website' == $attr['link'] && $website ) : ?>
     1179                                                                        <a href="<?php echo esc_attr( esc_url( $website ) ); ?>">
     1180                                                                                <?php the_post_thumbnail( 'wcb-sponsor-logo-horizontal-2x' ); ?>
     1181                                                                        </a>
     1182                                                                <?php else : ?>
     1183                                                                        <?php the_post_thumbnail( 'wcb-sponsor-logo-horizontal-2x' ); ?>
     1184                                                                <?php endif; ?>
    11411185
    1142                                                 <?php the_content(); ?>
    1143                                         </div>
    1144                                 </div><!-- #sponsor -->
    1145                                 <?php endwhile; ?>
     1186                                                                <?php the_content(); ?>
     1187                                                        </div>
     1188                                                </div><!-- #sponsor -->
     1189                                        <?php endwhile; ?>
    11461190
    1147                         </div><!-- .wcorg-sponsor-level -->
     1191                                </div><!-- .wcorg-sponsor-level -->
    11481192
    1149                 <?php endforeach; ?>
     1193                        <?php endforeach; ?>
    11501194                </div><!-- .wcorg-sponsors -->
    11511195                <?php
    11521196
    11531197                wp_reset_postdata();
    11541198                $content = ob_get_contents();
    11551199                ob_end_clean();
     1200
    11561201                return $content;
    11571202        }
    11581203
    class WordCamp_Post_Types_Plugin { 
    11871232                global $post;
    11881233                $enabled_site_ids = apply_filters( 'wcpt_speaker_post_avatar_enabled_site_ids', array( 364 ) );    // 2014.sf
    11891234
    1190                 if ( ! $this->is_single_cpt_post( 'wcb_speaker') ) {
     1235                if ( ! $this->is_single_cpt_post( 'wcb_speaker' ) ) {
    11911236                        return $content;
    11921237                }
    11931238
    class WordCamp_Post_Types_Plugin { 
    11971242                }
    11981243
    11991244                $avatar = get_avatar( get_post_meta( $post->ID, '_wcb_speaker_email', true ) );
     1245
    12001246                return '<div class="speaker-avatar">' . $avatar . '</div>' . $content;
    12011247        }
    12021248
    class WordCamp_Post_Types_Plugin { 
    12151261                global $post;
    12161262                $enabled_site_ids = apply_filters( 'wcpt_session_post_speaker_info_enabled_site_ids', array( 364 ) );    // 2014.sf
    12171263
    1218                 if ( ! $this->is_single_cpt_post( 'wcb_session') ) {
     1264                if ( ! $this->is_single_cpt_post( 'wcb_session' ) ) {
    12191265                        return $content;
    12201266                }
    12211267
    class WordCamp_Post_Types_Plugin { 
    13001346                        return $content;
    13011347                }
    13021348
    1303                 $session_slides_html  = '<div class="session-video">';
     1349                $session_slides_html = '<div class="session-video">';
    13041350                $session_slides_html .= sprintf( __( '<a href="%s" target="_blank">View Session Slides</a>', 'wordcamporg' ), esc_url( $session_slides ) );
    13051351                $session_slides_html .= '</div>';
    13061352
    class WordCamp_Post_Types_Plugin { 
    13411387                        return $content;
    13421388                }
    13431389
    1344                 $session_video_html  = '<div class="session-video">';
     1390                $session_video_html = '<div class="session-video">';
    13451391                $session_video_html .= sprintf( __( '<a href="%s" target="_blank">View Session Video</a>', 'wordcamporg' ), esc_url( $session_video ) );
    13461392                $session_video_html .= '</div>';
    13471393
    class WordCamp_Post_Types_Plugin { 
    13631409                global $post;
    13641410                $enabled_site_ids = apply_filters( 'wcpt_speaker_post_session_info_enabled_site_ids', array( 364 ) );    // 2014.sf
    13651411
    1366                 if ( ! $this->is_single_cpt_post( 'wcb_speaker') ) {
     1412                if ( ! $this->is_single_cpt_post( 'wcb_speaker' ) ) {
    13671413                        return $content;
    13681414                }
    13691415
    class WordCamp_Post_Types_Plugin { 
    14121458         * Fired during add_meta_boxes, adds extra meta boxes to our custom post types.
    14131459         */
    14141460        function add_meta_boxes() {
    1415                 add_meta_box( 'speaker-info',   __( 'Speaker Info',   'wordcamporg'  ), array( $this, 'metabox_speaker_info'   ), 'wcb_speaker',  'side' );
    1416                 add_meta_box( 'organizer-info', __( 'Organizer Info', 'wordcamporg'  ), array( $this, 'metabox_organizer_info' ), 'wcb_organizer', 'side' );
    1417                 add_meta_box( 'speakers-list',  __( 'Speakers',       'wordcamporg'  ), array( $this, 'metabox_speakers_list'  ), 'wcb_session',  'side' );
    1418                 add_meta_box( 'session-info',   __( 'Session Info',   'wordcamporg'  ), array( $this, 'metabox_session_info'   ), 'wcb_session',  'normal' );
    1419                 add_meta_box( 'sponsor-info',   __( 'Sponsor Info',   'wordcamporg'  ), array( $this, 'metabox_sponsor_info'   ), 'wcb_sponsor',  'normal' );
    1420                 add_meta_box( 'invoice-sponsor', __( 'Invoice Sponsor', 'wordcamporg' ), array( $this, 'metabox_invoice_sponsor' ), 'wcb_sponsor', 'side'   );
     1461                add_meta_box( 'speaker-info', __( 'Speaker Info', 'wordcamporg' ), array( $this, 'metabox_speaker_info' ), 'wcb_speaker', 'side' );
     1462                add_meta_box( 'organizer-info', __( 'Organizer Info', 'wordcamporg' ), array( $this, 'metabox_organizer_info' ), 'wcb_organizer', 'side' );
     1463                add_meta_box( 'speakers-list', __( 'Speakers', 'wordcamporg' ), array( $this, 'metabox_speakers_list' ), 'wcb_session', 'side' );
     1464                add_meta_box( 'session-info', __( 'Session Info', 'wordcamporg' ), array( $this, 'metabox_session_info' ), 'wcb_session', 'normal' );
     1465                add_meta_box( 'sponsor-info', __( 'Sponsor Info', 'wordcamporg' ), array( $this, 'metabox_sponsor_info' ), 'wcb_sponsor', 'normal' );
     1466                add_meta_box( 'invoice-sponsor', __( 'Invoice Sponsor', 'wordcamporg' ), array( $this, 'metabox_invoice_sponsor' ), 'wcb_sponsor', 'side' );
    14211467        }
    14221468
    14231469        /**
    class WordCamp_Post_Types_Plugin { 
    14281474                $email = get_post_meta( $post->ID, '_wcb_speaker_email', true );
    14291475
    14301476                $wporg_username = '';
    1431                 $user_id        = get_post_meta( $post->ID, '_wcpt_user_id', true );
    1432                 $wporg_user     = get_user_by( 'id', $user_id );
     1477                $user_id = get_post_meta( $post->ID, '_wcpt_user_id', true );
     1478                $wporg_user = get_user_by( 'id', $user_id );
    14331479
    1434                 if ( $wporg_user )
     1480                if ( $wporg_user ) {
    14351481                        $wporg_username = $wporg_user->user_nicename;
     1482                }
    14361483                ?>
    14371484
    14381485                <?php wp_nonce_field( 'edit-speaker-info', 'wcpt-meta-speaker-info' ); ?>
    14391486
    14401487                <p>
    14411488                        <label for="wcpt-gravatar-email"><?php _e( 'Gravatar Email:', 'wordcamporg' ); ?></label>
    1442                         <input type="text" class="widefat" id="wcpt-gravatar-email" name="wcpt-gravatar-email" value="<?php echo esc_attr( $email ); ?>" />
     1489                        <input type="text" class="widefat" id="wcpt-gravatar-email" name="wcpt-gravatar-email" value="<?php echo esc_attr( $email ); ?>"/>
    14431490                </p>
    14441491
    14451492                <p>
    14461493                        <label for="wcpt-wporg-username"><?php _e( 'WordPress.org Username:', 'wordcamporg' ); ?></label>
    1447                         <input type="text" class="widefat" id="wcpt-wporg-username" name="wcpt-wporg-username" value="<?php echo esc_attr( $wporg_username ); ?>" />
     1494                        <input type="text" class="widefat" id="wcpt-wporg-username" name="wcpt-wporg-username" value="<?php echo esc_attr( $wporg_username ); ?>"/>
    14481495                </p>
    14491496
    14501497                <?php
    class WordCamp_Post_Types_Plugin { 
    14571504                global $post;
    14581505
    14591506                $wporg_username = '';
    1460                 $user_id        = get_post_meta( $post->ID, '_wcpt_user_id', true );
    1461                 $wporg_user     = get_user_by( 'id', $user_id );
     1507                $user_id = get_post_meta( $post->ID, '_wcpt_user_id', true );
     1508                $wporg_user = get_user_by( 'id', $user_id );
    14621509
    1463                 if ( $wporg_user )
     1510                if ( $wporg_user ) {
    14641511                        $wporg_username = $wporg_user->user_nicename;
     1512                }
    14651513                ?>
    14661514
    14671515                <?php wp_nonce_field( 'edit-organizer-info', 'wcpt-meta-organizer-info' ); ?>
    14681516
    14691517                <p>
    14701518                        <label for="wcpt-wporg-username"><?php _e( 'WordPress.org Username:', 'wordcamporg' ); ?></label>
    1471                         <input type="text" class="widefat" id="wcpt-wporg-username" name="wcpt-wporg-username" value="<?php echo esc_attr( $wporg_username ); ?>" />
     1519                        <input type="text" class="widefat" id="wcpt-wporg-username" name="wcpt-wporg-username" value="<?php echo esc_attr( $wporg_username ); ?>"/>
    14721520                </p>
    14731521
    14741522                <?php
    class WordCamp_Post_Types_Plugin { 
    14821530                $speakers = get_post_meta( $post->ID, '_wcb_session_speakers', true );
    14831531                wp_enqueue_script( 'jquery-ui-autocomplete' );
    14841532
    1485                 $speakers_names   = array();
     1533                $speakers_names = array();
    14861534                $speakers_objects = get_posts( array(
    14871535                        'post_type'      => 'wcb_speaker',
    14881536                        'post_status'    => 'publish',
    class WordCamp_Post_Types_Plugin { 
    14901538                ) );
    14911539
    14921540                // We'll use these in js.
    1493                 foreach ( $speakers_objects as $speaker_object )
     1541                foreach ( $speakers_objects as $speaker_object ) {
    14941542                        $speakers_names[] = $speaker_object->post_title;
     1543                }
    14951544                $speakers_names_first = array_pop( $speakers_names );
    14961545                ?>
    14971546
    class WordCamp_Post_Types_Plugin { 
    15011550                <p class="description"><?php _e( 'A speaker entry must exist first. Separate multiple speakers with commas.', 'wordcamporg' ); ?></p>
    15021551
    15031552                <script>
    1504                 jQuery(document).ready( function($) {
    1505                         var availableSpeakers = [ <?php
    1506                                 foreach ( $speakers_names as $name ) { printf( "'%s', ", esc_js( $name ) ); }
    1507                                 printf( "'%s'", esc_js( $speakers_names_first ) ); // avoid the trailing comma
    1508                         ?> ];
    1509                         function split( val ) {
    1510                                 return val.split( /,\s*/ );
    1511                         }
    1512                         function extractLast( term ) {
    1513                                 return split( term ).pop();
    1514                         }
    1515                         $( '#wcpt-speakers-list' )
    1516                                 .bind( 'keydown', function( event ) {
    1517                                         if ( event.keyCode == $.ui.keyCode.TAB &&
    1518                                                 $( this ).data( 'autocomplete' ).menu.active ) {
    1519                                                 event.preventDefault();
     1553                        jQuery( document ).ready( function( $ ) {
     1554                                var availableSpeakers = [ <?php
     1555                                        foreach ( $speakers_names as $name ) {
     1556                                                printf( "'%s', ", esc_js( $name ) );
    15201557                                        }
    1521                                 })
    1522                                 .autocomplete({
    1523                                         minLength: 0,
    1524                                         source: function( request, response ) {
    1525                                                 response( $.ui.autocomplete.filter(
    1526                                                         availableSpeakers, extractLast( request.term ) ) )
    1527                                         },
    1528                                         focus: function() {
    1529                                                 return false;
    1530                                         },
    1531                                         select: function( event, ui ) {
    1532                                                 var terms = split( this.value );
    1533                                                 terms.pop();
    1534                                                 terms.push( ui.item.value );
    1535                                                 terms.push( '' );
    1536                                                 this.value = terms.join( ', ' );
    1537                                                 $(this).focus();
    1538                                                 return false;
    1539                                         },
    1540                                         open: function() { $(this).addClass('open'); },
    1541                                         close: function() { $(this).removeClass('open'); }
    1542                                 });
    1543                 });
     1558                                        printf( "'%s'", esc_js( $speakers_names_first ) ); // avoid the trailing comma
     1559                                        ?> ];
     1560
     1561                                function split( val ) {
     1562                                        return val.split( /,\s*/ );
     1563                                }
     1564
     1565                                function extractLast( term ) {
     1566                                        return split( term ).pop();
     1567                                }
     1568
     1569                                $( '#wcpt-speakers-list' )
     1570                                        .bind( 'keydown', function( event ) {
     1571                                                if ( event.keyCode == $.ui.keyCode.TAB &&
     1572                                                        $( this ).data( 'autocomplete' ).menu.active ) {
     1573                                                        event.preventDefault();
     1574                                                }
     1575                                        } )
     1576                                        .autocomplete( {
     1577                                                minLength : 0,
     1578                                                source : function( request, response ) {
     1579                                                        response( $.ui.autocomplete.filter(
     1580                                                                availableSpeakers, extractLast( request.term ) ) )
     1581                                                },
     1582                                                focus : function() {
     1583                                                        return false;
     1584                                                },
     1585                                                select : function( event, ui ) {
     1586                                                        var terms = split( this.value );
     1587                                                        terms.pop();
     1588                                                        terms.push( ui.item.value );
     1589                                                        terms.push( '' );
     1590                                                        this.value = terms.join( ', ' );
     1591                                                        $( this ).focus();
     1592                                                        return false;
     1593                                                },
     1594                                                open : function() { $( this ).addClass( 'open' ); },
     1595                                                close : function() { $( this ).removeClass( 'open' ); }
     1596                                        } );
     1597                        } );
    15441598                </script>
    15451599
    15461600                <?php
    15471601        }
    15481602
    15491603        function metabox_session_info() {
    1550                 $post             = get_post();
    1551                 $session_time     = absint( get_post_meta( $post->ID, '_wcpt_session_time', true ) );
    1552                 $session_date     = ( $session_time ) ? date( 'Y-m-d', $session_time ) : date( 'Y-m-d' );
    1553                 $session_hours    = ( $session_time ) ? date( 'g', $session_time )    : date( 'g' );
    1554                 $session_minutes  = ( $session_time ) ? date( 'i', $session_time )    : '00';
    1555                 $session_meridiem = ( $session_time ) ? date( 'a', $session_time )     : 'am';
    1556                 $session_type     = get_post_meta( $post->ID, '_wcpt_session_type', true );
    1557                 $session_slides   = get_post_meta( $post->ID, '_wcpt_session_slides', true );
    1558                 $session_video    = get_post_meta( $post->ID, '_wcpt_session_video', true );
     1604                $post = get_post();
     1605                $session_time = absint( get_post_meta( $post->ID, '_wcpt_session_time', true ) );
     1606                $session_date = ( $session_time ) ? date( 'Y-m-d', $session_time ) : date( 'Y-m-d' );
     1607                $session_hours = ( $session_time ) ? date( 'g', $session_time ) : date( 'g' );
     1608                $session_minutes = ( $session_time ) ? date( 'i', $session_time ) : '00';
     1609                $session_meridiem = ( $session_time ) ? date( 'a', $session_time ) : 'am';
     1610                $session_type = get_post_meta( $post->ID, '_wcpt_session_type', true );
     1611                $session_slides = get_post_meta( $post->ID, '_wcpt_session_slides', true );
     1612                $session_video = get_post_meta( $post->ID, '_wcpt_session_video', true );
    15591613                ?>
    15601614
    15611615                <?php wp_nonce_field( 'edit-session-info', 'wcpt-meta-session-info' ); ?>
    15621616
    15631617                <p>
    15641618                        <label for="wcpt-session-date"><?php _e( 'Date:', 'wordcamporg' ); ?></label>
    1565                         <input type="text" id="wcpt-session-date" data-date="<?php echo esc_attr( $session_date ); ?>" name="wcpt-session-date" value="<?php echo esc_attr( $session_date ); ?>" /><br />
     1619                        <input type="text" id="wcpt-session-date" data-date="<?php echo esc_attr( $session_date ); ?>" name="wcpt-session-date" value="<?php echo esc_attr( $session_date ); ?>"/><br/>
    15661620                        <label><?php _e( 'Time:', 'wordcamporg' ); ?></label>
    15671621
    15681622                        <select name="wcpt-session-hour" aria-label="<?php _e( 'Session Start Hour', 'wordcamporg' ); ?>">
    class WordCamp_Post_Types_Plugin { 
    15971651
    15981652                <p>
    15991653                        <label for="wcpt-session-slides"><?php _e( 'Slides URL:', 'wordcamporg' ); ?></label>
    1600                         <input type="text" class="widefat" id="wcpt-session-slides" name="wcpt-session-slides" value="<?php echo esc_url( $session_slides ); ?>" />
     1654                        <input type="text" class="widefat" id="wcpt-session-slides" name="wcpt-session-slides" value="<?php echo esc_url( $session_slides ); ?>"/>
    16011655                </p>
    16021656
    16031657                <p>
    16041658                        <label for="wcpt-session-video"><?php _e( 'WordPress.TV URL:', 'wordcamporg' ); ?></label>
    1605                         <input type="text" class="widefat" id="wcpt-session-video" name="wcpt-session-video" value="<?php echo esc_url( $session_video ); ?>" />
     1659                        <input type="text" class="widefat" id="wcpt-session-video" name="wcpt-session-video" value="<?php echo esc_url( $session_video ); ?>"/>
    16061660                </p>
    16071661
    16081662                <?php
    class WordCamp_Post_Types_Plugin { 
    16141668         * @param WP_Post $sponsor
    16151669         */
    16161670        function metabox_sponsor_info( $sponsor ) {
    1617                 $company_name      = get_post_meta( $sponsor->ID, '_wcpt_sponsor_company_name',      true );
    1618                 $website           = get_post_meta( $sponsor->ID, '_wcpt_sponsor_website',           true );
    1619                 $first_name        = get_post_meta( $sponsor->ID, '_wcpt_sponsor_first_name',        true );
    1620                 $last_name         = get_post_meta( $sponsor->ID, '_wcpt_sponsor_last_name',         true );
    1621                 $email_address     = get_post_meta( $sponsor->ID, '_wcpt_sponsor_email_address',     true );
    1622                 $phone_number      = get_post_meta( $sponsor->ID, '_wcpt_sponsor_phone_number',      true );
    1623                 $vat_number        = get_post_meta( $sponsor->ID, '_wcpt_sponsor_vat_number',        true );
    1624                 $twitter_handle    = get_post_meta( $sponsor->ID, '_wcpt_sponsor_twitter_handle',    true );
    1625 
    1626                 $street_address1 = get_post_meta( $sponsor->ID, '_wcpt_sponsor_street_address1',   true );
    1627                 $street_address2 = get_post_meta( $sponsor->ID, '_wcpt_sponsor_street_address2',   true );
    1628                 $city            = get_post_meta( $sponsor->ID, '_wcpt_sponsor_city',              true );
    1629                 $state           = get_post_meta( $sponsor->ID, '_wcpt_sponsor_state',             true );
    1630                 $zip_code        = get_post_meta( $sponsor->ID, '_wcpt_sponsor_zip_code',          true );
    1631                 $country         = get_post_meta( $sponsor->ID, '_wcpt_sponsor_country',           true );
     1671                $company_name = get_post_meta( $sponsor->ID, '_wcpt_sponsor_company_name', true );
     1672                $website = get_post_meta( $sponsor->ID, '_wcpt_sponsor_website', true );
     1673                $first_name = get_post_meta( $sponsor->ID, '_wcpt_sponsor_first_name', true );
     1674                $last_name = get_post_meta( $sponsor->ID, '_wcpt_sponsor_last_name', true );
     1675                $email_address = get_post_meta( $sponsor->ID, '_wcpt_sponsor_email_address', true );
     1676                $phone_number = get_post_meta( $sponsor->ID, '_wcpt_sponsor_phone_number', true );
     1677                $vat_number = get_post_meta( $sponsor->ID, '_wcpt_sponsor_vat_number', true );
     1678                $twitter_handle = get_post_meta( $sponsor->ID, '_wcpt_sponsor_twitter_handle', true );
     1679
     1680                $street_address1 = get_post_meta( $sponsor->ID, '_wcpt_sponsor_street_address1', true );
     1681                $street_address2 = get_post_meta( $sponsor->ID, '_wcpt_sponsor_street_address2', true );
     1682                $city = get_post_meta( $sponsor->ID, '_wcpt_sponsor_city', true );
     1683                $state = get_post_meta( $sponsor->ID, '_wcpt_sponsor_state', true );
     1684                $zip_code = get_post_meta( $sponsor->ID, '_wcpt_sponsor_zip_code', true );
     1685                $country = get_post_meta( $sponsor->ID, '_wcpt_sponsor_country', true );
     1686
     1687                if ( $state === $this->get_sponsor_info_state_default_value() ) {
     1688                        $state = '';
     1689                }
    16321690
    16331691                $available_countries = array( 'Abkhazia', 'Afghanistan', 'Aland', 'Albania', 'Algeria', 'American Samoa', 'Andorra', 'Angola', 'Anguilla', 'Antigua and Barbuda', 'Argentina', 'Armenia', 'Aruba', 'Ascension', 'Ashmore and Cartier Islands', 'Australia', 'Australian Antarctic Territory', 'Austria', 'Azerbaijan', 'Bahamas, The', 'Bahrain', 'Baker Island', 'Bangladesh', 'Barbados', 'Belarus', 'Belgium', 'Belize', 'Benin', 'Bermuda', 'Bhutan', 'Bolivia', 'Bosnia and Herzegovina', 'Botswana', 'Bouvet Island', 'Brazil', 'British Antarctic Territory', 'British Indian Ocean Territory', 'British Sovereign Base Areas', 'British Virgin Islands', 'Brunei', 'Bulgaria', 'Burkina Faso', 'Burundi', 'Cambodia', 'Cameroon', 'Canada', 'Cape Verde', 'Cayman Islands', 'Central African Republic', 'Chad', 'Chile', "China, People's Republic of", 'China, Republic of (Taiwan)', 'Christmas Island', 'Clipperton Island', 'Cocos (Keeling) Islands', 'Colombia', 'Comoros', 'Congo, (Congo – Brazzaville)', 'Congo, (Congo – Kinshasa)', 'Cook Islands', 'Coral Sea Islands', 'Costa Rica', "Cote d'Ivoire (Ivory Coast)", 'Croatia', 'Cuba', 'Cyprus', 'Czech Republic', 'Denmark', 'Djibouti', 'Dominica', 'Dominican Republic', 'Ecuador', 'Egypt', 'El Salvador', 'Equatorial Guinea', 'Eritrea', 'Estonia', 'Ethiopia', 'Falkland Islands (Islas Malvinas)', 'Faroe Islands', 'Fiji', 'Finland', 'France', 'French Guiana', 'French Polynesia', 'French Southern and Antarctic Lands', 'Gabon', 'Gambia, The', 'Georgia', 'Germany', 'Ghana', 'Gibraltar', 'Greece', 'Greenland', 'Grenada', 'Guadeloupe', 'Guam', 'Guatemala', 'Guernsey', 'Guinea', 'Guinea-Bissau', 'Guyana', 'Haiti', 'Heard Island and McDonald Islands', 'Honduras', 'Hong Kong', 'Howland Island', 'Hungary', 'Iceland', 'India', 'Indonesia', 'Iran', 'Iraq', 'Ireland', 'Isle of Man', 'Israel', 'Italy', 'Jamaica', 'Japan', 'Jarvis Island', 'Jersey', 'Johnston Atoll', 'Jordan', 'Kazakhstan', 'Kenya', 'Kingman Reef', 'Kiribati', 'Korea, North', 'Korea, South', 'Kuwait', 'Kyrgyzstan', 'Laos', 'Latvia', 'Lebanon', 'Lesotho', 'Liberia', 'Libya', 'Liechtenstein', 'Lithuania', 'Luxembourg', 'Macau', 'Macedonia', 'Madagascar', 'Malawi', 'Malaysia', 'Maldives', 'Mali', 'Malta', 'Marshall Islands', 'Martinique', 'Mauritania', 'Mauritius', 'Mayotte', 'Mexico', 'Micronesia', 'Midway Islands', 'Moldova', 'Monaco', 'Mongolia', 'Montenegro', 'Montserrat', 'Morocco', 'Mozambique', 'Myanmar (Burma)', 'Nagorno-Karabakh', 'Namibia', 'Nauru', 'Navassa Island', 'Nepal', 'Netherlands', 'Netherlands Antilles', 'New Caledonia', 'New Zealand', 'Nicaragua', 'Niger', 'Nigeria', 'Niue', 'Norfolk Island', 'Northern Cyprus', 'Northern Mariana Islands', 'Norway', 'Oman', 'Pakistan', 'Palau', 'Palmyra Atoll', 'Panama', 'Papua New Guinea', 'Paraguay', 'Peru', 'Peter I Island', 'Philippines', 'Pitcairn Islands', 'Poland', 'Portugal', 'Pridnestrovie (Transnistria)', 'Puerto Rico', 'Qatar', 'Queen Maud Land', 'Reunion', 'Romania', 'Ross Dependency', 'Russia', 'Rwanda', 'Saint Barthelemy', 'Saint Helena', 'Saint Kitts and Nevis', 'Saint Lucia', 'Saint Martin', 'Saint Pierre and Miquelon', 'Saint Vincent and the Grenadines', 'Samoa', 'San Marino', 'Sao Tome and Principe', 'Saudi Arabia', 'Senegal', 'Serbia', 'Seychelles', 'Sierra Leone', 'Singapore', 'Slovakia', 'Slovenia', 'Solomon Islands', 'Somalia', 'Somaliland', 'South Africa', 'South Georgia & South Sandwich Islands', 'South Ossetia', 'Spain', 'Sri Lanka', 'Sudan', 'Suriname', 'Svalbard', 'Swaziland', 'Sweden', 'Switzerland', 'Syria', 'Tajikistan', 'Tanzania', 'Thailand', 'Timor-Leste (East Timor)', 'Togo', 'Tokelau', 'Tonga', 'Trinidad and Tobago', 'Tristan da Cunha', 'Tunisia', 'Turkey', 'Turkmenistan', 'Turks and Caicos Islands', 'Tuvalu', 'U.S. Virgin Islands', 'Uganda', 'Ukraine', 'United Arab Emirates', 'United Kingdom', 'United States', 'Uruguay', 'Uzbekistan', 'Vanuatu', 'Vatican City', 'Venezuela', 'Vietnam', 'Wake Island', 'Wallis and Futuna', 'Yemen', 'Zambia', 'Zimbabwe' );
    16341692                // todo use WordCamp_Budgets::get_valid_countries_iso3166() instead. need to switch multi-event sponsors at same time.
    class WordCamp_Post_Types_Plugin { 
    16391697        }
    16401698
    16411699        /**
     1700         * Returns the default value for the state input when it's empty
     1701         *
     1702         * @return string
     1703         */
     1704        protected function get_sponsor_info_state_default_value() {
     1705                return 'Not Applicable';
     1706        }
     1707
     1708        /**
    16421709         * Render the Invoice Sponsor metabox view
    16431710         *
    16441711         * @param WP_Post $sponsor
    class WordCamp_Post_Types_Plugin { 
    16491716                $existing_invoices = get_posts( array(
    16501717                        'post_type'      => \WordCamp\Budgets\Sponsor_Invoices\POST_TYPE,
    16511718                        'post_status'    => 'any',
    1652                         'posts_per_page' => - 1,
     1719                        'posts_per_page' => -1,
    16531720
    16541721                        'meta_query' => array(
    16551722                                array(
    class WordCamp_Post_Types_Plugin { 
    16811748         * Fired when a post is saved, makes sure additional metadata is also updated.
    16821749         */
    16831750        function save_post_speaker( $post_id, $post ) {
    1684                 if ( wp_is_post_revision( $post_id ) || $post->post_type != 'wcb_speaker' || ! current_user_can( 'edit_post', $post_id ) )
     1751                if ( wp_is_post_revision( $post_id ) || $post->post_type != 'wcb_speaker' || ! current_user_can( 'edit_post', $post_id ) ) {
    16851752                        return;
     1753                }
    16861754
    16871755                if ( isset( $_POST['wcpt-meta-speaker-info'] ) && wp_verify_nonce( $_POST['wcpt-meta-speaker-info'], 'edit-speaker-info' ) ) {
    1688                         $email          = sanitize_text_field( $_POST['wcpt-gravatar-email'] );
     1756                        $email = sanitize_text_field( $_POST['wcpt-gravatar-email'] );
    16891757                        $wporg_username = sanitize_text_field( $_POST['wcpt-wporg-username'] );
    1690                         $wporg_user     = wcorg_get_user_by_canonical_names( $wporg_username );
     1758                        $wporg_user = wcorg_get_user_by_canonical_names( $wporg_username );
    16911759
    1692                         if ( empty( $email ) )
     1760                        if ( empty( $email ) ) {
    16931761                                delete_post_meta( $post_id, '_wcb_speaker_email' );
    1694                         elseif ( $email && is_email( $email ) )
     1762                        } elseif ( $email && is_email( $email ) ) {
    16951763                                update_post_meta( $post_id, '_wcb_speaker_email', $email );
     1764                        }
    16961765
    1697                         if ( ! $wporg_user )
     1766                        if ( ! $wporg_user ) {
    16981767                                delete_post_meta( $post_id, '_wcpt_user_id' );
    1699                         else
     1768                        } else {
    17001769                                update_post_meta( $post_id, '_wcpt_user_id', $wporg_user->ID );
     1770                        }
    17011771                }
    17021772        }
    17031773
    class WordCamp_Post_Types_Plugin { 
    17051775         * When an Organizer post is saved, update some meta data.
    17061776         */
    17071777        function save_post_organizer( $post_id, $post ) {
    1708                 if ( wp_is_post_revision( $post_id ) || $post->post_type != 'wcb_organizer' || ! current_user_can( 'edit_post', $post_id ) )
     1778                if ( wp_is_post_revision( $post_id ) || $post->post_type != 'wcb_organizer' || ! current_user_can( 'edit_post', $post_id ) ) {
    17091779                        return;
     1780                }
    17101781
    17111782                if ( isset( $_POST['wcpt-meta-organizer-info'] ) && wp_verify_nonce( $_POST['wcpt-meta-organizer-info'], 'edit-organizer-info' ) ) {
    17121783                        $wporg_username = sanitize_text_field( $_POST['wcpt-wporg-username'] );
    17131784                        $wporg_user = wcorg_get_user_by_canonical_names( $wporg_username );
    17141785
    1715                         if ( ! $wporg_user )
     1786                        if ( ! $wporg_user ) {
    17161787                                delete_post_meta( $post_id, '_wcpt_user_id' );
    1717                         else
     1788                        } else {
    17181789                                update_post_meta( $post_id, '_wcpt_user_id', $wporg_user->ID );
     1790                        }
    17191791                }
    17201792        }
    17211793
    class WordCamp_Post_Types_Plugin { 
    17231795         * Fired when a post is saved, updates additional sessions metadada.
    17241796         */
    17251797        function save_post_session( $post_id, $post ) {
    1726                 if ( wp_is_post_revision( $post_id ) || $post->post_type != 'wcb_session' )
     1798                if ( wp_is_post_revision( $post_id ) || $post->post_type != 'wcb_session' ) {
    17271799                        return;
     1800                }
    17281801
    17291802                if ( isset( $_POST['wcpt-meta-speakers-list-nonce'] ) && wp_verify_nonce( $_POST['wcpt-meta-speakers-list-nonce'], 'edit-speakers-list' ) && current_user_can( 'edit_post', $post_id ) ) {
    17301803
    class WordCamp_Post_Types_Plugin { 
    17461819
    17471820                        // Update session type
    17481821                        $session_type = sanitize_text_field( $_POST['wcpt-session-type'] );
    1749                         if ( ! in_array( $session_type, array( 'session', 'custom' ) ) )
     1822                        if ( ! in_array( $session_type, array( 'session', 'custom' ) ) ) {
    17501823                                $session_type = 'session';
     1824                        }
    17511825
    17521826                        update_post_meta( $post_id, '_wcpt_session_type', $session_type );
    17531827
    class WordCamp_Post_Types_Plugin { 
    17651839                $speakers_list = get_post_meta( $post_id, '_wcb_session_speakers', true );
    17661840                $speakers_list = explode( ',', $speakers_list );
    17671841
    1768                 if ( ! is_array( $speakers_list ) )
     1842                if ( ! is_array( $speakers_list ) ) {
    17691843                        $speakers_list = array();
     1844                }
    17701845
    17711846                $speaker_ids = array();
    1772                 $speakers    = array_unique( array_map( 'trim', $speakers_list ) );
     1847                $speakers = array_unique( array_map( 'trim', $speakers_list ) );
    17731848
    17741849                foreach ( $speakers as $speaker_name ) {
    1775                         if ( empty( $speaker_name ) )
     1850                        if ( empty( $speaker_name ) ) {
    17761851                                continue;
     1852                        }
    17771853
    17781854                        /*
    17791855                         * Look for speakers by their names.
    class WordCamp_Post_Types_Plugin { 
    17851861                         * here to make it more forgiving.
    17861862                         */
    17871863                        $speaker = get_page_by_title( $speaker_name, OBJECT, 'wcb_speaker' );
    1788                         if ( $speaker )
     1864                        if ( $speaker ) {
    17891865                                $speaker_ids[] = $speaker->ID;
     1866                        }
    17901867                }
    17911868
    17921869                // Add speaker IDs to post meta.
    17931870                $speaker_ids = array_unique( $speaker_ids );
    17941871                delete_post_meta( $post_id, '_wcpt_speaker_id' );
    1795                 foreach ( $speaker_ids as $speaker_id )
     1872                foreach ( $speaker_ids as $speaker_id ) {
    17961873                        add_post_meta( $post_id, '_wcpt_speaker_id', $speaker_id );
     1874                }
    17971875
    17981876                // Set the speaker as the author of the session post, so the single
    17991877                // view doesn't confuse users who see "posted by [organizer name]"
    class WordCamp_Post_Types_Plugin { 
    18021880                        $user = get_user_by( 'id', $wporg_user_id );
    18031881
    18041882                        if ( $user ) {
    1805                                 remove_action( 'save_post', array( $this, 'save_post_session' ), 10, 2 );       // avoid infinite recursion
     1883                                remove_action( 'save_post', array( $this, 'save_post_session' ), 10, 2 );    // avoid infinite recursion
    18061884                                wp_update_post( array(
    18071885                                        'ID'          => $post_id,
    1808                                         'post_author' => $user->ID
     1886                                        'post_author' => $user->ID,
    18091887                                ) );
    18101888                                add_action( 'save_post', array( $this, 'save_post_session' ), 10, 2 );
    18111889
    class WordCamp_Post_Types_Plugin { 
    18241902
    18251903                if ( isset( $_POST['wcpt-meta-sponsor-info'] ) && wp_verify_nonce( $_POST['wcpt-meta-sponsor-info'], 'edit-sponsor-info' ) ) {
    18261904                        $text_values = array(
    1827                                 'company_name', 'first_name', 'last_name', 'email_address', 'phone_number', 'vat_number', 'twitter_handle',
    1828                                 'street_address1', 'street_address2', 'city', 'state', 'zip_code', 'country'
     1905                                'company_name', 'first_name', 'last_name', 'email_address', 'phone_number', 'vat_number', 'twitter_handle',
     1906                                'street_address1', 'street_address2', 'city', 'state', 'zip_code', 'country',
    18291907                        );
    18301908
    18311909                        foreach ( $text_values as $id ) {
    18321910                                $values[ $id ] = sanitize_text_field( $_POST["_wcpt_sponsor_$id"] );
    18331911                        }
    18341912
     1913                        if ( empty( $values['state'] ) ) {
     1914                                $values['state'] = $this->get_sponsor_info_state_default_value();
     1915                        }
     1916
    18351917                        $values['website'] = esc_url_raw( $_POST['_wcpt_sponsor_website'] );
    18361918                        // TODO: maybe only allows links to home page, depending on outcome of http://make.wordpress.org/community/2013/12/31/irs-rules-for-corporate-sponsorship-of-wordcamp/
    18371919
    18381920                        $values['first_name'] = ucfirst( $values['first_name'] );
    1839                         $values['last_name' ] = ucfirst( $values['last_name' ] );
     1921                        $values['last_name'] = ucfirst( $values['last_name'] );
    18401922
    1841                         foreach( $values as $id => $value ) {
     1923                        foreach ( $values as $id => $value ) {
    18421924                                if ( empty( $value ) ) {
    18431925                                        delete_post_meta( $post_id, "_wcpt_sponsor_$id" );
    18441926                                } else {
    class WordCamp_Post_Types_Plugin { 
    18541936        function register_post_types() {
    18551937                // Speaker post type labels.
    18561938                $labels = array(
    1857                         'name'                  => __( 'Speakers', 'wordcamporg' ),
    1858                         'singular_name'         => __( 'Speaker', 'wordcamporg' ),
    1859                         'add_new'               => __( 'Add New', 'wordcamporg' ),
    1860                         'add_new_item'          => __( 'Create New Speaker', 'wordcamporg' ),
    1861                         'edit'                  => __( 'Edit', 'wordcamporg' ),
    1862                         'edit_item'             => __( 'Edit Speaker', 'wordcamporg' ),
    1863                         'new_item'              => __( 'New Speaker', 'wordcamporg' ),
    1864                         'view'                  => __( 'View Speaker', 'wordcamporg' ),
    1865                         'view_item'             => __( 'View Speaker', 'wordcamporg' ),
    1866                         'search_items'          => __( 'Search Speakers', 'wordcamporg' ),
    1867                         'not_found'             => __( 'No speakers found', 'wordcamporg' ),
    1868                         'not_found_in_trash'    => __( 'No speakers found in Trash', 'wordcamporg' ),
    1869                         'parent_item_colon'     => __( 'Parent Speaker:', 'wordcamporg' ),
     1939                        'name'               => __( 'Speakers', 'wordcamporg' ),
     1940                        'singular_name'      => __( 'Speaker', 'wordcamporg' ),
     1941                        'add_new'            => __( 'Add New', 'wordcamporg' ),
     1942                        'add_new_item'       => __( 'Create New Speaker', 'wordcamporg' ),
     1943                        'edit'               => __( 'Edit', 'wordcamporg' ),
     1944                        'edit_item'          => __( 'Edit Speaker', 'wordcamporg' ),
     1945                        'new_item'           => __( 'New Speaker', 'wordcamporg' ),
     1946                        'view'               => __( 'View Speaker', 'wordcamporg' ),
     1947                        'view_item'          => __( 'View Speaker', 'wordcamporg' ),
     1948                        'search_items'       => __( 'Search Speakers', 'wordcamporg' ),
     1949                        'not_found'          => __( 'No speakers found', 'wordcamporg' ),
     1950                        'not_found_in_trash' => __( 'No speakers found in Trash', 'wordcamporg' ),
     1951                        'parent_item_colon'  => __( 'Parent Speaker:', 'wordcamporg' ),
    18701952                );
    18711953
    18721954                // Register speaker post type.
    18731955                register_post_type( 'wcb_speaker', array(
    1874                         'labels'            => $labels,
    1875                         'rewrite'           => array( 'slug' => 'speaker', 'with_front' => true ),
    1876                         'supports'          => array( 'title', 'editor', 'author', 'revisions', 'comments', 'custom-fields' ),
    1877                         'menu_position'     => 20,
    1878                         'public'            => true,
    1879                         'show_ui'           => true,
    1880                         'can_export'        => true,
    1881                         'capability_type'   => 'post',
    1882                         'hierarchical'      => false,
    1883                         'query_var'         => true,
    1884                         'menu_icon'         => 'dashicons-megaphone',
    1885                         'show_in_rest'      => true,
    1886                         'rest_base'         => 'speakers',
     1956                        'labels'          => $labels,
     1957                        'rewrite'         => array( 'slug' => 'speaker', 'with_front' => true ),
     1958                        'supports'        => array( 'title', 'editor', 'author', 'revisions', 'comments', 'custom-fields' ),
     1959                        'menu_position'   => 20,
     1960                        'public'          => true,
     1961                        'show_ui'         => true,
     1962                        'can_export'      => true,
     1963                        'capability_type' => 'post',
     1964                        'hierarchical'    => false,
     1965                        'query_var'       => true,
     1966                        'menu_icon'       => 'dashicons-megaphone',
     1967                        'show_in_rest'    => true,
     1968                        'rest_base'       => 'speakers',
    18871969                ) );
    18881970
    18891971                // Session post type labels.
    18901972                $labels = array(
    1891                         'name'                  => __( 'Sessions', 'wordcamporg' ),
    1892                         'singular_name'         => __( 'Session', 'wordcamporg' ),
    1893                         'add_new'               => __( 'Add New', 'wordcamporg' ),
    1894                         'add_new_item'          => __( 'Create New Session', 'wordcamporg' ),
    1895                         'edit'                  => __( 'Edit', 'wordcamporg' ),
    1896                         'edit_item'             => __( 'Edit Session', 'wordcamporg' ),
    1897                         'new_item'              => __( 'New Session', 'wordcamporg' ),
    1898                         'view'                  => __( 'View Session', 'wordcamporg' ),
    1899                         'view_item'             => __( 'View Session', 'wordcamporg' ),
    1900                         'search_items'          => __( 'Search Sessions', 'wordcamporg' ),
    1901                         'not_found'             => __( 'No sessions found', 'wordcamporg' ),
    1902                         'not_found_in_trash'    => __( 'No sessions found in Trash', 'wordcamporg' ),
    1903                         'parent_item_colon'     => __( 'Parent Session:', 'wordcamporg' ),
     1973                        'name'               => __( 'Sessions', 'wordcamporg' ),
     1974                        'singular_name'      => __( 'Session', 'wordcamporg' ),
     1975                        'add_new'            => __( 'Add New', 'wordcamporg' ),
     1976                        'add_new_item'       => __( 'Create New Session', 'wordcamporg' ),
     1977                        'edit'               => __( 'Edit', 'wordcamporg' ),
     1978                        'edit_item'          => __( 'Edit Session', 'wordcamporg' ),
     1979                        'new_item'           => __( 'New Session', 'wordcamporg' ),
     1980                        'view'               => __( 'View Session', 'wordcamporg' ),
     1981                        'view_item'          => __( 'View Session', 'wordcamporg' ),
     1982                        'search_items'       => __( 'Search Sessions', 'wordcamporg' ),
     1983                        'not_found'          => __( 'No sessions found', 'wordcamporg' ),
     1984                        'not_found_in_trash' => __( 'No sessions found in Trash', 'wordcamporg' ),
     1985                        'parent_item_colon'  => __( 'Parent Session:', 'wordcamporg' ),
    19041986                );
    19051987
    19061988                // Register session post type.
    19071989                register_post_type( 'wcb_session', array(
    1908                         'labels'            => $labels,
    1909                         'rewrite'           => array( 'slug' => 'session', 'with_front' => false ),
    1910                         'supports'          => array( 'title', 'editor', 'author', 'revisions', 'thumbnail', 'custom-fields' ),
    1911                         'menu_position'     => 21,
    1912                         'public'            => true,
    1913                         'show_ui'           => true,
    1914                         'can_export'        => true,
    1915                         'capability_type'   => 'post',
    1916                         'hierarchical'      => false,
    1917                         'query_var'         => true,
    1918                         'menu_icon'         => 'dashicons-schedule',
    1919                         'show_in_rest'      => true,
    1920                         'rest_base'         => 'sessions',
     1990                        'labels'          => $labels,
     1991                        'rewrite'         => array( 'slug' => 'session', 'with_front' => false ),
     1992                        'supports'        => array( 'title', 'editor', 'author', 'revisions', 'thumbnail', 'custom-fields' ),
     1993                        'menu_position'   => 21,
     1994                        'public'          => true,
     1995                        'show_ui'         => true,
     1996                        'can_export'      => true,
     1997                        'capability_type' => 'post',
     1998                        'hierarchical'    => false,
     1999                        'query_var'       => true,
     2000                        'menu_icon'       => 'dashicons-schedule',
     2001                        'show_in_rest'    => true,
     2002                        'rest_base'       => 'sessions',
    19212003                ) );
    19222004
    19232005                // Sponsor post type labels.
    19242006                $labels = array(
    1925                         'name'                  => __( 'Sponsors', 'wordcamporg' ),
    1926                         'singular_name'         => __( 'Sponsor', 'wordcamporg' ),
    1927                         'add_new'               => __( 'Add New', 'wordcamporg' ),
    1928                         'add_new_item'          => __( 'Create New Sponsor', 'wordcamporg' ),
    1929                         'edit'                  => __( 'Edit', 'wordcamporg' ),
    1930                         'edit_item'             => __( 'Edit Sponsor', 'wordcamporg' ),
    1931                         'new_item'              => __( 'New Sponsor', 'wordcamporg' ),
    1932                         'view'                  => __( 'View Sponsor', 'wordcamporg' ),
    1933                         'view_item'             => __( 'View Sponsor', 'wordcamporg' ),
    1934                         'search_items'          => __( 'Search Sponsors', 'wordcamporg' ),
    1935                         'not_found'             => __( 'No sponsors found', 'wordcamporg' ),
    1936                         'not_found_in_trash'    => __( 'No sponsors found in Trash', 'wordcamporg' ),
    1937                         'parent_item_colon'     => __( 'Parent Sponsor:', 'wordcamporg' ),
     2007                        'name'               => __( 'Sponsors', 'wordcamporg' ),
     2008                        'singular_name'      => __( 'Sponsor', 'wordcamporg' ),
     2009                        'add_new'            => __( 'Add New', 'wordcamporg' ),
     2010                        'add_new_item'       => __( 'Create New Sponsor', 'wordcamporg' ),
     2011                        'edit'               => __( 'Edit', 'wordcamporg' ),
     2012                        'edit_item'          => __( 'Edit Sponsor', 'wordcamporg' ),
     2013                        'new_item'           => __( 'New Sponsor', 'wordcamporg' ),
     2014                        'view'               => __( 'View Sponsor', 'wordcamporg' ),
     2015                        'view_item'          => __( 'View Sponsor', 'wordcamporg' ),
     2016                        'search_items'       => __( 'Search Sponsors', 'wordcamporg' ),
     2017                        'not_found'          => __( 'No sponsors found', 'wordcamporg' ),
     2018                        'not_found_in_trash' => __( 'No sponsors found in Trash', 'wordcamporg' ),
     2019                        'parent_item_colon'  => __( 'Parent Sponsor:', 'wordcamporg' ),
    19382020                );
    19392021
    19402022                // Register sponsor post type.
    19412023                register_post_type( 'wcb_sponsor', array(
    1942                         'labels'            => $labels,
    1943                         'rewrite'           => array( 'slug' => 'sponsor', 'with_front' => false ),
    1944                         'supports'          => array( 'title', 'editor', 'revisions', 'thumbnail', 'custom-fields' ),
    1945                         'menu_position'     => 21,
    1946                         'public'            => true,
    1947                         'show_ui'           => true,
    1948                         'can_export'        => true,
    1949                         'capability_type'   => 'post',
    1950                         'hierarchical'      => false,
    1951                         'query_var'         => true,
    1952                         'menu_icon'         => 'dashicons-heart',
    1953                         'show_in_rest'      => true,
    1954                         'rest_base'         => 'sponsors',
     2024                        'labels'          => $labels,
     2025                        'rewrite'         => array( 'slug' => 'sponsor', 'with_front' => false ),
     2026                        'supports'        => array( 'title', 'editor', 'revisions', 'thumbnail', 'custom-fields' ),
     2027                        'menu_position'   => 21,
     2028                        'public'          => true,
     2029                        'show_ui'         => true,
     2030                        'can_export'      => true,
     2031                        'capability_type' => 'post',
     2032                        'hierarchical'    => false,
     2033                        'query_var'       => true,
     2034                        'menu_icon'       => 'dashicons-heart',
     2035                        'show_in_rest'    => true,
     2036                        'rest_base'       => 'sponsors',
    19552037                ) );
    19562038
    19572039                // Organizer post type labels.
    19582040                $labels = array(
    1959                         'name'                  => __( 'Organizers', 'wordcamporg' ),
    1960                         'singular_name'         => __( 'Organizer', 'wordcamporg' ),
    1961                         'add_new'               => __( 'Add New', 'wordcamporg' ),
    1962                         'add_new_item'          => __( 'Create New Organizer', 'wordcamporg' ),
    1963                         'edit'                  => __( 'Edit', 'wordcamporg' ),
    1964                         'edit_item'             => __( 'Edit Organizer', 'wordcamporg' ),
    1965                         'new_item'              => __( 'New Organizer', 'wordcamporg' ),
    1966                         'view'                  => __( 'View Organizer', 'wordcamporg' ),
    1967                         'view_item'             => __( 'View Organizer', 'wordcamporg' ),
    1968                         'search_items'          => __( 'Search Organizers', 'wordcamporg' ),
    1969                         'not_found'             => __( 'No organizers found', 'wordcamporg' ),
    1970                         'not_found_in_trash'    => __( 'No organizers found in Trash', 'wordcamporg' ),
    1971                         'parent_item_colon'     => __( 'Parent Organizer:', 'wordcamporg' ),
     2041                        'name'               => __( 'Organizers', 'wordcamporg' ),
     2042                        'singular_name'      => __( 'Organizer', 'wordcamporg' ),
     2043                        'add_new'            => __( 'Add New', 'wordcamporg' ),
     2044                        'add_new_item'       => __( 'Create New Organizer', 'wordcamporg' ),
     2045                        'edit'               => __( 'Edit', 'wordcamporg' ),
     2046                        'edit_item'          => __( 'Edit Organizer', 'wordcamporg' ),
     2047                        'new_item'           => __( 'New Organizer', 'wordcamporg' ),
     2048                        'view'               => __( 'View Organizer', 'wordcamporg' ),
     2049                        'view_item'          => __( 'View Organizer', 'wordcamporg' ),
     2050                        'search_items'       => __( 'Search Organizers', 'wordcamporg' ),
     2051                        'not_found'          => __( 'No organizers found', 'wordcamporg' ),
     2052                        'not_found_in_trash' => __( 'No organizers found in Trash', 'wordcamporg' ),
     2053                        'parent_item_colon'  => __( 'Parent Organizer:', 'wordcamporg' ),
    19722054                );
    19732055
    19742056                // Register organizer post type.
    19752057                register_post_type( 'wcb_organizer', array(
    1976                         'labels'            => $labels,
    1977                         'rewrite'           => array( 'slug' => 'organizer', 'with_front' => false ),
    1978                         'supports'          => array( 'title', 'editor', 'revisions' ),
    1979                         'menu_position'     => 22,
    1980                         'public'            => false,
    1981                                 // todo public or publicly_queryable = true, so consistent with others? at the very least set show_in_json = true
    1982                         'show_ui'           => true,
    1983                         'can_export'        => true,
    1984                         'capability_type'   => 'post',
    1985                         'hierarchical'      => false,
    1986                         'query_var'         => true,
    1987                         'menu_icon'         => 'dashicons-groups',
     2058                        'labels'          => $labels,
     2059                        'rewrite'         => array( 'slug' => 'organizer', 'with_front' => false ),
     2060                        'supports'        => array( 'title', 'editor', 'revisions' ),
     2061                        'menu_position'   => 22,
     2062                        'public'          => false,
     2063                        // todo public or publicly_queryable = true, so consistent with others? at the very least set show_in_json = true
     2064                        'show_ui'         => true,
     2065                        'can_export'      => true,
     2066                        'capability_type' => 'post',
     2067                        'hierarchical'    => false,
     2068                        'query_var'       => true,
     2069                        'menu_icon'       => 'dashicons-groups',
    19882070                ) );
    19892071        }
    19902072
    class WordCamp_Post_Types_Plugin { 
    19942076        function register_taxonomies() {
    19952077                // Labels for tracks.
    19962078                $labels = array(
    1997                         'name'              => __( 'Tracks', 'wordcamporg' ),
    1998                         'singular_name'     => __( 'Track', 'wordcamporg' ),
    1999                         'search_items'      => __( 'Search Tracks', 'wordcamporg' ),
    2000                         'popular_items'     => __( 'Popular Tracks','wordcamporg' ),
    2001                         'all_items'         => __( 'All Tracks', 'wordcamporg' ),
    2002                         'edit_item'         => __( 'Edit Track', 'wordcamporg' ),
    2003                         'update_item'       => __( 'Update Track', 'wordcamporg' ),
    2004                         'add_new_item'      => __( 'Add Track', 'wordcamporg' ),
    2005                         'new_item_name'     => __( 'New Track', 'wordcamporg' ),
     2079                        'name'          => __( 'Tracks', 'wordcamporg' ),
     2080                        'singular_name' => __( 'Track', 'wordcamporg' ),
     2081                        'search_items'  => __( 'Search Tracks', 'wordcamporg' ),
     2082                        'popular_items' => __( 'Popular Tracks', 'wordcamporg' ),
     2083                        'all_items'     => __( 'All Tracks', 'wordcamporg' ),
     2084                        'edit_item'     => __( 'Edit Track', 'wordcamporg' ),
     2085                        'update_item'   => __( 'Update Track', 'wordcamporg' ),
     2086                        'add_new_item'  => __( 'Add Track', 'wordcamporg' ),
     2087                        'new_item_name' => __( 'New Track', 'wordcamporg' ),
    20062088                );
    20072089
    20082090                // Register the Tracks taxonomy.
    class WordCamp_Post_Types_Plugin { 
    20192101
    20202102                // Labels for sponsor levels.
    20212103                $labels = array(
    2022                         'name'              => __( 'Sponsor Levels', 'wordcamporg' ),
    2023                         'singular_name'     => __( 'Sponsor Level', 'wordcamporg' ),
    2024                         'search_items'      => __( 'Search Sponsor Levels', 'wordcamporg' ),
    2025                         'popular_items'     => __( 'Popular Sponsor Levels', 'wordcamporg' ),
    2026                         'all_items'         => __( 'All Sponsor Levels', 'wordcamporg' ),
    2027                         'edit_item'         => __( 'Edit Sponsor Level', 'wordcamporg' ),
    2028                         'update_item'       => __( 'Update Sponsor Level', 'wordcamporg' ),
    2029                         'add_new_item'      => __( 'Add Sponsor Level', 'wordcamporg' ),
    2030                         'new_item_name'     => __( 'New Sponsor Level', 'wordcamporg' ),
     2104                        'name'          => __( 'Sponsor Levels', 'wordcamporg' ),
     2105                        'singular_name' => __( 'Sponsor Level', 'wordcamporg' ),
     2106                        'search_items'  => __( 'Search Sponsor Levels', 'wordcamporg' ),
     2107                        'popular_items' => __( 'Popular Sponsor Levels', 'wordcamporg' ),
     2108                        'all_items'     => __( 'All Sponsor Levels', 'wordcamporg' ),
     2109                        'edit_item'     => __( 'Edit Sponsor Level', 'wordcamporg' ),
     2110                        'update_item'   => __( 'Update Sponsor Level', 'wordcamporg' ),
     2111                        'add_new_item'  => __( 'Add Sponsor Level', 'wordcamporg' ),
     2112                        'new_item_name' => __( 'New Sponsor Level', 'wordcamporg' ),
    20312113                );
    20322114
    20332115                // Register sponsor level taxonomy
    class WordCamp_Post_Types_Plugin { 
    20442126
    20452127                // Labels for organizer teams.
    20462128                $labels = array(
    2047                         'name'          => __( 'Teams',         'wordcamporg' ),
    2048                         'singular_name' => __( 'Team',          'wordcamporg' ),
    2049                         'search_items'  => __( 'Search Teams',  'wordcamporg' ),
     2129                        'name'          => __( 'Teams', 'wordcamporg' ),
     2130                        'singular_name' => __( 'Team', 'wordcamporg' ),
     2131                        'search_items'  => __( 'Search Teams', 'wordcamporg' ),
    20502132                        'popular_items' => __( 'Popular Teams', 'wordcamporg' ),
    2051                         'all_items'     => __( 'All Teams',     'wordcamporg' ),
    2052                         'edit_item'     => __( 'Edit Team',     'wordcamporg' ),
    2053                         'update_item'   => __( 'Update Team',   'wordcamporg' ),
    2054                         'add_new_item'  => __( 'Add Team',      'wordcamporg' ),
    2055                         'new_item_name' => __( 'New Team',      'wordcamporg' ),
     2133                        'all_items'     => __( 'All Teams', 'wordcamporg' ),
     2134                        'edit_item'     => __( 'Edit Team', 'wordcamporg' ),
     2135                        'update_item'   => __( 'Update Team', 'wordcamporg' ),
     2136                        'add_new_item'  => __( 'Add Team', 'wordcamporg' ),
     2137                        'new_item_name' => __( 'New Team', 'wordcamporg' ),
    20562138                );
    20572139
    20582140                // Register organizer teams taxonomy
    class WordCamp_Post_Types_Plugin { 
    20712153
    20722154                // Labels for speaker groups.
    20732155                $labels = array(
    2074                         'name'          => __( 'Groups',         'wordcamporg' ),
    2075                         'singular_name' => __( 'Group',          'wordcamporg' ),
    2076                         'search_items'  => __( 'Search Groups',  'wordcamporg' ),
     2156                        'name'          => __( 'Groups', 'wordcamporg' ),
     2157                        'singular_name' => __( 'Group', 'wordcamporg' ),
     2158                        'search_items'  => __( 'Search Groups', 'wordcamporg' ),
    20772159                        'popular_items' => __( 'Popular Groups', 'wordcamporg' ),
    2078                         'all_items'     => __( 'All Groups',     'wordcamporg' ),
    2079                         'edit_item'     => __( 'Edit Group',     'wordcamporg' ),
    2080                         'update_item'   => __( 'Update Group',   'wordcamporg' ),
    2081                         'add_new_item'  => __( 'Add Group',      'wordcamporg' ),
    2082                         'new_item_name' => __( 'New Group',      'wordcamporg' ),
     2160                        'all_items'     => __( 'All Groups', 'wordcamporg' ),
     2161                        'edit_item'     => __( 'Edit Group', 'wordcamporg' ),
     2162                        'update_item'   => __( 'Update Group', 'wordcamporg' ),
     2163                        'add_new_item'  => __( 'Add Group', 'wordcamporg' ),
     2164                        'new_item_name' => __( 'New Group', 'wordcamporg' ),
    20832165                );
    20842166
    20852167                // Register speaker groups taxonomy
    class WordCamp_Post_Types_Plugin { 
    21052187         * override.
    21062188         *
    21072189         * @uses current_filter()
    2108          * @see __construct()
     2190         * @see  __construct()
    21092191         */
    21102192        function manage_post_types_columns( $columns ) {
    21112193                $current_filter = current_filter();
    class WordCamp_Post_Types_Plugin { 
    21132195                switch ( $current_filter ) {
    21142196                        case 'manage_wcb_organizer_posts_columns':
    21152197                                // Insert at offset 1, that's right after the checkbox.
    2116                                 $columns = array_slice( $columns, 0, 1, true ) + array( 'wcb_organizer_avatar' => __( 'Avatar', 'wordcamporg' ) )   + array_slice( $columns, 1, null, true );
     2198                                $columns = array_slice( $columns, 0, 1, true ) + array( 'wcb_organizer_avatar' => __( 'Avatar', 'wordcamporg' ) ) + array_slice( $columns, 1, null, true );
    21172199                                break;
    21182200
    21192201                        case 'manage_wcb_speaker_posts_columns':
    21202202                                $original_columns = $columns;
    21212203
    2122                                 $columns =  array_slice( $original_columns, 0, 1, true );
     2204                                $columns = array_slice( $original_columns, 0, 1, true );
    21232205                                $columns += array( 'wcb_speaker_avatar' => __( 'Avatar', 'wordcamporg' ) );
    21242206                                $columns += array_slice( $original_columns, 1, 1, true );
    21252207                                $columns += array(
    2126                                         'wcb_speaker_email'          => __( 'Gravatar Email',         'wordcamporg' ),
     2208                                        'wcb_speaker_email'          => __( 'Gravatar Email', 'wordcamporg' ),
    21272209                                        'wcb_speaker_wporg_username' => __( 'WordPress.org Username', 'wordcamporg' ),
    21282210                                );
    21292211                                $columns += array_slice( $original_columns, 2, null, true );
    class WordCamp_Post_Types_Plugin { 
    21322214
    21332215                        case 'manage_wcb_session_posts_columns':
    21342216                                $columns = array_slice( $columns, 0, 2, true ) + array( 'wcb_session_speakers' => __( 'Speakers', 'wordcamporg' ) ) + array_slice( $columns, 2, null, true );
    2135                                 $columns = array_slice( $columns, 0, 1, true ) + array( 'wcb_session_time'     => __( 'Time', 'wordcamporg' ) )    + array_slice( $columns, 1, null, true );
     2217                                $columns = array_slice( $columns, 0, 1, true ) + array( 'wcb_session_time' => __( 'Time', 'wordcamporg' ) ) + array_slice( $columns, 1, null, true );
    21362218                                break;
    21372219                        default:
    21382220                }
    class WordCamp_Post_Types_Plugin { 
    21622244                                break;
    21632245
    21642246                        case 'wcb_speaker_wporg_username':
    2165                                 $user_id    = get_post_meta( get_the_ID(), '_wcpt_user_id', true );
     2247                                $user_id = get_post_meta( get_the_ID(), '_wcpt_user_id', true );
    21662248                                $wporg_user = get_user_by( 'id', $user_id );
    21672249
    21682250                                if ( $wporg_user ) {
    class WordCamp_Post_Types_Plugin { 
    21762258                                $speakers_ids = array_map( 'absint', (array) get_post_meta( $post_id, '_wcpt_speaker_id' ) );
    21772259                                if ( ! empty( $speakers_ids ) ) {
    21782260                                        $speakers = get_posts( array(
    2179                                                 'post_type' => 'wcb_speaker',
     2261                                                'post_type'      => 'wcb_speaker',
    21802262                                                'posts_per_page' => -1,
    2181                                                 'post__in' => $speakers_ids,
     2263                                                'post__in'       => $speakers_ids,
    21822264                                        ) );
    21832265                                }
    21842266
    class WordCamp_Post_Types_Plugin { 
    22062288        function manage_sortable_columns( $sortable ) {
    22072289                $current_filter = current_filter();
    22082290
    2209                 if ( 'manage_edit-wcb_session_sortable_columns' == $current_filter )
     2291                if ( 'manage_edit-wcb_session_sortable_columns' == $current_filter ) {
    22102292                        $sortable['wcb_session_time'] = '_wcpt_session_time';
     2293                }
    22112294
    22122295                return $sortable;
    22132296        }
    class WordCamp_Post_Types_Plugin { 
    22182301        function display_post_states( $states ) {
    22192302                $post = get_post();
    22202303
    2221                 if ( 'wcb_session' != $post->post_type )
     2304                if ( 'wcb_session' != $post->post_type ) {
    22222305                        return $states;
     2306                }
    22232307
    22242308                $session_type = get_post_meta( $post->ID, '_wcpt_session_type', true );
    2225                 if ( ! in_array( $session_type, array( 'session', 'custom' ) ) )
     2309                if ( ! in_array( $session_type, array( 'session', 'custom' ) ) ) {
    22262310                        $session_type = 'session';
     2311                }
    22272312
    2228                 if ( 'session' == $session_type )
     2313                if ( 'session' == $session_type ) {
    22292314                        $states['wcpt-session-type'] = __( 'Session', 'wordcamporg' );
    2230                 elseif ( 'custom' == $session_type )
     2315                } elseif ( 'custom' == $session_type ) {
    22312316                        $states['wcpt-session-type'] = __( 'Custom', 'wordcamporg' );
     2317                }
    22322318
    22332319                return $states;
    22342320        }
    class WordCamp_Post_Types_Plugin { 
    22392325        function register_widgets() {
    22402326                require_once( 'inc/widgets.php' );
    22412327
    2242                 register_widget( 'WCB_Widget_Sponsors'    );
    2243                 register_widget( 'WCPT_Widget_Speakers'   );
    2244                 register_widget( 'WCPT_Widget_Sessions'   );
     2328                register_widget( 'WCB_Widget_Sponsors' );
     2329                register_widget( 'WCPT_Widget_Speakers' );
     2330                register_widget( 'WCPT_Widget_Sessions' );
    22452331                register_widget( 'WCPT_Widget_Organizers' );
    22462332        }
    22472333
    class WordCamp_Post_Types_Plugin { 
    22572343                                continue;
    22582344                        }
    22592345
    2260                         $num_posts        = wp_count_posts( $post_type );
     2346                        $num_posts = wp_count_posts( $post_type );
    22612347                        $post_type_object = get_post_type_object( $post_type );
    22622348
    22632349                        if ( $num_posts && $num_posts->publish ) {
    class WordCamp_Post_Types_Plugin { 
    22922378         * Comments and pings on speakers closed by default.
    22932379         *
    22942380         * @param string $status Default comment status.
     2381         *
    22952382         * @return string Resulting status.
    22962383         */
    22972384        public function default_comment_ping_status( $status ) {
    22982385                $screen = get_current_screen();
    2299                 if ( ! empty( $screen->post_type ) && $screen->post_type == 'wcb_speaker' )
     2386                if ( ! empty( $screen->post_type ) && $screen->post_type == 'wcb_speaker' ) {
    23002387                        $status = 'closed';
     2388                }
    23012389
    23022390                return $status;
    23032391        }