diff --git a/plugins/wporg-5ftf/includes/pledge-form.php b/plugins/wporg-5ftf/includes/pledge-form.php index 5d2f13b..d409035 100755 --- a/plugins/wporg-5ftf/includes/pledge-form.php +++ b/plugins/wporg-5ftf/includes/pledge-form.php @@ -17,19 +17,15 @@ add_shortcode( 'five_for_the_future_pledge_form', __NAMESPACE__ . '\render_short /** * * - * @param $attributes - * @param $content - * * @return false|string */ -function render_shortcode( $attributes, $content ) { +function render_shortcode() { $action = filter_input( INPUT_POST, 'action' ); $messages = []; $complete = false; - $html = ''; - if ( 'Submit' === $action ) { - $processed = process_form( $_POST ); + if ( 'Submit Pledge' === $action ) { + $processed = process_form(); if ( is_wp_error( $processed ) ) { $messages = array_merge( $messages, $processed->get_error_messages() ); @@ -38,34 +34,61 @@ function render_shortcode( $attributes, $content ) { } } - if ( $complete ) { - $html = wpautop( __( 'Thank you for your submission.', 'wporg' ) ); - } else { - ob_start(); - require FiveForTheFuture\PATH . 'views/pledge-form.php'; - $html = ob_get_clean(); - } + ob_start(); + require FiveForTheFuture\PATH . 'views/pledge-form.php'; - return $html; + return ob_get_clean(); } /** * * - * @param array $form_values + * @return array + */ +function get_input_filters() { + return array_merge( + // Inputs that correspond to meta values. + wp_list_pluck( PledgeMeta\get_pledge_meta_config(), 'php_filter' ), + // Inputs with no corresponding meta value. + array( + 'contributor-wporg-usernames' => [ + 'filter' => FILTER_SANITIZE_STRING, + 'flags' => FILTER_REQUIRE_ARRAY, + ], + 'pledge-agreement' => FILTER_VALIDATE_BOOLEAN, + ) + ); +} + +/** + * * * @return string|WP_Error String "success" if the form processed correctly. Otherwise WP_Error. */ -function process_form( array $form_values ) { - $required_fields = PledgeMeta\has_required_pledge_meta( $form_values ); +function process_form() { + $submission = filter_input_array( INPUT_POST, get_input_filters() ); - if ( is_wp_error( $required_fields ) ) { - return $required_fields; + $submission['org-domain'] = get_normalized_domain_from_url( $submission['org-url'] ); + + if ( in_array( null, $submission, true ) || in_array( false, $submission, true ) ) { + return new WP_Error( + 'invalid_submission', + __( 'Some fields have missing or invalid information.', 'wporg' ) + ); + } + + $has_existing_pledge = has_existing_pledge( $submission['org-domain'] ); + + if ( $has_existing_pledge ) { + return new WP_Error( + 'existing_pledge', + __( 'A pledge already exists for this domain.', 'wporg' ) + ); } $name = sanitize_meta( - PledgeMeta\META_PREFIX . 'company-name', - $form_values['company-name'], + PledgeMeta\META_PREFIX . 'org-name', + $submission['org-name'], 'post', Pledge\CPT_ID ); @@ -76,12 +99,46 @@ function process_form( array $form_values ) { return $created; } - PledgeMeta\save_pledge_meta( $created, $form_values ); - // save teams contirbuted to as terms + PledgeMeta\save_pledge_meta( $created, $submission ); return 'success'; } +/** + * + * + * @param string $url + * + * @return string + */ +function get_normalized_domain_from_url( $url ) { + $domain = wp_parse_url( $url, PHP_URL_HOST ); + $domain = preg_replace( '#^www\.#', '', $domain ); + + return $domain; +} + +/** + * + * + * @param string $domain + * + * @return bool + */ +function has_existing_pledge( $domain ) { + $matching_pledge = get_posts( array( + 'post_type' => Pledge\CPT_ID, + 'post_status' => array( 'pending', 'publish' ), + 'meta_query' => array( + 'key' => PledgeMeta\META_PREFIX . 'org-domain', + 'value' => $domain, + 'compare' => 'LIKE', + ), + ) ); + + return ! empty( $matching_pledge ); +} + /** * * diff --git a/plugins/wporg-5ftf/includes/pledge-meta.php b/plugins/wporg-5ftf/includes/pledge-meta.php index a8856dd..a9d51ea 100755 --- a/plugins/wporg-5ftf/includes/pledge-meta.php +++ b/plugins/wporg-5ftf/includes/pledge-meta.php @@ -11,7 +11,7 @@ use WP_Post, WP_Error; defined( 'WPINC' ) || die(); -const META_PREFIX = FiveForTheFuture\PREFIX . '-'; +const META_PREFIX = FiveForTheFuture\PREFIX . '_'; add_action( 'init', __NAMESPACE__ . '\register_pledge_meta' ); add_action( 'admin_init', __NAMESPACE__ . '\add_meta_boxes' ); @@ -24,50 +24,40 @@ add_action( 'save_post', __NAMESPACE__ . '\save_pledge', 10, 2 ); */ function get_pledge_meta_config() { return [ - 'company-name' => [ - 'show_in_rest' => true, + 'org-name' => [ + 'single' => true, 'sanitize_callback' => 'sanitize_text_field', - 'required' => true, - ], - 'company-url' => [ 'show_in_rest' => true, + 'required' => true, + 'php_filter' => FILTER_SANITIZE_STRING + ], + 'org-url' => [ + 'single' => true, 'sanitize_callback' => 'esc_url_raw', - 'required' => true, - ], - 'company-email' => [ - 'show_in_rest' => false, - 'sanitize_callback' => 'sanitize_email', - 'required' => true, - ], - 'company-phone' => [ - 'show_in_rest' => false, - 'sanitize_callback' => 'sanitize_text_field', - 'required' => false, - ], - 'company-total-employees' => [ 'show_in_rest' => true, - 'sanitize_callback' => 'absint', 'required' => true, + 'php_filter' => FILTER_VALIDATE_URL, ], - 'contact-name' => [ - 'show_in_rest' => false, + 'org-domain' => [ + 'single' => true, 'sanitize_callback' => 'sanitize_text_field', - 'required' => true, - ], - 'contact-wporg-username' => [ 'show_in_rest' => false, + 'required' => true, + 'php_filter' => FILTER_SANITIZE_STRING, + ], + 'org-description' => [ + 'single' => true, + 'sanitize_callback' => 'sanitize_text_field', + 'show_in_rest' => true, + 'required' => true, + 'php_filter' => FILTER_SANITIZE_STRING + ], + 'admin-wporg-username' => [ + 'single' => true, 'sanitize_callback' => 'sanitize_user', - 'required' => true, - ], - 'pledge-hours' => [ - 'show_in_rest' => true, - 'sanitize_callback' => 'absint', - 'required' => true, - ], - 'pledge-agreement' => [ 'show_in_rest' => false, - 'sanitize_callback' => 'wp_validate_boolean', 'required' => true, + 'php_filter' => FILTER_SANITIZE_STRING ], ]; } @@ -165,11 +155,13 @@ function save_pledge( $pledge_id, $pledge ) { return; } - if ( is_wp_error( has_required_pledge_meta( $_POST ) ) ) { + $submitted_meta = filter_input_array( INPUT_POST, wp_list_pluck( get_pledge_meta_config(), 'php_filter' ) ); + + if ( is_wp_error( has_required_pledge_meta( $submitted_meta ) ) ) { return; } - save_pledge_meta( $pledge_id, $_POST ); + save_pledge_meta( $pledge_id, $submitted_meta ); } /** @@ -192,12 +184,12 @@ function save_pledge_meta( $pledge_id, $new_values ) { delete_post_meta( $pledge_id, $meta_key ); } } - - // maybe set the wporg username as the company author, so they can edit it themselves to keep it updated, - // then make the user a contributor if they don't already have a role on the site - // setup cron to automatically email once per quarter - // "here's all the info we have: x, y, z" - // is that still accurate? if not, click here to update it - // if want to be removed from public listing, emailing support@wordcamp.org - // don't let them edit the "featured" taxonomy, only admins } + +// maybe set the wporg username as the company author, so they can edit it themselves to keep it updated, +// then make the user a contributor if they don't already have a role on the site +// setup cron to automatically email once per quarter +// "here's all the info we have: x, y, z" +// is that still accurate? if not, click here to update it +// if want to be removed from public listing, emailing support@wordcamp.org +// don't let them edit the "featured" taxonomy, only admins diff --git a/plugins/wporg-5ftf/views/pledge-form.php b/plugins/wporg-5ftf/views/pledge-form.php index 17686cc..7ba8f30 100755 --- a/plugins/wporg-5ftf/views/pledge-form.php +++ b/plugins/wporg-5ftf/views/pledge-form.php @@ -4,152 +4,106 @@ */ /** @var array $messages */ +/** @var bool $complete */ ?> +

+ Manage an existing pledge +

+ +
+ -
-
- + +
+ +
+ + + +
-
- + Logo TODO
-
-
- -
-
- -
- - -
-
- -
-
- -
- - -
- -
- -
- expectations of the Five For The Future program and that it will dedicate this amount of employee time per week to the WordPress project', 'wporg' ), - esc_url( '#' ) - ); - ?> -
-
-
- -
-
+
+ +
+ + +