Making WordPress.org

Changeset 1287


Ignore:
Timestamp:
02/20/2015 07:55:57 PM (12 years ago)
Author:
iandunn
Message:

WordCamp Forms to Drafts: Add handler for Call for Speakers form.

Props nvwd
See #567

File:
1 edited

Legend:

Unmodified
Added
Removed
  • sites/trunk/wordcamp.org/public_html/wp-content/plugins/wordcamp-forms-to-drafts/wordcamp-forms-to-drafts.php

    r698 r1287  
    2222         */
    2323        public function __construct() {
     24                add_filter( 'the_content',              array( $this, 'force_login_to_view_form' ), 9 );
     25                add_action( 'template_redirect',        array( $this, 'populate_form_based_on_user' ), 9 );
    2426                add_action( 'grunion_pre_message_sent', array( $this, 'returning_organizer_application' ), 10, 3 );
    2527                add_action( 'grunion_pre_message_sent', array( $this, 'new_organizer_application' ), 10, 3 );
    2628                add_action( 'grunion_pre_message_sent', array( $this, 'call_for_sponsors' ), 10, 3 );
     29                add_action( 'grunion_pre_message_sent', array( $this, 'call_for_speakers' ), 10, 3 );
     30        }
     31
     32        /**
     33         * Force user to login to view certain forms.
     34         *
     35         * @param string $content
     36         *
     37         * @return string
     38         */
     39        public function force_login_to_view_form( $content ) {
     40                global $post;
     41                $forms_that_require_login = array( 'call-for-speakers' );
     42                $shortcode_pattern        = '/\[contact-form[\D\S]+\[\/contact-form\]/';
     43                $form_id                  = get_post_meta( $post->ID, 'wcfd-key', true );
     44
     45                if ( in_array( $form_id, $forms_that_require_login ) && ! is_user_logged_in() ) {
     46                        switch ( $form_id ) {
     47                                case 'call-for-speakers':
     48                                        $please_login_message = sprintf(
     49                                                __( 'Before submitting your speaker proposal, please <a href="%s">log into your WordPress.org account</a>*.', 'wordcamporg' ),
     50                                                wp_login_url( get_permalink() )
     51                                        );
     52                                        break;
     53                        }
     54
     55                        if ( ! empty( $please_login_message ) ) {
     56                                $please_login_message = str_replace(
     57                                        __( 'Please use your <strong>WordPress.org</strong>* account to log in.', 'wordcamporg' ),
     58                                        $please_login_message,
     59                                        wcorg_login_message( '', get_permalink() )
     60                                );
     61
     62                                $content = preg_replace( $shortcode_pattern, $please_login_message, $content );
     63                        }
     64                }
     65
     66                return $content;
     67        }
     68
     69        /**
     70         * Populate certain form fields based on the current user.
     71         *
     72         * @todo Maybe remove username field, or make it readonly. We don't need an explicit field since we can just
     73         *       grab the current user value, but it might be good to let them see/change which one they're using.
     74         */
     75        public function populate_form_based_on_user() {
     76                global $current_user, $post;
     77
     78                if ( ! is_user_logged_in() ) {
     79                        return;
     80                }
     81
     82                get_currentuserinfo();
     83                $form_id = get_post_meta( $post->ID, 'wcfd-key', true );
     84
     85                switch ( $form_id ) {
     86                        case 'call-for-speakers':
     87                                $default_values = array(
     88                                        'Name'                   => $current_user->display_name,
     89                                        'Email Address'          => $current_user->user_email,
     90                                        'WordPress.org Username' => $current_user->user_login,
     91                                );
     92
     93                                foreach ( $default_values as $field_label => $default_value ) {
     94                                        $field_id = $this->get_grunion_field_id( $post->ID, $field_label );
     95
     96                                        if ( ! isset( $_POST[ $field_id ] ) ) {
     97                                                $_POST[ $field_id ] = $default_value;
     98                                        }
     99                                }
     100
     101                                break;
     102                }
     103        }
     104
     105        /**
     106         * Get the Grunion field ID
     107         *
     108         * This is a simplified version of what happens in Grunion_Contact_Form_Field::__construct()
     109         *
     110         * @todo submit Jetpack PR to modularize that logic so we can just call it directly instead of duplicating it
     111         *
     112         * @param int $page_id
     113         * @param string $label
     114         *
     115         * @return string
     116         */
     117        protected function get_grunion_field_id( $page_id, $label ) {
     118                $id = sprintf(
     119                        'g%s-%s',
     120                        $page_id,
     121                        sanitize_title_with_dashes( preg_replace( '/[^a-zA-Z0-9.-_:]/', '', $label ) )
     122                );
     123
     124                return $id;
     125        }
     126
     127        /**
     128         * Remove prefixes from form labels
     129         *
     130         * Grunion prefixes the field keys with 'N_', so that 'Name becomes '1_Name'. That prevents directly accessing
     131         * the values, since the number is unknown.
     132         *
     133         * @param array $prefixed_values
     134         *
     135         * @return array
     136         */
     137        protected function get_unprefixed_grunion_form_values( $prefixed_values ) {
     138                $unprefixed_values = array();
     139
     140                foreach ( $prefixed_values as $key => $value ) {
     141                        $unprefixed_values[ preg_replace( '#^\d+_#i', '', $key ) ] = $value;
     142                }
     143
     144                return $unprefixed_values;
    27145        }
    28146
    … …  
    34152         *
    35153         * @param int $submission_id
     154         *
    36155         * @return string | false
    37156         */
    … …  
    51170         *
    52171         * @param string $username
     172         *
    53173         * @return int
    54174         */
    … …  
    62182         *
    63183         * This plugin may need to insert a form into a different site, and the targeted post type may not be active
    64          * on the current site. If we don't do this, PHP notices will be generated and will break the post/get/redirect
     184         * on the current site. If we don't do this, PHP notices will be generated and will break the post/redirect/get
    65185         * flow because of the early headers.
    66186         *
    … …  
    185305         *
    186306         * @todo
     307         * - Update WordCamp_New_Site to inject wcfd-key meta and anything else necessary to make this active for new
     308         *   sites
    187309         * - Add jetpack form field for Sponsor Level, where options are automatically pulled from wcb_sponsor_level
    188310         *   taxonomy and the selected term is applied to the drafted post. Maybe need to send PR to add filter to
    … …  
    206328
    207329                // Create the post
     330                // todo need to unprefix $all_values, like call_for_speakers() does? if so, extract into DRY function
    208331                $draft_id = wp_insert_post( array(
    209332                        'post_type'    => 'wcb_sponsor',
    … …  
    223346                }
    224347        }
     348
     349        /**
     350         * Create draft Speaker and Session posts from a Call for Speakers form submission.
     351         *
     352         * @todo Add jetpack form field for Track, where options are automatically pulled from wcb_track
     353         *       taxonomy and the selected term(s) is applied to the drafted post.
     354         * @todo If creating speaker or session fails, report to organizer so that submission doesn't get missed
     355         *
     356         * @param int   $submission_id
     357         * @param array $all_values
     358         * @param array $extra_values
     359         */
     360        public function call_for_speakers( $submission_id, $all_values, $extra_values ) {
     361                if ( 'call-for-speakers' != $this->get_form_key( $submission_id ) ) {
     362                        return;
     363                }
     364
     365                global $current_user;
     366
     367                $all_values = $this->get_unprefixed_grunion_form_values( $all_values );
     368
     369                if ( ! $speaker_user_id = $this->get_user_id_from_username( $all_values['WordPress.org Username'] ) ) {
     370                        $speaker_user_id                      = $current_user->ID;
     371                        $all_values['WordPress.org Username'] = $current_user->user_login;
     372                }
     373
     374                $speaker = $this->get_speaker_from_user_id( $speaker_user_id );
     375
     376                if ( ! is_a( $speaker, 'WP_Post' ) ) {
     377                        $speaker_id = $this->create_draft_speaker( $all_values );
     378
     379                        if ( ! is_a( $speaker_id, 'WP_Error' ) ) {
     380                                $speaker = get_post( $speaker_id );
     381                        }
     382                }
     383
     384                if ( is_a( $speaker, 'WP_Post' ) ) {
     385                        $this->create_draft_session( $all_values, $speaker );
     386                }
     387        }
     388
     389        /**
     390         * Get speaker post based on WordPress.org user name
     391         *
     392         * @param int $user_id
     393         *
     394         * @return WP_Post | false
     395         */
     396        protected function get_speaker_from_user_id( $user_id ) {
     397                $speaker_query = new WP_Query( array(
     398                        'post_type'      => 'wcb_speaker',
     399                        'posts_per_page' => 1,
     400                        'post_status'    => array( 'publish', 'pending', 'draft', 'future', 'private' ),    // Trashed speakers are ignored because they'll likely be deleted
     401                        'meta_query'     => array(
     402                                array(
     403                                        'key'     => '_wcpt_user_id',
     404                                        'value'   => $user_id,
     405                                        'compare' => '=',
     406                                ),
     407                        ),
     408                ) );
     409
     410                return empty( $speaker_query->post ) ? false : $speaker_query->post;
     411        }
     412
     413        /**
     414         * Create a drafted speaker post
     415         *
     416         * @param array $speaker
     417         *
     418         * @return int | WP_Error
     419         */
     420        protected function create_draft_speaker( $speaker ) {
     421                $speaker_id = wp_insert_post(
     422                        array(
     423                                'post_type'    => 'wcb_speaker',
     424                                'post_title'   => $speaker['Name'],
     425                                'post_content' => $speaker['Your Bio'],
     426                                'post_status'  => 'draft',
     427                                'post_author'  => $this->get_user_id_from_username( 'wordcamp' ),
     428                        ),
     429                        true
     430                );
     431
     432                if ( $speaker_id ) {
     433                        update_post_meta( $speaker_id, '_wcb_speaker_email', $speaker[ 'Email Address' ] );
     434                        update_post_meta( $speaker_id, '_wcpt_user_id',      $this->get_user_id_from_username( $speaker['WordPress.org Username'] ) );
     435                }
     436
     437                return $speaker_id;
     438        }
     439
     440        /**
     441         * Create a drafted session post
     442         *
     443         * @param array   $session
     444         * @param WP_Post $speaker
     445         *
     446         * @return int | WP_Error
     447         */
     448        protected function create_draft_session( $session, $speaker ) {
     449                $session_id = wp_insert_post(
     450                        array(
     451                                'post_type'    => 'wcb_session',
     452                                'post_title'   => $session['Topic Title'],
     453                                'post_content' => $session['Topic Description'],
     454                                'post_status'  => 'draft',
     455                                'post_author'  => $this->get_user_id_from_username( $session['WordPress.org Username'] ),
     456                        ),
     457                        true
     458                );
     459
     460                if ( $session_id ) {
     461                        update_post_meta( $session_id, '_wcpt_speaker_id',      $speaker->ID );
     462                        update_post_meta( $session_id, '_wcb_session_speakers', $speaker->post_title );
     463                }
     464
     465                return $session_id;
     466        }
    225467} // end WordCamp_Forms_To_Drafts
    226468
Note: See TracChangeset for help on using the changeset viewer.