Created
May 26, 2025 11:57
-
-
Save rocketgeek/ebcc6cb44ec710d567e292801fb9c031 to your computer and use it in GitHub Desktop.
patch for form label link functionality in class-wp-members-forms.php
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
/** | |
* The WP_Members Forms Class. | |
* | |
* @package WP-Members | |
* @subpackage WP_Members Forms Object Class | |
* @since 3.1.0 | |
*/ | |
// Exit if accessed directly. | |
if ( ! defined( 'ABSPATH' ) ) { | |
exit(); | |
} | |
class WP_Members_Forms { | |
public $reg_form_showing = false; | |
public $file_user_id; // A container for the uploaded file user ID. | |
/** | |
* Plugin initialization function. | |
* | |
* @since 3.1.0 | |
*/ | |
function __construct() { | |
} | |
/** | |
* Sets the registration fields. | |
* | |
* @since 3.0.0 | |
* @since 3.1.5 Added $form argument. | |
* @since 3.3.0 Added $tag argument. | |
* | |
* @global stdClass $wpmem | |
* @param string $tag | |
* @param string $form The form being generated. | |
*/ | |
function load_fields( $tag = "all", $form = 'default' ) { | |
global $wpmem; | |
// @todo Temp fix for admin notification bug. | |
$tag = ( 'admin_notify' == $tag ) ? 'register' : $tag; | |
$tag = ( 'register_wp' == $tag ) ? 'register' : $tag; | |
// Get stored fields settings. | |
$fields = get_option( 'wpmembers_fields' ); | |
// Validate fields settings. | |
if ( ! isset( $fields ) || empty( $fields ) ) { | |
// Update settings. | |
$fields = array( array( 10, esc_html__( 'Email', 'wp-members' ), 'user_email', 'email', 'y', 'y', 'y', 'profile'=>true ) ); | |
} | |
// Check woo reg fields. | |
if ( 'woo' == $tag && 1 == $wpmem->woo->add_my_account_fields ) { | |
$woo_reg_fields = get_option( 'wpmembers_wcacct_fields' ); | |
$woo_reg_fields = ( $woo_reg_fields ) ? $woo_reg_fields : array(); | |
} | |
// Establish $assembled_fields as an array explicitly. | |
$assembled_fields = array(); | |
// Add new field array keys | |
foreach ( $fields as $key => $val ) { | |
// Start by checking if we need this field or not. | |
if ( | |
( 'register' == $tag && 'y' == $val[4] ) | |
|| ( 'profile' == $tag && ( ! isset( $val['profile'] ) || 1 == $val['profile'] ) ) // @todo Currently checking ! isset because some fields don't have $val['profile']. Should probably handle on update to set $val['profile'] for all fields. | |
|| ( 'all' == $tag ) | |
|| ( 'woo' == $tag && 1 == $wpmem->woo->add_my_account_fields && in_array( $val[2], $woo_reg_fields ) ) | |
) { | |
if ( 'woo' == $tag && in_array( $val[2], $woo_reg_fields ) ) { | |
$val[4] = 'y'; | |
} | |
// Key fields with meta key. | |
$meta_key = $val[2]; | |
// What is the field type. | |
$field_type = $val[3]; | |
// Old format, new key. | |
foreach ( $val as $subkey => $subval ) { | |
$assembled_fields[ $meta_key ][ $subkey ] = $subval; | |
} | |
// Setup field properties. | |
$assembled_fields[ $meta_key ]['label'] = $val[1]; | |
$assembled_fields[ $meta_key ]['type'] = $field_type; | |
$assembled_fields[ $meta_key ]['register'] = ( 'y' == $val[4] ) ? true : false; | |
$assembled_fields[ $meta_key ]['required'] = ( 'y' == $val[5] ) ? true : false; | |
$assembled_fields[ $meta_key ]['profile'] = ( isset( $val['profile'] ) ) ? $val['profile'] : ( ( 'y' == $val[4] ) ? true : false ); | |
$assembled_fields[ $meta_key ]['native'] = ( 'y' == $val[6] ) ? true : false; | |
// These field types have additional properties. | |
switch ( $field_type ) { | |
case 'checkbox': | |
$assembled_fields[ $meta_key ]['checked_value'] = $val[7]; | |
$assembled_fields[ $meta_key ]['checked_default'] = ( 'y' == $val[8] ) ? true : false; | |
$assembled_fields[ $meta_key ]['checkbox_label'] = ( isset( $val['checkbox_label'] ) ) ? $val['checkbox_label'] : 0; | |
break; | |
case 'select': | |
case 'multiselect': | |
case 'multicheckbox': | |
case 'radio': | |
case 'membership': | |
if ( 'membership' == $field_type ) { | |
/** | |
* Filter the membership field dropdown default. | |
* | |
* @since 3.5.0 | |
* | |
* @param string $default | |
*/ | |
$membership_default = apply_filters( 'wpmem_membership_field_default', wpmem_get_text( 'membership_field' ) ); | |
$val[7] = array( $membership_default . '|' ); | |
foreach( wpmem_get_memberships() as $membership_key => $membership_value ) { | |
$val[7][] = $membership_value['title'] . '|' . $membership_key; | |
} | |
} | |
// Correct a malformed value (if last value is empty due to a trailing comma). | |
if ( '' == end( $val[7] ) ) { | |
array_pop( $val[7] ); | |
$assembled_fields[ $meta_key ][7] = $val[7]; | |
} | |
$assembled_fields[ $meta_key ]['values'] = $val[7]; | |
$assembled_fields[ $meta_key ]['delimiter'] = ( isset( $val[8] ) ) ? $val[8] : '|'; | |
$assembled_fields[ $meta_key ]['options'] = array(); | |
foreach ( $val[7] as $value ) { | |
$pieces = explode( '|', trim( $value ) ); | |
// @todo The following originally eliminated an empty option value. However, this | |
// is needed for WooCommerce. Check to see if this causes issues elsewhere. | |
//if ( isset( $pieces[1] ) && $pieces[1] != '' ) { | |
$assembled_fields[ $meta_key ]['options'][ $pieces[1] ] = $pieces[0]; | |
//} | |
} | |
break; | |
case 'file': | |
case 'image': | |
$assembled_fields[ $meta_key ]['file_types'] = $val[7]; | |
break; | |
case 'hidden': | |
$assembled_fields[ $meta_key ]['value'] = $val[7]; | |
break; | |
default: | |
$assembled_fields[ $meta_key ]['value'] = ( isset( $val['value'] ) ) ? $val['value'] : ''; // @since 3.5.0 adds default value. | |
break; | |
} | |
} | |
} | |
// @todo Set for checking backwards compatibility, but eventually get $wpmem->fields out altogether. | |
$wpmem->fields = $assembled_fields; | |
return $assembled_fields; | |
} | |
/** | |
* Filter custom fields for localization. | |
* | |
* @since 3.3.9 | |
* | |
* @param array $fields | |
*/ | |
function localize_fields( $fields ) { | |
// @todo Find wpmem_custom_translation_strings() | |
if ( function_exists( 'wpmem_custom_translation_strings' ) ) { | |
$string_map = wpmem_custom_translation_strings( get_locale() ); | |
foreach ( $string_map as $meta_key => $value ) { | |
if ( is_array( $value ) ) { | |
if ( isset( $fields[ $meta_key ]['placeholder'] ) && isset( $value['placeholder'] ) ) { | |
$fields[ $meta_key ]['placeholder'] = $string_map[ $meta_key ]['placeholder']; | |
} | |
if ( isset( $fields[ $meta_key ]['title'] ) && isset( $value['title'] ) ) { | |
$fields[ $meta_key ]['title'] = $string_map[ $meta_key ]['title']; | |
} | |
if ( isset( $fields[ $meta_key ]['label'] ) && isset( $value['label'] ) ) { | |
$fields[ $meta_key ]['label'] = $string_map[ $meta_key ]['label']; | |
} | |
} else { | |
$fields[ $meta_key ]['label'] = $string_map[ $meta_key ]; | |
} | |
} | |
} | |
return $fields; | |
} | |
/** | |
* Get excluded meta fields. | |
* | |
* @since 3.0.0 | |
* @since 3.3.3 Update $tag to match wpmem_fields() tags. | |
* | |
* @param string $tag A tag so we know where the function is being used. | |
* @return array The excluded fields. | |
*/ | |
function excluded_fields( $tag ) { | |
// Default excluded fields. | |
$excluded_fields = array( 'password', 'confirm_password', 'confirm_email', 'password_confirm', 'email_confirm' ); | |
if ( 'update' == $tag || 'admin-profile' == $tag || 'user-profile' == $tag || 'wp-register' == $tag ) { | |
$excluded_fields[] = 'username'; | |
} | |
if ( 'admin-profile' == $tag || 'user-profile' == $tag ) { | |
array_push( $excluded_fields, 'first_name', 'last_name', 'nickname', 'display_name', 'user_email', 'description', 'user_url' ); | |
// If WooCommerce is used, remove these meta - WC already adds them in their own section. | |
if ( class_exists( 'woocommerce' ) ) { | |
array_push( $excluded_fields, | |
'billing_first_name', | |
'billing_last_name', | |
'billing_company', | |
'billing_address_1', | |
'billing_address_2', | |
'billing_city', | |
'billing_postcode', | |
'billing_country', | |
'billing_state', | |
'billing_email', | |
'billing_phone', | |
'shipping_first_name', | |
'shipping_last_name', | |
'shipping_company', | |
'shipping_address_1', | |
'shipping_address_2', | |
'shipping_city', | |
'shipping_postcode', | |
'shipping_country', | |
'shipping_state' | |
); | |
} | |
} | |
/** | |
* Filter excluded meta fields. | |
* | |
* @since 2.9.3 | |
* @since 3.0.0 Moved to new method in WP_Members Class. | |
* @since 3.3.3 Update $tag to match wpmem_fields() tags. | |
* | |
* @param array An array of the field meta names to exclude. | |
* @param string $tag A tag so we know where the function is being used. | |
*/ | |
$excluded_fields = apply_filters( 'wpmem_exclude_fields', $excluded_fields, $tag ); | |
// Return excluded fields. | |
return $excluded_fields; | |
} | |
/** | |
* Creates form fields | |
* | |
* Creates various form fields and returns them as a string. | |
* | |
* @since 3.1.0 | |
* @since 3.1.1 Added $delimiter. | |
* @since 3.1.2 Changed $valtochk to $compare. | |
* @since 3.1.6 Added $placeholder. | |
* @since 3.1.7 Added number type & $min, $max, $title and $pattern attributes. | |
* @since 3.2.0 Added $id argument. | |
* @since 3.2.4 Added radio group and multiple checkbox individual item labels. | |
* | |
* @global object $wpmem The WP_Members object class. | |
* @param array $args { | |
* @type string $id | |
* @type string $name | |
* @type string $type | |
* @type string $value | |
* @type string $compare | |
* @type string $class | |
* @type boolean $required | |
* @type string $delimiter | |
* @type string $placeholder | |
* @type string $pattern | |
* @type string $title | |
* @type string $min | |
* @type string $max | |
* @type string $rows Number of rows for a textarea (default:5). | |
* @type string $cols Number of columns for a textarea (default:20). | |
* } | |
* @return string $str The field returned as a string. | |
*/ | |
function create_form_field( $args ) { | |
// Set defaults for most possible $args. | |
$id = ( isset( $args['id'] ) ) ? esc_attr( $args['id'] ) : esc_attr( $args['name'] ); | |
$name = esc_attr( $args['name'] ); | |
$type = esc_attr( $args['type'] ); | |
$value = ( isset( $args['value'] ) ) ? $args['value'] : ''; | |
$compare = ( isset( $args['compare'] ) ) ? $args['compare'] : ''; | |
$class = ( isset( $args['class'] ) ) ? $args['class'] : 'textbox'; | |
$required = ( isset( $args['required'] ) ) ? $args['required'] : false; | |
$delimiter = ( isset( $args['delimiter'] ) ) ? $args['delimiter'] : '|'; | |
$placeholder = ( isset( $args['placeholder'] ) ) ? $args['placeholder'] : false; | |
$pattern = ( isset( $args['pattern'] ) ) ? $args['pattern'] : false; | |
$title = ( isset( $args['title'] ) ) ? $args['title'] : false; | |
$file_types = ( isset( $args['file_types'] ) ) ? $args['file_types'] : false; | |
$timestamp = ( isset( $args['timestamp_display'] ) ) ? $args['timestamp_display'] : 'Y-m-d'; | |
// Handle field creation by type. | |
switch ( $type ) { | |
/* | |
* Field types text|url|email|number|date are all handled essentially the | |
* same. The primary differences are CSS class (with a default fallback | |
* of 'textbox'), how values are escaped, and the application of min|max | |
* values for number fields. | |
*/ | |
case "text": | |
case "url": | |
case "email": | |
case "number": | |
case "date": | |
case "timestamp": | |
$class = ( 'textbox' == $class ) ? "textbox" : wpmem_sanitize_class( $class ); | |
switch ( $type ) { | |
case 'url': | |
$value = esc_url( $value ); | |
break; | |
case 'timestamp': | |
$value = ( '' != $value ) ? date( $timestamp, intval( $value ) ) : ''; | |
break; | |
default: | |
$value = wp_unslash( esc_attr( $value ) ); | |
break; | |
} | |
$required = ( $required ) ? ' required' : ''; | |
$placeholder = ( $placeholder ) ? ' placeholder="' . esc_attr( __( $placeholder, 'wp-members' ) ) . '"' : ''; | |
$title = ( $title ) ? ' title="' . esc_attr( __( $title, 'wp-members' ) ) . '"' : ''; | |
$pattern = ( $pattern && 'number' != $type ) ? ' pattern="' . esc_attr( $pattern ) . '"' : ''; | |
$min = ( isset( $args['min'] ) && $args['min'] != '' ) ? ' min="' . esc_attr( $args['min'] ) . '"' : ''; | |
$max = ( isset( $args['max'] ) && $args['max'] != '' ) ? ' max="' . esc_attr( $args['max'] ). '"' : ''; | |
$str = "<input name=\"$name\" type=\"$type\" id=\"$id\" value=\"$value\" class=\"$class\"$placeholder$title$pattern$min$max" . ( ( $required ) ? " required " : "" ) . " />"; | |
break; | |
case "password": | |
$class = wpmem_sanitize_class( $class ); | |
$placeholder = ( $placeholder ) ? ' placeholder="' . esc_attr( __( $placeholder, 'wp-members' ) ) . '"' : ''; | |
$pattern = ( $pattern ) ? ' pattern="' . esc_attr( $pattern ) . '"' : ''; | |
$title = ( $title ) ? ' title="' . esc_attr( __( $title, 'wp-members' ) ) . '"' : ''; | |
$str = "<input name=\"$name\" type=\"$type\" id=\"$id\" class=\"$class\"$placeholder$title$pattern" . ( ( $required ) ? " required " : "" ) . " />"; | |
break; | |
case "image": | |
case "file": | |
if ( $file_types ) { | |
$file_types = explode( '|', $file_types ); | |
foreach( $file_types as $file_type ) { | |
$array[] = "." . $file_type; | |
} | |
$accept = ' accept="' . implode( ",", $array ) . '"'; | |
} else { | |
$accept = ''; | |
} | |
$class = ( 'textbox' == $class ) ? "file" : wpmem_sanitize_class( $class ); | |
$str = "<input name=\"$name\" type=\"file\" id=\"$id\" value=\"" . esc_attr( $value ) . "\" class=\"$class\"$accept" . ( ( $required ) ? " required " : "" ) . ( ( 'image' == $type ) ? ' onchange="loadFile(event, this.id)"' : '' ) . ' />'; | |
break; | |
case "checkbox": | |
$class = ( 'textbox' == $class ) ? "checkbox" : wpmem_sanitize_class( $class ); | |
$str = "<input name=\"$name\" type=\"$type\" id=\"$id\" value=\"" . esc_attr( $value ) . "\"" . checked( $value, $compare, false ) . ( ( $required ) ? " required " : "" ) . " />"; | |
break; | |
case "textarea": | |
$value = esc_textarea( stripslashes( $value ) ); // stripslashes( esc_textarea( $value ) ); | |
$class = ( 'textbox' == $class ) ? "textarea" : wpmem_sanitize_class( $class ); | |
$placeholder = ( $placeholder ) ? ' placeholder="' . esc_attr( __( $placeholder, 'wp-members' ) ) . '"' : ''; | |
$rows = ( isset( $args['rows'] ) && $args['rows'] ) ? esc_attr( $args['rows'] ) : '5'; | |
$cols = ( isset( $args['cols'] ) && $args['cols'] ) ? esc_attr( $args['cols'] ) : '20'; | |
$str = "<textarea cols=\"$cols\" rows=\"$rows\" name=\"$name\" id=\"$id\" class=\"$class\"$placeholder" . ( ( $required ) ? " required " : "" ) . ">$value</textarea>"; | |
break; | |
case "hidden": | |
$str = "<input name=\"$name\" type=\"$type\" value=\"" . esc_attr( $value ) . "\" />"; | |
break; | |
case "option": | |
$str = "<option value=\"" . esc_attr( $value ) . "\" " . selected( $value, $compare, false ) . " >" . __( $name, 'wp-members' ) . "</option>"; | |
break; | |
case "select": | |
case "multiselect": | |
case "membership": | |
$class = ( 'textbox' == $class && 'multiselect' != $type ) ? "dropdown" : $class; | |
$class = ( 'textbox' == $class && 'multiselect' == $type ) ? "multiselect" : $class; | |
$pname = ( 'multiselect' == $type ) ? $name . "[]" : $name; | |
$str = "<select name=\"$pname\" id=\"$id\" class=\"$class\"" . ( ( 'multiselect' == $type ) ? " multiple " : "" ) . ( ( $required ) ? " required " : "" ) . ">\n"; | |
if ( 'membership' == $type ) { | |
$value = array( wpmem_get_text( 'membership_field' ) . '|' ); | |
foreach( wpmem_get_memberships() as $membership_key => $membership_value ) { | |
$value[] = $membership_value['title'] . '|' . $membership_key; | |
} | |
} | |
foreach ( $value as $option ) { | |
$pieces = array_map( 'trim', explode( '|', $option ) ); | |
if ( 'multiselect' == $type ) { | |
$chk = ''; | |
$values = ( empty( $compare ) ) ? array() : ( is_array( $compare ) ? $compare : explode( $delimiter, $compare ) ); | |
} else { | |
$chk = $compare; | |
$values = array(); | |
} | |
if ( isset( $pieces[1] ) && '' != $pieces[1] ) { | |
$chk = ( ( isset( $pieces[2] ) && '' == $compare ) || in_array( $pieces[1], $values ) ) ? $pieces[1] : $chk; | |
} else { | |
$chk = 'not selected'; | |
} | |
$pieces[1] = ( isset( $pieces[1] ) ) ? $pieces[1] : ''; // If someone skipped a pipe, treat it as empty. | |
$str = $str . "<option value=\"$pieces[1]\"" . selected( $pieces[1], $chk, false ) . ">" . esc_attr( __( $pieces[0], 'wp-members' ) ) . "</option>\n"; | |
} | |
$str = $str . "</select>"; | |
break; | |
case "multicheckbox": | |
$class = ( 'textbox' == $class ) ? "checkbox" : $class; | |
$str = ''; | |
$num = 1; | |
foreach ( $value as $option ) { | |
$pieces = explode( '|', $option ); | |
$values = ( empty( $compare ) ) ? array() : ( is_array( $compare ) ? $compare : explode( $delimiter, $compare ) ); | |
$chk = ( isset( $pieces[2] ) && '' == $compare ) ? $pieces[1] : ''; | |
if ( isset( $pieces[1] ) && '' != $pieces[1] ) { | |
$id_value = esc_attr( $id . '[' . $pieces[1] . ']' ); | |
$label = wpmem_form_label( array( 'meta_key'=>$id_value, 'label'=>esc_html( __( $pieces[0], 'wp-members' ) ), 'type'=>'multicheckbox', 'id'=>$id_value ) ); | |
$str = $str . wpmem_form_field( array( | |
'id' => $id_value, | |
'name' => $name . '[]', | |
'type' => 'checkbox', | |
'value' => $pieces[1], | |
'compare' => ( in_array( $pieces[1], $values ) ) ? $pieces[1] : $chk, | |
) ) . " " . $label . "<br />\n"; | |
} else { | |
$str = $str . '<span class="div_multicheckbox_separator">' . esc_html( __( $pieces[0], 'wp-members' ) ) . "</span><br />\n"; | |
} | |
} | |
break; | |
case "radio": | |
$class = ( 'textbox' == $class ) ? "radio" : wpmem_sanitize_class( $class ); | |
$str = ''; | |
$num = 1; | |
foreach ( $value as $option ) { | |
$pieces = explode( '|', $option ); | |
$id_num = $id . '_' . $num; | |
if ( isset( $pieces[1] ) && '' != $pieces[1] ) { | |
$label = wpmem_form_label( array( 'meta_key'=>esc_attr( $id_num ), 'label'=>esc_html( __( $pieces[0], 'wp-members' ) ), 'type'=>'radio', 'id'=>esc_attr( "label_" . $id_num ) ) ); | |
$str = $str . "<input type=\"radio\" name=\"$name\" id=\"" . esc_attr( $id_num ) . "\" value=\"" . esc_attr( $pieces[1] ) . '"' . checked( $pieces[1], $compare, false ) . ( ( $required ) ? " required " : " " ) . "> $label<br />\n"; | |
$num++; | |
} else { | |
$str = $str . '<span class="div_radio_separator">' . esc_html( __( $pieces[0], 'wp-members' ) ) . "</span><br />\n"; | |
} | |
} | |
break; | |
} | |
return $str; | |
} // End create_form_field() | |
/** | |
* Create form label. | |
* | |
* @since 3.1.7 | |
* @since 3.2.4 Added $id | |
* | |
* @param array $args { | |
* @type string $meta_key | |
* @type string $label | |
* @type string $type | |
* @type string $id (optional) | |
* @type string $class (optional) | |
* @type string $required (optional) | |
* @type string $req_mark (optional) | |
* } | |
* @return string $label | |
*/ | |
function create_form_label( $args ) { | |
$defaults = array( | |
'meta_key' => $args['meta_key'], | |
'label' => $args['label'], | |
'type' => $args['type'], | |
'class' => ( isset( $args['class'] ) ) ? $args['class'] : false, | |
'id' => ( isset( $args['id'] ) ) ? $args['id'] : false, | |
'required' => ( isset( $args['required'] ) ) ? $args['required'] : false, | |
'req_mark ' => ( isset( $args['req_mark'] ) ) ? $args['req_mark'] : false, | |
'label_href' => ( isset( $args['label_href'] ) ) ? $args['label_href'] : false, | |
); | |
/** | |
* Filter the form label args before assembly. | |
* | |
* @since 3.5.3 | |
* | |
* @param array $args | |
*/ | |
$args = apply_filters( 'wpmem_create_form_label_args', $defaults ); | |
$req_mark = ( ! isset( $args['req_mark'] ) || ! $args['req_mark'] ) ? wpmem_get_text( 'register_req_mark' ) : $args['req_mark']; | |
$label_text = __( $args['label'], 'wp-members' ); | |
if ( isset( $args['label_href'] ) && '' != $args['label_href'] ) { | |
// Adjust placeholders. | |
$label_text = str_replace( '%', '%s', esc_html( $label_text ) ); | |
/** | |
* Filters the anchor tag. | |
* | |
* @since 3.5.3 | |
* | |
* @param array $atts An array of attributes for the <a> tag. | |
* @param string $meta_key Meta key of the field. | |
*/ | |
$tag_atts = apply_filters( 'wpmem_form_label_link', array ( | |
'href' => $args['label_href'], | |
'target' => '_blank', | |
), $args['meta_key'] ); | |
$anchor_tag = "<a "; | |
foreach ( $tag_atts as $attribute => $value ) { | |
$anchor_tag .= ( '' != $value ) ? esc_attr( $attribute ) . '="' . esc_attr( $value ) . '" ' : esc_attr( $attribute ) . ' '; | |
} | |
$anchor_tag .= ">"; | |
$label_text_escd = sprintf( $label_text, $anchor_tag, '</a>' ); | |
} else { | |
$label_text_escd = esc_html( $label_text ); | |
} | |
if ( ! $args['class'] ) { | |
$class = ( $args['type'] == 'password' || $args['type'] == 'email' || $args['type'] == 'url' ) ? 'text' : $args['type']; | |
} else { | |
$class = $args['class']; | |
} | |
$id_escd = ( $args['id'] ) ? ' id="' . esc_attr( $args['id'] ) . '"' : ''; | |
$label = '<label for="' . esc_attr( $args['meta_key'] ) . '"' . $id_escd . ' class="' . wpmem_sanitize_class( $class ) . '">' . $label_text_escd; | |
$label = ( $args['required'] ) ? $label . $req_mark : $label; // $req_mark text is escaped in wpmem_get_text() and then wrapped with html tag. | |
$label = $label . '</label>'; | |
return $label; | |
} | |
/** | |
* Uploads file from the user. | |
* | |
* @since 3.1.0 | |
* | |
* @param array $file | |
* @param int $user_id | |
* @return int|bool | |
*/ | |
function do_file_upload( $file = array(), $user_id = false ) { | |
// Filter the upload directory. | |
add_filter( 'upload_dir', array( &$this, 'file_upload_dir' ) ); | |
// Set up user ID for use in upload process. | |
$this->file_user_id = ( $user_id ) ? $user_id : 0; | |
// Get WordPress file upload processing scripts. | |
require_once( ABSPATH . 'wp-admin/includes/file.php' ); | |
require_once( ABSPATH . 'wp-admin/includes/media.php' ); | |
$file_return = wp_handle_upload( $file, array( 'test_form' => false ) ); | |
if ( isset( $file_return['error'] ) || isset( $file_return['upload_error_handler'] ) ) { | |
return false; | |
} else { | |
$attachment = array( | |
'post_mime_type' => $file_return['type'], | |
'post_title' => preg_replace( '/\.[^.]+$/', '', basename( $file_return['file'] ) ), | |
'post_content' => '', | |
'post_status' => 'inherit', | |
'guid' => $file_return['url'], | |
'post_author' => ( $user_id ) ? $user_id : '', | |
); | |
$attachment_id = wp_insert_attachment( $attachment, $file_return['url'] ); | |
require_once( ABSPATH . 'wp-admin/includes/image.php' ); | |
$attachment_data = wp_generate_attachment_metadata( $attachment_id, $file_return['file'] ); | |
wp_update_attachment_metadata( $attachment_id, $attachment_data ); | |
if ( 0 < intval( $attachment_id ) ) { | |
// Returns an array with file information. | |
return $attachment_id; | |
} | |
} | |
return false; | |
} // End upload_file() | |
/** | |
* Sets the file upload directory. | |
* | |
* This is a filter function for upload_dir. | |
* | |
* @link https://codex.wordpress.org/Plugin_API/Filter_Reference/upload_dir | |
* | |
* @since 3.1.0 | |
* | |
* @param array $param { | |
* The directory information for upload. | |
* | |
* @type string $path | |
* @type string $url | |
* @type string $subdir | |
* @type string $basedir | |
* @type string $baseurl | |
* @type string $error | |
* } | |
* @return array $param | |
*/ | |
function file_upload_dir( $param ) { | |
$user_id = ( isset( $this->file_user_id ) ) ? $this->file_user_id : null; | |
$args = array( | |
'user_id' => $user_id, | |
'wpmem_dir' => wpmem_get_upload_base(), | |
'user_dir' => 'user_files/' . $user_id, | |
); | |
/** | |
* Filter the user directory elements. | |
* | |
* @since 3.1.0 | |
* | |
* @param array $args | |
*/ | |
$args = apply_filters( 'wpmem_user_upload_dir', $args ); | |
$param['subdir'] = '/' . $args['wpmem_dir'] . '/' . $args['user_dir']; | |
$param['path'] = $param['basedir'] . '/' . $args['wpmem_dir'] . '/' . $args['user_dir']; | |
$param['url'] = $param['baseurl'] . '/' . $args['wpmem_dir'] . '/' . $args['user_dir']; | |
return $param; | |
} | |
/** | |
* Login Form Builder. | |
* | |
* Builds the form used for login, change password, and reset password. | |
* | |
* @since 2.5.1 | |
* @since 3.1.7 Moved to forms object class as login_form(). | |
* @since 3.1.7 Added WP action login_form. | |
* @since 3.2.6 Added nonce to the short form. | |
* | |
* @param string $page | |
* @param array $arr { | |
* The elements needed to generate the form (login|reset password|forgotten password). | |
* | |
* @type string $heading Form heading text. | |
* @type string $action The form action (login|pwdchange|pwdreset|getusername). | |
* @type string $button_text Form submit button text. | |
* @type array $inputs { | |
* The form input values. | |
* | |
* @type array { | |
* | |
* @type string $name The field label. | |
* @type string $type Input type. | |
* @type string $tag Input tag name. | |
* @type string $class Input tag class. | |
* @type string $div Div wrapper class. | |
* } | |
* } | |
* @type string $redirect_to Optional. URL to redirect to. | |
* } | |
* @return string $form The HTML for the form as a string. | |
*/ | |
function login_form( $mixed, $arr = array() ) { | |
global $wpmem; | |
// Handle legacy use. | |
if ( is_array( $mixed ) ) { | |
$page = ( isset( $mixed['page'] ) ) ? $mixed['page'] : 'login'; | |
$arr = $mixed; | |
} else { | |
$page = $mixed; | |
} | |
$action = ( ! isset( $arr['action'] ) ) ? 'login' : $arr['action']; | |
// Set up redirect_to | |
$redirect_to = wpmem_get_redirect_to( $arr ); | |
// Set up default wrappers. | |
// NOTE: DO NOT EDIT! There is a filter hook for this -> wpmem_login_form_args. | |
$defaults = array( | |
// wrappers | |
'heading_before' => '<legend>', | |
'heading_after' => '</legend>', | |
'fieldset_before' => '<fieldset>', | |
'fieldset_after' => '</fieldset>', | |
'main_div_before' => '<div id="wpmem_login">', | |
'main_div_after' => '</div>', | |
'row_before' => '', | |
'row_after' => '', | |
'buttons_before' => '<div class="button_div">', | |
'buttons_after' => '</div>', | |
'link_before' => '<div class="link-text">', | |
'link_after' => '</div>', | |
'link_span_before' => '<span class="link-text-%s">', | |
'link_span_after' => '</span>', | |
// classes & ids | |
'form_id' => 'wpmem_' . $action . '_form', | |
'form_class' => 'form', | |
'button_id' => '', | |
'button_class' => 'buttons', | |
// other | |
'strip_breaks' => true, | |
'wrap_inputs' => true, | |
'remember_check' => true, | |
'n' => "\n", | |
't' => "\t", | |
'redirect_to' => $redirect_to, | |
'login_form_action' => true, | |
'novalidate' => false, | |
); | |
/** | |
* Filter the default form arguments. | |
* | |
* This filter accepts an array of various elements to replace the form defaults. This | |
* includes default tags, labels, text, and small items including various booleans. | |
* | |
* @since 2.9.0 | |
* @since 3.3.0 Passes $defaults as an argument. | |
* | |
* @param array $args { | |
* An array of arguments to merge with defaults. | |
* | |
* @type string $heading_before Default: '<legend>' | |
* @type string $heading_after Default: '</legend>' | |
* @type string $fieldset_before Default: '<fieldset>' | |
* @type string $fieldset_after Default: '</fieldset>' | |
* @type string $main_div_before Default: '<div id="wpmem_login">' | |
* @type string $main_div_after Default: '</div>' | |
* @type string $row_before Default: '' | |
* @type string $row_after Default: '' | |
* @type string $buttons_before Default: '<div class="button_div">' | |
* @type string $buttons_after Default: '</div>' | |
* @type string $link_before Default: '<div class="link-text">' | |
* @type string $link_after Default: '</div>' | |
* @type string $link_span_before Default: '<span class="link-text-%s">' | |
* @type string $link_span_after Default: '</span>' | |
* @type string $form_id Default: 'wpmem_' . $action . '_form' (for example, wpmem_login_form or wpmem_pwdreset_form) | |
* @type string $form_class Default: 'form' | |
* @type string $button_id Default: '' | |
* @type string $button_class Default: buttons' | |
* @type boolean $strip_breaks Default: true (if true, strips all line breaks from the generated HTML) | |
* @type boolean $wrap_inputs Default: true (if true, includes main_div_before/after wrappers around input tags) | |
* @type boolean $remember_check Default: true | |
* @type string $n Default: "\n" (the new line character if breaks are not stripped (see $strip_breaks)) | |
* @type string $t Default: "\t" (the line indent character if breaks are not stripped (see $strip_breaks)) | |
* @type string $redirect_to Default: (the $redirect_to argument passed to the function) | |
* @type boolean $login_form_action Default: true (if true, adds the WP login_form action) | |
* } | |
* @param string $action The action being performed by the form. login|pwdreset|pwdchange|getusername. | |
*/ | |
$args = apply_filters( 'wpmem_login_form_args', $defaults, $action ); | |
// Merge $args with defaults. | |
$args = wp_parse_args( $args, $defaults ); | |
// Build the input rows. | |
foreach ( $arr['inputs'] as $input ) { | |
$label = '<label for="' . esc_attr( $input['tag'] ) . '">' . $input['name'] . '</label>'; | |
$field = wpmem_form_field( array( | |
'name' => $input['tag'], | |
'type' => $input['type'], | |
'class' => $input['class'], | |
'required' => true, | |
) ); | |
$field_before = ( $args['wrap_inputs'] ) ? '<div class="' . wpmem_sanitize_class( $input['div'] ) . '">' : ''; | |
$field_after = ( $args['wrap_inputs'] ) ? '</div>' : ''; | |
$rows[] = array( | |
'row_before' => $args['row_before'], | |
'label' => $label, | |
'field_before' => $field_before, | |
'field' => $field, | |
'field_after' => $field_after, | |
'row_after' => $args['row_after'], | |
); | |
} | |
/** | |
* Filter the array of form rows. | |
* | |
* This filter receives an array of the main rows in the form, each array element being | |
* an array of that particular row's pieces. This allows making changes to individual | |
* parts of a row without needing to parse through a string of HTML. | |
* | |
* @since 2.9.0 | |
* @since 3.2.6 Added $arr parameter so all settings are passed. | |
* | |
* @param array $rows An array containing the form rows. | |
* @param string $action The action being performed by the form. login|pwdreset|pwdchange|getusername. | |
* @param array $arr An array containing all of the form settings. | |
*/ | |
$rows = apply_filters( 'wpmem_login_form_rows', $rows, $action, $arr ); | |
// Put the rows from the array into $form. | |
$form = ''; | |
foreach ( $rows as $row_item ) { | |
$row = ( $row_item['row_before'] != '' ) ? $row_item['row_before'] . $args['n'] . $row_item['label'] . $args['n'] : $row_item['label'] . $args['n']; | |
$row .= ( $row_item['field_before'] != '' ) ? $row_item['field_before'] . $args['n'] . $args['t'] . $row_item['field'] . $args['n'] . $row_item['field_after'] . $args['n'] : $row_item['field'] . $args['n']; | |
$row .= ( $row_item['row_after'] != '' ) ? $row_item['row_after'] . $args['n'] : ''; | |
$form.= $row; | |
} | |
// Handle outside elements added to the login form (currently ONLY for login). | |
if ( 'login' == $action && $args['login_form_action'] ) { | |
ob_start(); | |
/** This action is documented in wp-login.php */ | |
do_action( 'login_form' ); | |
$add_to_form = ob_get_contents(); | |
ob_end_clean(); | |
$form.= $add_to_form; | |
} | |
// Build hidden fields, filter, and add to the form. | |
if ( 'set_password_from_key' == wpmem_get( 'a', false, 'request' ) && 'login' != $action ) { | |
$hidden['action'] = wpmem_form_field( array( 'name' => 'a', 'type' => 'hidden', 'value' => 'set_password_from_key' ) ); | |
$hidden['key'] = wpmem_form_field( array( 'name' => 'key', 'type' => 'hidden', 'value' => sanitize_text_field( wpmem_get( 'key', null, 'request' ) ) ) ); | |
$hidden['login'] = wpmem_form_field( array( 'name' => 'login', 'type' => 'hidden', 'value' => sanitize_user( wpmem_get( 'login', null, 'request' ) ) ) ); | |
} else { | |
$hidden['action'] = wpmem_form_field( array( 'name' => 'a', 'type' => 'hidden', 'value' => $action ) ); | |
$hidden['redirect_to'] = wpmem_form_field( array( 'name' => 'redirect_to', 'type' => 'hidden', 'value' => esc_url( $args['redirect_to'] ) ) ); | |
} | |
if ( $action != 'login' ) { | |
$hidden['formsubmit'] = wpmem_form_field( array( 'name' => 'formsubmit', 'type' => 'hidden', 'value' => '1' ) ); | |
} | |
/** | |
* Filter hidden fields array. | |
* | |
* @since 3.4.0 | |
* | |
* @param array $hidden | |
* @param string $action The action being performed by the form. login|pwdreset|pwdchange|getusername. | |
*/ | |
$hidden = apply_filters( 'wpmem_login_hidden_field_rows', $hidden, $action ); | |
$hidden_field_string = ''; | |
foreach ( $hidden as $field ) { | |
$hidden_field_string .= $field . $args['n']; | |
} | |
/** | |
* Filter the hidden field HTML. | |
* | |
* @since 2.9.0 | |
* | |
* @param string $hidden The generated HTML of hidden fields. | |
* @param string $action The action being performed by the form. login|pwdreset|pwdchange|getusername. | |
*/ | |
$form = $form . apply_filters( 'wpmem_login_hidden_fields', $hidden_field_string, $action ); | |
// Build the buttons, filter, and add to the form. | |
if ( $action == 'login' ) { | |
$buttons[] = ( $args['remember_check'] ) ? $args['t'] . wpmem_form_field( array( 'name' => 'rememberme', 'type' => 'checkbox', 'value' => 'forever' ) ) . ' ' . '<label for="rememberme">' . wpmem_get_text( 'remember_me' ) . '</label> ' . $args['n'] : ''; | |
$buttons[] = $args['t'] . '<input type="submit" name="Submit" value="' . esc_attr( $arr['button_text'] ) . '" class="' . wpmem_sanitize_class( $args['button_class'] ) . '" />' . $args['n']; | |
} else { | |
$buttons[] = '<input type="submit" name="Submit" value="' . esc_attr( $arr['button_text'] ) . '" class="' . wpmem_sanitize_class( $args['button_class'] ) . '" />' . $args['n']; | |
} | |
/** | |
* Filter the button parts. | |
* | |
* @since 3.4.5 | |
* | |
* @param array $rows | |
* @param string $action | |
*/ | |
$buttons = apply_filters( 'wpmem_login_form_button_rows', $buttons, $action ); | |
// HTML assembly for buttons. | |
$button_html = ''; | |
foreach ( $buttons as $button_row ) { | |
$button_html .= $button_row; | |
} | |
/** | |
* Filter the HTML for form buttons. | |
* | |
* The string includes the buttons, as well as the before/after wrapper elements. | |
* | |
* @since 2.9.0 | |
* | |
* @param string $buttons The generated HTML of the form buttons. | |
* @param string $action The action being performed by the form. login|pwdreset|pwdchange|getusername. | |
*/ | |
$form = $form . apply_filters( 'wpmem_login_form_buttons', $args['buttons_before'] . $args['n'] . $button_html . $args['buttons_after'] . $args['n'], $action ); | |
$links_array = array( | |
'forgot' => array( | |
'tag' => 'forgot', | |
'link' => wpmem_pwd_reset_url(), | |
'page' => 'profile', | |
'action' => 'login', | |
), | |
'register' => array( | |
'tag' => 'reg', | |
'link' => wpmem_register_url(), | |
'page' => 'register', | |
'action' => 'login', | |
), | |
'username' => array( | |
'tag' => 'username', | |
'link' => wpmem_forgot_username_url(), | |
'page' => 'profile', | |
'action' => 'pwdreset', | |
), | |
); | |
if ( wpmem_is_enabled( 'act_link' ) ) { | |
$links_array['reconfirm'] = array( | |
'tag' => 'reconfirm', | |
'link' => wpmem_reconfirm_url(), | |
'page' => 'profile', | |
'action' => 'pwdreset', | |
); | |
} | |
foreach ( $links_array as $key => $value ) { | |
$tag = $value['tag']; | |
if ( ( $wpmem->user_pages[ $value['page'] ] || 'profile' == $page ) && $value['action'] == $action ) { | |
/** | |
* Filters register, forgot password, forgot username, and resend confirmation links. | |
* | |
* @since 2.8.0 | |
* @since 3.1.7 Combined all to a single process. | |
* @since 3.2.5 Added $tag parameter. | |
* | |
* @param string The raw link. | |
* @param string $tag forgot|reg|pwdreset|username. | |
*/ | |
$link = apply_filters( "wpmem_{$tag}_link", $value['link'], $tag ); | |
$str = wpmem_get_text( "{$key}_link_before" ) . '<a href="' . esc_url( $link ) . '">' . wpmem_get_text( "{$key}_link" ) . '</a>'; | |
$link_str = $args['link_before']; | |
$link_str.= ( '' != $args['link_span_before'] ) ? sprintf( $args['link_span_before'], $key ) : ''; | |
/** | |
* Filters the register, forgot password, forgot username, and resend confirmation links HTML. | |
* | |
* @since 2.9.0 | |
* @since 3.0.9 Added $link parameter. | |
* @since 3.1.7 Combined all to a single process. | |
* @since 3.2.5 Added $tag parameter. | |
* | |
* @param string $str The link HTML. | |
* @param string $link The link. | |
* @param string $tag forgot|reg|pwdreset. | |
*/ | |
$link_str.= apply_filters( "wpmem_{$tag}_link_str", $str, $link, $tag ); | |
$link_str.= ( '' != $args['link_span_after'] ) ? $args['link_span_after'] : ''; | |
$link_str.= $args['link_after'] . $args['n']; | |
/* | |
* If this is the register link, and the current post type is set to | |
* display the register form, and the current page is not the login | |
* page, then do not add the register link, otherwise add the link. | |
*/ | |
if ( 'register' == $key ) { | |
if ( ! isset( $wpmem->user_pages['register'] ) || '' == $wpmem->user_pages['register'] ) { | |
$form = $form; | |
} else { | |
if ( isset( $wpmem->user_pages['login'] ) && '' != $wpmem->user_pages['login'] ) { | |
$form = ( 1 == $wpmem->show_reg[ get_post_type( get_the_ID() ) ] && wpmem_current_url( true, false ) != wpmem_login_url() ) ? $form : $form . $link_str; | |
} else { | |
global $post; | |
if ( has_shortcode( $post->post_content, 'wpmem_profile' ) ) { | |
$form = $form; | |
} else { | |
$form = ( 1 == $wpmem->show_reg[ get_post_type( get_the_ID() ) ] && ! has_shortcode( $post->post_content, 'wpmem_form' ) ) ? $form : $form . $link_str; | |
} | |
} | |
} | |
} else { | |
$form = $form . $link_str; | |
} | |
} | |
} | |
$novalidate = ( $args['novalidate'] ) ? 'novalidate' : ''; | |
// Apply the heading. | |
$form = $args['heading_before'] . $arr['heading'] . $args['heading_after'] . $args['n'] . $form; | |
// Apply fieldset wrapper. | |
$form = $args['fieldset_before'] . $args['n'] . $form . $args['fieldset_after'] . $args['n']; | |
// Apply nonce. | |
$form = wp_nonce_field( 'wpmem_shortform_nonce', '_wpmem_' . $action . '_nonce', true, false ) . $args['n'] . $form; | |
// Apply form wrapper. | |
$form = '<form action="' . esc_url( get_permalink() ) . '" method="POST" id="' . wpmem_sanitize_class( $args['form_id'] ) . '" class="' . wpmem_sanitize_class( $args['form_class'] ) . '"' . $novalidate . '>' . $args['n'] . $form . '</form>'; | |
// Apply anchor. | |
$form = '<a id="' . esc_attr( $action ) . '"></a>' . $args['n'] . $form; | |
// Apply main wrapper. | |
$form = $args['main_div_before'] . $args['n'] . $form . $args['n'] . $args['main_div_after']; | |
// Remove line breaks. | |
$form = ( $args['strip_breaks'] ) ? str_replace( array( "\n", "\r", "\t" ), array( '','','' ), $form ) : $form; | |
/** | |
* Filter the generated HTML of the entire form. | |
* | |
* @since 2.7.4 | |
* @since 2.9.1 Added $action argument | |
* | |
* @param string $form The HTML of the final generated form. | |
* @param string $action The action being performed by the form. login|pwdreset|pwdchange|getusername. | |
*/ | |
$form = apply_filters( 'wpmem_login_form', $form, $action ); | |
/** | |
* Filter before the form. | |
* | |
* This rarely used filter allows you to stick any string onto the front of | |
* the generated form. | |
* | |
* @since 2.7.4 | |
* | |
* @param string $str The HTML to add before the form. Default null. | |
* @param string $action The action being performed by the form. login|pwdreset|pwdchange|getusername. | |
*/ | |
$form = apply_filters( 'wpmem_login_form_before', '', $action ) . $form; | |
return $form; | |
} // End login_form. | |
/** | |
* Registration Form Builder. | |
* | |
* Outputs the form for new user registration and existing user edits. | |
* | |
* @since 2.5.1 | |
* @since 3.1.7 Moved to forms object class as register_form(). | |
* @since 3.2.5 use_nonce now obsolete (nonce is added automatically). | |
* @since 3.3.0 $heading argument obsolete. | |
* @since 3.3.3 Image field type now shows the preview image when "choose file" is clicked. | |
* @since 3.4.6 Added $user object as a filterable arg. | |
* | |
* @global object $wpmem The WP_Members object. | |
* @param mixed $mixed (optional) String toggles between new registration ('new') and user profile edit ('edit'), or array containing settings arguments. | |
* @return string $form The HTML for the entire form as a string. | |
*/ | |
function register_form( $mixed = 'new', $redirect_to = null ) { | |
/* | |
* Removes the action to load form elements for the WP registration | |
* form. Otherwise, when the register_form action is fired in this | |
* form, we'd get a duplication of all custom fields. | |
*/ | |
remove_action( 'register_form', 'wpmem_wp_register_form' ); | |
// Handle legacy use. | |
if ( is_array( $mixed ) ) { | |
$id = ( isset( $mixed['id'] ) ) ? $mixed['id'] : ''; | |
$tag = ( isset( $mixed['tag'] ) ) ? $mixed['tag'] : 'new'; | |
$heading = ( isset( $mixed['heading'] ) ) ? $mixed['heading'] : ''; | |
$redirect_to = ( isset( $mixed['redirect_to'] ) ) ? $mixed['redirect_to'] : ''; | |
$fields = ( isset( $mixed['fields'] ) ) ? $mixed['fields'] : false; | |
} else { | |
$id = 'default'; | |
$tag = $mixed; | |
} | |
global $wpmem; | |
// If editing, the user object of the user being edit. | |
$user = ( 'edit' == $tag ) ? get_user_by( 'ID', get_current_user_id() ) : false; | |
/** | |
* Set up default wrappers. | |
* | |
* DO NOT EDIT THESE! If you need to customize, use the filter hook | |
* documented below to set up a proper, external filter function. | |
* | |
* @see wpmem_register_form_args | |
* @link https://rocketgeek.com/plugins/wp-members/docs/filter-hooks/wpmem_register_form_args/ | |
*/ | |
$defaults = array( | |
// Wrappers. | |
'heading_before' => '<legend>', | |
'heading_after' => '</legend>', | |
'fieldset_before' => '<fieldset>', | |
'fieldset_after' => '</fieldset>', | |
'main_div_before' => '<div id="wpmem_reg">', | |
'main_div_after' => '</div>', | |
'row_before' => '', | |
'row_after' => '', | |
'buttons_before' => '<div class="button_div">', | |
'buttons_after' => '</div>', | |
// Classes & ids. | |
'form_id' => ( 'new' == $tag ) ? 'wpmem_register_form' : 'wpmem_profile_form', | |
'form_class' => 'form', | |
'button_id' => '', | |
'button_class' => 'buttons', | |
// Required field tags and text. | |
'req_mark' => wpmem_get_text( 'register_req_mark' ), | |
'req_label' => wpmem_get_text( 'register_required' ), | |
'req_label_before' => '<div class="req-text">', | |
'req_label_after' => '</div>', | |
// Buttons. | |
'show_clear_form' => false, | |
'clear_form' => wpmem_get_text( 'register_clear' ), | |
'submit_register' => wpmem_get_text( 'register_submit' ), | |
'submit_update' => wpmem_get_text( 'profile_submit' ), | |
// Other. | |
'post_to' => get_permalink(), | |
'strip_breaks' => true, | |
'wrap_inputs' => true, | |
'n' => "\n", | |
't' => "\t", | |
'register_form_action' => true, | |
'user' => $user, | |
'novalidate' => false, | |
); | |
/** | |
* Filter the default form arguments. | |
* | |
* This filter accepts an array of various elements to replace the form defaults. This | |
* includes default tags, labels, text, and small items including various booleans. | |
* | |
* @since 2.9.0 | |
* @since 3.2.5 Added $id | |
* @since 3.3.0 Passes $defaults as an argument. | |
* @since 3.4.6 Added $user as an argument. | |
* | |
* @param array An array of arguments to merge with defaults. Default null. | |
* @param string $tag Toggle new registration or profile update. new|edit. | |
* @param string $id An id for the form (optional). | |
*/ | |
$args = apply_filters( 'wpmem_register_form_args', $defaults, $tag, $id ); | |
// Merge $args with defaults. | |
$args = wp_parse_args( $args, $defaults ); | |
// User ID based on filtered value. | |
$user = $args['user']; | |
// Get fields. | |
$wpmem_fields = wpmem_fields( $tag ); | |
// Fields to skip for user profile update. | |
if ( 'edit' == $tag ) { | |
$pass_arr = array( 'username', 'password', 'confirm_password', 'password_confirm' ); | |
// Skips tos on user edit page, unless they haven't got a value for tos. | |
$user_tos_val = ( is_object( $user ) ) ? get_user_meta( $user->ID, 'tos', true ) : false; | |
if ( isset( $wpmem_fields['tos'] ) && ( $wpmem_fields['tos']['checked_value'] == $user_tos_val ) ) { | |
$pass_arr[] = 'tos'; | |
} | |
foreach ( $pass_arr as $pass ) { | |
unset( $wpmem_fields[ $pass ] ); | |
} | |
} | |
/** | |
* Filter the array of form fields. | |
* | |
* The form fields are stored in the WP options table as wpmembers_fields. This | |
* filter can filter that array after the option is retreived before the fields | |
* are parsed. This allows you to change the fields that may be used in the form | |
* on the fly. | |
* | |
* @since 2.9.0 | |
* @deprecated 3.1.7 Use wpmem_fields instead. | |
* | |
* @param array The array of form fields. | |
* @param string $tag Toggle new registration or profile update. new|edit. | |
*/ | |
$wpmem_fields = apply_filters_deprecated( 'wpmem_register_fields_arr', array( $wpmem_fields, $tag ), '3.1.7', 'wpmem_fields' ); | |
$hidden_rows = array(); | |
$form_has_file = false; | |
// Loop through the remaining fields. | |
foreach ( $wpmem_fields as $meta_key => $field ) { | |
// Start with a clean row. | |
$val = ''; $label = ''; $input = ''; $field_before = ''; $field_after = ''; | |
// If the field is set to display and we aren't skipping, construct the row. | |
// Handle hidden fields | |
if ( 'hidden' == $field['type'] ) { | |
$do_row = false; | |
$hidden_rows[ $meta_key ] = wpmem_form_field( array( | |
'name' => $meta_key, | |
'type' => $field['type'], | |
'value' => $field['value'], | |
'compare' => $valtochk, | |
'required' => $field['required'], | |
) ); | |
} | |
// Label for all but TOS and hidden fields. | |
if ( 'tos' != $meta_key && 'hidden' != $field['type'] ) { | |
$class = ( $field['type'] == 'password' || $field['type'] == 'email' || $field['type'] == 'url' ) ? 'text' : $field['type']; | |
$label = wpmem_form_label( array( | |
'meta_key' => $meta_key, //( 'username' == $meta_key ) ? 'user_login' : $meta_key, | |
'label' => __( $field['label'], 'wp-members' ), | |
'type' => $field['type'], | |
'class' => $class, | |
'required' => $field['required'], | |
'req_mark' => $args['req_mark'], | |
'label_href' => ( isset( $field['label_href'] ) ) ? $field['label_href'] : false, | |
) ); | |
} | |
// Gets the field value for edit profile. | |
if ( ( 'edit' == $tag ) && ( '' == wpmem_get_form_state() ) ) { | |
switch ( $meta_key ) { | |
case( 'description' ): | |
case( 'textarea' == $field['type'] ): | |
$val = ( is_object( $user ) ) ? get_user_meta( $user->ID, $meta_key, 'true' ) : ''; // esc_textarea() is run when field is created. | |
break; | |
case 'user_email': | |
case 'confirm_email': | |
$val = ( is_object( $user ) ) ? sanitize_email( $user->user_email ) : ''; | |
break; | |
case 'user_url': | |
$val = ( is_object( $user ) ) ? $user->user_url : ''; // esc_url() is run when the field is created. | |
break; | |
case 'display_name': | |
$val = ( is_object( $user ) ) ? sanitize_text_field( $user->display_name ) : ''; | |
break; | |
default: | |
$val = ( is_object( $user ) ) ? sanitize_text_field( get_user_meta( $user->ID, $meta_key, 'true' ) ) : ''; | |
break; | |
} | |
} else { | |
if ( 'file' == $field['type'] ) { | |
$val = ( isset( $_FILES[ $meta_key ]['name'] ) ) ? sanitize_file_name( $_FILES[ $meta_key ]['name'] ) : '' ; | |
} else { | |
$val = wpmem_get_sanitized( $meta_key, '', 'post', $field['type'] ); // ( isset( $_POST[ $meta_key ] ) ) ? wpmem_sanitize_field( $_POST[ $meta_key ], $field['type'] ) : ''; | |
} | |
if ( isset( $field['value'] ) && '' != $field['value'] ) { | |
$val = $field['value']; | |
} | |
} | |
// Does the tos field. | |
if ( 'tos' == $meta_key ) { | |
// $val = sanitize_text_field( wpmem_get( $meta_key, '' ) ); | |
// Should be checked by default? and only if form hasn't been submitted. | |
$val = ( ! $_POST && $field['checked_default'] ) ? $field['checked_value'] : $val; | |
$input = wpmem_form_field( array( | |
'name' => $meta_key, | |
'type' => $field['type'], | |
'value' => $field['checked_value'], | |
'compare' => $val, | |
'required' => $field['required'], | |
) ); | |
$input .= ' ' . $this->get_tos_link( $field, $tag ); | |
$input = ( $field['required'] ) ? $input . $args['req_mark'] : $input; | |
// In previous versions, the div class would end up being the same as the row before. | |
$field_before = ( $args['wrap_inputs'] ) ? '<div class="div_text">' : ''; | |
$field_after = ( $args['wrap_inputs'] ) ? '</div>' : ''; | |
} elseif ( 'hidden' != $field['type'] ) { | |
// For checkboxes. | |
if ( 'checkbox' == $field['type'] ) { | |
$valtochk = $val; | |
$val = $field['checked_value']; | |
// if it should it be checked by default (& only if form not submitted), then override above... | |
if ( $field['checked_default'] && ( ! $_POST && $tag != 'edit' ) ) { | |
$val = $valtochk = $field['checked_value']; | |
} | |
} | |
// For dropdown select. | |
if ( 'select' == $field['type'] || 'radio' == $field['type'] || 'multiselect' == $field['type'] || 'multicheckbox' == $field['type'] || 'membership' == $field['type'] ) { | |
$valtochk = $val; | |
$val = $field['values']; | |
} | |
if ( ! isset( $valtochk ) ) { | |
$valtochk = ''; | |
} | |
if ( ( 'file' == $field['type'] || 'image' == $field['type'] ) ) { | |
$form_has_file = true; | |
// Handle files differently for multisite vs. single install. | |
// @see: https://core.trac.wordpress.org/ticket/32145 | |
if ( is_multisite() ) { | |
$attachment = get_post( $val ); | |
$attachment_url = $attachment->guid; | |
} else { | |
$attachment_url = wp_get_attachment_url( $val ); | |
} | |
$empty_file = '<span class="description">' . __( 'None' ) . '</span>'; | |
if ( 'edit' == $tag ) { | |
if ( 'file' == $field['type'] ) { | |
$input = ( $attachment_url ) ? '<a href="' . esc_url( $attachment_url ) . '" id="' . $meta_key . '_file">' . get_the_title( $val ) . '</a>' : $empty_file; | |
} else { | |
$input = ( $attachment_url ) ? '<img src="' . esc_url( $attachment_url ) . '" id="' . $meta_key . '_img" />' : $empty_file; | |
} | |
$input.= '<br />' . wpmem_get_text( 'profile_upload' ) . '<br />'; | |
} else { | |
if ( 'image' == $field['type'] ) { | |
$input = '<img src="" id="' . $meta_key . '_img" />'; | |
} | |
} | |
$input.= wpmem_form_field( array( | |
'name' => $meta_key, | |
'type' => $field['type'], | |
'value' => $val, | |
'compare' => $valtochk, | |
'file_types' => $field['file_types'], | |
) ); | |
} else { | |
// For all other input types. | |
$formfield_args = array( | |
'name' => $meta_key, // ( 'username' == $meta_key ) ? 'user_login' : $meta_key, | |
'type' => $field['type'], | |
'value' => $val, | |
'compare' => $valtochk, | |
//'class' => ( $class ) ? $class : 'textbox', | |
'required' => $field['required'], | |
'placeholder' => ( isset( $field['placeholder'] ) ) ? $field['placeholder'] : '', | |
'pattern' => ( isset( $field['pattern'] ) ) ? $field['pattern'] : false, | |
'title' => ( isset( $field['title'] ) ) ? $field['title'] : false, | |
'min' => ( isset( $field['min'] ) ) ? $field['min'] : false, | |
'max' => ( isset( $field['max'] ) ) ? $field['max'] : false, | |
'rows' => ( isset( $field['rows'] ) ) ? $field['rows'] : false, | |
'cols' => ( isset( $field['cols'] ) ) ? $field['cols'] : false, | |
'file_types' => ( isset( $field['file_types'] ) ) ? $field['file_types'] : false, | |
); | |
if ( 'multicheckbox' == $field['type'] || 'multiselect' == $field['type'] ) { | |
$formfield_args['delimiter'] = $field['delimiter']; | |
} | |
// Add timestamp support. | |
if ( 'timestamp' == $field['type'] ) { | |
$formfield_args['timestamp_display'] = $field['timestamp_display']; | |
} | |
$input = wpmem_form_field( $formfield_args ); | |
// If checkbox label option is enabled. | |
// @todo "checkbox_label" should be set already, check why it isn't. | |
if ( 'checkbox' == $field['type'] && isset( $field['checkbox_label'] ) && 1 == $field['checkbox_label'] ) { | |
$input = $input . ' <label for="' . $meta_key . '">' . $label . '</label>'; | |
$label = ''; // @todo Overdoing it throws a "Automatic conversion of false to array is deprecated" error: $fields[ $meta_key ]['label'] = $field['label'] = $label = ''; | |
} | |
} | |
// Determine input wrappers. | |
$field_before = ( $args['wrap_inputs'] ) ? '<div class="div_' . $class . '">' : ''; | |
$field_after = ( $args['wrap_inputs'] ) ? '</div>' : ''; | |
} | |
// If the row is set to display, add the row to the form array. | |
if ( 'hidden' != $field['type'] ) { | |
$values = ''; | |
if ( 'multicheckbox' == $field['type'] || 'select' == $field['type'] || 'multiselect' == $field['type'] || 'radio' == $field['type'] ) { | |
$values = $val; | |
$val = $valtochk; | |
} | |
$rows[ $meta_key ] = array( | |
'meta' => $meta_key, | |
'type' => $field['type'], | |
'value' => $val, | |
'values' => $values, | |
'label_text' => __( $field['label'], 'wp-members' ), | |
'row_before' => $args['row_before'], | |
'label' => $label, | |
'field_before' => $field_before, | |
'field' => $input, | |
'field_after' => $field_after, | |
'row_after' => $args['row_after'], | |
); | |
} | |
} | |
// If captcha is Really Simple CAPTCHA. | |
if ( 2 == $wpmem->captcha && 'edit' != $tag ) { | |
// Build the captcha. | |
$row = WP_Members_Captcha::rs_captcha( 'array' ); | |
$rows['captcha'] = array( | |
'meta' => '', | |
'type' => 'text', | |
'value' => '', | |
'values' => '', | |
'label_text' => $row['label_text'], | |
'row_before' => $args['row_before'], | |
'label' => $row['label'], | |
'field_before' => ( $args['wrap_inputs'] ) ? '<div class="div_text">' : '', | |
'field' => $row['img'] . $row['hidden'] . $row['field'], | |
'field_after' => ( $args['wrap_inputs'] ) ? '</div>' : '', | |
'row_after' => $args['row_after'], | |
); | |
} | |
/** | |
* Filter the array of form rows. | |
* | |
* This filter receives an array of the main rows in the form, each array element being | |
* an array of that particular row's pieces. This allows making changes to individual | |
* parts of a row without needing to parse through a string of HTML. | |
* | |
* @since 2.9.0 | |
* @since 3.0.9 Added $rows['label_text']. | |
* @since 3.1.0 Added $rows['key']. | |
* @since 3.1.6 Deprecated $rows['order']. | |
* | |
* @param array $rows { | |
* An array containing the form rows. | |
* | |
* @type string order Field display order. (deprecated as of 3.1.6) | |
* @type string meta Field meta tag (not used for display). | |
* @type string type Input field type (not used for display). | |
* @type string value Input field value (not used for display). | |
* @type string values Possible field values (dropdown, multiple select/check, radio). | |
* @type string label_text Raw text for the label (not used for display). | |
* @type string row_before Opening wrapper tag around the row. | |
* @type string label Label tag. | |
* @type string field_before Opening wrapper tag before the input tag. | |
* @type string field The field input tag. | |
* @type string field_after Closing wrapper tag around the input tag. | |
* @type string row_after Closing wrapper tag around the row. | |
* } | |
* @param string $tag Toggle new registration or profile update. new|edit. | |
*/ | |
$rows = apply_filters( 'wpmem_register_form_rows', $rows, $tag ); | |
// Put the rows from the array into $form. | |
$form = ''; $enctype = ''; | |
foreach ( $rows as $meta_key => $row_item ) { | |
// Make sure all keys are set just in case someone didn't return a proper array through the filter. | |
foreach ( $this->get_reg_row_keys() as $check_key ) { | |
if ( ! isset( $rows[ $meta_key ][ $check_key ] ) ) { | |
$rows[ $meta_key ][ $check_key ] = ''; | |
$row_item[ $check_key ] = ''; | |
} | |
} | |
// Check form to see if we need multipart enctype. | |
$enctype = ( $row_item['type'] == 'file' || $row_item['type'] == 'image' ) ? "multipart/form-data" : $enctype; | |
// Assemble row pieces. | |
$row = ( $row_item['row_before'] != '' ) ? $row_item['row_before'] . $args['n'] . $row_item['label'] . $args['n'] : $row_item['label'] . $args['n']; | |
$row .= ( $row_item['field_before'] != '' ) ? $row_item['field_before'] . $args['n'] . $args['t'] . $row_item['field'] . $args['n'] . $row_item['field_after'] . $args['n'] : $row_item['field'] . $args['n']; | |
$row .= ( $row_item['row_after'] != '' ) ? $row_item['row_after'] . $args['n'] : ''; | |
$form.= $row; | |
} | |
// Handle outside elements added to the register form with register_form. | |
if ( 'new' == $tag && $args['register_form_action'] ) { | |
ob_start(); | |
/** This action is documented in wp-login.php */ | |
do_action( 'register_form' ); | |
$add_to_form = ob_get_contents(); | |
ob_end_clean(); | |
$form.= $add_to_form; | |
} | |
// Do recaptcha if enabled. | |
if ( ( 1 == $wpmem->captcha || 3 == $wpmem->captcha || 4 == $wpmem->captcha ) && $tag != 'edit' ) { // don't show on edit page! | |
$row = WP_Members_Captcha::recaptcha(); | |
if ( 4 != $wpmem->captcha ) { | |
$row = '<div class="clear"></div><div class="captcha">' . $row . '</div>'; | |
} | |
// Add the captcha row to the form. | |
/** | |
* Filter the HTML for the CAPTCHA row. | |
* | |
* @since 2.9.0 | |
* | |
* @param string The HTML for the entire row (includes HTML tags plus reCAPTCHA). | |
* @param string $tag Toggle new registration or profile update. new|edit. | |
*/ | |
$form.= apply_filters( 'wpmem_register_captcha_row', $args['row_before'] . $row . $args['row_after'], $tag ); | |
} | |
if ( 5 == $wpmem->captcha && 'edit' != $tag ) { | |
$row = WP_Members_Captcha::hcaptcha(); | |
/** This filter is documented in /includes/class-wp-members-forms.php */ | |
$form.= apply_filters( 'wpmem_register_captcha_row', $args['row_before'] . $row . $args['row_after'], $tag ); | |
} | |
// Create hidden fields. | |
$var = ( $tag == 'edit' ) ? 'update' : 'register'; | |
$redirect_to = ( isset( $_REQUEST['redirect_to'] ) ) ? $_REQUEST['redirect_to'] : ( ( $redirect_to ) ? $redirect_to : get_permalink() ); | |
$hidden_rows['_wpmem_a'] = '<input name="a" type="hidden" value="' . esc_attr( $var ) . '" />'; | |
$hidden_rows['_wpmem_reg_page'] = '<input name="wpmem_reg_page" type="hidden" value="' . esc_url( get_permalink() ) . '" />'; | |
if ( $redirect_to != get_permalink() ) { | |
$hidden_rows['_wpmem_redirect_to'] = '<input name="redirect_to" type="hidden" value="' . esc_url( $redirect_to ) . '" />'; | |
} | |
/** | |
* Filter the hidden form rows. | |
* | |
* @since 3.2.0 | |
* | |
* @param array $hidden_rows | |
* @param string $tag | |
*/ | |
$hidden_rows = apply_filters( 'wpmem_register_hidden_rows', $hidden_rows, $tag ); | |
// Assemble hidden fields HTML. | |
$hidden = ''; | |
foreach ( $hidden_rows as $hidden_row ) { | |
$hidden .= $hidden_row . $args['n']; | |
} | |
/** | |
* Filter the hidden field HTML. | |
* | |
* @since 2.9.0 | |
* | |
* @param string $hidden The generated HTML of hidden fields. | |
* @param string $tag Toggle new registration or profile update. new|edit. | |
*/ | |
$hidden = apply_filters( 'wpmem_register_hidden_fields', $hidden, $tag ); | |
// Add the hidden fields to the form. | |
$form.= $hidden; | |
// Create buttons and wrapper. | |
$button_text = ( $tag == 'edit' ) ? $args['submit_update'] : $args['submit_register']; | |
$button_html = array( | |
'reset' => ( $args['show_clear_form'] ) ? '<input name="reset" type="reset" value="' . esc_attr( $args['clear_form'] ) . '" class="' . wpmem_sanitize_class( $args['button_class'] ) . '" /> ' : '', | |
'submit' => '<input name="submit" type="submit" value="' . esc_attr( $button_text ) . '" class="' . wpmem_sanitize_class( $args['button_class'] ) . '" />', | |
); | |
$buttons = $button_html['reset'] . $args['n'] . $button_html['submit'] . $args['n']; | |
/** | |
* Filter the HTML for form buttons. | |
* | |
* The string passed through the filter includes the buttons, as well as the HTML wrapper elements. | |
* | |
* @since 2.9.0 | |
* @since 3.2.6 Added $button_html parameter | |
* | |
* @param string $buttons The generated HTML of the form buttons. | |
* @param string $tag Toggle new registration or profile update. new|edit. | |
* @param array $button_html The individual button html. | |
*/ | |
$buttons = apply_filters( 'wpmem_register_form_buttons', $buttons, $tag, $button_html ); | |
// Add the buttons to the form. | |
$form.= $args['buttons_before'] . $args['n'] . $buttons . $args['buttons_after'] . $args['n']; | |
// Add the required field notation to the bottom of the form. | |
$form.= $args['req_label_before'] . $args['req_label'] . $args['req_label_after']; | |
// Apply the heading. | |
if ( 'edit' == $tag ) { | |
/** | |
* Filter the default heading in User Profile edit mode. | |
* | |
* @since 2.7.5 | |
* @since 3.3.0 Moved into main registration function (from profile shortcode). | |
* | |
* @param string The default edit mode heading. | |
*/ | |
$heading = ( isset( $heading ) && '' != $heading ) ? $heading : apply_filters( 'wpmem_user_edit_heading', wpmem_get_text( 'profile_heading' ) ); | |
} else { | |
/** | |
* Filter the registration form heading. | |
* | |
* @since 2.8.2 | |
* | |
* @param string $str | |
* @param string $tag Toggle new registration or profile update. new|edit. | |
*/ | |
$heading = ( isset( $heading ) && '' != $heading ) ? $heading : apply_filters( 'wpmem_register_heading', wpmem_get_text( 'register_heading' ), $tag ); | |
} | |
$form = $args['heading_before'] . $heading . $args['heading_after'] . $args['n'] . $form; | |
// Apply fieldset wrapper. | |
$form = $args['fieldset_before'] . $args['n'] . $form . $args['n'] . $args['fieldset_after']; | |
// Apply attribution if enabled. | |
$form = $form . $this->attribution(); | |
// Apply nonce. Nonce uses $tag value of the form processor, NOT the form builder. | |
$nonce = ( $tag == 'edit' ) ? 'update' : 'register'; | |
$form = wp_nonce_field( 'wpmem_longform_nonce', '_wpmem_' . $nonce . '_nonce', true, false ) . $args['n'] . $form; | |
// Apply form wrapper. | |
$novalidate = ( $args['novalidate'] ) ? 'novalidate' : ''; | |
$enctype = ( $enctype == 'multipart/form-data' ) ? ' enctype="multipart/form-data"' : ''; | |
$form = '<form name="form" method="post"' . $enctype . ' action="' . esc_attr( $args['post_to'] ) . '" id="' . wpmem_sanitize_class( $args['form_id'] ) . '" class="' . wpmem_sanitize_class( $args['form_class'] ) . '"' . $novalidate . '>' . $args['n'] . $form . $args['n'] . '</form>'; | |
// Apply anchor. | |
$form = '<a id="register"></a>' . $args['n'] . $form; | |
// Apply main div wrapper. | |
$form = $args['main_div_before'] . $args['n'] . $form . $args['n'] . $args['main_div_after'] . $args['n']; | |
// Remove line breaks if enabled for easier filtering later. | |
$form = ( $args['strip_breaks'] ) ? $this->strip_breaks( $form, $rows ) : $form; //str_replace( array( "\n", "\r", "\t" ), array( '','','' ), $form ) : $form; | |
// If there is an image input type, include the following script. | |
$form = ( $form_has_file ) ? $form . ' | |
<script> | |
var loadFile = function(event, clicked_id) { | |
var reader = new FileReader(); | |
var the_id = clicked_id + "_img"; | |
reader.onload = function() { | |
var output = document.getElementById(the_id); | |
output.src = reader.result; | |
}; | |
reader.readAsDataURL(event.target.files[0]); | |
}; | |
</script>' : $form; | |
/** | |
* Filter the generated HTML of the entire form. | |
* | |
* @since 2.7.4 | |
* | |
* @param string $form The HTML of the final generated form. | |
* @param string $tag Toggle new registration or profile update. new|edit. | |
* @param array $rows { | |
* An array containing the form rows. | |
* | |
* @type string order Field display order. | |
* @type string meta Field meta tag (not used for display). | |
* @type string type Input field type (not used for display). | |
* @type string value Input field value (not used for display). | |
* @type string values The possible values for the field (dropdown, multiple select/checkbox, radio group). | |
* @type string label_text Raw text for the label (not used for display). | |
* @type string row_before Opening wrapper tag around the row. | |
* @type string label Label tag. | |
* @type string field_before Opening wrapper tag before the input tag. | |
* @type string field The field input tag. | |
* @type string field_after Closing wrapper tag around the input tag. | |
* @type string row_after Closing wrapper tag around the row. | |
* } | |
* @param string $hidden The HTML string of hidden fields | |
*/ | |
$form = apply_filters( 'wpmem_register_form', $form, $tag, $rows, $hidden ); | |
/** | |
* Filter before the form. | |
* | |
* This rarely used filter allows you to stick any string onto the front of | |
* the generated form. | |
* | |
* @since 2.7.4 | |
* | |
* @param string $str The HTML to add before the form. Default null. | |
* @param string $tag Toggle new registration or profile update. new|edit. | |
*/ | |
$form = apply_filters( 'wpmem_register_form_before', '', $tag ) . $form; | |
$wpmem->forms->set_reg_form_showing( true ); | |
// Return the generated form. | |
return $form; | |
} // End register_form(). | |
/** | |
* Strip line breaks from form. | |
* | |
* Function removes line breaks and tabs. Checks for textarea fields | |
* before stripping line breaks. | |
* | |
* @since 3.1.8 | |
* | |
* @param string $form | |
* @param array $rows | |
* @return string $form | |
*/ | |
private function strip_breaks( $form, $rows ) { | |
foreach( $rows as $key => $row ) { | |
if ( 'textarea' == $row['type'] ) { | |
$textareas[ $key ] = $row['field']; | |
} | |
} | |
$form = str_replace( array( "\n", "\r", "\t" ), array( '','','' ), $form ); | |
if ( ! empty ( $textareas ) ) { | |
foreach ( $textareas as $textarea ) { | |
$stripped = str_replace( array( "\n", "\r", "\t" ), array( '','','' ), $textarea ); | |
$form = str_replace( $stripped, $textarea, $form ); | |
} | |
} | |
return $form; | |
} | |
/** | |
* Appends WP-Members registration fields to wp-login.php registration form. | |
* | |
* @since 2.8.7 | |
* @since 3.1.1 Updated to support new (3.1.0) field types. | |
* @since 3.1.6 Updated to support new fields array. Added WC classes. | |
* @since 3.1.8 Added $process parameter. | |
* @since 3.3.0 Ported from wpmem_do_wp_register_form() in wp-registration.php. | |
* | |
* @global stdClass $wpmem | |
* @param string $process | |
*/ | |
function wp_register_form( $process = 'wp' ) { | |
global $wpmem; | |
$wpmem_fields = wpmem_fields( $process ); | |
// Check if this is WooCommerce account page. | |
$is_woo = false; | |
if ( 'woo' == $process ) { | |
$is_woo = true; | |
} else { | |
if ( function_exists( 'is_account_page' ) ) { | |
$is_woo = ( is_account_page() ) ? true : $is_woo; | |
} | |
} | |
if ( isset( $wpmem_fields ) && is_array( $wpmem_fields ) ) { | |
unset( $wpmem_fields['username'] ); | |
if ( $is_woo ) { | |
// Woo has its own setting for password fields. | |
unset( $wpmem_fields['password'] ); | |
unset( $wpmem_fields['confirm_password'] ); | |
} | |
foreach ( $wpmem_fields as $meta_key => $field ) { | |
$req = ( $field['required'] ) ? ( ( $is_woo ) ? ' <span class="required">*</span>' : ' <span class="req">' . wpmem_get_text( 'wp_form_required' ) . '</span>' ) : ''; | |
// File fields not yet supported for this form. | |
if ( $field['register'] && $meta_key != 'user_email' && $field['type'] != 'file' && $field['type'] != 'image' ) { | |
if ( 'checkbox' == $field['type'] ) { | |
if ( 'tos' == $meta_key ) { | |
$tos_link_text = $this->get_tos_link( $field, 'woo' ); | |
} | |
$label = ( 'tos' == $meta_key ) ? $tos_link_text : __( $field['label'], 'wp-members' ); | |
$val = esc_attr( wpmem_get( $meta_key, '' ) ); // ( isset( $_POST[ $meta_key ] ) ) ? esc_attr( $_POST[ $meta_key ] ) : ''; | |
$val = ( ! $_POST && $field['checked_default'] ) ? $field['checked_value'] : $val; | |
$row_before = '<p class="wpmem-checkbox">'; | |
$label = '<label for="' . $meta_key . '">' . $label . $req . '</label>'; | |
$input = wpmem_form_field( $meta_key, $field['type'], $field['checked_value'], $val ); | |
$row_after = '</p>'; | |
} elseif ( 'hidden' == $field['type'] ) { | |
// Handle hidden fields | |
$row_before = ''; | |
$label = ''; | |
$input = wpmem_form_field( array( | |
'name' => $meta_key, | |
'type' => $field['type'], | |
'value' => $field['value'], | |
'compare' => $valtochk, | |
'required' => $field['required'], | |
) ); | |
$row_after = ''; | |
} else { | |
$row_before = ( $is_woo ) ? '<p class="woocommerce-FormRow woocommerce-FormRow--wide form-row form-row-wide">' : '<p>'; | |
$label = '<label for="' . $meta_key . '">' . __( $field['label'], 'wp-members' ) . $req . '</label>'; | |
$label .= ( 'multicheckbox' == $field['type'] ) ? '<br />' : ''; | |
// determine the field type and generate accordingly... | |
switch ( $field['type'] ) { | |
case( 'textarea' ): | |
$input = '<textarea name="' . $meta_key . '" id="' . $meta_key . '" class="textarea">'; | |
$input.= esc_textarea( wpmem_get( $meta_key, '' ) ); // ( isset( $_POST[ $meta_key ] ) ) ? esc_textarea( $_POST[ $meta_key ] ) : ''; | |
$input.= '</textarea>'; | |
break; | |
case( 'select' ): | |
case( 'multiselect' ): | |
case( 'multicheckbox' ): | |
case( 'radio' ): | |
case( 'membership' ): | |
$row_before = ( $is_woo && ( 'select' == $field['type'] || 'multiselect' == $field['type'] || 'membership' == $field['type'] ) ) ? $row_before : '<p class="' . $field['type'] . '">'; | |
$valtochk = sanitize_text_field( wpmem_get( $meta_key, '' ) ); // ( isset( $_POST[ $meta_key ] ) ) ? sanitize_text_field( $_POST[ $meta_key ] ) : ''; | |
$formfield_args = array( | |
'name' => $meta_key, | |
'type' => $field['type'], | |
'value' => $field['values'], | |
'compare' => $valtochk, | |
'required' => $field['required'], | |
'class' => ( $is_woo && ( 'select' == $field['type'] || 'multiselect' == $field['type'] || 'membership' == $field['type'] ) ) ? 'woocommerce-Input woocommerce-Input--text input-text' : $field['type'], | |
); | |
if ( 'multicheckbox' == $field['type'] || 'multiselect' == $field['type'] ) { | |
$formfield_args['delimiter'] = $field['delimiter']; | |
} | |
$input = wpmem_form_field( $formfield_args ); | |
break; | |
case( 'file' ): | |
case( 'image' ): | |
// Field type not supported for this yet. | |
break; | |
default: | |
$class = ( $is_woo ) ? 'woocommerce-Input woocommerce-Input--text input-text' : 'input'; | |
//$input = '<input type="' . $field['type'] . '" name="' . $meta_key . '" id="' . $meta_key . '" class="' . $class . '" value="'; | |
$formfield_args = array( | |
'name' => $meta_key, | |
'type' => $field['type'], | |
'value' => wpmem_sanitize_field( wpmem_get( $meta_key, '' ), $field['type'] ), | |
'compare' => ( isset( $field['compare'] ) ) ? $field['compare'] : '', | |
'required' => $field['required'], | |
'class' => $class, | |
'placeholder' => ( isset( $field['placeholder'] ) ) ? $field['placeholder'] : '', | |
'pattern' => ( isset( $field['pattern'] ) ) ? $field['pattern'] : false, | |
'title' => ( isset( $field['title'] ) ) ? $field['title'] : false, | |
'min' => ( isset( $field['min'] ) ) ? $field['min'] : false, | |
'max' => ( isset( $field['max'] ) ) ? $field['max'] : false, | |
'rows' => ( isset( $field['rows'] ) ) ? $field['rows'] : false, | |
'cols' => ( isset( $field['cols'] ) ) ? $field['cols'] : false, | |
); | |
// Add timestamp support. | |
if ( 'timestamp' == $field['type'] ) { | |
$formfield_args['timestamp_display'] = $field['timestamp_display']; | |
} | |
$input = wpmem_form_field( $formfield_args ); | |
//$input.= ( isset( $_POST[ $meta_key ] ) ) ? esc_attr( $_POST[ $meta_key ] ) : ''; | |
//$input.= '" size="25" />'; | |
break; | |
} | |
$row_after = '</p>'; | |
} | |
// if the row is set to display, add the row to the form array | |
$rows[ $meta_key ] = array( | |
'type' => $field['type'], | |
'row_before' => $row_before, | |
'label' => $label, | |
'field' => $input, | |
'row_after' => $row_after, | |
); | |
} | |
} | |
// Do recaptcha if enabled. | |
if ( ! $is_woo && isset( $wpmem->captcha ) && $wpmem->captcha != 0 ) { | |
$row_before = '<p>'; | |
$row_after = '</p>'; | |
$label = ''; | |
$captcha = ''; | |
if ( in_array( $wpmem->captcha, array( 1, 3, 4 ) ) ) { | |
$captcha = WP_Members_Captcha::recaptcha(); | |
} elseif ( 5 == $wpmem->captcha ) { | |
$captcha = WP_Members_Captcha::hcaptcha(); | |
} elseif ( 2 == $wpmem->captcha ) { | |
$row = WP_Members_Captcha::rs_captcha( 'array' ); | |
$label = $row['label']; //$row['label_text']; | |
$captcha = $row['img'] . $row['hidden'] . $row['field']; | |
} | |
if ( 4 == $wpmem->captcha ) { | |
$row_before = ''; | |
$row_after = ''; | |
} | |
$rows['captcha'] = array( | |
'type' => '', | |
'row_before' => $row_before, | |
'row_after' => $row_after, | |
'label' => $label, | |
'field' => $captcha, | |
); | |
} | |
if ( isset( $rows ) && is_array( $rows ) ) { | |
/** | |
* Filter the native registration form rows. | |
* | |
* @since 2.9.3. | |
* | |
* @param array $rows The custom rows added to the form. | |
*/ | |
$rows = apply_filters( 'wpmem_native_form_rows', $rows ); | |
foreach ( $rows as $row_item ) { | |
if ( $row_item['type'] == 'checkbox' ) { | |
echo $row_item['row_before'] . $row_item['field'] . $row_item['label'] . $row_item['row_after']; | |
} else { | |
echo $row_item['row_before'] . $row_item['label'] . $row_item['field'] . $row_item['row_after']; | |
} | |
} | |
} | |
} | |
} | |
/** | |
* Appends WP-Members registration fields to Users > Add New User screen. | |
* | |
* @since 2.9.0 | |
* @since 3.1.1 Updated to support new (3.1.0) field types and user activation. | |
* @since 3.1.6 Updated to support new fields array. | |
* @since 3.3.0 Ported from wpmem_do_wp_newuser_form() in wp-registration.php. | |
* | |
* @global stdClass $wpmem | |
*/ | |
function wp_newuser_form() { | |
global $wpmem; | |
echo '<table class="form-table"><tbody>'; | |
$wpmem_fields = wpmem_fields(); // @todo For now in 3.5+, load all fields. Perhaps at some point we go to wpmem_fields( 'add_new' ); | |
$exclude = wpmem_get_excluded_meta( 'wp-register' ); | |
foreach ( $wpmem_fields as $meta_key => $field ) { | |
if ( ! $field['native'] && ! in_array( $meta_key, $exclude ) ) { | |
$req = ( $field['required'] ) ? ' <span class="description">' . wpmem_get_text( 'wp_form_required' ) . '</span>' : ''; | |
$class = ( 'radio' == $field['type'] | |
|| 'checkbox' == $field['type'] | |
|| 'date' == $field['type'] ) ? '' : ' class="form-field" '; | |
echo '<tr' . $class . '> | |
<th scope="row"> | |
<label for="' . $meta_key . '">' . __( $field['label'], 'wp-members' ) . $req . '</label> | |
</th> | |
<td>'; | |
// determine the field type and generate accordingly. | |
// All fields use the following: | |
$args['name'] = $meta_key; | |
$args['type'] = $field['type']; | |
$args['required'] = $field['required']; | |
$args['placeholder'] = ( isset( $field['placeholder'] ) ) ? $field['placeholder'] : ''; | |
$args['pattern'] = ( isset( $field['pattern'] ) ) ? $field['pattern'] : ''; | |
$args['title'] = ( isset( $field['title'] ) ) ? $field['title'] : ''; | |
$posted_meta = wpmem_get( $meta_key, '' ); | |
switch ( $field['type'] ) { | |
case( 'select' ): | |
$val = sanitize_text_field( $posted_meta ); // ( isset( $_POST[ $meta_key ] ) ) ? sanitize_text_field( $_POST[ $meta_key ] ) : ''; | |
$args['value'] = $field['values']; | |
$args['compare'] = $val; | |
echo wpmem_form_field( $args ); | |
break; | |
case( 'textarea' ): | |
$args['value'] = esc_textarea( $posted_meta ); // ( isset( $_POST[ $meta_key ] ) ) ? esc_textarea( $_POST[ $meta_key ] ) : ''; | |
echo wpmem_form_field( $args ); | |
break; | |
case( 'checkbox' ): | |
$val = sanitize_text_field( $posted_meta ); // ( isset( $_POST[ $meta_key ] ) ) ? sanitize_text_field( $_POST[ $meta_key ] ) : ''; | |
$val = ( ! $_POST && $field['checked_default'] ) ? $field['checked_value'] : $val; | |
$args['value'] = $field['checked_value']; | |
$args['compare'] = $val; | |
echo wpmem_form_field( $args ); | |
break; | |
case( 'multiselect' ): | |
case( 'multicheckbox' ): | |
case( 'radio' ): | |
case( 'membership' ); | |
$args['value'] = $field['values']; | |
$args['compare'] = sanitize_text_field( $posted_meta ); // ( isset( $_POST[ $meta_key ] ) ) ? sanitize_text_field( $_POST[ $meta_key ] ) : ''; | |
if ( 'multicheckbox' == $field['type'] || 'multiselect' == $field['type'] ) { | |
$args['delimiter'] = $field['delimiter']; | |
} | |
echo wpmem_form_field( $args ); | |
break; | |
case( 'file' ): | |
case( 'image' ): | |
echo 'Not currently supported for this form'; | |
break; | |
default: | |
$args['value'] = esc_attr( $posted_meta ); // ( isset( $_POST[ $meta_key ] ) ) ? esc_attr( $_POST[ $meta_key ] ) : ''; | |
echo wpmem_form_field( $args ); | |
break; | |
} | |
echo '</td> | |
</tr>'; | |
} | |
} | |
// If moderated registration is enabled, add checkbox to set user as active. | |
if ( 1 == $wpmem->mod_reg ) { | |
echo '<tr> | |
<th scope="row"> | |
<label for="activate_user">' . wpmem_get_text( 'wp_form_activate' ) . '</label> | |
</th> | |
<td>' . wpmem_form_field( array( 'name' => 'activate_user', 'type' => 'checkbox', 'value' => 1, 'compare' => '' ) ) . '</td> | |
</tr>'; | |
} | |
echo '</tbody></table>'; | |
} | |
/** | |
* Create an attribution link in the form. | |
* | |
* @since 2.6.0 | |
* @since 3.1.1 Updated to use new object setting. | |
* @since 3.3.0 Ported from wpmem_inc_attribution() in forms.php. | |
* | |
* @global object $wpmem | |
* @return string $str | |
*/ | |
function attribution() { | |
global $wpmem; | |
$str = ' | |
<div align="center"> | |
<small>Powered by <a href="https://rocketgeek.com" target="_blank">WP-Members</a></small> | |
</div>'; | |
return ( 1 == $wpmem->attrib ) ? $str : ''; | |
} | |
/** | |
* Settings for building Short Form (login). | |
* | |
* Replaces individual legacy functions and filters for | |
* the short forms, combined into a single method. | |
* | |
* @since 3.3.0 | |
* @since 3.4.0 Change inputs. | |
* | |
* @global stdClass $post | |
* @global stdClass $wpmem | |
* | |
* @param string $form login|changepassword|resetpassword|forgotusername | |
* @param array $args | |
* @return string $form | |
*/ | |
function do_shortform( $form, $args = array() ) { | |
$input_arrays = array( | |
'login' => array( | |
array( | |
'name' => wpmem_get_text( 'login_username' ), | |
'type' => 'text', | |
'tag' => 'log', | |
'class' => 'username', | |
'div' => 'div_text', | |
), | |
array( | |
'name' => wpmem_get_text( 'login_password' ), | |
'type' => 'password', | |
'tag' => 'pwd', | |
'class' => 'password', | |
'div' => 'div_text', | |
), | |
), | |
'changepassword' => array( | |
array( | |
'name' => wpmem_get_text( 'pwdchg_password1' ), | |
'type' => 'password', | |
'tag' => 'pass1', | |
'class' => 'password', | |
'div' => 'div_text', | |
), | |
array( | |
'name' => wpmem_get_text( 'pwdchg_password2' ), | |
'type' => 'password', | |
'tag' => 'pass2', | |
'class' => 'password', | |
'div' => 'div_text', | |
), | |
), | |
'resetpassword' => array( | |
array( | |
'name' => wpmem_get_text( 'login_username' ), | |
'type' => 'text', | |
'tag' => 'user', | |
'class' => 'username', | |
'div' => 'div_text', | |
), | |
), | |
'forgotusername' => array( | |
array( | |
'name' => wpmem_get_text( 'username_email' ), | |
'type' => 'text', | |
'tag' => 'user_email', | |
'class' => 'username', | |
'div' => 'div_text', | |
), | |
), | |
'reconfirm' => array( | |
array( | |
'name' => wpmem_get_text( 'login_username' ), | |
'type' => 'text', | |
'tag' => 'user', | |
'class' => 'username', | |
'div' => 'div_text', | |
), | |
) | |
); | |
/** | |
* Filter the array of change password form fields. | |
* | |
* @since 2.9.0 | |
* @deprecated 3.3.0 Use wpmem_{$form}_form_defaults instead. | |
* | |
* @param array $default_inputs An array matching the elements used by default. | |
*/ | |
$default_inputs = apply_filters_deprecated( 'wpmem_inc_' . $form . '_inputs', array( $input_arrays[ $form ] ), '3.3.0', 'wpmem_' . $form . '_form_defaults' ); | |
$form_arrays = array( | |
'login' => array( | |
'heading' => wpmem_get_text( 'login_heading' ), | |
'action' => 'login', | |
'button_text' => wpmem_get_text( 'login_button' ), | |
'inputs' => $default_inputs, | |
'redirect_to' => ( isset( $args['redirect_to'] ) ) ? $args['redirect_to'] : get_permalink(), | |
), | |
'changepassword' => array( | |
'heading' => wpmem_get_text( 'pwdchg_heading' ), | |
'action' => 'pwdchange', | |
'button_text' => wpmem_get_text( 'pwdchg_button' ), | |
'inputs' => $default_inputs, | |
), | |
'resetpassword' => array( | |
'heading' => wpmem_get_text( 'pwdreset_heading' ), | |
'action' => 'pwdreset', | |
'button_text' => wpmem_get_text( 'pwdreset_button' ), | |
'inputs' => $default_inputs, | |
), | |
'forgotusername' => array( | |
'heading' => wpmem_get_text( 'username_heading' ), | |
'action' => 'getusername', | |
'button_text' => wpmem_get_text( 'username_button' ), | |
'inputs' => $default_inputs, | |
), | |
'reconfirm' => array( | |
'heading' => wpmem_get_text( 'reconfirm_heading' ), | |
'action' => 'reconfirm', | |
'button_text' => wpmem_get_text( 'reconfirm_button' ), | |
'inputs' => $default_inputs, | |
), | |
); | |
/** | |
* Filter the arguments to override form defaults. | |
* | |
* @since 2.9.0 | |
* @deprecated 3.3.0 Use wpmem_{$form}_form_defaults instead. | |
* | |
* @param array $args An array of arguments to use. Default null. (login|changepassword|resetpassword|forgotusername) | |
*/ | |
$args = apply_filters_deprecated( 'wpmem_inc_' . $form . '_args', array(''), '3.3.0', 'wpmem_' . $form . '_form_defaults' ); | |
$arr = wp_parse_args( $args, $form_arrays[ $form ] ); | |
/** | |
* Filter the arguments to override change password form defaults. | |
* | |
* @since 3.3.0 | |
* @since 3.4.6 Added $form of the filter being used. | |
* | |
* @param array $args An array of arguments to use. | |
* @param string $form Tag of the form being used (login|changepassword|resetpassword|forgotusername) | |
*/ | |
$arr = apply_filters( 'wpmem_' . $form . '_form_defaults', $arr, $form ); | |
return $this->login_form( '', $arr ); | |
} | |
/** | |
* Applies the post restricted message above the short form. | |
* | |
* @since 3.3.0 | |
* | |
* @global stdClass $wpmem | |
* | |
* @return string $str The generated message. | |
*/ | |
public function add_restricted_msg() { | |
$str = ''; | |
if ( "success" != wpmem_get_form_state() ) { | |
$dialogs = get_option( 'wpmembers_dialogs' ); | |
// The message shown above blocked content. | |
$msg = wpmem_get_text( 'restricted_msg' ); | |
/** | |
* Filter the message args. | |
* | |
* @since 3.5.0 | |
* | |
* @todo Eliminate <p> tag from before/after. Use CSS to adjust the div size instead. | |
* @todo Rework localization of custom strings into dialogs class. | |
* | |
* @param array $args { | |
* The various parts of the restricted dialog. | |
* | |
* @type string $msg The actual message. | |
* @type string $before The opening HTML tags. | |
* @type string $after The closing HTML tags (no need to change this if you're not changing the opening tag type). | |
* } | |
*/ | |
$args = apply_filters( 'wpmem_restricted_msg_args', array( | |
'msg' => ( $dialogs['restricted_msg'] == $msg ) ? $msg : __( stripslashes( $dialogs['restricted_msg'] ), 'wp-members' ), | |
'before' => '<div id="wpmem_restricted_msg"><p>', | |
'after' => '</p></div>', | |
)); | |
$full_html = $args['before'] . $args['msg'] . $args['after']; | |
/** | |
* Filter the post restricted message. | |
* | |
* @since 2.7.3 | |
* @since 3.2.0 Added raw message string and HTML as separate params. | |
* | |
* @param string $full_html The post restricted message with HTML. | |
* @param string $message The raw message string. | |
* @param string $before The 'before' HTML wrapper. | |
* @param string $after The 'after' HTML wrapper. | |
*/ | |
$str = apply_filters( 'wpmem_restricted_msg', $full_html, $args['msg'], $args['before'], $args['after'] ); | |
} | |
return $str; | |
} | |
/** | |
* Alias for handing the default WP login form. | |
* | |
* @since 3.3.2 | |
*/ | |
function wp_login_form( $args ) { | |
return wp_login_form( $args ); | |
} | |
/** | |
* Generate TOS field with link. | |
* | |
* @since 3.3.5 | |
* | |
* @param array $field | |
* @param string $tag | |
* @return string | |
*/ | |
function get_tos_link( $field, $tag = 'new' ) { | |
global $wpmem; | |
// Determine if TOS is a WP page or not. | |
$tos_content = stripslashes( get_option( 'wpmembers_tos' ) ); | |
if ( has_shortcode( $tos_content, 'wpmem_tos' ) || has_shortcode( $tos_content, 'wp-members' ) ) { | |
$tos_link_url = do_shortcode( $tos_content ); | |
$tos_link_tag = '<a href="' . esc_url( $tos_link_url ) . '" target="_blank">'; | |
} else { | |
$tos_link_url = esc_url( add_query_arg( 'tos', 'display' ) ); | |
$tos_link_tag = "<a href=\"#\" onClick=\"window.open('" . esc_url( $tos_link_url ) . "','tos');\">"; | |
} | |
/** | |
* Filter the TOS link. | |
* | |
* @since 3.2.6 | |
* | |
* @param string $tos_link_tag | |
* @param string $tos_link_url | |
*/ | |
$tos_link_tag = apply_filters( 'wpmem_tos_link_tag', $tos_link_tag, $tos_link_url ); | |
/** | |
* Filter the TOS link text. | |
* | |
* @since 2.7.5 | |
* | |
* @param string The link text. | |
* @param string $tag Toggle new registration or profile update. new|edit. | |
*/ | |
$tos_link_text = apply_filters( 'wpmem_tos_link_txt', wpmem_get_text( 'register_tos' ), $tag ); | |
// If filtered value is not the default label, use that, otherwise use label. | |
// @note: if default changes, this check must change. | |
if ( __( 'Please indicate that you agree to the %s Terms of Service %s', 'wp-members' ) == $tos_link_text ) { | |
if ( __( 'TOS', 'wp-members' ) != $field['label'] && __( 'Terms of Service', 'wp-members' ) != $field['label'] ) { | |
$tos_link_text = $field['label']; | |
} | |
} | |
// If tos string does not contain link identifiers (%s), wrap the whole string. | |
if ( ! strpos( $tos_link_text, '%s' ) ) { | |
$tos_link_text = '%s' . $tos_link_text . '%s'; | |
} | |
return sprintf( $tos_link_text, $tos_link_tag, '</a>' ); | |
} | |
function get_reg_row_keys() { | |
return array( 'meta', 'type', 'value', 'values', 'label_text', 'row_before', 'label', 'field_before', 'field', 'field_after', 'row_after' ); | |
} | |
function is_reg_form_showing() { | |
return $this->reg_form_showing; | |
} | |
function set_reg_form_showing( $value ) { | |
$this->reg_form_showing = $value; | |
} | |
} // End of WP_Members_Forms class. |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment