WordPress.org

Making WordPress.org

Ticket #561: 561.diff

File 561.diff, 4.4 KB (added by hlashbrooke, 6 years ago)

Solution as described in ticket body

  • wp-content/plugins/wc-post-types/wc-post-types.php

     
    256256                        'posts_per_page' => -1,
    257257                        'orderby' => 'date',
    258258                        'order' => 'desc',
     259                        'track' => 'all',
    259260                ), $attr );
    260261
    261262                $attr['show_avatars'] = $this->str_to_bool( $attr['show_avatars'] );
    262263                $attr['orderby'] = ( in_array( $attr['orderby'], array( 'date', 'title', 'rand' ) ) ) ? $attr['orderby'] : 'date';
    263264                $attr['order'] = ( in_array( $attr['order'], array( 'asc', 'desc') ) ) ? $attr['order'] : 'desc';
    264265
    265                 $speakers = new WP_Query( array(
     266                $args = array(
    266267                        'post_type' => 'wcb_speaker',
    267268                        'posts_per_page' => intval( $attr['posts_per_page'] ),
    268269                        'orderby' => $attr['orderby'],
    269270                        'order' => $attr['order'],
    270                 ) );
     271                );
    271272
     273                // Fetch speakers from specified tracks only
     274                if ( 'all' != $attr['track'] ) {
     275                        $tracks = explode( ',', $attr['track'] );
     276                        $args['meta_query'][] = array(
     277                                'key' => '_wcpt_speaker_tracks',
     278                                'value' => $tracks,
     279                                'compare' => 'IN',
     280                        );
     281                }
     282
     283                $speakers = new WP_Query( $args );
     284
    272285                if ( ! $speakers->have_posts() )
    273286                        return '';
    274287
     
    279292
    280293                        <?php while ( $speakers->have_posts() ) : $speakers->the_post(); ?>
    281294
    282                                 <div id="wcorg-speaker-<?php echo sanitize_html_class( $post->post_name ); ?>" class="wcorg-speaker">
     295                                <?php
     296                                // Get list of speaker tracks for div class
     297                                $tracks = get_post_meta( get_the_ID(), '_wcpt_speaker_tracks', false );
     298                                $track_class = '';
     299                                foreach( $tracks as $track ) {
     300                                        $track_class .= ' ' . sanitize_html_class( $track );
     301                                }
     302                                ?>
     303
     304                                <div id="wcorg-speaker-<?php echo sanitize_html_class( $post->post_name ); ?>" class="wcorg-speaker<?php echo $track_class; ?>">
    283305                                        <h2><?php the_title(); ?></h2>
    284306                                        <div class="wcorg-speaker-description">
    285307                                                <?php echo ( $attr['show_avatars'] ) ? get_avatar( get_post_meta( get_the_ID(), '_wcb_speaker_email', true ), absint( $attr['avatar_size'] ) ) : ''; ?>
     
    11421164        }
    11431165
    11441166        /**
     1167         * Adds session tracks to all speakers
     1168         * @return void
     1169         */
     1170        function save_all_speaker_tracks() {
     1171                $args = array(
     1172                        'post_type' => 'wcb_speaker',
     1173                        'posts_per_page' => -1,
     1174                );
     1175
     1176                $speakers = get_posts( $args );
     1177
     1178                foreach( $speakers as $speaker ) {
     1179                        $this->save_single_speaker_tracks( $speaker->ID );
     1180                }
     1181        }
     1182
     1183        /**
     1184         * Adds session tracks to specified speaker
     1185         * @param  integer  $speaker_id   ID of speaker
     1186         * @return void
     1187         */
     1188        function save_single_speaker_tracks( $speaker_id = 0 ) {
     1189
     1190                if( ! $speaker_id ) return;
     1191
     1192                $args = array(
     1193                        'post_type' => 'wcb_session',
     1194                        'posts_per_page' => -1,
     1195                        'meta_query' => array(
     1196                                array(
     1197                                        'key' => '_wcpt_speaker_id',
     1198                                        'value' => $speaker_id,
     1199                                ),
     1200                        ),
     1201                );
     1202
     1203                $sessions = get_posts( $args );
     1204
     1205                // Delete all existing tracks from speaker
     1206                delete_post_meta( $speaker_id, '_wcpt_speaker_tracks' );
     1207
     1208                foreach( $sessions as $session ) {
     1209
     1210                        // Get all tracks for session
     1211                        $session_tracks = wp_get_post_terms( $session->ID, 'wcb_track' );
     1212
     1213                        if( ! is_wp_error( $session_tracks ) ) {
     1214
     1215                                // Add each track from session to speaker
     1216                                foreach( $session_tracks as $track ) {
     1217                                        add_post_meta( $speaker_id, '_wcpt_speaker_tracks', $track->slug, false );
     1218                                }
     1219
     1220                        }
     1221                }
     1222        }
     1223
     1224        /**
    11451225         * Get WordPress.org User
    11461226         *
    11471227         * Give it login or slug, will return a WP_User object if found.
     
    12341314                delete_post_meta( $post_id, '_wcpt_speaker_id' );
    12351315                foreach ( $speaker_ids as $speaker_id )
    12361316                        add_post_meta( $post_id, '_wcpt_speaker_id', $speaker_id );
    1237                
     1317
    12381318                // Set the speaker as the author of the session post, so the single
    12391319                // view doesn't confuse users who see "posted by [organizer name]"
    12401320                foreach ( $speaker_ids as $speaker_post ) {
    12411321                        $wporg_user_id = get_post_meta( $speaker_post, '_wcpt_user_id', true );
    12421322                        $user = get_user_by( 'id', $wporg_user_id );
    1243                        
     1323
    12441324                        if ( $user ) {
    12451325                                remove_action( 'save_post', array( $this, 'save_post_session' ), 10, 2 );       // avoid infinite recursion
    12461326                                wp_update_post( array(
     
    12481328                                        'post_author' => $user->ID
    12491329                                ) );
    12501330                                add_action( 'save_post', array( $this, 'save_post_session' ), 10, 2 );
    1251                                
     1331
    12521332                                break;
    12531333                        }
    12541334                }
     1335
     1336                // Save session tracks as speaker meta for all speakers
     1337                $this->save_all_speaker_tracks();
    12551338        }
    12561339
    12571340        /**