diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 00000000..a8358f0f --- /dev/null +++ b/.gitmodules @@ -0,0 +1,3 @@ +[submodule "includes/vendor/rocketgeek-utilities"] + path = includes/vendor/rocketgeek-utilities + url = https://github.com/rocketgeek/rocketgeek-utilities.git diff --git a/admin/admin.php b/admin/admin.php deleted file mode 100644 index 1aa48ec4..00000000 --- a/admin/admin.php +++ /dev/null @@ -1,290 +0,0 @@ -' . __( 'Settings', 'wp-members' ) . ''; - $links = array_merge( array( $settings_link ), $links ); - } - return $links; -} - - -/** - * Loads the admin javascript and css files. - * - * @since 2.5.1 - * - * @uses wp_enqueue_script - * @uses wp_enqueue_style - */ -function wpmem_load_admin_js() { - // Queue up admin ajax and styles. - wp_enqueue_script( 'wpmem-admin-js', WPMEM_DIR . 'js/admin.js', '', WPMEM_VERSION ); - wp_enqueue_style ( 'wpmem-admin-css', WPMEM_DIR . 'css/admin.css', '', WPMEM_VERSION ); -} - - -/** - * Creates the captcha tab. - * - * @since 2.8 - * - * @param string $tab - * @return - */ -function wpmem_a_captcha_tab( $tab ) { - include_once( WPMEM_PATH . 'admin/tab-captcha.php' ); - return ( $tab == 'captcha' ) ? wpmem_a_build_captcha_options() : false ; -} - - -/** - * Adds the captcha tab. - * - * @since 2.8 - * - * @param array $tabs The array of tabs for the admin panel. - * @return array The updated array of tabs for the admin panel. - */ -function wpmem_add_captcha_tab( $tabs ) { - return array_merge( $tabs, array( 'captcha' => 'Captcha' ) ); -} - - -/** - * Primary admin function. - * - * @since 2.1 - */ -function wpmem_admin() { - - $did_update = ( isset( $_POST['wpmem_admin_a'] ) ) ? wpmem_admin_action( $_POST['wpmem_admin_a'] ) : false; - - global $wpmem; - - if ( $wpmem->captcha ) { - add_filter( 'wpmem_admin_tabs', 'wpmem_add_captcha_tab' ); - add_action( 'wpmem_admin_do_tab', 'wpmem_a_captcha_tab', 1, 1 ); - } ?> - -
- - - -
'WP-Members ' . __( 'Options', 'wp-members' ), - 'fields' => __( 'Fields', 'wp-members' ), - 'dialogs' => __( 'Dialogs', 'wp-members' ), - 'emails' => __( 'Emails', 'wp-members' ), - ); - - /** - * Filter the admin tabs for the plugin settings page. - * - * @since 2.8.0 - * - * @param array $tabs An array of the tabs to be displayed on the plugin settings page. - */ - $tabs = apply_filters( 'wpmem_admin_tabs', $tabs ); - - $links = array(); - foreach ( $tabs as $tab => $name ) { - $class = ( $tab == $current ) ? 'nav-tab nav-tab-active' : 'nav-tab'; - $links[] = '' . $name . ''; - } - - echo ''; -} - - -/** - * Handles the various update actions for the default tabs. - * - * @since 2.8 - * - * @param string $action The action that is being done. - */ -function wpmem_admin_action( $action ) { - - $did_update = ''; // makes sure $did_update is defined - switch ( $action ) { - - case 'update_settings': - include_once( WPMEM_PATH . 'admin/tab-options.php' ); - $did_update = wpmem_update_options(); - break; - - case 'update_fields': - case 'add_field': - case 'edit_field': - include_once( WPMEM_PATH . 'admin/tab-fields.php' ); - $did_update = wpmem_update_fields( $action ); - break; - - case 'update_dialogs': - include_once( WPMEM_PATH . 'admin/tab-dialogs.php' ); - $did_update = wpmem_update_dialogs(); - break; - - case 'update_emails': - include_once( WPMEM_PATH . 'admin/tab-emails.php' ); - $did_update = wpmem_update_emails(); - break; - - case 'update_captcha': - include_once( WPMEM_PATH . 'admin/tab-captcha.php' ); - $did_update = wpmem_update_captcha(); - break; - } - - return $did_update; -} - - -/** - * Adds WP-Members custom fields to the WP Add New User form. - * - * @since 2.9.1 - */ -function wpmem_admin_add_new_user() { - include_once( WPMEM_PATH . 'inc/wp-registration.php' ); - echo wpmem_do_wp_newuser_form(); - return; -} - -// End of File. \ No newline at end of file diff --git a/admin/dialogs.php b/admin/dialogs.php deleted file mode 100644 index ee50d793..00000000 --- a/admin/dialogs.php +++ /dev/null @@ -1,230 +0,0 @@ - -

warnings == 0 ) ? true : false; - - // Settings allow anyone to register. - if ( get_option( 'users_can_register' ) != 0 && $warnings_off ) { - wpmem_a_warning_msg(1); - } - - // Settings allow anyone to comment. - if ( get_option( 'comment_registration' ) !=1 && $warnings_off ) { - wpmem_a_warning_msg(2); - } - - // Rss set to full text feeds. - if ( get_option( 'rss_use_excerpt' ) !=1 && $warnings_off ) { - wpmem_a_warning_msg(3); - } - - // Holding registrations but haven't changed default successful registration message. - if ( $warnings_off && $wpmem->mod_reg == 1 && $wpmem_dialogs[3] == 'Congratulations! Your registration was successful.

You may now login using the password that was emailed to you.' ) { - wpmem_a_warning_msg(4); - } - - // Haven't entered recaptcha api keys. - if ( $warnings_off && $wpmem->captcha == 1 ) { - $wpmem_captcha = get_option( 'wpmembers_captcha' ); - if ( isset( $wpmem_captcha['recaptcha'] ) ) { - if ( ! $wpmem_captcha['recaptcha']['public'] || ! $wpmem_captcha['recaptcha']['private'] ) { - wpmem_a_warning_msg(6); - } - } - } - -} - - -/** - * Assembles the various admin warning messages. - * - * @since 2.4.0 - * - * @param int $msg The number for which message should be displayed. - */ -function wpmem_a_warning_msg( $msg ) { - - $strong_msg = $remain_msg = $span_msg = ''; - - switch ( $msg ) { - - case 1: - $strong_msg = __( 'Your WP settings allow anyone to register - this is not the recommended setting.', 'wp-members' ); - $remain_msg = sprintf( __( 'You can %s change this here %s making sure the box next to "Anyone can register" is unchecked.', 'wp-members'), '', '' ); - $span_msg = __( 'This setting allows a link on the /wp-login.php page to register using the WP native registration process thus circumventing any registration you are using with WP-Members. In some cases, this may suit the users wants/needs, but most users should uncheck this option. If you do not change this setting, you can choose to ignore these warning messages under WP-Members Settings.', 'wp-members' ); - break; - - case 2: - $strong_msg = __( 'Your WP settings allow anyone to comment - this is not the recommended setting.', 'wp-members' ); - $remain_msg = sprintf( __( 'You can %s change this here %s by checking the box next to "Users must be registered and logged in to comment."', 'wp-members' ), '', '' ); - $span_msg = __( 'This setting allows any users to comment, whether or not they are registered. Depending on how you are using WP-Members will determine whether you should change this setting or not. If you do not change this setting, you can choose to ignore these warning messages under WP-Members Settings.', 'wp-members' ); - break; - - case 3: - $strong_msg = __( 'Your WP settings allow full text rss feeds - this is not the recommended setting.', 'wp-members' ); - $remain_msg = sprintf( __( 'You can %s change this here %s by changing "For each article in a feed, show" to "Summary."', 'wp-members' ), '' , '' ); - $span_msg = __( 'Leaving this set to full text allows anyone to read your protected content in an RSS reader. Changing this to Summary prevents this as your feeds will only show summary text.', 'wp-members' ); - break; - - case 4: - $strong_msg = __( 'You have set WP-Members to hold registrations for approval', 'wp-members' ); - $remain_msg = __( 'but you have not changed the default message for "Registration Completed" under "WP-Members Dialogs and Error Messages." You should change this message to let users know they are pending approval.', 'wp-members' ); - break; - - case 5: - $strong_msg = __( 'You have set WP-Members to turn off the registration process', 'wp-members' ); - $remain_msg = __( 'but you also set to moderate and/or email admin new registrations. You will need to set up a registration page for users to register.', 'wp-members' ); - break; - - case 6: - $strong_msg = __( 'You have turned on reCAPTCHA', 'wp-members'); - $remain_msg = __( 'but you have not entered API keys. You will need both a public and private key. The CAPTCHA will not display unless a valid API key is included.', 'wp-members' ); - break; - - } - - if ( $span_msg ) { - $span_msg = ' [why is this?]'; - } - echo '

' . $strong_msg . ' ' . $remain_msg . $span_msg . '

'; - -} - - -/** - * Assemble the side meta box. - * - * @since 2.8 - */ -function wpmem_a_meta_box() { - - ?>
-

WP-Members Information

-
- -


-
-
- - -

Find out how to get access to WP-Members private members forum, premium code snippets, tutorials, and add-on modules! - -

- -

- ™!

-  Chad Butler
- ButlerBlog: RSS | Twitter
- Copyright © 2006-

- Premium support and installation service available at rocketgeek.com. -

-
-
-

-
'http://rocketgeek.com/feed/', //put your feed URL here - 'title' => __( 'Latest from RocketGeek', 'wp-members' ), - 'items' => 4, //how many posts to show - 'show_summary' => 0, - 'show_author' => 0, - 'show_date' => 0, - ) );?> -
-
'; - wp_widget_rss_output( array( - 'url' => 'http://feeds.feedburner.com/butlerblog', - 'title' => __( 'Latest from ButlerBlog', 'wp-members' ), - 'items' => 5, - 'show_summary' => 0, - 'show_author' => 0, - 'show_date' => 1, - ) ); - echo ""; -} - -/** End of File **/ \ No newline at end of file diff --git a/admin/index.php b/admin/index.php index 6be7716e..dc051a13 100644 --- a/admin/index.php +++ b/admin/index.php @@ -1 +1 @@ - \ No newline at end of file + - current_action(); - $sendback = ''; - - switch ( $action ) { - - case ( 'block' ): - case ( 'unblock' ): - // Validate nonce. - check_admin_referer( 'bulk-posts' ); - // Get the posts. - $posts = ( isset( $_REQUEST['post'] ) ) ? $_REQUEST['post'] : ''; - // Update posts. - $x = ''; - if ( $posts ) { - foreach ( $posts as $post_id ) { - $x++; - $post = get_post( $post_id ); - $type = $post->post_type; - // Update accordingly. - if ( $wpmem->block[ $type ] == 0 ) { - if ( $action == 'block' ) { - update_post_meta( $post_id, '_wpmem_block', 1 ); - } else { - delete_post_meta( $post_id, '_wpmem_block' ); - } - } - - if ( $wpmem->block[ $type ] == 1 ) { - if ( $action == 'unblock' ) { - update_post_meta( $post_id, '_wpmem_block', 0 ); - } else { - delete_post_meta( $post_id, '_wpmem_block' ); - } - } - } - // Set the return message. - $arr = array( - 'a' => $action, - 'n' => $x, - 'post_type' => $type, - ); - - $sendback = add_query_arg( array( $arr ), '', $sendback ); - - } else { - // Set the return message. - $sendback = add_query_arg( array( 'a' => 'none' ), '', $sendback ); - } - break; - - default: - return; - - } - - // If we did not return already, we need to wp_redirect. - wp_redirect( $sendback ); - exit(); -} - - -/** - * Function to echo admin update message. - * - * @since 2.8.2 - */ -function wpmem_posts_admin_notices() { - - global $pagenow, $post_type; - if ( $pagenow == 'edit.php' && isset( $_REQUEST['a'] ) ) { - $action = ( $_REQUEST['a'] == 'block' ) ? 'blocked' : 'unblocked'; - echo '

' . $_REQUEST['n'] . ' ' . $post_type . ' ' . $action . '

'; - } -} - - -/** - * Adds the blocking meta boxes for post and page editor screens. - * - * @since 2.8 - */ -function wpmem_block_meta_add() { - - // Build an array of post types - // @todo - holding off on CPT support. - // $post_types = get_post_types( array( 'public' => true, '_builtin' => false ), 'names', 'and' ); - $post_arr = array( - 'post' => 'Posts', - 'page' => 'Pages', - ); - /* if ( $post_types ) { - foreach ( $post_types as $post_type ) { - $cpt_obj = get_post_type_object( $post_type ); - $post_arr[ $cpt_obj->name ] = $cpt_obj->labels->name; - } - } */ - - foreach ( $post_arr as $key => $val ) { - - /** - * Filter the post meta box title. - * - * @since 2.9.0 - * - * @param Post restriction title. - */ - $post_title = apply_filters( 'wpmem_admin_' . $key . '_meta_title', __( $val . ' Restriction', 'wp-members' ) ); - - add_meta_box( 'wpmem-block-meta-id', $post_title, 'wpmem_block_meta', $key, 'side', 'high' ); - } -} - - -/** - * Builds the meta boxes for post and page editor screens. - * - * @since 2.8 - * - * @global $post The WordPress post object. - */ -function wpmem_block_meta() { - - global $post, $wpmem; - - wp_nonce_field( 'wpmem_block_meta_nonce', 'wpmem_block_meta_nonce' ); - - $post_type = get_post_type_object( $post->post_type ); - - if ( isset( $wpmem->block[ $post->post_type ] ) && $wpmem->block[ $post->post_type ] == 1 ) { - $block = 0; - $notice_text = 'blocked'; - $text = 'Unblock'; - } else { //} elseif ( $wpmem->block[ $post->post_type ] == 0 ) { - $block = 1; - $notice_text = 'not blocked'; - $text = 'Block'; - } - $meta = '_wpmem_block'; - $admin_url = get_admin_url(); ?> - -

- labels->name, $notice_text ); - echo '  '; - printf( 'Edit', $admin_url ); - ?> -

-

- - ID, $meta, true ), '1' ); ?> /> - - ID, $meta, true ), '0' ); ?> /> - - -

- block[ $post_type ] == 1 ) ? __( 'Unblocked?', 'wp-members' ) : __( 'Blocked?', 'wp-members' ); - } - return $columns; -} - - -/** - * Adds blocking status to the Post Table column. - * - * @since 2.8.3 - * - * @param $column_name - * @param $post_ID - */ -function wpmem_post_columns_content( $column_name, $post_ID ) { - - global $wpmem; - $post_type = ( isset( $_REQUEST['post_type'] ) ) ? $_REQUEST['post_type'] : 'post'; - - if ( $column_name == 'wpmem_block' ) { - - $block_meta = get_post_meta( $post_ID, '_wpmem_block', true ); - - // Backward compatibility for old block/unblock meta. - if ( ! $block_meta ) { - // Check for old meta. - $old_block = get_post_meta( $post_ID, 'block', true ); - $old_unblock = get_post_meta( $post_ID, 'unblock', true ); - $block_meta = ( $old_block ) ? 1 : ( ( $old_unblock ) ? 0 : $block_meta ); - } - - echo ( $wpmem->block[ $post_type ] == 1 && $block_meta == '0' ) ? __( 'Yes' ) : ''; - echo ( $wpmem->block[ $post_type ] == 0 && $block_meta == '1' ) ? __( 'Yes' ) : ''; - } -} - - -/** - * Adds shortcode dropdown to post editor tinymce. - * - * @since 3.0 - */ -function wpmem_load_tinymce() { - // @todo For now, only load if WP version is high enough. - if ( version_compare( get_bloginfo( 'version' ), '3.9', '>=' ) ) { - global $wpmem_shortcode; - include( WPMEM_PATH . 'inc/class-wp-members-tinymce-buttons.php' ); - $wpmem_shortcode = new WP_Members_TinyMCE_Buttons; - } -} - -// End of File. \ No newline at end of file +', '' ), 'wp-members' ); - ?> -
- -
- -
-

-
- -
-
-
- -
-
-
- -

-
-
- - - captcha == 1 ) { - $show_update_button = true; - $private_key = ( isset( $wpmem_captcha['recaptcha'] ) ) ? $wpmem_captcha['recaptcha']['private'] : ''; - $public_key = ( isset( $wpmem_captcha['recaptcha'] ) ) ? $wpmem_captcha['recaptcha']['public'] : ''; - $captcha_theme = ( isset( $wpmem_captcha['recaptcha'] ) ) ? $wpmem_captcha['recaptcha']['theme'] : ''; - ?> - - - - - - - - - - - - captcha == 3 ) { - $show_update_button = true; - $private_key = ( isset( $wpmem_captcha['recaptcha'] ) ) ? $wpmem_captcha['recaptcha']['private'] : ''; - $public_key = ( isset( $wpmem_captcha['recaptcha'] ) ) ? $wpmem_captcha['recaptcha']['public'] : ''; - ?> - - - - - - - - captcha == 2 ) { - - // Setup defaults. - $defaults = array( - 'characters' => 'ABCDEFGHJKLMNPQRSTUVWXYZ23456789', - 'num_char' => '4', - 'dim_w' => '72', - 'dim_h' => '30', - 'font_color' => '0,0,0', - 'bg_color' => '255,255,255', - 'font_size' => '12', - 'kerning' => '14', - 'img_type' => 'png', - ); - - $args = ( is_array( $wpmem_captcha['really_simple'] ) ) ? $wpmem_captcha['really_simple'] : array(); - - extract( wp_parse_args( $args, $defaults ) ); - - // Explode colors. - $font_color = explode( ',', $font_color ); - $bg_color = explode( ',', $bg_color ); - - $show_update_button = true; - if ( is_plugin_active( 'really-simple-captcha/really-simple-captcha.php' ) ) { ?> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - captcha ) { - case 1: - $captcha_type = 'recaptcha'; - break; - case 2: - $captcha_type = 'really_simple'; - break; - case 3: - $captcha_type = 'recaptcha2'; - break; - } ?> - - - - - -
-

-

', '' ); ?>.

-

-

- ", '' ); ?>.
- :  
- -
- -
-

-

', '' ); ?>.

-

-

- ", '' ); ?>.
- :  
- -
R: G: B:
R: G: B:
-
-

-

', '' ), 'wp-members' ); ?>

-
  - - - -
-
-
-
-
-
-
- $_POST['wpmem_captcha_publickey'], - 'private' => $_POST['wpmem_captcha_privatekey'], - ); - if ( $update_type == 'recaptcha' && isset( $_POST['wpmem_captcha_theme'] ) ) { - $new_settings['recaptcha']['theme'] = $_POST['wpmem_captcha_theme']; - } - } - - if ( $update_type == 'really_simple' ) { - if ( array_key_exists( 'recaptcha', $settings ) ) { - // Updating really_simple but need to maintain recaptcha. - $new_settings['recaptcha'] = $settings['recaptcha']; - } - $font_color = $_POST['font_color_r'] . ',' . $_POST['font_color_g'] . ',' . $_POST['font_color_b']; - $bg_color = $_POST['bg_color_r'] . ',' . $_POST['bg_color_g'] . ',' . $_POST['bg_color_b']; - $new_settings['really_simple'] = array( - 'characters' => $_POST['characters'], - 'num_char' => $_POST['num_char'], - 'dim_w' => $_POST['dim_w'], - 'dim_h' => $_POST['dim_h'], - 'font_color' => $font_color, - 'bg_color' => $bg_color, - 'font_size' => $_POST['font_size'], - 'kerning' => $_POST['kerning'], - 'img_type' => $_POST['img_type'], - ); - } - - update_option( 'wpmembers_captcha', $new_settings ); - return __( 'CAPTCHA was updated for WP-Members', 'wp-members' ); -} - -/** End of File **/ \ No newline at end of file diff --git a/admin/tab-dialogs.php b/admin/tab-dialogs.php deleted file mode 100644 index b7fc8150..00000000 --- a/admin/tab-dialogs.php +++ /dev/null @@ -1,122 +0,0 @@ - -
- -
- -
-

-
- See the Users Guide on dialogs. -
-
-
- -
-
-
-

WP-Members

-
-

-
- - - - - - - - - - - - - - - - - - -
  - - -
-
-
-
-
-
-
- mod_reg == 0 ) { - $wpmem_email_title_arr = array( - array( __( "New Registration", 'wp-members' ), 'wpmembers_email_newreg' ), - ); - } else { - $wpmem_email_title_arr = array( - array( __( "Registration is Moderated", 'wp-members' ), 'wpmembers_email_newmod' ), - array( __( "Registration is Moderated, User is Approved", 'wp-members' ), 'wpmembers_email_appmod' ), - ); - } - array_push( - $wpmem_email_title_arr, - array( __( "Password Reset", 'wp-members' ), 'wpmembers_email_repass' ) - ); - if ( $wpmem->notify == 1 ) { - array_push( - $wpmem_email_title_arr, - array( __( "Admin Notification", 'wp-members' ), 'wpmembers_email_notify' ) - ); - } - array_push( - $wpmem_email_title_arr, - array( __( "Email Signature", 'wp-members' ), 'wpmembers_email_footer' ) - ); ?> -
- -
-
-
-

WP-Members

-
-

-
- - -

-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  email@yourdomain.com
  John Smith



  - - -
-
-
-
-
-

- -
-
-
-
- mod_reg == 0 ) ? $arr = array( 'wpmembers_email_newreg' ) : $arr = array( 'wpmembers_email_newmod', 'wpmembers_email_appmod' ); - array_push( $arr, 'wpmembers_email_repass' ); - ( $wpmem->notify == 1 ) ? array_push( $arr, 'wpmembers_email_notify' ) : false; - array_push( $arr, 'wpmembers_email_footer' ); - - for ( $row = 0; $row < ( count( $arr ) - 1 ); $row++ ) { - $arr2 = array( - "subj" => $_POST[$arr[$row] . '_subj'], - "body" => $_POST[$arr[$row] . '_body'], - ); - update_option( $arr[$row], $arr2, false ); - $arr2 = ''; - } - - // Updated the email footer. - update_option( $arr[$row], $_POST[$arr[$row] . '_body'], false ); - - return __( 'WP-Members emails were updated', 'wp-members' ); - -} - -/** End of File **/ \ No newline at end of file diff --git a/admin/tab-fields.php b/admin/tab-fields.php deleted file mode 100644 index 4a59e0da..00000000 --- a/admin/tab-fields.php +++ /dev/null @@ -1,570 +0,0 @@ - -
- -
-
- - - -
-
- -
- 0 ) { - $key = $new_order[$row]; - $key = substr( $key, 15 ); - - for ( $x = 0; $x < count( $wpmem_old_fields ); $x++ ) { - - if ( $wpmem_old_fields[$x][0] == $key ) { - $wpmem_new_fields[$row - 1] = $wpmem_old_fields[$x]; - } - } - } - } - - update_option( 'wpmembers_fields', $wpmem_new_fields ); - - die(); // This is required to return a proper result. - -} - - -/** - * Updates fields. - * - * @since 2.8 - * - * @param string $action The field update action (update_fields|add|edit) - * @global string $add_field_err_msg The add field error message - * @return string $did_update The fields update message - * - * @todo apply some additional form validation to the add/update process - */ -function wpmem_update_fields( $action ) { - - // Get the current fields. - $wpmem_fields = get_option( 'wpmembers_fields' ); - $wpmem_ut_fields = get_option( 'wpmembers_utfields' ); - - if ( $action == 'update_fields' ) { - - // Check nonce. - check_admin_referer( 'wpmem-update-fields' ); - - // @todo - need some additional form validation here - - // Update user table fields. - $arr = ( isset( $_POST['ut_fields'] ) ) ? $_POST['ut_fields'] : ''; - update_option( 'wpmembers_utfields', $arr ); - - // Rebuild the array, don't touch user_email - it's always mandatory. - $nrow = 0; - for ( $row = 0; $row < count( $wpmem_fields ); $row++ ) { - - // Check to see if the field is checked for deletion, and if not, add it to the new array. - $delete_field = "del_" . $wpmem_fields[$row][2]; - $delete_field = ( isset( $_POST[$delete_field] ) ) ? $_POST[$delete_field] : false; - if ( $delete_field != "delete" ) { - - for ( $i = 0; $i < 4; $i++ ) { - $wpmem_newfields[$nrow][$i] = $wpmem_fields[$row][$i]; - } - - $wpmem_newfields[$nrow][0] = $nrow + 1; - - $display_field = $wpmem_fields[$row][2] . "_display"; - $require_field = $wpmem_fields[$row][2] . "_required"; - $checked_field = $wpmem_fields[$row][2] . "_checked"; - - if ( $wpmem_fields[$row][2] != 'user_email' ){ - $wpmem_newfields[$nrow][4] = ( isset( $_POST[$display_field] ) ) ? $_POST[$display_field] : ''; - $wpmem_newfields[$nrow][5] = ( isset( $_POST[$require_field] ) ) ? $_POST[$require_field] : ''; - } else { - $wpmem_newfields[$nrow][4] = 'y'; - $wpmem_newfields[$nrow][5] = 'y'; - } - - // @todo Does $chkreq get used anywhere? - // if ( $wpmem_newfields[$nrow][4] != 'y' && $wpmem_newfields[$nrow][5] == 'y' ) { $chkreq = "err"; } - // @todo Changed above to this: - $chkreq = ( $wpmem_newfields[$nrow][4] != 'y' && $wpmem_newfields[$nrow][5] == 'y' ) ? 'err' : false; - - $wpmem_newfields[$nrow][6] = $wpmem_fields[$row][6]; - $wpmem_newfields[$nrow][7] = ( isset( $wpmem_fields[$row][7] ) ) ? $wpmem_fields[$row][7] : ''; - if ( $wpmem_fields[$row][3] == 'checkbox' ) { - if ( isset( $_POST[$checked_field] ) && $_POST[$checked_field] == 'y' ) { - $wpmem_newfields[$nrow][8] = 'y'; - } else { - $wpmem_newfields[$nrow][8] = 'n'; - } - } - - $nrow = $nrow + 1; - } - - } - - update_option( 'wpmembers_fields', $wpmem_newfields ); - $did_update = __( 'WP-Members fields were updated', 'wp-members' ); - - } elseif ( $action == 'add_field' || 'edit_field' ) { - - // Check nonce. - check_admin_referer( 'wpmem-add-fields' ); - - global $add_field_err_msg; - - $add_field_err_msg = false; - - // Error check that field label and option name are included and unique. - $add_field_err_msg = ( $_POST['add_name'] == '' ) ? __( 'Field Label is required for adding a new field. Nothing was updated.', 'wp-members' ) : $add_field_err_msg; - $add_field_err_msg = ( $_POST['add_option'] == '' ) ? __( 'Option Name is required for adding a new field. Nothing was updated.', 'wp-members' ) : $add_field_err_msg; - - $add_field_err_msg = ( !preg_match("/^[A-Za-z0-9_]*$/", $_POST['add_option'] ) ) ? __( 'Option Name must contain only letters, numbers, and underscores', 'wp-members' ) : $add_field_err_msg; - - // Check for duplicate field names. - $chk_fields = array(); - foreach ( $wpmem_fields as $field ) { - $chk_fields[] = $field[2]; - } - $add_field_err_msg = ( in_array( $_POST['add_option'], $chk_fields ) ) ? __( 'A field with that option name already exists', 'wp-members' ) : $add_field_err_msg; - - // Error check for reserved terms. - $reserved_terms = wpmem_wp_reserved_terms(); - $submitted_term = $_POST['add_option']; - if ( in_array( strtolower( $submitted_term ), $reserved_terms ) ) { - $add_field_err_msg = sprintf( __( 'Sorry, "%s" is a reserved term. Field was not added.', 'wp-members' ), $submitted_term ); - } - - // Error check option name for spaces and replace with underscores. - $us_option = $_POST['add_option']; - $us_option = preg_replace( "/ /", '_', $us_option ); - - $arr = array(); - - $arr[0] = ( $action == 'add_field' ) ? ( count( $wpmem_fields ) ) + 2 : false; - $arr[1] = stripslashes( $_POST['add_name'] ); - $arr[2] = $us_option; - $arr[3] = $_POST['add_type']; - $arr[4] = ( isset( $_POST['add_display'] ) ) ? $_POST['add_display'] : 'n'; - $arr[5] = ( isset( $_POST['add_required'] ) ) ? $_POST['add_required'] : 'n'; - $arr[6] = ( $us_option == 'user_nicename' || $us_option == 'display_name' || $us_option == 'nickname' ) ? 'y' : 'n'; - - if ( $_POST['add_type'] == 'checkbox' ) { - $add_field_err_msg = ( ! $_POST['add_checked_value'] ) ? __( 'Checked value is required for checkboxes. Nothing was updated.', 'wp-members' ) : $add_field_err_msg; - $arr[7] = ( isset( $_POST['add_checked_value'] ) ) ? $_POST['add_checked_value'] : false; - $arr[8] = ( isset( $_POST['add_checked_default'] ) ) ? $_POST['add_checked_default'] : 'n'; - } - - if ( $_POST['add_type'] == 'select' ) { - // Get the values. - $str = stripslashes( $_POST['add_dropdown_value'] ); - // Remove linebreaks. - $str = trim( str_replace( array("\r", "\r\n", "\n"), '', $str ) ); - // Create array. - if ( ! function_exists( 'str_getcsv' ) ) { - $arr[7] = explode( ',', $str ); - } else { - $arr[7] = str_getcsv( $str, ',', '"' ); - } - } - - if ( $_POST['add_type'] == 'file' ) { - $arr[7] = stripslashes( $_POST['add_file_value'] ); - } - - if ( $action == 'add_field' ) { - if ( ! $add_field_err_msg ) { - array_push( $wpmem_fields, $arr ); - update_option( 'wpmembers_fields', $wpmem_fields ); - $did_update = $_POST['add_name'] . ' ' . __( 'field was added', 'wp-members' ); - } else { - $did_update = $add_field_err_msg; - } - } else { - - for ( $row = 0; $row < count( $wpmem_fields ); $row++ ) { - if ( $wpmem_fields[$row][2] == $_GET['edit'] ) { - $arr[0] = $wpmem_fields[$row][0]; - $x = ( $arr[3] == 'checkbox' ) ? 8 : ( ( $arr[3] == 'select' || $arr[3] == 'file' ) ? 7 : 6 ); - for ( $r = 0; $r < $x+1; $r++ ) { - $wpmem_fields[$row][$r] = $arr[$r]; - } - } - } - - update_option( 'wpmembers_fields', $wpmem_fields ); - - $did_update = $_POST['add_name'] . ' ' . __( 'field was updated', 'wp-members' ); - - } - } - - if ( WPMEM_DEBUG == true && isset( $arr ) ) { echo "
"; print_r($arr); echo "
"; } - - return $did_update; -} - - -/** - * Function to write the field edit link. - * - * @since 2.8 - * - * @param string $field_id The option name of the field to be edited - */ -function wpmem_fields_edit_link( $field_id ) { - return '' . __( 'Edit' ) . ''; -} - - -/** - * Function to dispay the add/edit field form. - * - * @since 2.8 - * - * @param string $mode The mode for the function (edit|add) - * @param array|null $wpmem_fields the array of fields - * @param string|null $field the field being edited - */ -function wpmem_a_field_edit( $mode, $wpmem_fields = null, $field = null ) { - - if ( $mode == 'edit' ) { - for ( $row = 0; $row < count( $wpmem_fields ); $row++ ) { - if ( $wpmem_fields[$row][2] == $field ) { - $field_arr = $wpmem_fields[$row]; - } - } - } - - $form_action = ( $mode == 'edit' ) ? 'editfieldform' : 'addfieldform'; - -?> -
-

-
-
- -
    -
  • - - - -
  • -
  • - - - - - - - -
  • -
  • - - - - - - -
  • -
  • - - /> -
  • -
  • - - /> -
  • - - ' : ''; ?> -
  • - -
  • -
  • - - -
  • -
  • - - -
  • - ' : ''; ?> - - - ' : ''; ?> -
  • - -
  • -
  • - - /> -
  • -
  • - - -
  • - ' : ''; ?> - - - ' : ''; ?> -
  • - -
  • -
  • - - -
  • -
  • - - -
  • -
  • - - -
  • - ' : ''; ?> - - -

- - - -
-
-
- -
-

-
-

-

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - mod_reg == 1 ) { ?> - - - - - - - - - - - - - - - - use_exp == 1 ) { ?> - - - - - - - - - - - - - - - -
" value="delete" /> * - - - - /> - -
 user_registered  - /> -
 active  - /> -
 wpmem_reg_ip  - /> -
 Subscription Typeexp_type  - /> -
 Expiresexpires  - /> -

- - -
-
-
- ', '', '', '' ), 'wp-members' ); - $help_link = __( sprintf( 'See the %sUsers Guide on plugin options%s.', '', '' ), 'wp-members' ); - - // Build an array of post types - $post_types = get_post_types( array( 'public' => true, '_builtin' => false ), 'names', 'and' ); - $post_arr = array( - 'post' => 'Posts', - 'page' => 'Pages', - ); - if ( $post_types ) { - foreach ( $post_types as $post_type ) { - $cpt_obj = get_post_type_object( $post_type ); - $post_arr[ $cpt_obj->name ] = $cpt_obj->labels->name; - } - } ?> - -
- -
- -
-

-
- -
-
- -
- -
-
-
-

-
-
- -

Content

-
    - $val ) { - if ( $key == 'post' || $key == 'page' ) { // @todo - holding off on CPT support. ?> - > - - - - - __( 'Show Excerpts', 'wp-members' ), - 'show_login' => __( 'Show Login Form', 'wp-members' ), - 'show_reg' => __( 'Show Registration Form', 'wp-members' ), - ); - - foreach ( $option_group_array as $item_key => $item_val ) { - $i = 0; - $len = count( $post_arr ); - foreach ( $post_arr as $key => $val ) { - if ( $key == 'post' || $key == 'page' ) { // @todo - holding off on CPT support. - $setting = ( isset( $wpmem->{$item_key}[ $key ] ) ) ? $wpmem->{$item_key}[ $key ] : 0; - ?> - > - - /> - - -
- -

Subscription Settings

-
    -
  • - - $arr[$row][3]; } ?> - $arr[$row][3] == 1 ) { echo "checked"; }?> />   - -
  • -
-

Other Settings

-
    - -
  • - - $arr[$row][3]; } ?> - $arr[$row][3] == 1 ) { echo "checked"; }?> />   - -
  • - - attrib; ?> -
  • - - />   - -
  • - autoex; ?> -
  • - - />      . -
  • -
  • - - -
  • -

    - user_pages['login']; - if ( ! $wpmem_logurl ) { $wpmem_logurl = wpmem_use_ssl(); } ?> -
  • - -  
    -
    - - -
    -
  • - user_pages['register']; - if ( ! $wpmem_regurl ) { $wpmem_regurl = wpmem_use_ssl(); } ?> -
  • - -  
    -
    - - -
    -
  • - user_pages['profile']; - if ( ! $wpmem_msurl ) { $wpmem_msurl = wpmem_use_ssl(); } ?> -
  • - -  
    -
    - - -
    -
  • -

    -
  • - - -
  • - cssurl; - if ( ! $wpmem_cssurl ) { $wpmem_cssurl = wpmem_use_ssl(); } ?> -
    -
  • - - -
  • -
    -

    - - -
-
-
-
-
-
-
- isset( $_POST['wpmem_autoex'] ) ? $_POST['wpmem_autoex'] : 0, - 'auto_ex_len' => isset( $_POST['wpmem_autoex_len'] ) ? $_POST['wpmem_autoex_len'] : '', - ); - - $wpmem_newsettings = array( - 'version' => WPMEM_VERSION, - 'notify' => ( isset( $_POST['wpmem_settings_notify'] ) ) ? $_POST['wpmem_settings_notify'] : 0, - 'mod_reg' => ( isset( $_POST['wpmem_settings_moderate'] ) ) ? $_POST['wpmem_settings_moderate'] : 0, - 'captcha' => ( isset( $_POST['wpmem_settings_captcha'] ) ) ? $_POST['wpmem_settings_captcha'] : 0, - 'use_exp' => ( isset( $_POST['wpmem_settings_time_exp'] ) ) ? $_POST['wpmem_settings_time_exp'] : 0, - 'use_trial' => ( isset( $_POST['wpmem_settings_trial'] ) ) ? $_POST['wpmem_settings_trial'] : 0, - 'warnings' => ( isset( $_POST['wpmem_settings_ignore_warnings'] ) ) ? $_POST['wpmem_settings_ignore_warnings'] : 0, - 'user_pages' => array( - 'profile' => ( $msurl ) ? $msurl : '', - 'register' => ( $regurl ) ? $regurl : '', - 'login' => ( $logurl ) ? $logurl : '', - ), - 'cssurl' => ( $cssurl ) ? $cssurl : '', - 'style' => $wpmem_settings_style, - 'autoex' => $wpmem_autoex, - 'attrib' => ( isset( $_POST['attribution'] ) ) ? $_POST['attribution'] : 0, - ); - - // Build an array of post types - $post_types = get_post_types( array( 'public' => true, '_builtin' => false ), 'names', 'and' ); - $post_arr = array( 'post', 'page' ); - if ( $post_types ) { - foreach ( $post_types as $post_type ) { - $cpt_obj = get_post_type_object( $post_type ); - $post_arr[] = $cpt_obj->name; - } - } - - // Get settings for blocking, excerpts, show login, and show registration for posts, pages, and custom post types. - $option_group_array = array( 'block', 'show_excerpt', 'show_login', 'show_reg' ); - foreach ( $option_group_array as $option_group_item ) { - $arr = array(); - foreach ( $post_arr as $post_type ) { - $post_var = 'wpmem_' . $option_group_item . '_' . $post_type; - $arr[ $post_type ] = ( isset( $_POST[ $post_var ] ) ) ? $_POST[ $post_var ] : 0; - } - $wpmem_newsettings[ $option_group_item ] = $arr; - } - - /* - * If we are setting registration to be moderated, - * check to see if the current admin has been - * activated so they don't accidentally lock themselves - * out later. - */ - if ( isset( $_POST['wpmem_settings_moderate'] ) == 1 ) { - global $current_user; - get_currentuserinfo(); - $user_ID = $current_user->ID; - update_user_meta( $user_ID, 'active', 1 ); - } - - update_option( 'wpmembers_settings', $wpmem_newsettings ); - - global $wpmem; - foreach ( $wpmem_newsettings as $key => $val ) { - $wpmem->$key = $val; - } - - return __( 'WP-Members settings were updated', 'wp-members' ); -} - - -/** - * Create the stylesheet dropdown selection. - * - * @since 2.8 - * - * @param $style string The stored stylesheet setting. - */ -function wpmem_admin_style_list( $style ) { - - $list = array( - 'No Float' => WPMEM_DIR . 'css/generic-no-float.css', - 'Rigid' => WPMEM_DIR . 'css/generic-rigid.css', - 'Twenty Fifteen' => WPMEM_DIR . 'css/wp-members-2015.css', - 'Twenty Fifteen - no float' => WPMEM_DIR . 'css/wp-members-2015-no-float.css', - 'Twenty Fourteen' => WPMEM_DIR . 'css/wp-members-2014.css', - 'Twenty Fourteen - no float' => WPMEM_DIR . 'css/wp-members-2014-no-float.css', - 'Twenty Thirteen' => WPMEM_DIR . 'css/wp-members-2013.css', - 'Twenty Twelve' => WPMEM_DIR . 'css/wp-members-2012.css', - 'Twenty Eleven' => WPMEM_DIR . 'css/wp-members-2011.css', - 'Twenty Ten' => WPMEM_DIR . 'css/wp-members.css', - 'Kubrick' => WPMEM_DIR . 'css/wp-members-kubrick.css', - ); - - /** - * Filters the list of stylesheets in the plugin options dropdown. - * - * @since 2.8.0 - * - * @param array $list An array of stylesheets that can be applied to the plugin's forms. - */ - $list = apply_filters( 'wpmem_admin_style_list', $list ); - - $selected = false; - foreach ( $list as $name => $location ) { - $selected = ( $location == $style ) ? true : $selected; - echo '\n"; - } - $selected = ( ! $selected ) ? ' selected' : ''; - echo ''; - - return; -} - - -/** - * Create a dropdown selection of pages. - * - * @since 2.8.1 - * - * @param string $val - */ -function wpmem_admin_page_list( $val, $show_custom_url = true ) { - - $selected = ( $val == 'http://' ) ? 'select a page' : false; - $pages = get_pages(); - - echo ''; - - foreach ( $pages as $page ) { - $selected = ( get_page_link( $page->ID ) == $val ) ? true : $selected; - $option = ''; - echo $option; - } - if ( $show_custom_url ) { - $selected = ( ! $selected ) ? ' selected' : ''; - echo ''; - } -} - -/** End of File **/ \ No newline at end of file + 'all', - 'filename' => 'wp-members-user-export-' . $today . '.csv', - 'export_fields' => array(), - 'exclude_fields' => array( 'password', 'confirm_password', 'confirm_email' ), - ); - - // Merge $args with defaults and extract. - /** - * Filter the default export arguments. - * - * @since 2.9.7 - * - * @param array $args An array of arguments to merge with defaults. Default null. - */ - extract( wp_parse_args( apply_filters( 'wpmem_export_args', $args ), $defaults ) ); - - // Output needs to be buffered, start the buffer. - ob_start(); - - // If exporting all, get all of the users. - $users = ( $export == 'all' ) ? get_users( array( 'fields' => 'ID' ) ) : $users; - - // Generate headers and a filename based on date of export. - header( "Content-Description: File Transfer" ); - header( "Content-type: application/octet-stream" ); - header( "Content-Disposition: attachment; filename=" . $filename ); - header( "Content-Type: text/csv; charset=" . get_option( 'blog_charset' ), true ); - echo "\xEF\xBB\xBF"; // UTF-8 BOM - - // Get the fields. - $wpmem_fields = get_option( 'wpmembers_fields' ); - - // Do the header row. - $hrow = "User ID,Username,"; - - foreach ( $wpmem_fields as $meta ) { - if ( ! in_array( $meta[2], $exclude_fields ) ) { - $hrow.= $meta[1] . ","; - } - } - - $hrow .= ( $wpmem->mod_reg == 1 ) ? __( 'Activated?', 'wp-members' ) . "," : ''; - $hrow .= ( $wpmem->use_exp == 1 ) ? __( 'Subscription', 'wp-members' ) . "," . __( 'Expires', 'wp-members' ) . "," : ''; - - $hrow .= __( 'Registered', 'wp-members' ) . ","; - $hrow .= __( 'IP', 'wp-members' ); - $data = $hrow . "\r\n"; - - /* - * We used the fields array once, - * rewind so we can use it again. - */ - reset( $wpmem_fields ); - - /* - * Loop through the array of users, - * build the data, delimit by commas, wrap fields with double quotes, - * use \n switch for new line. - */ - foreach ( $users as $user ) { - - $user_info = get_userdata( $user ); - - $data .= '"' . $user_info->ID . '","' . $user_info->user_login . '",'; - - $wp_user_fields = array( 'user_email', 'user_nicename', 'user_url', 'display_name' ); - foreach ( $wpmem_fields as $meta ) { - if ( ! in_array( $meta[2], $exclude_fields ) ) { - // @todo Research using fputcsv to escape fields for export. - if ( in_array( $meta[2], $wp_user_fields ) ){ - $data .= '"' . $user_info->$meta[2] . '",'; - } else { - $data .= '"' . get_user_meta( $user, $meta[2], true ) . '",'; - } - } - } - - $data .= ( $wpmem->mod_reg == 1 ) ? '"' . ( get_user_meta( $user, 'active', 1 ) ) ? __( 'Yes' ) : __( 'No' ) . '",' : ''; - $data .= ( $wpmem->use_exp == 1 ) ? '"' . get_user_meta( $user, "exp_type", true ) . '",' : ''; - $data .= ( $wpmem->use_exp == 1 ) ? '"' . get_user_meta( $user, "expires", true ) . '",' : ''; - - $data .= '"' . $user_info->user_registered . '",'; - $data .= '"' . get_user_meta( $user, "wpmem_reg_ip", true ). '"'; - $data .= "\r\n"; - - // Update the user record as being exported. - if ( $export != 'all' ){ - update_user_meta( $user, 'exported', 1 ); - } - } - - // We are done, output the CSV. - echo $data; - - // Clear the buffer. - ob_flush(); - - exit(); -} - -/** End of File **/ \ No newline at end of file diff --git a/admin/user-profile.php b/admin/user-profile.php deleted file mode 100644 index 52bc6da8..00000000 --- a/admin/user-profile.php +++ /dev/null @@ -1,239 +0,0 @@ -id == 'profile' ) ? $user_ID : $_REQUEST['user_id']; ?> - -

- - fields; // get_option( 'wpmembers_fields' ); - // Get excluded meta. - $exclude = wpmem_get_excluded_meta( 'admin-profile' ); - - /** - * Fires at the beginning of generating the WP-Members fields in the user profile. - * - * @since 2.9.3 - * - * @param int $user_id The user's ID. - * @param array $wpmem_fields The WP-Members fields. - */ - do_action( 'wpmem_admin_before_profile', $user_id, $wpmem_fields ); - - foreach ( $wpmem_fields as $meta ) { - - $valtochk = ''; - - // Determine which fields to show in the additional fields area. - $show = ( $meta[6] == 'n' && ! in_array( $meta[2], $exclude ) ) ? true : false; - $show = ( $meta[1] == 'TOS' && $meta[4] != 'y' ) ? null : $show; - - if ( $show ) { - // Is the field required? - $req = ( $meta[5] == 'y' ) ? ' ' . __( '(required)' ) . '' : ''; - - $show_field = ' - - - - '; - - /** - * Filter the profile field. - * - * @since 2.8.2 - * - * @param string $show_field The HTML string for the additional profile field. - */ - echo apply_filters( 'wpmem_admin_profile_field', $show_field ); - } - } - - // See if reg is moderated, and if the user has been activated. - if ( $wpmem->mod_reg == 1 ) { - $user_active_flag = get_user_meta( $user_id, 'active', true ); - switch( $user_active_flag ) { - - case '': - $label = __( 'Activate this user?', 'wp-members' ); - $action = 1; - break; - - case 0: - $label = __( 'Reactivate this user?', 'wp-members' ); - $action = 1; - break; - - case 1: - $label = __( 'Deactivate this user?', 'wp-members' ); - $action = 0; - break; - - }?> - - - - - - - use_exp == 1 ) { - if ( ( $wpmem->mod_reg == 1 && get_user_meta( $user_id, 'active', true ) == 1 ) || ( $wpmwm->mod_reg != 1 ) ) { - wpmem_a_extenduser( $user_id ); - } - } ?> - - - - - - -
'; - $val = htmlspecialchars( get_user_meta( $user_id, $meta[2], true ) ); - if ( $meta[3] == 'checkbox' || $meta[3] == 'select' ) { - $valtochk = $val; - $val = $meta[7]; - } - $show_field.= wpmem_create_formfield( $meta[2], $meta[3], $val, $valtochk ) . ' -
fields; // get_option( 'wpmembers_fields' ); - - /** - * Fires before the user profile is updated. - * - * @since 2.9.2 - * - * @param int $user_id The user ID. - * @param array $wpmem_fields Array of the custom fields. - */ - do_action( 'wpmem_admin_pre_user_update', $user_id, $wpmem_fields ); - - $fields = array(); - $chk_pass = false; - foreach ( $wpmem_fields as $meta ) { - if ( $meta[6] == "n" && $meta[3] != 'password' && $meta[3] != 'checkbox' ) { - ( isset( $_POST[ $meta[2] ] ) ) ? $fields[ $meta[2] ] = $_POST[ $meta[2] ] : false; - } elseif ( $meta[2] == 'password' && $meta[4] == 'y' ) { - $chk_pass = true; - } elseif ( $meta[3] == 'checkbox' ) { - $fields[ $meta[2] ] = ( isset( $_POST[ $meta[2] ] ) ) ? $_POST[ $meta[2] ] : ''; - } - } - - /** - * Filter the submitted field values for backend profile update. - * - * @since 2.8.2 - * - * @param array $fields An array of the posted form values. - * @param int $user_id The ID of the user being updated. - */ - $fields = apply_filters( 'wpmem_admin_profile_update', $fields, $user_id ); - - // Get any excluded meta fields. - $exclude = wpmem_get_excluded_meta( 'admin-profile' ); - foreach ( $fields as $key => $val ) { - if ( ! in_array( $key, $exclude ) ) { - update_user_meta( $user_id, $key, $val ); - } - } - - if ( $wpmem->mod_reg == 1 ) { - - $wpmem_activate_user = ( isset( $_POST['activate_user'] ) == '' ) ? -1 : $_POST['activate_user']; - - if ( $wpmem_activate_user == 1 ) { - wpmem_a_activate_user( $user_id, $chk_pass ); - } elseif ( $wpmem_activate_user == 0 ) { - wpmem_a_deactivate_user( $user_id ); - } - } - - ( $wpmem->use_exp == 1 ) ? wpmem_a_extend_user( $user_id ) : ''; - - /** - * Fires after the user profile is updated. - * - * @since 2.9.2 - * - * @param int $user_id The user ID. - */ - do_action( 'wpmem_admin_after_user_update', $user_id ); - - return; -} - -/** End of File **/ diff --git a/admin/users.php b/admin/users.php deleted file mode 100644 index d64d605c..00000000 --- a/admin/users.php +++ /dev/null @@ -1,540 +0,0 @@ - All Users page. - * - * This file is part of the WP-Members plugin by Chad Butler - * You can find out more about this plugin at http://rocketgeek.com - * Copyright (c) 2006-2015 Chad Butler - * WP-Members(tm) is a trademark of butlerblog.com - * - * @package WordPress - * @subpackage WP-Members - * @author Chad Butler - * @copyright 2006-2015 - * - * Functions included: - * - wpmem_bulk_user_action - * - wpmem_insert_activate_link - * - wpmem_users_page_load - * - wpmem_users_admin_notices - * - wpmem_users_views - * - wpmem_add_user_column - * - wpmem_add_user_column_content - * - wpmem_a_activate_user - * - wpmem_a_deactivate_user - * - wpmem_a_pre_user_query - * - wpmem_set_new_user_non_active - * - wpmem_set_activated_user - * - wpmem_set_deactivated_user - * - wpmem_set_user_status - */ - - -/** - * Actions and filters - */ -add_action( 'admin_footer-users.php', 'wpmem_bulk_user_action' ); -add_action( 'load-users.php', 'wpmem_users_page_load' ); -add_action( 'admin_notices', 'wpmem_users_admin_notices' ); -add_filter( 'views_users', 'wpmem_users_views' ); -add_filter( 'manage_users_columns', 'wpmem_add_user_column' ); -add_action( 'manage_users_custom_column', 'wpmem_add_user_column_content', 10, 3 ); -add_action( 'wpmem_post_register_data', 'wpmem_set_new_user_non_active' ); -add_action( 'wpmem_user_activated', 'wpmem_set_activated_user' ); -add_action( 'wpmem_user_deactivated', 'wpmem_set_deactivated_user' ); -add_filter( 'user_row_actions', 'wpmem_insert_activate_link', 10, 2 ); - - -/** - * Function to add activate/export to the bulk dropdown list. - * - * @since 2.8.2 - */ -function wpmem_bulk_user_action() { - global $wpmem; ?> - ID ) && $wpmem->mod_reg == 1 ) { - - $var = get_user_meta( $user_object->ID, 'active', true ); - - if ( $var != 1 ) { - $url = "users.php?action=activate-single&user=$user_object->ID"; - $url = wp_nonce_url( $url, 'activate-user' ); - $actions['activate'] = 'Activate'; - } - } - return $actions; -} - - -/** - * Function to handle bulk actions at page load. - * - * @since 2.8.2 - * - * @uses WP_Users_List_Table - */ -function wpmem_users_page_load() { - - // If exporting all users, do it, then exit. - if ( isset( $_REQUEST['export_all'] ) && $_REQUEST['export_all'] == __( 'Export All Users', 'wp-members' ) ) { - include_once( WPMEM_PATH . 'admin/user-export.php' ); - $today = date( "m-d-y" ); - wpmem_export_users( array( 'export'=>'all', 'filename'=>'user-export-' . $today . '.csv' ), '' ); - exit(); - } - - $wp_list_table = _get_list_table( 'WP_Users_List_Table' ); - $action = $wp_list_table->current_action(); - $sendback = ''; - - if ( $action == 'activate' || 'activate-single' ) { - // Find out if we need to set passwords. - $chk_pass = false; - $wpmem_fields = get_option( 'wpmembers_fields' ); - foreach ( $wpmem_fields as $field ) { - if ( $field[2] == 'password' && $field[4] == 'y' ) { - $chk_pass = true; - break; - } - } - } - - switch ( $action ) { - - case 'activate': - - // Validate nonce. - check_admin_referer( 'bulk-users' ); - - // Get the users. - $users = $_REQUEST['users']; - - // Update the users. - $x = 0; - foreach ( $users as $user ) { - // Check to see if the user is already activated, if not, activate. - if ( ! get_user_meta( $user, 'active', true ) ) { - wpmem_a_activate_user( $user, $chk_pass ); - $x++; - } - } - - // Set the return message. - $sendback = add_query_arg( array('activated' => $x . ' users activated' ), $sendback ); - break; - - case 'activate-single': - - // Validate nonce. - check_admin_referer( 'activate-user' ); - - // Get the users. - $users = $_REQUEST['user']; - - // Check to see if the user is already activated, if not, activate. - if ( ! get_user_meta( $users, 'active', true ) ) { - - wpmem_a_activate_user( $users, $chk_pass ); - - // Get the user data. - $user_info = get_userdata( $users ); - - // Set the return message. - $sendback = add_query_arg( array('activated' => "$user_info->user_login activated" ), $sendback ); - - } else { - - // Get the return message. - $sendback = add_query_arg( array('activated' => "That user is already active" ), $sendback ); - - } - break; - - case 'show': - - add_action( 'pre_user_query', 'wpmem_a_pre_user_query' ); - return; - break; - - case 'export': - - $users = ( isset( $_REQUEST['users'] ) ) ? $_REQUEST['users'] : false; - include_once( WPMEM_PATH . 'admin/user-export.php' ); - wpmem_export_users( array( 'export'=>'selected' ), $users ); - return; - break; - - default: - return; - break; - - } - - // If we did not return already, we need to wp_redirect. - wp_redirect( $sendback ); - exit(); - -} - - -/** - * Function to echo admin update message. - * - * @since 2.8.2 - */ -function wpmem_users_admin_notices() { - - global $pagenow, $user_action_msg; - if( $pagenow == 'users.php' && isset( $_REQUEST['activated'] ) ) { - $message = $_REQUEST['activated']; - echo "

{$message}

"; - } - - if ( $user_action_msg ) { - echo "

{$user_action_msg}

"; - } -} - - -/** - * Function to add user views to the top list. - * - * @since 2.8.2 - * - * @param array $views - * @return array $views - */ -function wpmem_users_views( $views ) { - - global $wpmem; - - $arr = array(); - if ( $wpmem->use_exp == 1 ) { - $arr[] = 'Pending'; - } - if ( $wpmem->use_trial == 1 ) { - $arr[] = 'Trial'; - } - if ( $wpmem->use_exp == 1 ) { - $arr[] = 'Subscription'; - $arr[] = 'Expired'; - } - if ( $wpmem->mod_reg == 1 ) { - $arr[] = 'Not Active'; - } - $arr[] = 'Not Exported'; - $show = ( isset( $_GET['show'] ) ) ? $_GET['show'] : false; - - for ( $row = 0; $row < count( $arr ); $row++ ) { - $link = "users.php?action=show&show="; - $lcas = str_replace( " ", "", strtolower( $arr[$row] ) ); - $link.= $lcas; - $curr = ( $show == $lcas ) ? ' class="current"' : ''; - - $echolink = true; - if ( $lcas == "notactive" && $wpmem->mod_reg != 1 ) { - $echolink = false; - } - - if ( $echolink ) { - $views[$lcas] = "$arr[$row] "; - } - } - - /** @todo if $show, then run function search query for the users */ - - return $views; -} - - -/** - * Function to add custom user columns to the user table. - * - * @since 2.8.2 - * - * @param array $columns - * @return array $columns - */ -function wpmem_add_user_column( $columns ) { - - global $wpmem_user_columns, $wpmem; - - // Get any columns to be added to the Users > All Users screen. - $wpmem_user_columns = get_option( 'wpmembers_utfields' ); - - if ( $wpmem_user_columns ) { - if ( $wpmem->mod_reg != 1 ) { - unset( $wpmem_user_columns['active'] ); - } - - $columns = array_merge( $columns, $wpmem_user_columns ); - } - - // @todo - needs to be debugged for use with external process custom columns. - // require_once( WPMEM_PATH . 'inc/class-wp-members-sortable-user-columns.php' ); - // new WP_Members_Sortable_User_Columns( $wpmem_user_columns ); - - return $columns; -} - - -/** - * Function to add the user content to the custom column. - * - * @since 2.8.2 - * - * @param $value - * @param $column_name - * @param $user_id - * @return The user value for the custom column. - */ -function wpmem_add_user_column_content( $value, $column_name, $user_id ) { - - // Is the column a WP-Members column? - global $wpmem_user_columns, $wpmem; - $is_wpmem = ( is_array( $wpmem_user_columns ) && array_key_exists( $column_name, $wpmem_user_columns ) ) ? true : false; - - if ( $is_wpmem ) { - - switch ( $column_name ) { - - case 'active': - if ( $wpmem->mod_reg == 1 ) { - /* - * If the column is "active", then return the value or empty. - * Returning in here keeps us from displaying another value. - */ - return ( get_user_meta( $user_id , 'active', 'true' ) != 1 ) ? __( 'No' ) : ''; - } else { - return; - } - break; - - case 'user_url': - case 'user_registered': - // Unlike other fields, website/url is not a meta field. - $user_info = get_userdata( $user_id ); - return $user_info->$column_name; - break; - - default: - return get_user_meta( $user_id, $column_name, true ); - break; - } - - } - - return $value; -} - - -/** - * Activates a user. - * - * If registration is moderated, sets the activated flag - * in the usermeta. Flag prevents login when $wpmem->mod_reg - * is true (1). Function is fired from bulk user edit or - * user profile update. - * - * @since 2.4 - * - * @param int $user_id - * @param bool $chk_pass - * @uses $wpdb WordPress Database object. - */ -function wpmem_a_activate_user( $user_id, $chk_pass = false ) { - - global $wpmem; - - // Define new_pass. - $new_pass = ''; - - // If passwords are user defined skip this. - if ( ! $chk_pass ) { - // Generates a password to send the user. - $new_pass = wp_generate_password(); - $new_hash = wp_hash_password( $new_pass ); - - // Update the user with the new password. - global $wpdb; - $wpdb->update( $wpdb->users, array( 'user_pass' => $new_hash ), array( 'ID' => $user_id ), array( '%s' ), array( '%d' ) ); - } - - // If subscriptions can expire, set the user's expiration date. - if( $wpmem->use_exp == 1 ) { - wpmem_set_exp( $user_id ); - } - - // Generate and send user approved email to user. - require_once( WPMEM_PATH . '/inc/email.php' ); - wpmem_inc_regemail( $user_id, $new_pass, 2 ); - - // Set the active flag in usermeta. - update_user_meta( $user_id, 'active', 1 ); - - /** - * Fires after the user activation process is complete. - * - * @since 2.8.2 - * - * @param int $user_id The user's ID. - */ - do_action( 'wpmem_user_activated', $user_id ); - - return; -} - - -/** - * Deactivates a user. - * - * Reverses the active flag from the activation process - * preventing login when registration is moderated. - * - * @since 2.7.1 - * - * @param int $user_id - */ -function wpmem_a_deactivate_user( $user_id ) { - update_user_meta( $user_id, 'active', 0 ); - - /** - * Fires after the user deactivation process is complete. - * - * @since 2.9.9 - * - * @param int $user_id The user's ID. - */ - do_action( 'wpmem_user_deactivated', $user_id ); -} - - -/** - * Adjusts user query based on custom views. - * - * @since 2.8.3 - * - * @param $user_search - */ -function wpmem_a_pre_user_query( $user_search ) { - - global $wpdb; - $show = $_GET['show']; - switch ( $show ) { - - case 'notactive': - case 'notexported': - $key = ( $show == 'notactive' ) ? 'active' : 'exported'; - $replace_query = "WHERE 1=1 AND {$wpdb->users}.ID NOT IN ( - SELECT {$wpdb->usermeta}.user_id FROM $wpdb->usermeta - WHERE {$wpdb->usermeta}.meta_key = \"$key\" - AND {$wpdb->usermeta}.meta_value = '1' )"; - break; - - case 'trial': - case 'subscription': - $replace_query = "WHERE 1=1 AND {$wpdb->users}.ID IN ( - SELECT {$wpdb->usermeta}.user_id FROM $wpdb->usermeta - WHERE {$wpdb->usermeta}.meta_key = 'exp_type' - AND {$wpdb->usermeta}.meta_value = \"$show\" )"; - break; - - case 'pending': - $replace_query = "WHERE 1=1 AND {$wpdb->users}.ID IN ( - SELECT {$wpdb->usermeta}.user_id FROM $wpdb->usermeta - WHERE {$wpdb->usermeta}.meta_key = 'exp_type' - AND {$wpdb->usermeta}.meta_value = \"$show\" )"; - break; - - case 'expired': - $replace_query = "WHERE 1=1 AND {$wpdb->users}.ID IN ( - SELECT {$wpdb->usermeta}.user_id FROM $wpdb->usermeta - WHERE {$wpdb->usermeta}.meta_key = 'expires' - AND STR_TO_DATE( {$wpdb->usermeta}.meta_value, '%m/%d/%Y' ) < CURDATE() - AND {$wpdb->usermeta}.meta_value != '01/01/1970' )"; - break; - } - - $user_search->query_where = str_replace( 'WHERE 1=1', $replace_query, $user_search->query_where ); -} - - -/** - * Use wpmem_post_register_data to set the user_status field to 2 using wp_update_user. - * http://codex.wordpress.org/Function_Reference/wp_update_user - * - * @uses wpmem_set_user_status - * @param $fields - */ -function wpmem_set_new_user_non_active( $fields ) { - wpmem_set_user_status( $fields['ID'], 2 ); - return; -} - - -/** - * Use wpmem_user_activated to set the user_status field to 0 using wp_update_user. - * - * @uses wpmem_set_user_status - * @param $user_id - */ -function wpmem_set_activated_user( $user_id ) { - wpmem_set_user_status( $user_id, 0 ); - return; -} - - -/** - * Use wpmem_user_deactivated to set the user_status field to 2 using wp_update_user. - * - * @uses wpmem_set_user_status - * @param $user_id - */ -function wpmem_set_deactivated_user( $user_id ) { - wpmem_set_user_status( $user_id, 2 ); - return; -} - - -/** - * Updates the user_status value in the wp_users table. - * - * @param $user_id - * @param $status - */ -function wpmem_set_user_status( $user_id, $status ) { - global $wpdb; - $wpdb->update( $wpdb->users, array( 'user_status' => $status ), array( 'ID' => $user_id ) ); - return; -} - -/** End of File **/ \ No newline at end of file diff --git a/assets/css/admin.css b/assets/css/admin.css new file mode 100644 index 00000000..2af5a100 --- /dev/null +++ b/assets/css/admin.css @@ -0,0 +1,238 @@ +/** + * WP-Members Admin Styles CSS + * + * CSS for the WP-Members admin panels + * + * This file is part of the WP-Members plugin by Chad Butler + * You can find out more about this plugin at https://rocketgeek.com + * Copyright (c) 2006-2023 Chad Butler + * WP-Members(tm) is a trademark of butlerblog.com + * + * @package WP-Members + * @author Chad Butler + * @copyright 2006-2023 + */ + + +.wpmem_tbl_drag { + background:#fffbcc; + font-weight: bold; + border: 1px solid #990000; +} + +.column-wpmem_block { + width: 80px; +} + +#addfieldform li, +#editfieldform li, +#updatesettings li { + padding: 5px 0; +} + +#addfieldform label, +#editfieldform label, +#updatesettings label { + float:left; + width: 166px; + clear: both; + display: block; +} + +#addfieldform .add-field-indent, +#editfieldform .add-field-indent { + margin-left: 165px; +} + +#fields_postbox, +#add_field_postbox { + min-width:950px; +} + +.req { + color: #f00; +} + +.settings_page_wpmem-settings #the-list { + cursor: move; +} +#sort, #edit { + width: 30px; +} + +#wpmem_block input { + vertical-align: -webkit-baseline-middle; + margin: 0 0 8px 0; +} +#wpmem_block label { + margin: 0 0 0 8px; +} +#wpmem_ok_block_status { + margin: 5px 0 0 0; +} +#wpmem_post_block_status { + font-weight: 600; +} +#wpmem_post_icon_0 { + color: red; +} +#wpmem_post_icon_1 { + color: green; +} +#wpmem_post_icon_2 { + color: black; +} +#wpmem_product_enabled { + color: green; +} +#s2id__wpmem_products, +.select2-search-field, +#_wpmem_products { + width: 100%; +} + +/** User Profile Tabs **/ +#wpmem_user_profile_tabs { + padding: 0px; + background: none; + border-width: 0px; +} +#wpmem_user_profile_tabs .ui-tabs-nav { + padding-left: 0px; + background: transparent; + border-width: 0px 0px 1px 0px; + -moz-border-radius: 0px; + -webkit-border-radius: 0px; + border-radius: 0px; +} +#wpmem_user_profile_tabs .ui-tabs-panel { + background: #fff; + border-width: 0px 1px 1px 1px; +} +#wpmem_user_profile_tabs .ui-state-active { + border: 1px solid #006799; + background: #135e96; +} +#wpmem_user_profile_tabs .ui-state-active a { + color: #fff; +} + +#wpmem_product_fixed_period_select label, +#wpmem_product_fixed_period_select input, +#wpmem_product_no_gap, +#wpmem_product_fixed_period { + margin-top: 10px; + margin-left: 24px; +} + +#updatesettings a { + text-decoration:none; +} +#updatesettings a:hover { + color: black; +} + +#adduser .form-field input[type="checkbox"], +#createuser .form-field input[type="checkbox"] { + width: initial; +} + +.wpmem-user-table-membership { + border-bottom:1px solid #999; +} + +#wpmem-fields .column-wcchkout, +#wpmem-fields .column-wcaccount, +#wpmem-fields .column-wcupdate, +#wpmem-fields .column-display { + width: 96px; + padding-left: 0px; +} +#wpmem-fields .column-req { + width: 78px; + padding-left: 0px; +} +#wpmem-fields .column-profile, +#wpmem-fields .column-userscrn, +#wpmem-fields .column-usearch { + width: 62px; + padding-left: 0px; +} +#wpmem-fields .column-edit { + width: 20px; +} +#wpmem-fields .column-display input, +#wpmem-fields .column-req input, +#wpmem-fields .column-profile input, +#wpmem-fields .column-wcaccount input, +#wpmem-fields .column-wcupdate input, +#wpmem-fields .column-wcchkout input, +#wpmem-fields .column-userscrn input, +#wpmem-fields .column-usearch input { + margin-left: 0px; +} + +/** tooltip styles **/ + +/* Add this attribute to the element that needs a tooltip */ +[data-tooltip] { + position: relative; + z-index: 2; + cursor: pointer; + } + + /* Hide the tooltip content by default */ + [data-tooltip]:before, + [data-tooltip]:after { + visibility: hidden; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; + filter: progid: DXImageTransform.Microsoft.Alpha(Opacity=0); + opacity: 0; + pointer-events: none; + } + + /* Position tooltip above the element */ + [data-tooltip]:before { + position: absolute; + bottom: 150%; + left: 50%; + margin-bottom: 5px; + margin-left: -80px; + padding: 7px; + width: 160px; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; + background-color: #000; + background-color: hsla(0, 0%, 20%, 0.9); + color: #fff; + content: attr(data-tooltip); + text-align: center; + font-size: 14px; + line-height: 1.2; + } + + /* Triangle hack to make tooltip look like a speech bubble */ + [data-tooltip]:after { + position: absolute; + bottom: 150%; + left: 50%; + margin-left: -5px; + width: 0; + border-top: 5px solid #000; + border-top: 5px solid hsla(0, 0%, 20%, 0.9); + border-right: 5px solid transparent; + border-left: 5px solid transparent; + content: " "; + font-size: 0; + line-height: 0; + } + + /* Show tooltip content on hover */ + [data-tooltip]:hover:before, + [data-tooltip]:hover:after { + visibility: visible; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=100)"; + filter: progid: DXImageTransform.Microsoft.Alpha(Opacity=100); + opacity: 1; + } \ No newline at end of file diff --git a/assets/css/admin.min.css b/assets/css/admin.min.css new file mode 100644 index 00000000..22d581a7 --- /dev/null +++ b/assets/css/admin.min.css @@ -0,0 +1 @@ +.wpmem_tbl_drag{background:#fffbcc;font-weight:700;border:1px solid #900}.column-wpmem_block{width:80px}#addfieldform li,#editfieldform li,#updatesettings li{padding:5px 0}#addfieldform label,#editfieldform label,#updatesettings label{float:left;width:166px;clear:both;display:block}#addfieldform .add-field-indent,#editfieldform .add-field-indent{margin-left:165px}#add_field_postbox,#fields_postbox{min-width:950px}.req{color:red}.settings_page_wpmem-settings #the-list{cursor:move}#edit,#sort{width:30px}#wpmem_block input{vertical-align:-webkit-baseline-middle;margin:0 0 8px 0}#wpmem_block label{margin:0 0 0 8px}#wpmem_ok_block_status{margin:5px 0 0 0}#wpmem_post_block_status{font-weight:600}#wpmem_post_icon_0{color:red}#wpmem_post_icon_1{color:green}#wpmem_post_icon_2{color:#000}#wpmem_product_enabled{color:green}#_wpmem_products,#s2id__wpmem_products,.select2-search-field{width:100%}#wpmem_user_profile_tabs{padding:0;background:0 0;border-width:0}#wpmem_user_profile_tabs .ui-tabs-nav{padding-left:0;background:0 0;border-width:0 0 1px 0;-moz-border-radius:0;-webkit-border-radius:0;border-radius:0}#wpmem_user_profile_tabs .ui-tabs-panel{background:#fff;border-width:0 1px 1px 1px}#wpmem_user_profile_tabs .ui-state-active{border:1px solid #006799;background:#135e96}#wpmem_user_profile_tabs .ui-state-active a{color:#fff}#wpmem_product_fixed_period,#wpmem_product_fixed_period_select input,#wpmem_product_fixed_period_select label,#wpmem_product_no_gap{margin-top:10px;margin-left:24px}#updatesettings a{text-decoration:none}#updatesettings a:hover{color:#000}#adduser .form-field input[type=checkbox],#createuser .form-field input[type=checkbox]{width:initial}.wpmem-user-table-membership{border-bottom:1px solid #999}#wpmem-fields .column-display,#wpmem-fields .column-wcaccount,#wpmem-fields .column-wcchkout,#wpmem-fields .column-wcupdate{width:96px;padding-left:0}#wpmem-fields .column-req{width:78px;padding-left:0}#wpmem-fields .column-profile,#wpmem-fields .column-usearch,#wpmem-fields .column-userscrn{width:62px;padding-left:0}#wpmem-fields .column-edit{width:20px}#wpmem-fields .column-display input,#wpmem-fields .column-profile input,#wpmem-fields .column-req input,#wpmem-fields .column-usearch input,#wpmem-fields .column-userscrn input,#wpmem-fields .column-wcaccount input,#wpmem-fields .column-wcchkout input,#wpmem-fields .column-wcupdate input{margin-left:0}[data-tooltip]{position:relative;z-index:2;cursor:pointer}[data-tooltip]:after,[data-tooltip]:before{visibility:hidden;opacity:0;pointer-events:none}[data-tooltip]:before{position:absolute;bottom:150%;left:50%;margin-bottom:5px;margin-left:-80px;padding:7px;width:160px;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;background-color:#000;background-color:hsla(0,0%,20%,.9);color:#fff;content:attr(data-tooltip);text-align:center;font-size:14px;line-height:1.2}[data-tooltip]:after{position:absolute;bottom:150%;left:50%;margin-left:-5px;width:0;border-top:5px solid #000;border-top:5px solid hsla(0,0%,20%,.9);border-right:5px solid transparent;border-left:5px solid transparent;content:" ";font-size:0;line-height:0}[data-tooltip]:hover:after,[data-tooltip]:hover:before{visibility:visible;opacity:1} \ No newline at end of file diff --git a/css/generic-no-float.css b/assets/css/forms/generic-no-float.css similarity index 70% rename from css/generic-no-float.css rename to assets/css/forms/generic-no-float.css index 6c745c24..9af41eb0 100644 --- a/css/generic-no-float.css +++ b/assets/css/forms/generic-no-float.css @@ -1,249 +1,283 @@ -/** - * WP-Members Styles CSS - * - * CSS for the WP-Members plugin - * - * This file is part of the WP-Members plugin by Chad Butler - * You can find out more about this plugin at http://rocketgeek.com - * Copyright (c) 2006-2015 Chad Butler - * WP-Members(tm) is a trademark of butlerblog.com - * - * @package WordPress - * @subpackage WP-Members - * @author Chad Butler - * @copyright 2006-2015 - */ - -/* -This stylesheet is designed to integrate WP-Members floated form elements -as simply as possible with most themes. There are quite a few examples -in here of what you can do to style the forms. You can build off of this -or start from scratch and set your own custom css for the plugin -(set the location in the admin panel). - -See http://rocketgeek.com/tips-and-tricks/setting-up-a-custom-wp-members-stylesheet/ -for information on how to set up the plugin with a custom stylesheet. - -For information how to load custom stylesheets with wp_enqueue_style, -see http://rocketgeek.com/tips-and-tricks/load-a-custom-stylesheet/ -*/ - - -/* Error and Dialog Messages */ - -#wpmem_msg, .wpmem_msg { - background: #F9F9F9; - border:1px solid lightGrey; - border-radius: 3px; - padding: 20px 0 0 0; -} -#wpmem_msg { - width: 100%; -} -.wpmem_msg { - width: 74%; -} - - -/* Sidebar Login Widget */ - -#wp-members { - width: 100%; -} -#wp-members fieldset { - border:none; - padding:0px -} -#wp-members input { - font-family: inherit; -} -#wp-members input[type="text"], -#wp-members input[type="password"]{ - margin: 0 0 4px 0; -} -#wp-members input[type="submit"] { - padding: 5px 6px 4px; - margin: 0 4px 0 0; -} -#wp-members .button_div { - margin-top:4px; -} -#wp-members .err { - width:100%; - padding: 5px; - font-family: inherit; - border: 1px solid #ccc; - border-radius: 3px; -} - - -/* Login Form and Registration Form */ -#wpmem_reg, #wpmem_login { - color: rgb(43, 43, 43); - font-family: Arial,sans-serif; - font-size: 16px; - font-weight: 400; - line-height: 1.5; -} - -#wpmem_reg input[type="text"], -#wpmem_reg textarea, -#wpmem_login input[type="text"], -#wpmem_login input[type="password"] { - border: 1px solid rgba(0, 0, 0, 0.1); - border-radius: 2px; - color: rgb(43, 43, 43); - padding: 8px 10px 8px; - background: none repeat scroll 0% 0% #fff; -} - -#wpmem_reg input, -#wpmem_reg button, -#wpmem_reg select, -#wpmem_reg textarea, -#wpmem_login input, -#wpmem_login button { - -moz-box-sizing: border-box; - font-size: 100%; - margin: 0px; - max-width: 100%; - vertical-align: baseline; -} - -#wpmem_reg input:focus, -#wpmem_reg textarea:focus, -#wpmem_login input:focus { - border: 1px solid rgba(0, 0, 0, 0.3); - outline: 0px none; -} - -#wpmem_reg select { - width:100%; - padding: 8px 10px 7px; - border: 1px solid rgba(0, 0, 0, 0.1); - border-radius: 2px; - color: rgb(43, 43, 43); - margin: 5px 0; -} - -#wpmem_reg fieldset, #wpmem_login fieldset { - border: none; - padding: 0; - margin: 40px 0; -} -#wpmem_reg legend, #wpmem_login legend { - font-size: 24px; - line-height: 1; - font-weight: 700; - margin-bottom: 10px; -} -#wpmem_reg .form, #wpmem_login .form { - margin:0; - padding:0; -} -#wpmem_reg .clear, #wpmem_login .clear { - clear:both; -} -#wpmem_reg .holder, #wpmem_login .holder { - background-color:#fff; -} -#wpmem_reg .div_text, #wpmem_reg .div_textarea, -#wpmem_reg .div_select, #wpmem_login .div_text, -#wpmem_reg .div_checkbox { - width:74%; - margin:0 0 14px 0; -} -#wpmem_login input[type="checkbox"] { - margin: 12px 2px; -} -#wpmem_reg .div_textarea textarea, -#wpmem_reg .textbox, #wpmem_login .textbox, -#wpmem_reg .username, #wpmem_login .username, -#wpmem_reg .password, #wpmem_login .password { - width:100%; -} - - -#wpmem_reg textarea { - height:185px; -} -#wpmem_reg .req { - color: #bd3500; - font-size: 22px; - line-height: 50%; -} - -#wpmem_reg .req-text { - margin: 20px 0px 0px 5px; -} - -#wpmem_reg .noinput { - width:93%; - padding: 8px 10px 7px; - border: 1px solid rgba(0, 0, 0, 0.1); - border-radius: 2px; - color: rgb(43, 43, 43); - margin: 5px 0; -} - -#wpmem_reg .captcha { - width: 74%; - margin: 5px 0px; -} -#wpmem_reg .captcha table{ - line-height: 0px; -} -#wpmem_login .link-text { - width: 74%; -} - -#tos { - margin-right:5px; -} - - -/* Buttons */ - -#wpmem_reg .button_div, #wpmem_login .button_div { - width:74%; - height:35px; - padding: 6px 0; - text-align: right; -} - - -/** for smaller screens */ - -@media screen and (max-width: 720px) { - #wpmem_reg label.text, #wpmem_reg label.checkbox, - #wpmem_reg label.textarea , #wpmem_reg label.select, - #wpmem_login label, #wpmem_reg .div_text, #wpmem_reg .div_textarea, - #wpmem_reg .div_select, #wpmem_login .div_text, - #wpmem_reg .div_checkbox, #wpmem_reg .button_div, #wpmem_login .button_div { - float: none; - } - - #wpmem_reg label.text, #wpmem_reg label.checkbox, - #wpmem_reg label.textarea , #wpmem_reg label.select, - #wpmem_login label { - width: 90%; - padding: 5px 0 0 0; - } - #wpmem_reg label.textarea { - height: 26px; - } - #wpmem_reg .div_text, #wpmem_reg .div_textarea, - #wpmem_reg .div_select, #wpmem_login .div_text, - #wpmem_reg .div_checkbox { - width: 98%; - } - #wpmem_msg, .wpmem_msg { - width: 100%; - } - - #wpmem_reg .button_div, - #wpmem_login .button_div, - #wpmem_login .link-text { - width:98%; - } +/** + * WP-Members Styles CSS + * + * CSS for the WP-Members plugin + * + * This file is part of the WP-Members plugin by Chad Butler + * You can find out more about this plugin at https://rocketgeek.com + * Copyright (c) 2006-2023 Chad Butler + * WP-Members(tm) is a trademark of butlerblog.com + * + * @package WP-Members + * @author Chad Butler + * @copyright 2006-2023 + */ + +/* +This stylesheet is designed to integrate WP-Members floated form elements +as simply as possible with most themes. There are quite a few examples +in here of what you can do to style the forms. You can build off of this +or start from scratch and set your own custom css for the plugin +(set the location in the admin panel). + +See https://rocketgeek.com/tips-and-tricks/setting-up-a-custom-wp-members-stylesheet/ +for information on how to set up the plugin with a custom stylesheet. + +For information how to load custom stylesheets with wp_enqueue_style, +see https://rocketgeek.com/tips-and-tricks/load-a-custom-stylesheet/ +*/ + +/* Error and Dialog Messages */ + +#wpmem_msg, +.wpmem_msg { + text-align: center; + background: #F9F9F9; + border:1px solid lightGrey; + border-radius: 3px; + padding: 20px 0; + margin: 15px 0; +} + +/* Messages and forms should (ideally) be the same width */ +#wpmem_msg, +.wpmem_msg, +#wpmem_reg, +#wpmem_login { + width: 75%; +} + +/* Sidebar Login Widget */ + +#wp-members { + width: 100%; +} +#wp-members fieldset { + border:none; + padding:0px +} +#wp-members input { + font-family: inherit; +} +#wp-members input[type="text"], +#wp-members input[type="password"]{ + margin: 0 0 4px 0; +} +#wp-members input[type="submit"] { + padding: 5px 6px 4px; + margin: 0 4px 0 0; +} +#wp-members .button_div { + margin-top:4px; +} +#wp-members .err { + width:100%; + padding: 5px; + font-family: inherit; + border: 1px solid #ccc; + border-radius: 3px; +} + +/* Login Form and Registration Form */ + +#wpmem_reg, +#wpmem_login { + color: rgb(43, 43, 43); + font-family: Arial,sans-serif; + font-size: 16px; + font-weight: 400; + line-height: 1.5; +} + +#wpmem_reg label, +#wpmem_login label { + display: initial; +} + +#wpmem_reg input[type="text"], +#wpmem_reg input[type="password"], +#wpmem_reg input[type="email"], +#wpmem_reg input[type="url"], +#wpmem_reg input[type="number"], +#wpmem_reg input[type="date"], +#wpmem_reg textarea, +#wpmem_login input[type="text"], +#wpmem_login input[type="password"] { + border: 1px solid rgba(0, 0, 0, 0.1); + border-radius: 2px; + color: rgb(43, 43, 43); + padding: 8px 10px 8px; + background: none repeat scroll 0% 0% #fff; +} + +#wpmem_reg input, +#wpmem_reg button, +#wpmem_reg select, +#wpmem_reg textarea, +#wpmem_login input, +#wpmem_login button { + -moz-box-sizing: border-box; + font-size: 100%; + margin: 0px; + max-width: 100%; + vertical-align: baseline; +} + +#wpmem_reg input:focus, +#wpmem_reg textarea:focus, +#wpmem_login input:focus { + border: 1px solid rgba(0, 0, 0, 0.3); + outline: 0px none; +} + +#wpmem_reg select { + width:100%; + padding: 8px 10px 7px; + border: 1px solid rgba(0, 0, 0, 0.1); + border-radius: 2px; + color: rgb(43, 43, 43); + margin: 5px 0; + background: none repeat scroll 0% 0% #fff; +} + +#wpmem_reg fieldset, +#wpmem_login fieldset { + border: none; + padding: 0; + margin: 40px 0; +} +#wpmem_reg legend, +#wpmem_login legend { + font-size: 24px; + line-height: 1; + font-weight: 700; + margin-bottom: 10px; + width: 100%; +} +#wpmem_reg .form, +#wpmem_login .form { + margin:0; + padding:0; +} +#wpmem_reg .clear, +#wpmem_login .clear { + clear:both; +} +#wpmem_reg .holder, +#wpmem_login .holder { + background-color:#fff; +} + +#wpmem_login .div_text, +#wpmem_reg .div_text, +#wpmem_reg .div_textarea, +#wpmem_reg .div_select, +#wpmem_reg .div_checkbox, +#wpmem_reg .div_multiselect, +#wpmem_reg .div_multicheckbox, +#wpmem_reg .div_radio, +#wpmem_reg .div_image, +#wpmem_reg .div_file, +#wpmem_reg .div_url, +#wpmem_reg .div_number, +#wpmem_reg .div_date, +#wpmem_reg .div_membership { + margin:0 0 14px 0; +} +#wpmem_login input[type="checkbox"] { + margin: 12px 2px; +} +#wpmem_reg .div_textarea textarea, +#wpmem_reg .textbox, +#wpmem_login .textbox, +#wpmem_reg .username, +#wpmem_reg .password, +#wpmem_reg .file, +#wpmem_reg .image, +#wpmem_login .username, +#wpmem_login .password { + width:100%; +} + + +#wpmem_reg textarea { + height:185px; +} +#wpmem_reg .req { + color: #bd3500; + font-size: 22px; + line-height: 50%; +} + +#wpmem_reg .req-text { + margin: 20px 0px 0px 5px; +} + +#wpmem_reg .noinput { + width:93%; + padding: 8px 10px 7px; + border: 1px solid rgba(0, 0, 0, 0.1); + border-radius: 2px; + color: rgb(43, 43, 43); + margin: 5px 0; +} + +#wpmem_reg .captcha { + margin: 5px 0px; +} +#wpmem_reg .captcha table{ + line-height: 0px; +} +#wpmem_login .link-text { + padding: 4px 0; + text-align:right; +} + +#tos { + margin-right:5px; +} + + +/* Buttons */ + +#wpmem_reg .button_div, #wpmem_login .button_div { + /* height:55px; */ + padding: 6px 0; + text-align: right; +} + + +/** for smaller screens */ + +@media screen and (max-width: 720px) { + #wpmem_reg label.text, #wpmem_reg label.checkbox, + #wpmem_reg label.textarea , #wpmem_reg label.select, + #wpmem_login label, #wpmem_reg .div_text, #wpmem_reg .div_textarea, + #wpmem_reg .div_select, #wpmem_login .div_text, + #wpmem_reg .div_checkbox, #wpmem_reg .button_div, #wpmem_login .button_div { + float: none; + } + + #wpmem_reg label.text, #wpmem_reg label.checkbox, + #wpmem_reg label.textarea , #wpmem_reg label.select { + width: 90%; + padding: 5px 0 0 0; + } + #wpmem_reg label.textarea { + height: 26px; + } + #wpmem_reg .div_text, #wpmem_reg .div_textarea, + #wpmem_reg .div_select, #wpmem_login .div_text, + #wpmem_reg .div_checkbox { + width: 98%; + } + #wpmem_msg, .wpmem_msg { + width: 100%; + } + + #wpmem_reg .button_div, + #wpmem_login .button_div, + #wpmem_login .link-text { + width:98%; + } } \ No newline at end of file diff --git a/assets/css/forms/generic-no-float.min.css b/assets/css/forms/generic-no-float.min.css new file mode 100644 index 00000000..d8f610d9 --- /dev/null +++ b/assets/css/forms/generic-no-float.min.css @@ -0,0 +1 @@ +#wpmem_msg,.wpmem_msg{text-align:center;background:#f9f9f9;border:1px solid #d3d3d3;border-radius:3px;padding:20px 0;margin:15px 0;}#wpmem_login,#wpmem_msg,#wpmem_reg,.wpmem_msg{width:75%}#wp-members{width:100%}#wp-members fieldset{border:none;padding:0}#wp-members input{font-family:inherit}#wp-members input[type=password],#wp-members input[type=text]{margin:0 0 4px 0}#wp-members input[type=submit]{padding:5px 6px 4px;margin:0 4px 0 0}#wp-members .button_div{margin-top:4px}#wp-members .err{width:100%;padding:5px;font-family:inherit;border:1px solid #ccc;border-radius:3px}#wpmem_login,#wpmem_reg{color:#2b2b2b;font-family:Arial,sans-serif;font-size:16px;font-weight:400;line-height:1.5}#wpmem_login label,#wpmem_reg label{display:initial}#wpmem_login input[type=password],#wpmem_login input[type=text],#wpmem_reg input[type=date],#wpmem_reg input[type=email],#wpmem_reg input[type=number],#wpmem_reg input[type=password],#wpmem_reg input[type=text],#wpmem_reg input[type=url],#wpmem_reg textarea{border:1px solid rgba(0,0,0,.1);border-radius:2px;color:#2b2b2b;padding:8px 10px 8px;background:none repeat scroll 0 0 #fff}#wpmem_login button,#wpmem_login input,#wpmem_reg button,#wpmem_reg input,#wpmem_reg select,#wpmem_reg textarea{-moz-box-sizing:border-box;font-size:100%;margin:0;max-width:100%;vertical-align:baseline}#wpmem_login input:focus,#wpmem_reg input:focus,#wpmem_reg textarea:focus{border:1px solid rgba(0,0,0,.3);outline:0 none}#wpmem_reg select{width:100%;padding:8px 10px 7px;border:1px solid rgba(0,0,0,.1);border-radius:2px;color:#2b2b2b;margin:5px 0;background:none repeat scroll 0 0 #fff}#wpmem_login fieldset,#wpmem_reg fieldset{border:none;padding:0;margin:40px 0}#wpmem_login legend,#wpmem_reg legend{font-size:24px;line-height:1;font-weight:700;margin-bottom:10px;width:100%}#wpmem_login .form,#wpmem_reg .form{margin:0;padding:0}#wpmem_login .clear,#wpmem_reg .clear{clear:both}#wpmem_login .holder,#wpmem_reg .holder{background-color:#fff}#wpmem_login .div_text,#wpmem_reg .div_checkbox,#wpmem_reg .div_date,#wpmem_reg .div_file,#wpmem_reg .div_image,#wpmem_reg .div_membership,#wpmem_reg .div_multicheckbox,#wpmem_reg .div_multiselect,#wpmem_reg .div_number,#wpmem_reg .div_radio,#wpmem_reg .div_select,#wpmem_reg .div_text,#wpmem_reg .div_textarea,#wpmem_reg .div_url{margin:0 0 14px 0}#wpmem_login input[type=checkbox]{margin:12px 2px}#wpmem_login .password,#wpmem_login .textbox,#wpmem_login .username,#wpmem_reg .div_textarea textarea,#wpmem_reg .file,#wpmem_reg .image,#wpmem_reg .password,#wpmem_reg .textbox,#wpmem_reg .username{width:100%}#wpmem_reg textarea{height:185px}#wpmem_reg .req{color:#bd3500;font-size:22px;line-height:50%}#wpmem_reg .req-text{margin:20px 0 0 5px}#wpmem_reg .noinput{width:93%;padding:8px 10px 7px;border:1px solid rgba(0,0,0,.1);border-radius:2px;color:#2b2b2b;margin:5px 0}#wpmem_reg .captcha{margin:5px 0}#wpmem_reg .captcha table{line-height:0}#wpmem_login .link-text{padding:4px 0;text-align:right}#tos{margin-right:5px}#wpmem_login .button_div,#wpmem_reg .button_div{padding:6px 0;text-align:right}@media screen and (max-width:720px){#wpmem_login .button_div,#wpmem_login .div_text,#wpmem_login label,#wpmem_reg .button_div,#wpmem_reg .div_checkbox,#wpmem_reg .div_select,#wpmem_reg .div_text,#wpmem_reg .div_textarea,#wpmem_reg label.checkbox,#wpmem_reg label.select,#wpmem_reg label.text,#wpmem_reg label.textarea{float:none}#wpmem_reg label.checkbox,#wpmem_reg label.select,#wpmem_reg label.text,#wpmem_reg label.textarea{width:90%;padding:5px 0 0 0}#wpmem_reg label.textarea{height:26px}#wpmem_login .div_text,#wpmem_reg .div_checkbox,#wpmem_reg .div_select,#wpmem_reg .div_text,#wpmem_reg .div_textarea{width:98%}#wpmem_msg,.wpmem_msg{width:100%}#wpmem_login .button_div,#wpmem_login .link-text,#wpmem_reg .button_div{width:98%}} \ No newline at end of file diff --git a/css/generic-rigid.css b/assets/css/forms/generic-rigid.css similarity index 60% rename from css/generic-rigid.css rename to assets/css/forms/generic-rigid.css index b00043d8..e57d63fe 100644 --- a/css/generic-rigid.css +++ b/assets/css/forms/generic-rigid.css @@ -1,288 +1,338 @@ -/** - * WP-Members Styles CSS - * - * CSS for the WP-Members plugin - * - * This file is part of the WP-Members plugin by Chad Butler - * You can find out more about this plugin at http://rocketgeek.com - * Copyright (c) 2006-2015 Chad Butler - * WP-Members(tm) is a trademark of butlerblog.com - * - * @package WordPress - * @subpackage WP-Members - * @author Chad Butler - * @copyright 2006-2015 - */ - -/* -This stylesheet is designed to integrate WP-Members floated form elements -as simply as possible with most themes using more rigid element properties. -There are quite a few examples in here of what you can do to style the forms. -You can build off of this or start from scratch and set your own -custom css for the plugin (set the location in the admin panel). - -See http://rocketgeek.com/tips-and-tricks/setting-up-a-custom-wp-members-stylesheet/ -for information on how to set up the plugin with a custom stylesheet. - -For information how to load custom stylesheets with wp_enqueue_style, -see http://rocketgeek.com/tips-and-tricks/load-a-custom-stylesheet/ -*/ - - -/* Error and Dialog Messages */ - -#wpmem_msg, .wpmem_msg { - width: 100%; - background: #F9F9F9; - border:1px solid lightGrey; - border-radius: 3px; - padding: 20px 0 0 0; -} - - -/* Sidebar Login Widget */ - -#wp-members { - width: 100%; -} -#wp-members fieldset { - border:none; - padding:0px -} -#wp-members input { - font-family: inherit; -} -#wp-members input[type="text"], -#wp-members input[type="password"]{ - margin: 0 0 4px 0; -} -#wp-members input[type="submit"] { - padding: 5px 6px 4px; - margin: 0 4px 0 0; -} -#wp-members .button_div { - margin-top:4px; -} -#wp-members .err { - width:100%; - padding: 5px; - font-family: inherit; - border: 1px solid #ccc; - border-radius: 3px; -} - - -/* Login Form and Registration Form */ - -/** - Fonts -*/ - -#wpmem_reg label, #wpmem_login label { - font-family: Arial,sans-serif; - font-size: 100%; - font-size: 14px; - font-weight: 400; -} - -#wpmem_reg legend, #wpmem_login legend { - font-size: 24px; - font-weight: 700; -} - -#wpmem_reg input, #wpmem_reg_ textarea, -#wpmem_reg select, #wpmem_login input { - font-family: Arial,sans-serif; - font-size: 100%; - font-size: 14px; - font-weight: 400; -} - -#wpmem_reg .req { - font-size: 22px; - color: #bd3500; -} - -/** - Form Design - */ - -#wpmem_reg fieldset, #wpmem_login fieldset { - border: none; -} - -#wpmem_reg input, #wpmem_reg textarea, -#wpmem_reg select, #wpmem_login input { - border: 1px solid rgba(0, 0, 0, 0.3); - outline: 0px none; - border-radius: 2px; - color: rgb(43, 43, 43); - padding: 8px 10px; - -moz-box-sizing: border-box; - margin: 0px; - max-width: 315px; - vertical-align: baseline; -} - - -#wpmem_reg .dropdown { - width:311px; -} -#wpmem_reg .dropdown:focus { - border: 1px solid rgba(0, 0, 0, 0.3); - outline: 0; -} -#wpmem_reg .textbox:focus, #wpmem_reg .textbox:hover, #wpmem_login .textbox:focus, #wpmem_login .textbox:hover, -#wpmem_reg .username:focus, #wpmem_reg .username:hover, #wpmem_login .username:focus, #wpmem_login .username:hover, -#wpmem_reg .password:focus, #wpmem_reg .password:hover, #wpmem_login .password:focus, #wpmem_login .password:hover { - background-color:inherit; -} - -/** - Size and Spacing - */ - -#wpmem_reg fieldset, #wpmem_login fieldset { - padding: 0; - margin: 40px 0; -} -#wpmem_reg legend, #wpmem_login legend { - line-height: 1; - margin-bottom: 10px; -} -#wpmem_reg label.text, #wpmem_reg label.checkbox, -#wpmem_reg label.textarea , #wpmem_reg label.select, -#wpmem_login label { - height: 30px; - width:32%; - float:left; - display: block; -} -#wpmem_reg label.text, #wpmem_reg label.checkbox, -#wpmem_reg label.select, #wpmem_login label{ - padding: 14px 0 4px 0; -} -#wpmem_reg label.textarea { - height: 176px; - padding: 16px 0 2px; -} -#wpmem_reg input[type="checkbox"]{ - margin-top:18px; -} -#wpmem_reg .form, #wpmem_login .form { - margin:0; - padding:0; -} -#wpmem_reg .clear, #wpmem_login .clear { - clear:both; -} -#wpmem_reg .holder, #wpmem_login .holder { - background-color:#fff; -} -#wpmem_reg .div_text, #wpmem_login .div_text, -#wpmem_reg .div_checkbox, #wpmem_reg .div_select, -#wpmem_reg .div_textarea { - width:311px; - float:right; -} -#wpmem_reg .div_text, #wpmem_login .div_text { - padding: 8px 0 6px; -} -#wpmem_reg .div_checkbox { - height: 48px; -} -#wpmem_reg .div_select { - padding: 2px 0 1px; -} -#wpmem_reg .div_textarea { - padding: 5px 0 4px 0; -} -#wpmem_login input[type="checkbox"] { - margin: 12px 2px; -} -#wpmem_reg .textbox, #wpmem_login .textbox, -#wpmem_reg .username, #wpmem_login .username, -#wpmem_reg .password, #wpmem_login .password { - display: block; - width:100%; - height: 34px; -} -#wpmem_reg .div_textarea textarea { - display: block; - width:100%; -} -#wpmem_reg .dropdown { - height: 36px; - padding: 8px 10px; - margin: 5px 0 4px 0; -} -#wpmem_reg textarea { - height:185px; -} -#wpmem_reg .req { - line-height: 50%; -} - -#wpmem_reg .req-text { - float:left; - margin: 20px 0px 0px 5px; -} - -#wpmem_reg .noinput { - margin: 6px 0px 7px 10px; -} - -#wpmem_reg .captcha { - margin: 5px -3px 5px 0; -} -#wpmem_reg .captcha table{ - line-height: 0px; -} - -#tos { - margin-right:5px; -} - -#wpmem_login .link-text { - width: 100%; - float:right; -} - - -/* Buttons */ - -#wpmem_reg .button_div, #wpmem_login .button_div { - width:100%; - float:right; - text-align:right; - height:35px; - padding: 6px 0; -} - - -/** for smaller screens */ - -@media screen and (max-width: 720px) { - #wpmem_reg label.text, #wpmem_reg label.checkbox, - #wpmem_reg label.textarea , #wpmem_reg label.select, - #wpmem_login label, #wpmem_reg .div_text, #wpmem_reg .div_textarea, - #wpmem_reg .div_select, #wpmem_login .div_text, - #wpmem_reg .div_checkbox, #wpmem_reg .button_div, #wpmem_login .button_div { - float: none; - } - - #wpmem_reg label.text, #wpmem_reg label.checkbox, - #wpmem_reg label.textarea , #wpmem_reg label.select, - #wpmem_login label { - width: 90%; - padding: 5px 0 0 0; - } - #wpmem_reg label.textarea { - height: 26px; - } - #wpmem_reg .div_text, #wpmem_reg .div_textarea, - #wpmem_reg .div_select, #wpmem_login .div_text, - #wpmem_reg .div_checkbox { - width: 98%; - } +/** + * WP-Members Styles CSS + * + * CSS for the WP-Members plugin + * + * This file is part of the WP-Members plugin by Chad Butler + * You can find out more about this plugin at https://rocketgeek.com + * Copyright (c) 2006-2023 Chad Butler + * WP-Members(tm) is a trademark of butlerblog.com + * + * @package WP-Members + * @author Chad Butler + * @copyright 2006-2023 + */ + +/* +This stylesheet is designed to integrate WP-Members floated form elements +as simply as possible with most themes using more rigid element properties. +There are quite a few examples in here of what you can do to style the forms. +You can build off of this or start from scratch and set your own +custom css for the plugin (set the location in the admin panel). + +See https://rocketgeek.com/tips-and-tricks/setting-up-a-custom-wp-members-stylesheet/ +for information on how to set up the plugin with a custom stylesheet. + +For information how to load custom stylesheets with wp_enqueue_style, +see https://rocketgeek.com/tips-and-tricks/load-a-custom-stylesheet/ +*/ + + +/* Error and Dialog Messages */ + +#wpmem_msg, .wpmem_msg { + width: 100%; + background: #F9F9F9; + border:1px solid lightGrey; + border-radius: 3px; + padding: 20px 0 0 0; +} + + +/* Sidebar Login Widget */ + +#wp-members { + width: 100%; +} +#wp-members fieldset { + border:none; + padding:0px +} +#wp-members input { + font-family: inherit; +} +#wp-members input[type="text"], +#wp-members input[type="password"]{ + margin: 0 0 4px 0; +} +#wp-members input[type="submit"] { + padding: 5px 6px 4px; + margin: 0 4px 0 0; +} +#wp-members .button_div { + margin-top:4px; +} +#wp-members .err { + width:100%; + padding: 5px; + font-family: inherit; + border: 1px solid #ccc; + border-radius: 3px; +} + + +/* Login Form and Registration Form */ + +/** + Fonts +*/ + +#wpmem_reg label, +#wpmem_login label { + font-family: Arial,sans-serif; + font-size: 100%; + font-size: 14px; + font-weight: 400; +} + +#wpmem_reg legend, +#wpmem_login legend { + font-size: 24px; + font-weight: 700; +} + +#wpmem_reg input, +#wpmem_reg textarea, +#wpmem_reg select, +#wpmem_login input { + font-family: Arial,sans-serif; + font-size: 100%; + font-size: 14px; + font-weight: 400; +} + +#wpmem_reg .req { + font-size: 22px; + color: #bd3500; +} + +/** + Form Design + */ + +#wpmem_reg fieldset, +#wpmem_login fieldset { + border: none; +} + +#wpmem_reg input, +#wpmem_reg textarea, +#wpmem_reg select, +#wpmem_login input { + border: 1px solid rgba(0, 0, 0, 0.3); + outline: 0px none; + border-radius: 2px; + color: rgb(43, 43, 43); + padding: 8px 10px; + -moz-box-sizing: border-box; + margin: 0px; + max-width: 315px; + vertical-align: baseline; +} + + +#wpmem_reg select { + width:311px; +} +#wpmem_reg .dropdown:focus { + border: 1px solid rgba(0, 0, 0, 0.3); + outline: 0; +} + +#wpmem_login .textbox:focus, #wpmem_login .textbox:hover, +#wpmem_reg .textbox:focus, #wpmem_reg .textbox:hover, +#wpmem_reg .username:focus, #wpmem_reg .username:hover, #wpmem_login .username:focus, #wpmem_login .username:hover, +#wpmem_reg .password:focus, #wpmem_reg .password:hover, #wpmem_login .password:focus, #wpmem_login .password:hover { + background-color:inherit; +} + +/** + Size and Spacing + */ + +#wpmem_reg fieldset, +#wpmem_login fieldset { + padding: 0; + margin: 40px 0; +} +#wpmem_reg legend, +#wpmem_login legend { + line-height: 1; + margin-bottom: 10px; +} +#wpmem_reg label.text, +#wpmem_reg label.checkbox, +#wpmem_reg label.textarea , +#wpmem_reg label.select, +#wpmem_login label { + height: 30px; + width:32%; + float:left; + display: block; +} +#wpmem_reg label.text, +#wpmem_reg label.checkbox, +#wpmem_reg label.select, +#wpmem_reg label.radio +#wpmem_reg label.multicheckbox, +#wpmem_reg.multiselect, +#wpmem_login label{ + padding: 14px 0 4px 0; +} +#wpmem_reg label.textarea { + height: 176px; + padding: 16px 0 2px; +} +#wpmem_login label[for="rememberme"] { + float: none; + display: initial; +} +#wpmem_reg input[type="checkbox"] { + margin-top:18px; +} +#wpmem_reg .div_multicheckbox input[type="checkbox"] { + margin: 0 0 0 0; +} +#wpmem_reg .form, +#wpmem_login .form { + margin:0; + padding:0; +} +#wpmem_reg .clear, +#wpmem_login .clear { + clear:both; +} +#wpmem_reg .holder, +#wpmem_login .holder { + background-color:#fff; +} +#wpmem_login .div_text, +#wpmem_reg .div_text, +#wpmem_reg .div_checkbox, +#wpmem_reg .div_select, +#wpmem_reg .div_textarea, +#wpmem_reg .div_multiselect, +#wpmem_reg .div_multicheckbox, +#wpmem_reg .div_radio { + width:311px; + float:right; +} +#wpmem_reg .div_text, +#wpmem_login .div_text { + padding: 8px 0 6px; +} +#wpmem_reg .div_checkbox { + height: 48px; +} +#wpmem_reg .div_select { + padding: 2px 0 1px; +} +#wpmem_reg .div_textarea { + padding: 5px 0 4px 0; +} +#wpmem_login input[type="checkbox"] { + margin: 12px 2px; +} +#wpmem_reg .textbox, +#wpmem_reg .username, +#wpmem_reg .password, +#wpmem_login .textbox, +#wpmem_login .username, +#wpmem_login .password { + display: block; + width:100%; + height: 34px; +} +#wpmem_reg .div_textarea textarea { + display: block; + width:100%; +} +#wpmem_reg .dropdown { + height: 36px; + padding: 8px 10px; + margin: 5px 0 4px 0; + background-color: transparent; +} +#wpmem_reg textarea { + height:185px; +} +#wpmem_reg .req { + line-height: 50%; +} + +#wpmem_reg .req-text { + float:left; + margin: 20px 0px 0px 5px; +} + +#wpmem_reg .noinput { + margin: 6px 0px 7px 10px; +} + +#wpmem_reg .captcha { + margin: 5px -3px 5px 0; +} +#wpmem_reg .captcha table{ + line-height: 0px; +} + +#tos { + margin-right:5px; +} + +#wpmem_login .link-text { + width: 100%; + float:right; + text-align:right; +} + + +/* Buttons */ + +#wpmem_reg .button_div, +#wpmem_login .button_div { + width:100%; + float:right; + text-align:right; + /*height:55px;*/ + padding: 6px 0; +} + + +/** for smaller screens */ + +@media screen and (max-width: 720px) { + #wpmem_reg label.text, + #wpmem_reg label.checkbox, + #wpmem_reg label.textarea, + #wpmem_reg label.select, + #wpmem_reg .div_text, + #wpmem_reg .div_textarea, + #wpmem_reg .div_select, + #wpmem_reg .div_checkbox, + #wpmem_reg .button_div, + #wpmem_login label, + #wpmem_login .button_div, + #wpmem_login .div_text { + float: none; + } + + #wpmem_reg label.text, + #wpmem_reg label.checkbox, + #wpmem_reg label.textarea, + #wpmem_reg label.select, + #wpmem_login label { + width: 90%; + padding: 5px 0 0 0; + } + #wpmem_reg label.textarea { + height: 26px; + } + #wpmem_reg .div_text, + #wpmem_reg .div_textarea, + #wpmem_reg .div_select, + #wpmem_reg .div_checkbox, + #wpmem_login .div_text { + width: 98%; + } } \ No newline at end of file diff --git a/assets/css/forms/generic-rigid.min.css b/assets/css/forms/generic-rigid.min.css new file mode 100644 index 00000000..b7968f43 --- /dev/null +++ b/assets/css/forms/generic-rigid.min.css @@ -0,0 +1 @@ +#wpmem_msg,.wpmem_msg{width:100%;background:#f9f9f9;border:1px solid #d3d3d3;border-radius:3px;padding:20px 0 0 0}#wp-members{width:100%}#wp-members fieldset{border:none;padding:0}#wp-members input{font-family:inherit}#wp-members input[type=password],#wp-members input[type=text]{margin:0 0 4px 0}#wp-members input[type=submit]{padding:5px 6px 4px;margin:0 4px 0 0}#wp-members .button_div{margin-top:4px}#wp-members .err{width:100%;padding:5px;font-family:inherit;border:1px solid #ccc;border-radius:3px}#wpmem_login label,#wpmem_reg label{font-family:Arial,sans-serif;font-size:100%;font-size:14px;font-weight:400}#wpmem_login legend,#wpmem_reg legend{font-size:24px;font-weight:700}#wpmem_login input,#wpmem_reg input,#wpmem_reg select,#wpmem_reg textarea{font-family:Arial,sans-serif;font-size:100%;font-size:14px;font-weight:400}#wpmem_reg .req{font-size:22px;color:#bd3500}#wpmem_login fieldset,#wpmem_reg fieldset{border:none}#wpmem_login input,#wpmem_reg input,#wpmem_reg select,#wpmem_reg textarea{border:1px solid rgba(0,0,0,.3);outline:0 none;border-radius:2px;color:#2b2b2b;padding:8px 10px;-moz-box-sizing:border-box;margin:0;max-width:315px;vertical-align:baseline}#wpmem_reg select{width:311px}#wpmem_reg .dropdown:focus{border:1px solid rgba(0,0,0,.3);outline:0}#wpmem_login .password:focus,#wpmem_login .password:hover,#wpmem_login .textbox:focus,#wpmem_login .textbox:hover,#wpmem_login .username:focus,#wpmem_login .username:hover,#wpmem_reg .password:focus,#wpmem_reg .password:hover,#wpmem_reg .textbox:focus,#wpmem_reg .textbox:hover,#wpmem_reg .username:focus,#wpmem_reg .username:hover{background-color:inherit}#wpmem_login fieldset,#wpmem_reg fieldset{padding:0;margin:40px 0}#wpmem_login legend,#wpmem_reg legend{line-height:1;margin-bottom:10px}#wpmem_login label,#wpmem_reg label.checkbox,#wpmem_reg label.select,#wpmem_reg label.text,#wpmem_reg label.textarea{height:30px;width:32%;float:left;display:block}#wpmem_login label,#wpmem_reg label.checkbox,#wpmem_reg label.radio #wpmem_reg label.multicheckbox,#wpmem_reg label.select,#wpmem_reg label.text,#wpmem_reg.multiselect{padding:14px 0 4px 0}#wpmem_reg label.textarea{height:176px;padding:16px 0 2px}#wpmem_login label[for=rememberme]{float:none;display:initial}#wpmem_reg input[type=checkbox]{margin-top:18px}#wpmem_reg .div_multicheckbox input[type=checkbox]{margin:0}#wpmem_login .form,#wpmem_reg .form{margin:0;padding:0}#wpmem_login .clear,#wpmem_reg .clear{clear:both}#wpmem_login .holder,#wpmem_reg .holder{background-color:#fff}#wpmem_login .div_text,#wpmem_reg .div_checkbox,#wpmem_reg .div_multicheckbox,#wpmem_reg .div_multiselect,#wpmem_reg .div_radio,#wpmem_reg .div_select,#wpmem_reg .div_text,#wpmem_reg .div_textarea{width:311px;float:right}#wpmem_login .div_text,#wpmem_reg .div_text{padding:8px 0 6px}#wpmem_reg .div_checkbox{height:48px}#wpmem_reg .div_select{padding:2px 0 1px}#wpmem_reg .div_textarea{padding:5px 0 4px 0}#wpmem_login input[type=checkbox]{margin:12px 2px}#wpmem_login .password,#wpmem_login .textbox,#wpmem_login .username,#wpmem_reg .password,#wpmem_reg .textbox,#wpmem_reg .username{display:block;width:100%;height:34px}#wpmem_reg .div_textarea textarea{display:block;width:100%}#wpmem_reg .dropdown{height:36px;padding:8px 10px;margin:5px 0 4px 0;background-color:transparent}#wpmem_reg textarea{height:185px}#wpmem_reg .req{line-height:50%}#wpmem_reg .req-text{float:left;margin:20px 0 0 5px}#wpmem_reg .noinput{margin:6px 0 7px 10px}#wpmem_reg .captcha{margin:5px -3px 5px 0}#wpmem_reg .captcha table{line-height:0}#tos{margin-right:5px}#wpmem_login .link-text{width:100%;float:right;text-align:right}#wpmem_login .button_div,#wpmem_reg .button_div{width:100%;float:right;text-align:right;padding:6px 0}@media screen and (max-width:720px){#wpmem_login .button_div,#wpmem_login .div_text,#wpmem_login label,#wpmem_reg .button_div,#wpmem_reg .div_checkbox,#wpmem_reg .div_select,#wpmem_reg .div_text,#wpmem_reg .div_textarea,#wpmem_reg label.checkbox,#wpmem_reg label.select,#wpmem_reg label.text,#wpmem_reg label.textarea{float:none}#wpmem_login label,#wpmem_reg label.checkbox,#wpmem_reg label.select,#wpmem_reg label.text,#wpmem_reg label.textarea{width:90%;padding:5px 0 0 0}#wpmem_reg label.textarea{height:26px}#wpmem_login .div_text,#wpmem_reg .div_checkbox,#wpmem_reg .div_select,#wpmem_reg .div_text,#wpmem_reg .div_textarea{width:98%}} \ No newline at end of file diff --git a/assets/css/forms/index.php b/assets/css/forms/index.php new file mode 100644 index 00000000..dc051a13 --- /dev/null +++ b/assets/css/forms/index.php @@ -0,0 +1 @@ +Sample Content

'; - - - editor.addButton('wpmem_shortcodes_button', function() { - return { - title: "WP-Members Shortcodes", - text: "[ ]", - type: 'menubutton', - icons: false, - menu: [ - { - text: 'WP-Members Shortcodes', - }, - { - text: 'Login Forms', - menu: [ - { - text: "basic login", - onclick: function(){ - editor.insertContent('[wpmem_form login]'); - } - }, - { - text: "login + redirect", - onclick: function(){ - editor.insertContent('[wpmem_form login redirect_to="http://mysite.com/my-page/"]'); - } - }, - { - text: "login + logged in content", - onclick: function(){ - editor.insertContent('[wpmem_form login]
This displays when logged in
[/wpmem_form]'); - } - }, - { - text: "login + redirect + content", - onclick: function(){ - editor.insertContent('[wpmem_form login redirect_to="http://mysite.com/my-page/"]
This displays when logged in
[/wpmem_form]'); - } - }, - ] - }, - { - text: 'Registration Forms', - menu: [ - { - text: "basic registration", - onclick: function(){ - editor.insertContent('[wpmem_form register]'); - } - }, - { - text: "registration + redirect", - onclick: function(){ - editor.insertContent('[wpmem_form register redirect_to="http://mysite.com/my-page/"]'); - } - }, - { - text: "registration + logged in content", - onclick: function(){ - editor.insertContent('[wpmem_form register]
This displays when logged in
[/wpmem_form]'); - } - }, - { - text: "registration + redirect + content", - onclick: function(){ - editor.insertContent('[wpmem_form register redirect_to="http://mysite.com/my-page/"]
This displays when logged in
[/wpmem_form]'); - } - }, - ] - }, - { - text: 'Other Forms', - menu: [ - { - text: "User Profile Page", - onclick: function(){ - editor.insertContent('[wp-members page="user-profile"]'); - } - }, - { - text: "Password Reset/Change", - onclick: function(){ - editor.insertContent('[wpmem_form password]'); - } - }, - { - text: "Password Reset Only", - onclick: function(){ - editor.insertContent('[wpmem_logged_out][wpmem_form password][/wpmem_logged_out]'); - } - }, - { - text: "Password Change Only", - onclick: function(){ - editor.insertContent('[wpmem_logged_in][wpmem_form password][/wpmem_logged_in]'); - } - }, - { - text: "User Data Edit", - onclick: function(){ - editor.insertContent('[wpmem_logged_in][wpmem_form user_edit][/wpmem_logged_in]'); - } - }, - ] - }, - { - text: 'Content Restriction', - menu: [ - { - text: "logged in content", - onclick: function(){ - editor.insertContent('[wpmem_logged_in]
This displays when logged in
[/wpmem_logged_in]'); - } - }, - { - text: "logged out content", - onclick: function(){ - editor.insertContent('[wpmem_logged_out]
This displays when logged out
[/wpmem_logged_out]'); - } - }, - ] - }, - { - text: 'Logout Link', - menu: [ - { - text: "basic logout link", - onclick: function(){ - editor.insertContent('[wpmem_logout]'); - } - }, - { - text: "logout link + custom link text", - onclick: function(){ - editor.insertContent('[wpmem_logout]This the link text[/wpmem_logout]'); - } - }, - ] - }, - { - text: 'User Fields', - onclick: function(){ - editor.insertContent('[wpmem_field field=user_login]'); - } - }, - { - text: 'User Count', - onclick: function(){ - editor.insertContent('[wpmem_show_count label="Active Users: " meta=active value=1]'); - } - }, - ] - } - }); - }; - - tinymce.PluginManager.add( "wpmem_shortcodes", wcShortcodeManager ); -})(); +(function () { + "use strict"; + + var wcShortcodeManager = function(editor, url) { + var wcDummyContent = 'Sample Content'; + var wcParagraphContent = '

Sample Content

'; + + + editor.addButton('wpmem_shortcodes_button', function() { + return { + title: "WP-Members Shortcodes", + tooltip: "WP-Members Shortcodes", + icon: "user", + type: 'menubutton', + icons: false, + menu: [ + { + text: 'WP-Members Shortcodes', + }, + { + text: 'Login Forms', + menu: [ + { + text: "basic login", + onclick: function(){ + editor.insertContent('[wpmem_form login]'); + } + }, + { + text: "login + redirect", + onclick: function(){ + editor.insertContent('[wpmem_form login redirect_to="https://mysite.com/my-page/"]'); + } + }, + { + text: "login + logged in content", + onclick: function(){ + editor.insertContent('[wpmem_form login]
This displays when logged in
[/wpmem_form]'); + } + }, + { + text: "login + redirect + content", + onclick: function(){ + editor.insertContent('[wpmem_form login redirect_to="https://mysite.com/my-page/"]
This displays when logged in
[/wpmem_form]'); + } + }, + ] + }, + { + text: 'Registration Forms', + menu: [ + { + text: "basic registration", + onclick: function(){ + editor.insertContent('[wpmem_form register]'); + } + }, + { + text: "registration + redirect", + onclick: function(){ + editor.insertContent('[wpmem_form register redirect_to="https://mysite.com/my-page/"]'); + } + }, + { + text: "registration + logged in content", + onclick: function(){ + editor.insertContent('[wpmem_form register]
This displays when logged in
[/wpmem_form]'); + } + }, + { + text: "registration + redirect + content", + onclick: function(){ + editor.insertContent('[wpmem_form register redirect_to="https://mysite.com/my-page/"]
This displays when logged in
[/wpmem_form]'); + } + }, + ] + }, + { + text: 'User Profile', + menu: [ + { + text: "User Profile Page", + onclick: function(){ + editor.insertContent('[wpmem_profile]'); + } + }, + { + text: "|" + }, + { + text: "Individual Components (optional):" + }, + { + text: "Password Reset/Change", + onclick: function(){ + editor.insertContent('[wpmem_form password]'); + } + }, + { + text: "Password Reset Only", + onclick: function(){ + editor.insertContent('[wpmem_logged_out][wpmem_form password][/wpmem_logged_out]'); + } + }, + { + text: "Password Change Only", + onclick: function(){ + editor.insertContent('[wpmem_logged_in][wpmem_form password][/wpmem_logged_in]'); + } + }, + { + text: "User Data Edit", + onclick: function(){ + editor.insertContent('[wpmem_logged_in][wpmem_form user_edit][/wpmem_logged_in]'); + } + }, + { + text: "Forgot Username", + onclick: function(){ + editor.insertContent('[wpmem_logged_out][wpmem_form forgot_username][/wpmem_logged_out]'); + } + }, + ] + }, + { + text: 'Content Restriction', + menu: [ + { + text: "logged in content", + onclick: function(){ + editor.insertContent('[wpmem_logged_in]
This displays when logged in
[/wpmem_logged_in]'); + } + }, + { + text: "logged out content", + onclick: function(){ + editor.insertContent('[wpmem_logged_out]
This displays when logged out
[/wpmem_logged_out]'); + } + }, + ] + }, + { + text: 'Links', + menu: [ + { + text: "log in/log out link", + onclick: function(){ + editor.insertContent('[wpmem_loginout]'); + } + }, + { + text: "|" + }, + { + text: "basic logout link", + onclick: function(){ + editor.insertContent('[wpmem_logout]'); + } + }, + { + text: "logout link + custom link text", + onclick: function(){ + editor.insertContent('[wpmem_logout]This the link text[/wpmem_logout]'); + } + }, + { + text: "|" + }, + { + text: "log in link", + onclick: function(){ + editor.insertContent('[wpmem_login_link]'); + } + }, + { + text: "log in link + custom link text", + onclick: function(){ + editor.insertContent('[wpmem_login_link]Link Text[/wpmem_login_link]'); + } + }, + { + text: "|" + }, + { + text: "register link", + onclick: function(){ + editor.insertContent('[wpmem_reg_link]'); + } + }, + { + text: "register link + custom link text", + onclick: function(){ + editor.insertContent('[wpmem_reg_link]Link Text[/wpmem_reg_link]'); + } + } + ] + }, + { + text: 'User Fields', + onclick: function(){ + editor.insertContent('[wpmem_field field=user_login]'); + } + }, + { + text: 'User Count', + onclick: function(){ + editor.insertContent('[wpmem_show_count label="Active Users: " key=active value=1]'); + } + }, + { + text: 'User Avatar', + onclick: function(){ + editor.insertContent('[wpmem_avatar]'); + } + }, + ] + } + }); + }; + + tinymce.PluginManager.add( "wpmem_shortcodes", wcShortcodeManager ); +})(); diff --git a/assets/js/shortcodes_tinymce.min.js b/assets/js/shortcodes_tinymce.min.js new file mode 100644 index 00000000..a4b1f02f --- /dev/null +++ b/assets/js/shortcodes_tinymce.min.js @@ -0,0 +1 @@ +!function(){"use strict";tinymce.PluginManager.add("wpmem_shortcodes",function(t,e){t.addButton("wpmem_shortcodes_button",function(){return{title:"WP-Members Shortcodes",tooltip:"WP-Members Shortcodes",icon:"user",type:"menubutton",icons:!1,menu:[{text:"WP-Members Shortcodes"},{text:"Login Forms",menu:[{text:"basic login",onclick:function(){t.insertContent("[wpmem_form login]")}},{text:"login + redirect",onclick:function(){t.insertContent('[wpmem_form login redirect_to="https://mysite.com/my-page/"]')}},{text:"login + logged in content",onclick:function(){t.insertContent("[wpmem_form login]
This displays when logged in
[/wpmem_form]")}},{text:"login + redirect + content",onclick:function(){t.insertContent('[wpmem_form login redirect_to="https://mysite.com/my-page/"]
This displays when logged in
[/wpmem_form]')}}]},{text:"Registration Forms",menu:[{text:"basic registration",onclick:function(){t.insertContent("[wpmem_form register]")}},{text:"registration + redirect",onclick:function(){t.insertContent('[wpmem_form register redirect_to="https://mysite.com/my-page/"]')}},{text:"registration + logged in content",onclick:function(){t.insertContent("[wpmem_form register]
This displays when logged in
[/wpmem_form]")}},{text:"registration + redirect + content",onclick:function(){t.insertContent('[wpmem_form register redirect_to="https://mysite.com/my-page/"]
This displays when logged in
[/wpmem_form]')}}]},{text:"User Profile",menu:[{text:"User Profile Page",onclick:function(){t.insertContent("[wpmem_profile]")}},{text:"|"},{text:"Individual Components (optional):"},{text:"Password Reset/Change",onclick:function(){t.insertContent("[wpmem_form password]")}},{text:"Password Reset Only",onclick:function(){t.insertContent("[wpmem_logged_out][wpmem_form password][/wpmem_logged_out]")}},{text:"Password Change Only",onclick:function(){t.insertContent("[wpmem_logged_in][wpmem_form password][/wpmem_logged_in]")}},{text:"User Data Edit",onclick:function(){t.insertContent("[wpmem_logged_in][wpmem_form user_edit][/wpmem_logged_in]")}},{text:"Forgot Username",onclick:function(){t.insertContent("[wpmem_logged_out][wpmem_form forgot_username][/wpmem_logged_out]")}}]},{text:"Content Restriction",menu:[{text:"logged in content",onclick:function(){t.insertContent("[wpmem_logged_in]
This displays when logged in
[/wpmem_logged_in]")}},{text:"logged out content",onclick:function(){t.insertContent("[wpmem_logged_out]
This displays when logged out
[/wpmem_logged_out]")}}]},{text:"Links",menu:[{text:"log in/log out link",onclick:function(){t.insertContent("[wpmem_loginout]")}},{text:"|"},{text:"basic logout link",onclick:function(){t.insertContent("[wpmem_logout]")}},{text:"logout link + custom link text",onclick:function(){t.insertContent("[wpmem_logout]This the link text[/wpmem_logout]")}},{text:"|"},{text:"log in link",onclick:function(){t.insertContent("[wpmem_login_link]")}},{text:"log in link + custom link text",onclick:function(){t.insertContent("[wpmem_login_link]Link Text[/wpmem_login_link]")}},{text:"|"},{text:"register link",onclick:function(){t.insertContent("[wpmem_reg_link]")}},{text:"register link + custom link text",onclick:function(){t.insertContent("[wpmem_reg_link]Link Text[/wpmem_reg_link]")}}]},{text:"User Fields",onclick:function(){t.insertContent("[wpmem_field field=user_login]")}},{text:"User Count",onclick:function(){t.insertContent('[wpmem_show_count label="Active Users: " key=active value=1]')}},{text:"User Avatar",onclick:function(){t.insertContent("[wpmem_avatar]")}}]}})})}(); \ No newline at end of file diff --git a/assets/js/wpmem-nav-menu.js b/assets/js/wpmem-nav-menu.js new file mode 100644 index 00000000..2aa0e51b --- /dev/null +++ b/assets/js/wpmem-nav-menu.js @@ -0,0 +1,27 @@ +;(function($) { + + $('.wpmem_logged_in_out_field').each(function(i){ + + var $field = $(this); + + var id = $field.find('input.nav-menu-id').val(); + + // if set to display by role (aka is null) then show the roles list, otherwise hide + if( $field.find('input.wpmem-logged-in-out:checked').val() === 'in' ){ + $field.next('.wpmem_nav_menu_field').show(); + } else { + $field.next('.wpmem_nav_menu_field').hide(); + } + }); + + // on in/out/role change, hide/show the roles + $('#menu-to-edit').on('change', 'input.wpmem-logged-in-out', function() { + if( $(this).val() === 'in' ){ + $(this).parentsUntil('.nav_menu_logged_in_out').next('.wpmem_nav_menu_field').slideDown(); + } else { + $(this).parentsUntil('.nav_menu_logged_in_out').next('.wpmem_nav_menu_field').slideUp(); + } + }); + + +})(jQuery); \ No newline at end of file diff --git a/assets/js/wpmem-nav-menu.min.js b/assets/js/wpmem-nav-menu.min.js new file mode 100644 index 00000000..4fa47abe --- /dev/null +++ b/assets/js/wpmem-nav-menu.min.js @@ -0,0 +1 @@ +!function(n){n(".wpmem_logged_in_out_field").each(function(e){var i=n(this);i.find("input.nav-menu-id").val();"in"===i.find("input.wpmem-logged-in-out:checked").val()?i.next(".wpmem_nav_menu_field").show():i.next(".wpmem_nav_menu_field").hide()}),n("#menu-to-edit").on("change","input.wpmem-logged-in-out",function(){"in"===n(this).val()?n(this).parentsUntil(".nav_menu_logged_in_out").next(".wpmem_nav_menu_field").slideDown():n(this).parentsUntil(".nav_menu_logged_in_out").next(".wpmem_nav_menu_field").slideUp()})}(jQuery); \ No newline at end of file diff --git a/changelog.txt b/changelog.txt new file mode 100644 index 00000000..c461bbd7 --- /dev/null +++ b/changelog.txt @@ -0,0 +1,1153 @@ += 3.2.9 = + +* Load jQuery UI and Select2 libraries locally (if they have not already been enqueued). +* Use (local) template file for default tos field link (can be customized and saved in theme folder). +* Added new sanitization functions to API: wpmem_sanitize_class() and wpmem_sanitize_array(). +* Review and cleanup of form data sanitization. +* Improved file/image field upload file type validation. +* Fixed issue with loading legacy translation files. +* Added "membership" attribute to [wpmem_logged_in] shortcode (same as "product" attribute, they are interchangeable). +* Added datepicker for setting user expiration (when membership products are used). + += 3.2.8 = + +* Include jQuery UI CSS and Select2 library locally. +* Updated default TOS to a template file. +* Added additional data sanitization. +* Fixed potential security issues to prevent CSRF (Cross Site Request Forgery). + += 3.2.7 = + +* Fix console error from nonce by implementing different nonce names. +* Updated packaged POT file for legacy lanaguage files. Updated legacy language files to use new POT. +* Full removal of legacy language files that are available as language packs from https://translate.wordpress.org/projects/wp-plugins/wp-members/ +* Added jQuery UI stylesheet (fixes issue with main options tab settings modal). +* Added wpmem_default_text filter. +* Deprecated wpmem_default_text_strings filter, use wpmem_default_text instead. +* Added translation capability to field placeholders and title attributes. +* Updated Customizer setting slug to avoid namespace collisions (added "wpmem_" stem). +* Updated instances of wp_redirect() to use wp_safe_redirect(). +* Updated install for multisite to use wp_insert_site (wpmu_new_blog deprecated in WP 5.1). +* Added user screen filter to show activated users. + += 3.2.6 = + +* Update to evaluate required fields as not null (instead of false). +* Added wpmem_tos_link_tag filter. +* Added $button_html parameter to wpmem_register_form_buttons filter. +* Added wpmem_serve_menu filter. +* Added nonce to short form (long form was added in 3.2.5). +* Password change function only can be fired if user is logged in. +* Added "all" argument to wpmem_user_data() to retrieve either all user meta or WP-Members fields only. +* Added $date argument to wpmem_set_user_product(). Allows specific date to be set using API. +* Added wpmem_admin_after_profile_table and wpmem_user_after_profile_table actions. +* get_user_products() returns empty array if no products (previously boolean). +* Rebuild of [wpmem_field] logic for field type. Combined multiple conditions into a single switch. +* Update password reset form - password field should be "text" class. +* Added membership field type for allowing selection of a membership at registration. +* Login form updated from "Username" to "Username or Email". +* Added $arr parameter to wpmem_login_form_rows filter. +* Added file's post ID to post_data array. + += 3.2.5 = + +* Fix user profile (admin/user) issue with tos field not displaying. +* Fix [wpmem_logged_in] shortcode to pass product attribute. +* Fix [wpmem_field] shortcode, checks if field is set to avoid undefined index error. +* Fix do_excerpt() if post object is not set as an object. +* Fix logic for displaying hidden posts based on product access. +* Added message dialog to display in Customizer. +* Added HTML5 "required" attribute to TOS checkbox. +* Added redirect_to attribute to logout link. +* Added $tag parameter to wpmem_{$tag}_link and wpmem_{$tag}_link_str filters. +* Added id parameter to wpmem_register_form_args filter. +* Added wpmem_email_send_args filter. +* Added wpmem_is_user() function to API. +* Added wpmem_do_shortcode() utility function in API. +* Added wpmem_export_fields filter to user export function. +* Added label attribute to field shortcode. +* Added user profile tabs (jquery ui tabs). +* Updated wpmem_form_date() API function. +* Updated check product access to handle product as an array. +* Updated to make a nonce a default for the registration form (reduces possibility of spam registrations). +* Updated form field creation, $value is now optional. +* Moved textdomain to load in main class file. +* Removed possibility of using reCAPTCHA v1 which is totally obsolete. +* Removed widget status message ("you are not logged in") for logged out state. + += 3.2.4 = + +* Added deactivate users both bulk and single in Users > All Users. +* Added id attribute for form labels. +* Added wpmem_format_date() API function. +* Added label tags to multipe checkbox and radio group items. +* Added assigned product(s) column to users and posts screens. +* Updated membership product object structure. +* Updated load priority to run later for jquery loginout script. +* Removed query_vars filter. +* Deprecated wpmem_a_activate_user(), use wpmem_activate_user() instead. +* Deprecated wpmem_a_deactivate_user(), use wpmem_deactivate_user() instead. +* Relocated install file to /inc/ directory. +* Moved methods out of core.php, deprecated file. +* Fixed issue with default stylesheet setting caused by moving install file. + += 3.2.3 = + +* Bug fix in user export that caused usernames to be dropped. +* Bug fix to allow admins to edit their own profile. +* Bug fix for jquery with regards to select2, only load if products are enabled. +* Added email API. +* Added product attribute to [wpmem_logged_in] shortcode. +* Added wpmem_force_ssl() API function. +* Added wpmem_set_as_logged_in() API function. +* Added filters to remove posts marked hidden from previous/next links. +* Updated user login function to use WP script, facilitates login with username OR email, removes wpmem_login_fields filter, changes to wp_safe_redirect(). +* Updated password change for maintaining login state. +* Moved wpmem_fields(), wpmem_form_label(), and wpmem_form_field() to api-forms.php. +* Moved wpmem_user_has_role(), wpmem_user_has_meta(), wpmem_is_user_activated(), wpmem_user_data(), wpmem_update_user_role(), and wpmem_user_has_access() to api-users.php. +* Moved wpmem_do_excerpt(), wpmem_texturize(), wpmem_get_excluded_meta(), wpmem_use_ssl(), wpmem_write_log(), wpmem_load_dropins(), wpmem_array_insert(), and wpmem_get_sub_str() to api-utilities.php. +* Moved wpmem_wp_reserved_terms() to admin API. +* Deprecated wpmem_check_activated() and wpmem_use_ssl(). +* Removed obsolete functions wpmem_enqueue_style(), wpmem_convert_tag(), wpmem_no_reset(), and wpmem_user_profile_multipart(). +* Applied wpmem_force_ssl() to stylesheet in case it needs to load securely (even if the setting is saved as http://). +* Implemented change in the native WP registration form processing to allow values of "0" to be interpreted as string literals. Previously could be interpreted as boolean when being saved. + += 3.2.2 = + +* Fixed bug in 3.2.1/3.2.2 for user activation when user creates password at registration and is activated from the user profile. +* Fixed a 3.2 upgrade issue, verifies username field is properly added to field settings array. +* Fixed issue with user product verification where only expiration products were validated. +* Fixed logic in form field builder so multiselect will accept a custom class. +* Added select2 support for setting product access in the post editor. +* Removed duplicate API function wpmem_current_postid() (use wpmem_current_post_id()). +* Replaced sanitize_html_class() with WP_Members_Forms::sanitize_class() so variables may contain multiple classes. + += 3.2.1 = + +* Fixed duplicate ID in login form. +* Fixed user profile update for excluded fields. +* Fixed native WP registration, excluded WP-Members username field in form validation. +* Fixed update post when block status is not changed. +* Rebuilt user interface for post restriction metabox to make it more intuitive. +* Changed status column in All Posts to show all block statuses, not just those opposite the default. +* Changed "clickable" attribute for field shortcode default to false. +* Added wpmem_user_export_header and wpmem_user_export_row filter for export. + += 3.2.0 = + +* Tested and compatible with Gutenberg. +* Changed default address meta fields to WooCommerce billing meta keys. +* Removed language packs that install from wordpress.org (de_DE, hu_HU, ja, nl_NL, pt_BR, ru_RU, and sv_SE). +* All remaining user facing strings in get_text() added wp-members textdomain. +* Added locale as a parameter for localization filters. +* Added wpmem_register_hidden_rows filter. +* Added "post_to" key for wpmem_register_form_args. +* Rebuild of user export function. User export now uses fputcsv. +* Updates/code improvement for enqueueing styles. +* Updated widget, added widget_title filter before wpmem_widget_title, documented wpmem_widget_id filter, added instance and id_base parameters. +* Updated empty $fields check to not rewrite fields. +* Deprecated wpmem_inc_status(). +* Deprecated wpmem_do_sidebar(). +* Deprecated wpmem_create_formfield(), use wpmem_form_field() instead. +* Deprecated a number of non-user callable functions. +* Eliminated capability-based load for admin files. +* Maintain user login state when password is changed. +* Added wpmem_get_sub_str() string manipulation utility. +* Updated login form redirect_to to account for query vars. +* Fixes issue with login status if logout url is encoded (sprintf() has too few arguments). +* Added Membership Products Custom Post Type. +* Added "Hide Post" option for blocking content (currently only by post meta _wpmem_block). +* Removed several outdated stylesheets from selection (still packaged with download for users who may use them). +* Added wpmem_update_user_role() API function. +* Added wpmem_display_message() API function. +* Added wpmem_user_has_access() API function. +* HTML5 update - form anchor tags changed from "name" to "id". +* HTML5 update - form id tags set default value (can still be filtered). +* HTML5 update - removed "align" attribute (captcha, link-text). +* HTML5 update - added placeholder, pattern, and title attribute support for password fields. +* Improved the add a field dialog to adjust required inputs depending on field type. +* Added placeholder, rows, and cols attribute support for textarea field settings. +* Moved remaining core functions to appropriate object classes, left wrappers for most. +* Added new email class and shortcode class to replace previous functions/files. +* Added link_span_before/link_span_after wrapper for login link text. +* Updated "TOS" text to accept a custom label (priority to filtered label with wpmem_tos_link_txt). +* Updated all processing involving "TOS" to better exclude the field on profile update (if saved value equals the field's checked value). +* Fixed a bug that caused WP native fields to be set as non-native when labels were updated in the fields tab. +* Added Customizer control to display login, register, and widget forms when using the Customizer (easier to work on custom CSS). +* Added login/out menu item. + += 3.1.9 = + +* Security enhancements. +* Improved user search in Users > All Users. +* Fully deprecated obsolete reCAPTCHA v1. If v1 is selected as a setting, it will be automatically changed to v2. (v1 users check your API keys for compatibility.) +* Removed obsolete comments_template.php. +* Set image field to display "medium" image in dashboard/admin user profile. Admin profile image display links to media editor. +* Added default format to date field shortcode to date format set in WP settings. +* Added format attribute to date field shortcode for custom date formatting. +* Added User ID as an optional column for the Users > All Users screen. +* Deprecated wpmem_user_profile(), wpmem_profile_update(), wpmem_user_profile_multipart(), wpmem_admin_fields(), wpmem_admin_update(). +* Rebuild of dashboard profile functions incorporated into new user profile object class. +* Fields tab bulk action now checks for both page and tab (rather than just tab) to prevent namespace collisions. +* Removed $requested_redirect_to argument from login_redirect filter hook. +* Removed height property of button_div for generic stylesheets. +* Fixed user edit shortcode to display updated user data without page refresh. +* Fixed password change so that login state is maintained after password update. +* Fix for multiple checkbox and multiple select field types if "comma" was selected as the delimiter (previously, this would break the field settings array option assembly). +* Improvements on field manager add/edit field screen. +* Improvements to multiple checkbox and radio groups: better handling of non-value selections and span wrapper for group separators. + += 3.1.8 = + +* Added new native registration handling to accommodate WooCommerce 3.0. +* Added support for user file upload on admin/dashboard profile. +* Added meta_key/meta_value attribute to [wpmem_logged_in] shortcode. +* Added wpmem_user_has_meta() API function. +* Updated post editor shortcode button javascript to include new(er) shortcodes. +* Fixed WP-Members user profile shortcode to only display logged in content (by shortcode) if the wpmem_a 'action' is not set (i.e. logged in content only displays if page is in "member links" state). +* Fixed register link in login form to prevent link from displaying if login form is displayed along with the registration form (standard configuration). +* Improved multisite support, including revisions to load all admin dependencies for administrator role, not just super admin. Dependency load role requirement is filterable. +* Improved line break stripping process in form builder to allow for line breaks in textarea fields. +* Improved field shortcode for textarea fields to display line breaks. +* Deprecated old wpmem_do_sc_pages() function, updated wpmem_sc_user_profile(). +* Removed $_SERVER['REQUEST_URI'] from all admin tab form action attributes. Replaced with new wpmem_admin_form_post_url() API function. +* Fields Tab: ground-up rebuild to utilize WP_List_Table and jquery sorting UI. +* Fields Tab: improved field add/edit screen: return link at bottom of page, display current field upon successful form submission, success message include return link. +* Fields Tab: added support for HTML5 field types: number, date. +* Fields Tab: added support for HTML5 field attributes: placeholder, pattern (regex), title, min, max. +* Corrects an issue with user profile display/update of textarea fields that are not the WP default bio field. +* Added display=raw attribute handling to textarea fields to allow display without converting line breaks to HTML br tags. +* Fixes issue with User Profile form heading not using the get_text() value. +* Improves logic for displaying register link in login form if login page is not set. + += 3.1.7 = + +* API updates: added wpmem_is_user_activated(). +* API updates: wpmem_is_reg_page() added default of current page ID. +* API updates: wpmem_current_url() added check for query string. +* API updates: Added wpmem_fields filter to wpmem_fields(). +* API updates: Added wpmem_current_post_id() and wpmem_form_label() functions. +* API updates: Added new [wpmem_avatar], [wpmem_login_link], and [wpmem_register_link] shortcodes. +* API updates: Added filter option in user export to decode html entities in user fields. +* API updates: Added wpmem_get_action action hook when wpmem_a is loaded. +* All admin dependencies and actions/filters loaded in admin api object. +* Corrected issue in forms function were RS Captcha had empty div wrapper variable. +* Removed deprecated functions wpmem_load_admin_js(), wpmem_test_shortcode(), and wpmem_generatePassword(). +* Moved remaining deprecated functions to new inc/deprecated.php. +* Added successful registration message on page if nonce validates (for reg redirects). +* Added User object class, handling login, logout, register. +* Added buffering to login form and widget to allow do_login action results to be displayed (such as 3rd party login captcha). +* Added support for WP's login_redirect filter (loads before wpmem_login_redirect). +* Added a div wrapper for post restricted message. +* Added initial form support for HTML5 number input, & min, max, title, and pattern attributes (placeholder support was added in 3.1.6). +* Updated wpmem_admin_update() to exit if there is no user ID. +* Updated admin notification email to translate field labels. +* Updated login form links and filters to a single process (was one for each). +* Updated WP Registration finalize process. +* Moved form building functions to forms object class. +* Deprecated wpmem_register_fields_arr filter (Use wpmem_fields instead). +* Removing the wpautop() function is now optional rather than default. +* Fixed load fields error checking, install function now correctly returns defaults. +* Changed password reset and password change to use wp_set_password() for improved performance with caching. + += 3.1.6 = + +* Fixed [wpmem_field] display handling for multiple select and multiple checkbox field types. +* Updates to always load fields from wpmem_fields() API function. +* Updates to begin to utilize new fields settings array. Fields setting is still store in the same array format as before. However, it is loaded into the new settings format. Current object class keeps numeric keys in place for legacy purposes. +* Updates to dropdown handling on main options tab to display proper preselected value when site is using ssl (https://) and no value is selected. +* Added wpmem_loginout() API function, changed [wpmem_loginout] shortcode to use API function. +* Added wpmem_array_insert() API function, allows for inserting array elements at any point in an array. +* Added wp_destroy_current_session() to logout function. +* Added WooCommerce support in native WP registration functions. Began adding WooCommerce classes to registration form elements. +* Added to wpmem_user_has_role() function to check for a single role or if the user has a role that is in an array of roles. +* Added wpmem_shortcodes_loaded, wpmem_hooks_loaded, and wpmem_dropins_loaded to fire after. +* Added text input to set a default 'read more' link for auto excerpt. +* Fixed issue with auto excerpt where an excerpt shorter than the excerpt setting would not display the more link. +* Preliminary updates to include placeholder support in fields (this will be an option in a future release). +* Localization fix of untranslated strings. +* Wrap "Remember Me" checkbox label with label tag in login form. +* Moved remaining initialization functions to class constructor. +* Moved wpmem_load_shortcodes, wpmem_load_hooks, and wpmem_load_dropins to fire before. +* reCAPTCHA version 1 is no longer supported by Google. It is now deprecated in the plugin. If you have reCAPTCHA v1 selected, it will remain so. But once this is changed to a different CAPTCHA setting or if this is a new install, reCAPTCHA version 1 will no longer be available as a selection. +* Custom field term "Option Name" changed to "Meta Key" for clarity. +* Marked required custom field properties as required in Add/Edit Field dialogs. +* Changed redirect_to process to escape the url with esc_url_raw rather than esc_url, otherwise query string variables do not get handled correctly. +* Fixes issue with displaying checkbox state on the admin user profile screen. +* Fixes issue with auto excerpt when excerpts are displayed on single posts/pages. +* Applies style properties for the remember me checkbox label to the default stylesheets. The label tag was added to this text in 3.1.6 (see below). +* Applies some admin strings for translation. + += 3.1.5 = + +* Addressed some security issues to prevent XSS vulnerabilities. +* Updated [wpmem_show_count] shortcode to include count of total blog users and users by role. See: https://rocketgeek.com/plugins/wp-members/docs/shortcodes/other-shortcodes/ +* Updated [wpmem_field] shortcode to accept [wpmem_field meta_key] instead of [wpmem_field field="meta_key"] (although the latter will still work). See https://rocketgeek.com/plugins/wp-members/docs/shortcodes/field-shortcodes/ +* Updated [wpmem_loginout] shortcode with some improvements to function code and link text attributes. See: https://rocketgeek.com/plugins/wp-members/docs/shortcodes/other-shortcodes/ +* Updated auto excerpt for improved functionality, uses wp_trim_words(), deprecated add_ellipsis, strip_tags, close_tags, parse_shortcodes, strip_shortcodes for filter (these were never documented so it is unlikely that anyone uses them). +* Updated hidden field type, now allows adding hidden fields to the registration form. +* Compartmentalized installation of initial settings. +* Field loader now validates settings, if none exist due to install error it will run the default fields install. +* Removed dialog setting downgrade on deactivation. Need to re-evaluate necessity of downgrading. +* Fixed issue with slash handling in Emails tab. +* Updated [wp-members] deprecated shortcode notice to include post/page information on where the shortcode is being used. + += 3.1.4 = + +* Change to the way the PayPal extension is integrated with the main plugin. This allows for some necessary filename changes in the extension. +* Added checks for PayPal extension function calls within the main plugin to avoid possible errors if it is deactivated. +* New wpmem_is_tab() API function checks the current tab in the plugin's admin panel. +* New wpmem_is_reg_page() API function checks if the page the user registered on is the registration page. +* New wpmem_load_dropins() API function runs dropin load function. +* Documentation updates, cleaned up and addressed several @todo tags. +* Updated [wpmem_field] shortcode to display display values instead of stored values for select (dropdown), multiple select, multiple checkbox, and radio group field types. +* Fixed bug in admin js file introduced when forgot username shortcode was added. +* Updates to reCAPTCHA2. Trims keys on save to avoid possible copy/paste whitespace issues, displays API error code(s) if WP_DEBUG is turned on, change use of file_get_contents() to wp_remote_fopen() for broader acceptable use. + += 3.1.3 = + +* Fixed issue with display of [wp-members] field tag. Note: although this tag should remain operable, the tag is officially obsolete since 2.9.8 and should be used as [wpmem_field]. +* Fixed issue with calling PayPal extension functions if settings are enabled but the extension is disabled. +* Updated some admin-side strings for translation. +* Updated wpmem_redirect_to_login() to __not__ check for wpmem_is_blocked(). Handling that outside the function will expand its usability. +* Updated row_after logic in login form function so that it can be used for adding tags at the end of a row w/o adding a tag at the beginning. +* Updated widget to check for wpmem_do_sidebar() instead of obsolete wpmem() function. +* Updated email shortcodes used in new install. +* Added new utility function wpmem_get() for checking posted variables and query strings with isset() and setting a default value. +* Added a nonce to register redirect by shortcode parameter. This will lead to being able to display a success message on the redirected page. +* Added redirect_to argument in wpmem_redirect_to_login(). +* Added generic registration error message. +* Added [wpmem_form forgot_username] shortcode for displaying the forgot username form. + += 3.1.2 = + +* Minimum WordPress version increased to 3.6. +* Added user counts to user screen links (set as transient) +* Added redirect_to parameter to wpmem_login_url() +* Added action parameter to wpmem_profile_url() +* Added api function wpmem_user_pages() to return an array of the login, register, and profile page urls. +* Added shortcode [wpmem_tos] for Terms of Service page url (replaces [wp-members page=tos url=http://mysite.com/path/to/tos/]). +* Added wpmem_write_log() function for writing notices to the WP error log. +* Deprecated [wp-members] shortcode, all other shortcodes no longer rely on wpmem_shortcode(). +* Fixed issue with pre-selected dropdown values to not select empty (separator) rows. +* Fixed email shortcodes for field and custom shortcodes not being parsed. + += 3.1.1 = + +* Added downgrade function (currently runs on deactivation) to allow for version rollbacks. +* Added new dialogs functions to admin api, allows for custom dialogs to be added. +* Added $user_id and $row to wpmem_admin_profile_field and wpmem_user_profile_field filters. +* Added new api class and api functions. +* Added [wpmem_loginout] shortcode. +* Added support for new field types to native registration and users > add new (except file/image fields). +* Updated users > add new so that user can be activated when added. +* Updated [wpmem_logged_in] shortcode so that content is not shown on on a user profile page action. +* Updated email settings to only save new from/name if changed. +* Updated admin warning messges. +* Updated multiselect and multicheckbox fields to allow user selected delimiter (defaults to pipe "|"). +* Fixes issue with profile update when file/image field is required. +* Fixes image field edit in fields tab to include file type. +* Fixes attribution setting for 3.0 settings array. +* Fixes for PHP7. + += 3.1.0 = + +This package contains several fixes, some new filters, new field types and other functional improvements. + +* Some general code cleanup, reviewing inline documentation and comments. +* Fixed issue for sidebar with redirect_to parameter set in widget settings. +* Fixed issue for custom error messages and email comparison error for profile update (so that errors show in form update state and not on links page). +* Fixed main options tab where checkbox may not display correct setting if unchecked. +* Fixed translation issue for required field error where all of the message except the field name was translated. +* Fixed issue for register shortcode page where if a user has registered, and is logging in but the login fails, display the login error message. +* Fixed register shortcode redirect parameter. +* Fixed confirm_password to bypass sanitize_text_field (which breaks password comparison if certain characters are used). +* Added logic so that user_pages are not blocked (login, register, user_profile). +* Added after_wrapper array value for wpmem_{$page}_links_args filters +* Added a new admin api class, utilities object class, and forms object class. +* Added user facing strings as an array in the main $wpmem object class. +* Added wpmem_default_text_strings filter for user facing text strings. +* Added new wpmem_sidebar_status_args filter hook. +* Added new container in main object for email from and from name settings. +* Added file upload functions. +* Added new field types: multiple checkbox, multiple select, radio, file, image, email, url. +* Added "values" key to the register form rows array to hold possible values (i.e. select, multiple select, multiple checkbox, and radio group) and the actual value to be in the "value" key. +* Added the ability for dropdown/select fields to have a default value other than the first value. +* Added filter wpmem_user_upload_dir for filtering the location of user uploaded files. +* Added wpmem_register_form_rows_admin and wpmem_register_form_rows_profile filter hooks. +* Deprecated use of wpmem_chk_qstr() function, use add_query_arg() instead. +* Deprecated use of get_currentuserinfo() (deprecated in WP 4.5), use wp_get_current_user() instead. +* Email function updates, added 'footer' as an array value in the main wpmem_email_filter filter. +* Changed install to set email/confirm_email and user_url as HTML5 field types "email" and "url" (now supported). +* Changed get_action call from init action to template_redirect action. +* Changed username in register form from log to user_login to match wp native registration form. +* Changed [wp-members page="user-profile"] shortcode to [wpmem_profile] (old shortcode will still work). +* Removed redirect parameter from register shortcode in shortcode menu. +* Removed kubrick stylesheet from selector (still packaged with download, shows as custom url if used). +* Changed all _update_ functions in install package to _upgrade_. +* Fixes an issue with PayPal extension where users may be set to pending if moderated registration is enabled after the user already has an expiration date. +* Update wpmem_do_sidebar to use use add_query_arg() if on a search query. + += 3.0.9 = + +* Added Custom Post Type support. +* Added wpmem_member_links_args and wpmem_register_links_args filters. +* Added $link parameter to wpmem_forgot_link_str and wpmem_reg_link_str filters (gives just the link as an available parameter). +* Added new wpmem_sb_reg_link_str and wpmem_sb_forgot_link_str filters (same format as above). +* Added [email] and [user-profile] shortcodes to the new user registration email. +* Added label_text key to wpmem_register_form_rows filter. +* Added new auto excerpt settings, can now be set by post type. +* Added new auto excerpt features including new wpmem_auto_excerpt_args filter. +* Added forgot username retrieveal link (included on forgot password reset form). +* Added wpmem_username_link and wpmem_username_link_str for filtering forgot username retrieval link. +* Added new upgrade process to WP_Members object class. +* Fixed handling of post bulk actions to keep current screen (if one is used). +* Fixed handling of updates to the user pages in the options tab. +* Fixed handling of empty post object in is_blocked() function. +* Improved email functions to eliminate get_user_meta() calls when not needed. + += 3.0.8 = + +* Added process for forgotten username retrieval. +* Removed last remaining instances of extract function. +* Updated settings for special pages (login|register|user-profile) to store only the numeric primary key ID. This will eliminate the need to update these settings if the site is moved (from a dev to live site, for example). Legacy full URL settings will still be compatible without needing to be updated, but will be automatically updated when main options are saved. + += 3.0.7 = + +* Fix for use of display_name on profile update. +* Fix for newer installs (post WP 4.0) where WPLANG is not defined and reCAPTCHA is used. +* Fix in wpmem_form shortcode to skp if no additional tag exists. +* Fix to plugin_basename. +* Changes in core to use fields from WP_Members class (preparing for new form field process). +* Reviews and updates to code standards and inline documentation. +* Fix for password reset (typo in object name checking for moderated registration) +* Fix for PayPal extension (https://rocketgeek.com/plugins/wp-members-paypal-subscriptions/); added logic to avoid errors if the PayPal extension is disabled but the main option setting remained turned on. + += 3.0.6 = + +* Updates to localization function - documented plugin_locale filter, wpmem_localization_file filter, and improved load_textdomain logic. +* Added /lang domain path to plugin header. +* Fixed a bug in the user export function that broke CSV columns when moderated registration was turned on. +* Improved current page retrieval in wpmem_redirect_to_login() function. +* Fixed admin enqueued scripts (post/page screen hook did not load from new location). + += 3.0.5 = + +* Updated wpmem_pwd_change and wpmem_pwd_reset action hooks to include password as a parameter. +* Stylesheet updates for 2015, 2014, and generic (both float and no float). +* Fix to TinyMCE shortcode button, should now load button on new post/page editor. +* Added [WP-Members] to the TinyMCE shortcode button for clarity as to what it is. +* Moved admin js and css files to /admin/js/ and /admin/css/ +* Moved admin class files to /admin/includes/ +* Updated and verified all directories contain an index.php file to prevent directory browsing. + += 3.0.4 = + +* Reintroduced the global action variable $wpmem_a for backward compatibility with certain add-ons, most notably the WP-Members MailChimp extension ( see https://rocketgeek.com/plugins/wp-members-mailchimp-integration/ ). Users of this extension should upgrade. This variable had been replaced with the new WP-Members object class introduced in 3.0. However, users of older extensions and those that may have customziations with logic may be using this variable, so rather than force updating and upgrading, it is being added back in. +* Change to the priority of functions hooked to the the_content filter. Lowering the priority should better integrate the plugin with various builder plugins and other processes that currently filter the_content after WP-Members since the content will now be filtered later in the process. This also should improve situations where in the past the on-the-fly texturization shortcode for the WP-Members forms might remain unparsed. + += 3.0.3 = + +* Bug fix recaptcha v2 decode json response on validation. +* Bug fix typo in $wpmem object name in admin/user-profile.php. +* Bug fix message string variable in wpmem_msg_dialog_arr filter. +* Fix register form shortcode redirect_to parameter. +* Admin forms now use submit_button() function to generate submit button. +* Changed localization to load on init action which will allow for more flexibility with filtering custom language files. +* Added wpmem_localization_file and wpmem_localization_dir filters. +* Localization checks for file in /wp-content/ language directory first, then loads plugin default. + += 3.0.2 = + +* Added reCAPTCHA version 2 as an option. v1 will remain available for now, to be fully deprecated later. +* Fixed widget to use __construct for WP 4.3 compatibility. +* Added error checking for WP reserved names when adding new custom fields. +* Added wpmem_wp_reserved_terms filter for overriding reserved terms list. +* Added trim whitespace to password reset and password change form validation. + += 3.0.1 = + +* Fixed use of wp_signon() for ssl. +* Fixed [wpmem_msurl] email shortcode. +* Fixed admin js and css load (removed unnecessary slash). +* Fixed autoexcerpt to use setting from object and not wpmemembers_autoex option. +* Added filter to remove comments array if content is blocked. + += 3.0.0 = + +This release makes significant changes to the plugin's main options in the way they are stored. While care has been taken to make sure that you can roll back to a previous version, you may need to resave settings in the plugin's main options tab when attempting to roll back. It is advised that you test this update prior upgrading an existing install on a production site. + +If you have any custom functions hooked to filters and actions that call any file includes directly from the plugin, please note that several file names have changed. + +* New settings and new plugin class WP_Members. +* New settings now natively support Custom Post Types, both setting defaults and individual post blocking. +* Settings constants removed in favor of using the $wpmem object class. +* Added new|edit toggle to wpmem-register_data filter hook. +* wpmem_settings_loaded action added. +* Securify comments changed to use comments_open instead of comments_template (with a blank template). +* New wpmem_securify_comments filter hook to customize whether comments load or not. +* Registration clear form button defaults to false. +* Removed wp_set_auth_cookie from login function; it is already done as part of wp_signon. +* Post meta box title filter is now for all post types wpmem_admin_{post type}_meta_title. +* New filter for Really Simple Captcha folder location: wpmem_rs_captcha_folder. +* New shortcodes [wpmem_form] added. +* Shortcode dropdown selector added to tinymce toolbar in Post/Page editor. +* Added redirect_to as a function argument if calling wpmem_logout() directly. + += 2.9.9 = +* Code standards in wp-members-email.php +* Rebuilt admin notification email to follow new regular email structure with more filters in wp-members-email.com +* Added $toggle to headers filter that is used in both emails so that headers could be filtered based on the email being sent (i.e. sending plain text for admin notification vs html for others. in wp-members-email.php +* Added redirect_to parameter as a widget entry in wp-members-sidebar.php +* Corrected flaws in error checking for adding new fields in /admin/tab-fields.php +* Added functions for updating user_status in wp_users table in /admin/users.php +* Fixed get_user_meta 'true' error in wp-members-core.php, users.php, /admin/users.php, /admin/user-profile.php +* Added dummy comments template to protect comments without post password. +* Added new action for deactivting a user (opposite of wpmem_user_activated). +* Added check to remove password, confirm_password, and confirm_email from export (data for these was already skipped, but the field space was there). +* Added wpmem_status_msg_args and wpmem_login_links_args filters. +* Corrected Really Simple Captcha, added field wrapper and should not display on user profile edit. + += 2.9.8 = +* Fixed bug in settings update that caused the stored version number to be erased. +* Fixed bug with new email function that causes the wpmem_email_newreg not to apply any filtered changes to the email body. +* Major updates to wpmem_block logic, changing to universal _wpmem_block from two separate metas (block & unblock). +* Fixed bug in the page bulk action that caused the result to end up on the posts page. +* Added wpmem_use_ssl utility function. +* Added use of wpmem_use_ssl function to reCAPTCHA to load correctly (previously handled ssl directly). +* Added use of wpmem_use_ssl function for default input text for custom register page, user profile page, and custom stylesheet settings inputs. +* Added new redirect_to parameter to login page shortcode. +* Fixed checkbox for checked by default on the add new user screen. +* Fixed "admin only" fields to display on the add new user screen. +* Added underscores parameter to the fields shortcode to strip underscores. Defaults to off. +* Updated excerpt logic to not show excerpts on multipage posts if not the first page. +* Added new 2015 stylesheets (currently available, but subject to changes/updates) + += 2.9.7 = +* Fixed comparison for the checkbox CSS class in wpmem_create_formfield. +* Corrected wp native registration function for use on localized sites. +* Rebuilt export function, merges the two previous functions into one (export selected and export all) and will allow for calling custom exports. +* Rebuilt user email function. +* Added default "from" headers to email. +* Added new filter wpmem_export_args. +* Added new filter wpmem_email_filter. +* Added a redirect_to parameter to the registration form similar to the login. +* Fixed plugin admin page load for multisite, if user has theme options edit capabilities. + += 2.9.6 = +* Updated admin.js to show/hide custom url fields for User Profile page, Register page, and Stylesheet settings. +* Updated options panel to show/hide custom url fields mentioned above. +* Updated admin.js to show/hide checkbox and dropdown extra settings when adding a custom field in Fields. +* Updated fields panel to show/hide extra fields mentioned above. +* Updated reCAPTCHA to automatically change language if the language is (1) set as WPLANG and (2) used by reCAPTCHA. +* Added error checking if Really Simple CAPTCHA is enabled but not installed. +* Updated registration function for improved operation when used with popular cache plugins. + += 2.9.5 = + +* Added support for Really Simple CAPTCHA (Really Simple CAPTCHA must also be installed). +* Added support for custom field meta keys as shortcodes in emails. +* Added support for default permalinks when using wpmem_logout shortcode. +* Improved admin notification email to skip metas defined as excluded meta. +* Fixed activation function for activations from user profile omitting passwords (see 2.9.4 bug fix for moderated password registration). + += 2.9.4 = + +* Bug fix for moderated password registration (changes in 2.9.3 introduced a bug that caused moderated registration to send a blank password). +* Bug fix for premium PayPal Subscription extension showing expired users, improved user query. +* Fixed user profile update so that wp_update_user is called only once. +* Added [wpmem_logged_out] shortcode to show content to logged out users. Same as [wp-members status="out"] shortcode but can be used on blocked content without changing security status. +* Removed checkbox for adding password and confirmation fields to the User Screen since these are not stored data. + += 2.9.3 = + +* Fixed a backend user profile update and create new user issue introduced with some 2.9.2 code improvements. The issue caused the additional fields not to save. +* Added a confirm password and confirm email field to the default install, as well as automatic form validation when used. +* Updated all functions that store/read user data to skip these fields as there is not need to store them, they are simply form validation fields. +* Improved error checking in the admin Fields tab when attempting to add an option name that already exists. +* Added separate registration validation for multisite (refers to WP-Members front end registration only). Multisite has different username requirements and the existing error message was valid, the wording did not fit well for multisite making it confusing. The multisite validation returns the WP error message rather than a custom error message. I may be updating other validation messages in the plugin to utilize this method (while allowing them to be filtered for customization). +* Added a separate install for multisite. +* Updated the template for all localization files (some strings still need translation). + += 2.9.2 = + +* Added user ID parameter to wpmem_login_redirect filter. +* Added new action hooks +* Added logout shortcode +* Added wpmem_msg_dialog_arr filter +* Improvements to registration function +* Admin panel updates for smaller screens +* Added bulk block/unblock for posts and pages + += 2.9.1 = + +This is primarily a cleanup and fix update with a few new features. + +* Added WP-Members registration fields to WordPress Users > Add New screen. +* Fixed wpmem_test_shortcode error for TOS. +* Plugin options tab - lists notify address for notify admin setting +* Updated default password change success message - removed need to re-login string. +* Make dropdown values in wpmem_create_formfield function translatable strings for localization +* Changed "logout" to "log out" +* Update to register function to check for unset values for WP native fields. +* Moved the path constants to be defined earlier. +* Added $action parameter to most of the login form filters, allows more direct filtering based on form state (login, password reset, password change). + += 2.9.0 = + +This is a major update focusing on upgrades to the form building functions, but also includes a number of other changes and improvements. + +Major updates + +* New form building functions include new hooks and a more customizable form building process. +* Form functions moved from wp-members-dialogs.php to new file forms.php +* Sidebar login form also rebuilt in the same way the login and register forms were changed. +* Legacy (old table based) forms completely removed in 2.9 +* Updates to error and dialog messages, removed unnecessary html tags + +Changes in wp-members-core.php + +* updated calling of wpmem_test_shortcode, now it works like has_shortcode, put off deprecating at this time. +* updated shortcode to include tos page, allow for new tags (wpmem_field, wpmem_logged_in) (added new shortcode calls in wp-members.php), and accept id attribute for fields. Added $tag argument, can use shortcode_atts_{$shortcode} filter +* moved wpmem_test_shortcode to utilities.php +* added new action hooks: wpmem_pwd_change and wpmem_pwd_reset +* added new filter hook: wpmem_regchk + +Changes in wp-members.php + +* a pretty major overhaul of this file. Moved all but four declarations that weren't already in functions into the init function. Only two constants are declared before the function. This initialization comes after the theme is setup, so pre-initilization needs, such as loading pluggable functions can be declared in the theme's functions.php file. Pluggable functions do not need to be loaded only from the wp-members-pluggable.php file. +* The file name of the wp-members-pluggable.php file is loaded in a filter hook, wpmem_plugins_file, so you could call it something else or load it from another location. +* New action hooks: wpmem_pre_init, wpmem_after_init, wpmem_pre_admin_init, wpmem_after_admin_init +* New filter hook: wpmem_settings + +Miscellaneous Changes + +* Updates to the html for some of the admin to better fit the new WP admin layout. Old html was compatible, but the new works better. +* Updates to the options tab to better group options +* Updates to native (wp-login.php) registration to include require field indication +* Review of output, localized a few missed strings +* Implementation of changes in localization of field names. English values are now stored in the db (except for custom fields that would be whatever language the user creates the field as). Fields are then translated when displayed, rather than stored as translated strings. +* Updated user profile to fix some issues with checkbox and required fields in users.php +* Updated user export to include wp_users table fields user_url, user_nicename, and display_name fields +* Code cleanup in wpmem_block function +* Updated autoexcerpt function +* New filter hooks for post editor meta box titles: wpmem_admin_post_meta_title, wpmem_admin_page_meta_title +* Some updates to existing stylesheets +* Added new stylesheets, including two with non-floated elements. Generic, non-floated stylesheet new default for fresh installs + += 2.8.10 = + +This is a security update the closes 2 reported XSS vulnerabilities. This update also includes a fix for using SSL with reCAPTCHA. + += 2.8.9 = + +This is an interim update with some changes that need to get done prior to the 2.9 release. Note: This is the last version that will be compatible with WordPress 3.1. Also, this will be the last version to contain the legacy table based forms. These have been deprecated since version 2.8.0. + +* Added a Twenty Fourteen stylesheet based on the new WP default theme. +* Twenty Fourteen installs as the default stylesheet with a new install +* User export fix - the new user export functions from 2.8.7 were inadvertenly incompatible with PHP 5.2.4 (WP minimum requirements) +* Admin options tab style/layout updates to work better with new WP (3.8) admin theme +* Moved the plugin's texurize process into wpmem_securify rather than in the form functions. This is going to happen in 2.9, and doing it as an interim update will allow users to test 2.9 with pluggable functions. +* Added the texturize process to the shortcode function for the same reason as above, plus this runs on the User List extension as well. +* Made the shortcode function pluggable +* Improved the auto excerpt function + += 2.8.8 = + +* Updated no password reset for non-activated users to use get_user_by('email') +* Fixed undefined variable $sendback in users.php +* Fixed undefined user object in wpmem_check_activated function +* Set a column width for the WP-Members column in the All Posts and All Pages admin panels, load admin.css +* Added wpmem_admin_after_block_meta and wpmem_admin_block_meta_save actions + += 2.8.7 = + +* Upgraded the user export process. Eliminates the need for directly loading an export file as in past versions. This also eliminates the need for wp-load.php. +* All user management functions that were in the Users > WP-Members menu are now included under Users > All Users. The Users > WP-Members menu is fully deprecated and removed. +* Corrected some undefined variable notices. +* New filter for the widget title wpmem_widget_title +* Further enhancements to the native WP registration. Even though the plugin was intended to put the registration process into the front end of your WP site, there are always users that either (a) prefer to use the backend native registration or (b) don't read or follow installation and usage instructions. So in an earlier version, I went ahead and added the WP-Members custom fields to the backend registration if it is turned on. This version finishes that process with proper support for dropdown select fields, checkboxes, and text area fields. It also cleans up the error checking and CSS styling for that process. + += 2.8.6 = + +* Continued updating the stylesheets, this update includes some minor changes to 2010, 2011, 2012, and 2013 to clean up the .noinput class (used in the User Profile update) and the reCAPTCHA area. +* Added responsive elements to the Twenty Twelve stylesheet (remains the plugin's default) +* Changed from PHP_SELF to REQUEST_URI for elements where the plugin forms need to post back to themselves and no other URL exists +* Changed from "siteurl" to "home" for getting the home page link - corrects problems for users who have WP installed in a different directory + += 2.8.5 = + +* Improved the Twenty Eleven and Twenty Twelve stylesheets (Twenty Twelve remains the plugin default). +* Added a responsive stylesheet based on Twenty Thirteen theme. +* Added a new filter hook for password reset args wpmem_pwdreset_args. This will allow mods for single stage reset (username only or email only). +* Corrected update_user_meta during registration use the filtered value of the user's IP and registration URL. + += 2.8.4 = + +* Fixed a small bug on admin-side user profile that caused checkboxes to not update correctly +* Added optional small "powered by" attribution link at the bottom of the registration form. + += 2.8.3 = + +Feature Updates + +* Allows native fields display_name, nicename, and nickname to be removed from the field manager. +* New filter wpmem_logout_link filters all logout links. +* Added default registration via wp-login page (backend). This of course can be disabled by unchecking "anyone can register" in the WP settings. +* Completion of user admin panel implementation. Added screens for non-active and non-exported users. +* Added a custom column to page/post tables to indicate if a post/page is blocked/unblocked opposite the chosen default setting. + +Fixes + +* Fixed bug in admin/post.php that caused an error due a typo in the selected capability. +* Applied the patch for the users table custom columns that didn't return non-WP-Members custom column values. +* Fixed the use of the nonce constant to check if the constant is defined. +* Applied patch to the utilities file that left some debugging code artifacts in the 2.8.2 release. + +Improvements + +* Updated dashboard widget to either superadmin or not display for multisite. +* Added a div tag to the "Required Field" text in the registration form - NOTE: if you run any filters on the registration form, you may need to test them and update accordingly. +* Updated the included stylesheets for the addition of req-text class for the "Required Field" text in the registration form. +* Added Portugese translation files (Thanks Joana!) + += 2.8.2 = + +Feature Updates + +* Added WP user fields user_nicename, display_name, and nickname to the $fields array, defaults to $username for backward compatibility. +* Updated field manager process to allow user_nicename, display_name, and nickname to be added via the fields manager as WP native fields +* Added wpmem_register_data filter for $fields to allow filtering of all fields prior to new user insertion, including above new fields (added updates to registration function to make better use of the filter). +* Added wpmem_pre_validate_form for $fields to allow filtering fields prior to default form field validation. +* Begin implementation of moving bulk user management features into Users > All Users. Users > All Users screen can now activate and export users, and will show additional fields as selected in the fields manager. +* Added wpmem_admin_profile_heading, wpmem_admin_profile_field, and wpmem_admin_profile_update filters. These filters are all part of the user profile section. + +Fixes, Patches, & Code Improvements + +* Fixed the conversion of update-profile to members-area shortcode. The bug renders all page shortcodes as members-area. +* Fixed the activate user process for user defined passwords, a bug from 2.8.0/2.8.1. +* Fixed a bug that can cause the sidebar login widget to not post to the correct url when a static front page is used. +* Fixed user profile update (updates with custom checkbox don't stay checked), an issue from 2.8.0. +* Patch correcting the front-side registration form nonce. This patch should improve reliability while still using nonces for security. +* Patch for the dropdown field for users running < PHP 5.3. +* Made front-side nonce optional, defaults to off. +* Moved utility functions out of core.php to utility file utilities.php. +* Moved the location of the wpmem_email_notify hook so the filter comes after shortcodes are parsed. +* Updated the registration function to rely on the values contain in $fields, allowing for the array values to be filtered. +* Updated the registration form to accommodate registration function updates. +* Improved auto excerpt function screens for unclosed common html tags and provides a closing tag if none exists. +* Improved export process to wrap fields with double quotes - fixes issues if field contains a comma. + += 2.8.1 = + +Security update release: 2.8.1 primarily closes some potential security holes. This update is highly recommended. + +Security Updates: + +* Closed potential cross site scripting exploit +* Added nonces to front-side registration +* Updated nonces in admin form submission +* Security evaluation and updates to other areas + +Feature Updates: + +* Added dropdown option for User Profile (members-area) and Register page location +* Updated dropdown field to accommodate commas in the values (ex: 1,000) + +Other Updates: + +* Updated TOS shortcode to be case-insensitive for the shortcode parameter (TOS/tos) +* Begin deprecating members-area parameter to be replaced with user-profile +* Separated User Profile functions from wp-members-core.php file +* Applied post 2.8.0 patches and corrected missing files + += 2.8.0 = + +New Feature release: 2.8.0 offers the beginning of a major rebuild of the admin panels with a few front-side features slipped in along the way. + +Security Improvements: + +* Added a dummy index.php file in all plugin directories. This is a security improvement and disallows direct access to a directory (in case your server allows directory browsing). + +Code Improvements: + +* Added new constants WPMEM_DIR and WPMEM_PATH. This will allow you to grab the directory of the plugin directly in action and filter functions. +* Broke up the admin file wp-members-admin.php into multiple files based on function. These are all now moved into an /admin/ directory. +* Added the password field to the fields array in the registration function so that this can be used in the registration hooks and filters. +* Updated the logout process to use wp_clear_auth_cookie. The previous wp_clearcookie was deprecated and was causing header errors in some instances. +* Improved the TOS shortcode. This should eliminate some of the parsing errors some users experienced in previous releases. + +Admin Panel Updates: + +* New admin look updates the tabs to the WP format. This also was built to allow extensible tabs so you can hook in and create your own tabs and panels. +* Add field dialog was updated and improved. +* Added an admin process to edit existing fields. +* Added new option in the plugin options to load one of the predefined stylesheets from a dropdown. +* Block/Unblock post meta box added to the post/page editor – no need to use custom fields anymore (this feature actually updates the custom fields accordingly, so you can use custom fields if you want to). +* Added dropdown selector for preloaded stylesheets - no need to enter the location of the preloaded stylesheets to use them. + +New Filters: + +* wpmem_admin_tabs - allows developers to hook into the admin tabs to add additional tabs. +* wpmem_admin_style_list - allows developers to hook into the dropdown list of stylesheets to add additional stylesheets. +* wpmem_auto_excerpt - filters the automatically generated excerpt. Allows you to customize a 'read more' link. +* wpmem_post_password - filters the automatically generated post password that blocks comments on blocked posts/pages. +* wpmem_forgot_link - filters the forgot password link that shows in the login forms. +* wpmem_reg_link - filters the register link that shows in the login forms. + +Other Updates: + +* Added a new pre-loaded stylesheet for Twenty Twelve theme. New installs will default to this style. Note: with the addition of the new style selector in the admin panel, you can easily toggle between the preloaded stylesheets. You can also add your own using the new wpmem_admin_style_list filter, enter the URL location in the Custom Stylesheet field, or load one using wp_enqueue_scripts. + += 2.7.7 = + +New Features: + +* Added a new filter hook wpmem_securify. This hook applies a filter to the $content variable at the end of the wpmem_securify function. The primary reason for this hook is to be able to run filters on $content that would give you the ability to block content even if the user is logged in (the wpmem_block filter only works for non-logged in state). This will bring in the ability to block users from content based on defined criteria such as content is for members of "group A" but the user is does not have access to "group A" content. +* Added wpmem_email_headers filter hook. This will allow you to easily filter the headers for the email process of the plugin giving you the ability to send HTML email without modifying the plugin. +* Added wpmem_user_activated action hook. This hook will give you the ability to run actions at the end of user activation. For sites that moderate registration, this gives you the ability to hook in actions that you might not want to do before approval of the registration (such as would normally be done with wpmem_post_register_data). +* Added new shortcode for creating a user list/member directory. __This shortcode requires installation of the premium add-on module WP-Members User List [available to rocketgeek.com members](https://rocketgeek.com/about/site-membership-subscription/)__. The shortcode has parameters for including a member search function as well as filter hooks for filtering the layout of the directory elements. +* Added new shortcode for protecting inline content with the __premium add-on module WP-Members PayPal Subscription [available to rocketgeek.com members](https://rocketgeek.com/about/site-membership-subscription/)__. + +Bug Fix: + +* Fixed a bug where the reCAPTCHA error messages do not display on the [shortcode pages "register" and "members-area"](https://rocketgeek.com/plugins/wp-members/docs/shortcodes/page-shortcodes/). + +Code Improvement: + +* Completed a rebuild of the login function wpmem_login. Updated the cookie process to switch from [wp_setcookie](http://codex.wordpress.org/Function_Reference/wp_setcookie) (which is deprecated) to [wp_set_auth_cookie](http://codex.wordpress.org/Function_Reference/wp_set_auth_cookie). Also, the [wpmem_login_redirect hook](https://rocketgeek.com/plugins/wp-members/docs/filter-hooks/wpmem_login_redirect/) was moved to after the login credentials have been validated and the user is logged in. This allows the hook to access user data without the need to validate the user within the filter. + += 2.7.6 = + +This release has some new features and some code updates + +* Added ability to use same redirect_to querystring that WP uses in the wp-login form. This allows more seamless replacement of the wp-login. +* Added a new page shortcode for password reset/change [wp-members page="password"]. If the user is logged out, it works the reset forgotten password functionality. If the user is logged in, it will offer the change password functionality. These functions do also remain in the members-area page shortcode as well, but now can be placed in a stand-alone location as well. +* Added a new page shortcode for the user edit page [wp-members page="user-edit"]. This needs to be used if the user is logged in and can be used with the login status shortcode. +* Removed $content global from the page shortcode function. This should correct the double form issue when used with plugins/themes that filter $content. +* Added do_shortcode to the page shortcode call. This should allow the page shortcodes to be used in conjuction with other shortcodes on the page (although this is not necessarily recommended). +* Added translations for Russian, Slovak, and Hindi. +* Moved _OLD forms to wp-members-deprecated.php. These forms can still be used, but will be deprecated in a future version. It is highly recommended that users still using legacy forms begin converting to the _NEW forms. + += 2.7.5 = + +This is a new feature release (see [release announcement](http://wp.me/p1zYcs-xf) for full details.) + +* Added 5 new filter hooks +* Final deprecation of the old style shortcodes for special pages (, ). If you are using these you need simply need to update to the modern shortcodes such as [wp-members page="members-area"] +* Added a check for the error message variable immediately following the wpmem_pre_register_data and wpmem_pre_update_data action hooks. This will allow for use of these hooks to include your own custom validation and still be able to return a relevant error message. +* Added a check to see if the TOS field is not being used and thus don't display it on the User Profile for the admin. +* Fixed a bug that showed the incorrect heading on the User Edit page when there is an empty field error. +* Added completely updated .pot file for translations +* Updated all .po/.mo translation files from the new .pot (still need some strings translated for some languages). +* Added all .po/.mo files to the download package. + += 2.7.4 = + +This is a new feature release (see [release announcement](http://wp.me/p1zYcs-wQ) for full details.) + +* Added 14 new filter hooks +* Added full user export function +* Force email in password reset to be non-case sensitive (changes to wpmem_reset_password in wp-members-core.php) +* Changed "Existing users Login" to "Existing Users Login" in wpmem_inc_login in wp-members-dialogs.php + += 2.7.3 = + +This is a code improvement release (see [release announcement](http://wp.me/p1zYcs-wD) for full details.) + +* Improved a number of functions in various files for improved functionality. +* Added p tag with class .noinput to the username field when updating profile, added property definition to the stylesheet as well to better align the username. +* Added css property to better align checkboxes in the reg form (a change to wp-members.css). +* Added a class to captcha, and a cooresponding css property in wp-members.css for top/bottom margin of captcha form. + +New features (shortcodes and hooks): + +* Added 'field' shortcode for displaying user data with a shortcode - currently considered experimental and subject to changes. +* Added wpmem_restricted_msg filter hook to filter the restricted post message. +* Added wpmem_login_failed filter hook to filter the login failed message (includes filtering display markup). +* Added wpmem_login_failed_sb filter hook to filter the login failed message in the sidebar (filters message only, not formatting). + += 2.7.2 = + +This is primarily a bug fix release (see [release announcement](http://wp.me/p1zYcs-vW) for full details.) + +* Fixed a bug where, when using moderated registration, updating a user's backend profile deactivates the user. +* Improved the login error message for login via wp-login.php. +* Added wpmem_pre_register_data action hook. +* Added wpmem_post_register_data action hook. +* Added wpmem_pre_update_data action hook. +* Added wpmem_post_update_data action hook. + += 2.7.1 = + +This release contains some new features that didn't get completed for 2.7.0 and some fixes (see [release announcement](http://wp.me/p1zYcs-vq) for full details.) + +New features: + +* Deactivate/reactivate users +* Registration moderation added for user defined passwords +* Include an optional stylesheet based on TwentyEleven Theme +* Include an optional stylesheet based on Kubrick (for narrower content areas) +* Added wpmem_register_redirect action hook +* Added wpmem_login_redirect filter hook +* Added wpmem_logout_redirect filter hook +* Added wpmem_sidebar_status filter hook +* Added wpmem_register_links filter hook +* Added wpmem_member_links filter hook +* Added wpmem_login_links filter hook + + +Fixes: + +* rebuilt default email install function +* skip password in [fields] shortcode (changes in wpmem_notify_admin) +* fixed widget sidebar div tag (changes in class widget_wpmemwidget) +* fixed form field validation for invalid email still registered user (changes in wpmem_registration) +* fixed rememberme in login process (changes in wpmem_login) +* moved send from filters to just the wp-members email processes (changes in wpmem_inc_regemail && wpmem_notify_admin) + + += 2.7.0 = + +This is new feature release with the following features and improvements (see : + +* Email messages can be customized via the plugin admin panel. +* Dropdown fields can be added via the field managment panel. +* Moved location of pluggable file load so that constants may be used without loading twice. +* Registration stores the url the user registered on for all registrations, not just if registration is moderated. +* Trim trailing whitespace on members area, register, and custom css urls. +* Added wp_specialchars_decode to blogname in emails to decode any special characters (such as &) in the title. +* Registration function is now pluggable. +* Updated sidebar widget to be multi-widget compatible. +* TOS can be stored in dialogs OR be a WP page (set in dialogs with a shortcode). +* Plugin can be set up for users to select their own passwords at registration (cannot be used with moderated registration). + += 2.6.6 = +Bug fix release + +* Fixes as bug where admin side user fields are cleared when a user updates their registration info. + += 2.6.5 = + +* Rewrite of the reCAPTCHA script to address IE compatibility issues. +* Expansion of the wptexturize fix in 2.6.4, now wraps all of the login and registration forms. +* Fix for the user profile edit so that the admin can see his own additional fields +* Fix so users can edit additional fields through the user profile page. +* WPMEM_REGURL no longer sent to wpmem_chk_qstr as it is a direct URL. + += 2.6.4 = +Bug fix release with the following changes: + +* Fixes the activate user bug, rolling back from wp_update_user to $wpdb->update. +* Added back wpmem_generatePassword (although this is no longer used, a lot of users are still using this in the comments template. +* Added an override in the login form for the wptexturize function so as to remove the
tag that WP puts into the generated form. + += 2.6.3 = +This is primarily a code improvement release + +* Localized "Clear Form" and "Submit" buttons for translation +* Updated reCAPTCHA noscript (for loading when the browser has js turned off) +* Fixed front-end error messages that did not have stripslashes +* Updated bulk user management to paginate users when displaying all users +* Introduced dropdown support (must be added programmatically at this time) +* Cleaned up unused globals from the registration forms +* Updated the location of the pluggable function file to be outside the plugin folder + += 2.6.2 = +This is a bug fix release with some additional improvements. + +Bug fixes + +* Fixed checkbox that is set to be checked by default remains checked in the update user settings front end even if the user unchecked it. +* Fixed legacy form password reset bug + +Improvements + +* Registration fields that are not selected to be displayed on the front end will still display on the admin side and be exported. This provides fields that can be used by the admin only for additional user information. +* Checkbox field can be edited in the Manage Fields panel to be checked by default or not. +* Keep the active tab active when editing various plugin settings. + += 2.6.1 = +Bug fix release + +* Corrected the settings link in the WP installed plugins panel. +* Fixed the view menu links for the bulk user management. +* Fixed ignore warning messages on the WP-Members settings. +* Fixed bulk activate users so already activated users would not be inadvertently reactivated. +* Deactivated auto-excerpt function (was not to be activated in 2.6 production version). + += 2.6.0 = +This version is a feature release that also includes some rebuilt functions and other code improvements. + +New Features: + +* Front-end now uses enqueue_style to load CSS, so advanced users can directly load their own styles for the plugin without using the plugin settings. +* Improved use of shortcodes. Old-style HTML comment shortcodes will continue to work in certain instances, but will no longer be supported in future versions. Upgrade to the new shortcodes. Major rewrite of the way WP-Members handles the_content() so that it will return a value rather than echo it. Working to better integrate with other shortcodes so they are propery parsed. New WP-Members shortcodes will added in future versions. +* Registration fields can now be customized via the admin panel. This includes adding new fields and deleting non-native fields, and also changing the field order. + +Code Improvements + +* eliminated unused globals +* updated certain functions to use more up-to-date native WP functions. +* core now checks to see if the action variable 'a' is set before requesting it. +* wpmem_securify now scans for 'more' tag so that it will not truncate if the work "more" exists in the excerpt. +* updated email validation/error message to registration process to use is_email(). + += 2.5.4 = +This is a bug fix release. 2.5.3 introduced a bug where the random password sent to a new user was invalid. While the fix is simple, the nature of the bug related to the functionality of the plugin dictates a full update so that users unaware of the bug will be notified via their WP admin panel. + += 2.5.3 = +This is primarily a bug fix release. + +Bug fixes: + +* Fixed reCAPTCHA from trying to validate on the User Edit page even though reCAPTCHA is not used on this page. +* Added validation to change password page to not allow double empty fields. +* Added additional username validation to prevent invalid (non-alphanumeric) characters in the username. +* Fixed comments reply link which did not allow a registered user to reply on an unblocked page/post. + +Other changes: + +* Rebuild of registration function +* Review of comments process +* Added stripslashes to front-end user registration validation + += 2.5.2 = +This is predominately a release of fixes and improvements: + +* Fixed the admin menus so that the user menu isn't open by default. +* Fixed the "ignore warning messages" that was broken in 2.5.1. +* Corrected the CAPTCHA to not show up on members settings update. +* Plugin checks to see if the reCAPTCHA library is already loaded to be compatible with other reCAPTCHA plugins. +* Fixed activate user function for bulk activation - checks to see if the user is already activated and if so, skips that user so we don't accidentally activate users that are already activated in bulk mode, thus resetting their passwords. +* Updated login process to use wp_signon (wp_login is deprecated). +* Updated sidebar widget include a new css class #wp-members .err for login error message +* Updated sidebar widget to use the appropriate `
  • ` tag into the sidebar area. This should only be a factor for users that customized css. In this case, you'll need to update your stylesheet for ID #wpmem_login_side to #wp-members. +* Updated the sidebar login to better direct the user upon successful login (previously working fine on individual posts and pages, but not on categories). +* *Strictly Experimental* - Introducing pluggable functions - laying the ground work, won't be official yet, so some functions may be deprecated and/or modified. + += 2.5.1 = +Exanding on the features added in 2.5.0, this release adds setting for the register page, new tableless forms, and custom CSS + +New Features + +* Changed the "turn off registration" feature to allow for a registration page +* Specify registration page location (so we can have a register link in the login form) +* New tableless forms, can still toggle legacy forms +* Specify custom CSS for tableless forms + +Fixes and Code Improvements + +* Removed focus call in the reCAPTCHA that put the cursor focus immediately on the CAPTCHA +* Updated to wp_enqueue_script & _style for admin css and ajax. +* Fixed some typos. +* Fixed some security issues. + += 2.5.0 = +WP-Members™ 2.5 is essentially a pre-3.0 release and extention of the 2.4 release, which was only released as a public beta. In addition to the list below, see the list of features, improvements, and fixes for 2.4.0. + +New Features + +* added shortcode support for login only page +* added support for checkboxes in the registration fields +* added setting for members area/settings page url (so we can have "forgot password" link anywhere) +* added a "change your password" link in the email if members area/settings page url is set + +Bug Fixes + +* corrected a bug introduced in the 2.3.x widget update that caused the widget to be undraggable in certain instances + += 2.4.0 = +This was never a full production release, but was released as a public beta. The production completion of this project was 2.5 + +New Features + +* added reCAPTCHA support for registration +* added Terms of Service (TOS) checkbox and popup +* added shortcode support for members area and register pages +* added custom user management panel for bulk user edits +* added user list export +* localization support (beginning) +* contextual help in admin panels (beginning) + +Code Improvements + +* updated the registration process so that unused fields are not put into the user_meta table +* updated emails for moderated registration to send user the url they signed up on +* capture user's IP address at registration +* sets logged in admin as activated (prevents admin from accidentally being locked out) +* added toggle to force clean install of settings +* improvements to uninstall process + +Bug Fixes + +* added stripslashes to dialogs (accommodates the use of apostrophes/quotation marks) +* fixed sidebar login for non-widget use (bug from 2.3.x) + += 2.3.2 = +Bug Fix Release + +* fixed login failed message for sidebar widget +* fixed login failed message for members area page +* fixed email to include user_url field properly +* changed cell alignment for 'textarea' field type in reg form + += 2.3.1 = +Code Improvements + +* updated deprecated call get_usermeta to get_user_meta, update_usermeta to update_user_meta +* completed update of deprecated call get_settings changed to get_option +* removed deprecated functions wpmem_register() and wpmem_update(), both of these are now handled by wpmem_registration +* $redirect_to in wpmem_login changed to $_POST +* fixed password reset link issue +* changed wp-members-admin.php to load for 'edit_users' capabilities, down from 'manage_options'. +* changes to admin form posts for use with WP Multisite (still need additional testing with Multisite for full compatibility) + +New Features + +* added direct link to edit user in notify admin email +* added optional registration page + += 2.3.0 = +Adds a number of features put off from the 2.2 release + +* option to notify admin of new user registrations +* option to hold new registrations for admin approval +* option to turn registration off (for admins that want to control registrations in some other way) +* option to show excerpt on pages/posts +* updated widget calls to wp_register_sidebar_ (register_sidebar_ is deprecated) +* updated certain API calls known to be deprecated +* broke out email related functions to separate file; only loads when needed +* broke out core and dialog functions to separate files + += 2.2.2 = +This release is all code-side cleanup to make the plugin more efficient: + +* Rewrote _securify function to remove redundancies +* Merged Login, Password Change, and Password Reset forms into _login_form +* Added uninstall/delete process to empty settings from database on plugin deletion +* Broke out install and admin scripts to separate file only loaded when needed +* Continued improvement of admin functions + += 2.2.1 = +* Change password bug fix +* Merged registration and user update functions to eliminate redundancy +* Added nonce security to the options admin + += 2.2.0 = +The #1 request with the plugin is to simply be able to change the required fields. I have greatly simplified the process so it can be managed from within the WP admin panel. Additionally, I added the ability to determine what fields will show in the registration form (both native WP fields, and additional WP-Members™ fields). Also, the error/dialog messages can now be managed from with the admin panel as well. + +* Added new customization features and an admin panel +* Can set fields that will display +* Can set fields to be required +* Can manage error/dialog messages from admin + += 2.1.2 = +* Added fix to set new registrations as the default role + += 2.1.1 = +* Udates for the 2.1.0 release that were not completed. +* updated variables for some function calls. +* eliminated unnecessary $table_prefix globals. +* updated some queries to better utilize the $wpdb class. +* custom fields admin is now managed as an array (cuts the lines of code by 75%, and makes way for user defined custom fields). \ No newline at end of file diff --git a/css/admin.css b/css/admin.css deleted file mode 100644 index 3c33bde4..00000000 --- a/css/admin.css +++ /dev/null @@ -1,46 +0,0 @@ -/** - * WP-Members Admin Styles CSS - * - * CSS for the WP-Members admin panels - * - * This file is part of the WP-Members plugin by Chad Butler - * You can find out more about this plugin at http://rocketgeek.com - * Copyright (c) 2006-2015 Chad Butler - * WP-Members(tm) is a trademark of butlerblog.com - * - * @package WordPress - * @subpackage WP-Members - * @author Chad Butler - * @copyright 2006-2015 - */ - - -.wpmem_tbl_drag { - background:#fffbcc; - font-weight: bold; - border: 1px solid #990000; -} - -.column-wpmem_block { - width: 80px; -} - -#addfieldform li, -#updatesettings li { - padding: 5px 0; -} - -#addfieldform label, -#updatesettings label { - float:left; - width: 166px; -} - -#addfieldform .add-field-indent { - margin-left: 165px; -} - -#fields_postbox, -#add_field_postbox{ - min-width:950px; -} \ No newline at end of file diff --git a/css/index.php b/css/index.php deleted file mode 100644 index 6be7716e..00000000 --- a/css/index.php +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/i18n/index.php b/i18n/index.php new file mode 100644 index 00000000..dc051a13 --- /dev/null +++ b/i18n/index.php @@ -0,0 +1 @@ +wpmem_dropin_folder filter." +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-emails.php:57 +msgid "Email Messages" +msgstr "Missatges d'email" + +#: includes/admin/tabs/class-wp-members-admin-tab-emails.php:60 +msgid "You can customize the content of the emails sent by the plugin." +msgstr "Pots personalitzar el contingut dels emails enviats per el plugin." + +#: includes/admin/tabs/class-wp-members-admin-tab-emails.php:62 +msgid "A list of shortcodes is available here." +msgstr "En aquesta pàgina podeu trobar una llista de codis." + +#: includes/admin/tabs/class-wp-members-admin-tab-emails.php:69 +msgid "Set a custom email address" +msgstr "Configureu una adreça de correu electrònic personalitzada" + +#: includes/admin/tabs/class-wp-members-admin-tab-emails.php:70 +#: includes/admin/tabs/class-wp-members-admin-tab-emails.php:74 +#: includes/admin/tabs/class-wp-members-admin-tab-emails.php:93 +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:163 +msgid "(optional)" +msgstr "(opcional)" + +#: includes/admin/tabs/class-wp-members-admin-tab-emails.php:73 +msgid "Set a custom email name" +msgstr "Establiu un nom de correu electrònic personalitzat" + +#: includes/admin/tabs/class-wp-members-admin-tab-emails.php:77 +msgid "Send HTML email" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-emails.php:93 +msgid "Email Signature" +msgstr "Signatura email" + +#: includes/admin/tabs/class-wp-members-admin-tab-emails.php:101 +msgid "Update Emails" +msgstr "Actualizar emails" + +#: includes/admin/tabs/class-wp-members-admin-tab-emails.php:172 +msgid "WP-Members emails were updated" +msgstr "Els emails de WP-Members s'han actualitzat" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:93 +#: includes/class-wp-members-dialogs.php:65 +msgid "No fields selected for deletion" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:95 +msgid "Are you sure you want to delete the following fields?" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:122 +msgid "Fields deleted" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:136 +msgid "Field Manager Documentation" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:164 +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:315 +#: includes/class-wp-members-forms.php:1629 +#: includes/class-wp-members-forms.php:1821 +#: includes/class-wp-members-user-profile.php:181 +msgid "(required)" +msgstr "(requerit)" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:169 +msgid "Edit Field" +msgstr "Edita Camp" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:169 +msgid "Add a Field" +msgstr "Afegir un camp" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:174 +msgid "Field Label" +msgstr "Etiqueta del camp" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:176 +msgid "The name of the field as it will be displayed to the user." +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:179 +#: includes/admin/tabs/class-wp-members-fields-table.php:58 +msgid "Meta Key" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:185 +msgid "" +"The database meta value for the field. It must be unique and contain no " +"spaces (underscores are ok)." +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:189 +#: includes/admin/tabs/class-wp-members-fields-table.php:59 +msgid "Field Type" +msgstr "Tipus de camp" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:195 +msgid "text" +msgstr "text" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:196 +msgid "email" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:197 +msgid "textarea" +msgstr "àrea de text" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:198 +msgid "checkbox" +msgstr "checkbox" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:199 +msgid "multiple checkbox" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:200 +msgid "select (dropdown)" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:201 +msgid "multiple select" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:202 +msgid "radio group" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:203 +msgid "password" +msgstr "Contrasenya " + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:204 +msgid "image" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:205 +msgid "file" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:206 +msgid "url" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:207 +msgid "number" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:208 +msgid "date" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:209 +msgid "hidden" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:211 +msgid "membership" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:217 +#: includes/admin/tabs/class-wp-members-fields-table.php:60 +msgid "Display?" +msgstr "Mostrar?" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:221 +msgid "This field is always displayed" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:226 +msgid "Required?" +msgstr "Obligatori?" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:230 +msgid "This field is always required" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:236 +msgid "Allow HTML?" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:243 +msgid "Placeholder" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:251 +msgid "Pattern" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:259 +msgid "Title" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:268 +msgid "Minimum Value" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:272 +msgid "Maximum Value" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:280 +msgid "Rows" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:284 +msgid "Columns" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:292 +msgid "Accepted file types:" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:297 +msgid "Accepted file types should be set like this: jpg|jpeg|png|gif" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:304 +msgid "Checked by default?" +msgstr "Marcada per defecte?" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:308 +msgid "HTML label position" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:310 +msgid "Before the input tag" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:311 +msgid "After the input tag" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:312 +msgid "" +"Selecting \"after\" will generally display the label to the right of the " +"checkbox" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:315 +msgid "Stored value if checked:" +msgstr "Valor emmagatzemat si s'activa:" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:336 +msgid "Stored values delimiter:" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:345 +msgid "Values (Displayed|Stored):" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:370 +msgid "Options should be Option Name|option_value," +msgstr "Les opcions han de ser Option Name|option_value," + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:374 +msgid "Visit plugin site for more information" +msgstr "Per a més informació visita la pàgina del plugin " + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:381 +msgid "Value" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:400 +msgid "Save Changes" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:400 +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:527 +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:528 +msgid "Add Field" +msgstr "afegir camp" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:402 +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:726 +msgid "Return to Fields Table" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:449 +msgid "Drag and drop to reorder fields" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:455 +msgid "Registration Date" +msgstr "Data de Registre" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:458 +msgid "Registration IP" +msgstr "Adreça IP" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:459 +msgid "Subscription Type" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:495 +msgid "Manage Fields" +msgstr "Gestionar camps" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:595 +msgid "WP-Members fields were updated" +msgstr "Els camps dels WP-Members s'han actualitzat" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:617 +msgid "Field Label is required. Nothing was updated." +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:618 +msgid "Meta Key is required. Nothing was updated." +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:620 +msgid "Meta Key must contain only letters, numbers, and underscores" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:627 +msgid "A field with that meta key already exists" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:632 +#, php-format +msgid "" +"Sorry, \"%s\" is a reserved term. " +"Field was not added." +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:673 +msgid "Checked value is required for checkboxes. Nothing was updated." +msgstr "" +"Es requereix etiqueta del camp per afegir un nou camp. Res s'ha actualitzat." + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:705 +msgid "A value is required for hidden fields. Nothing was updated." +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:712 +#, php-format +msgid "%s was added" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:725 +#, php-format +msgid "%s was updated" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:768 +msgid "Form field order updated." +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:56 +#, php-format +msgid "%sChange%s or %sFilter%s this address" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:57 +#, php-format +msgid "See the %sUsers Guide on plugin options%s." +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:90 +msgid "Manage Options" +msgstr "Configurar opcions" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:94 +msgid "Content" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:105 +msgid "Content Restriction" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:109 +msgid "Do not restrict" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:123 +msgid "Show Excerpts" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:124 +msgid "Show Login Form" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:125 +msgid "Show Registration Form" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:126 +msgid "Auto Excerpt:" +msgstr "Acte Extracte:" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:148 +msgid "Number of words in excerpt:" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:149 +msgid "Custom read more link (optional):" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:163 +msgid "Time-based expiration" +msgstr "Venciment en funció del temps" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:163 +msgid "Allows for access to expire" +msgstr "Permet que l'accés expiri" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:164 +msgid "Trial period" +msgstr "Període de prova" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:164 +msgid "Allows for a trial period" +msgstr "Permet un període de prova" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:166 +msgid "Subscription Settings" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:176 +msgid "New Feature Settings" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:182 +msgid "Legacy Password Reset" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:182 +#, php-format +msgid "Use legacy password reset. %s(Requires additional configuration)%s" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:184 +msgid "Legacy Login Error" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:184 +msgid "Use legacy WP-Members login error instead of WP error object." +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:187 +msgid "WooCommerce My Account" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:187 +msgid "Add WP-Members fields to WooCommerce My Account registration" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:188 +msgid "WooCommerce Checkout" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:188 +msgid "Add WP-Members fields to WooCommerce registration during checkout" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:204 +msgid "Other Settings" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:214 +msgid "Enable memberships" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:214 +#, php-format +msgid "Enables creation of different %s membership products %s" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:215 +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:223 +msgid "Clone menus" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:215 +msgid "Enables logged in menus" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:216 +msgid "Notify admin" +msgstr "Notificar a l'administrador" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:216 +#, php-format +msgid "Notify %s for each new registration? %s" +msgstr "Enviar un email a %s per a cada nou registre? %s" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:217 +msgid "Moderate registration" +msgstr "Confirmar registre" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:217 +msgid "Holds new registrations for admin approval" +msgstr "Els nous registres seran aprovats per l'administrador" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:218 +msgid "Confirmation Link" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:218 +#, php-format +msgid "" +"Send email confirmation link on new registration. %s(Requires additional " +"configuration)%s" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:219 +msgid "Ignore warning messages" +msgstr "Ignorar missatges d'advertència" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:219 +msgid "Ignores WP-Members warning messages in the admin panel" +msgstr "Ignorar missatges de perill de WP-Members en el panell d'administració" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:233 +msgid "Attribution" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:235 +msgid "" +"Attribution is appreciated! Display \"powered by\" link on register form?" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:238 +msgid "Enable CAPTCHA for Registration" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:253 +msgid "Login Page:" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:256 +msgid "Specify a login page (optional)" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:265 +msgid "Register Page:" +msgstr "Registrar la URL de la pàgina" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:268 +msgid "For creating a register link in the login form" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:277 +msgid "User Profile Page:" +msgstr "Fitxa d'usuari de la pàgina:" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:280 +msgid "For creating a forgot password link in the login form" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:286 +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:288 +msgid "Stylesheet" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:297 +msgid "Custom Stylesheet:" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:302 +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:329 +msgid "Update Settings" +msgstr "Actualizar configuració" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:310 +msgid "Custom Post Types" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:316 +msgid "Add to WP-Members Settings" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:332 +msgid "" +"Please keep in mind that Custom Post Types are \"custom\" and therefore, not " +"all of them will function exactly the same way. WP-Members will certainly " +"work with any post type that operate like a post or a page; but you will " +"need to review any custom post type added to determine that it functions the " +"way you expect." +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:342 +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:343 +msgid "WP-Members Settings" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:344 +msgid "" +"The following is your WP-Members settings information if needed for support." +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:378 +msgid "Click to Copy" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:458 +msgid "Custom Post Type settings were updated" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:579 +msgid "WP-Members settings were updated" +msgstr "La configuració de WP-Members s'ha actualitzat" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:651 +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:682 +msgid "USE CUSTOM URL BELOW" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:671 +msgid "Select a page" +msgstr "" + +#: includes/admin/tabs/class-wp-members-dropins-table.php:70 +msgid "Name" +msgstr "" + +#: includes/admin/tabs/class-wp-members-dropins-table.php:71 +msgid "Enabled" +msgstr "" + +#: includes/admin/tabs/class-wp-members-dropins-table.php:72 +msgid "File" +msgstr "" + +#: includes/admin/tabs/class-wp-members-dropins-table.php:73 +msgid "Version" +msgstr "" + +#: includes/admin/tabs/class-wp-members-dropins-table.php:74 +#: includes/walkers/class-wp-members-walker-nav-menu.php:186 +msgid "Description" +msgstr "" + +#: includes/admin/tabs/class-wp-members-dropins-table.php:117 +#: includes/admin/tabs/class-wp-members-fields-table.php:108 +msgid "Save Settings" +msgstr "" + +#: includes/admin/tabs/class-wp-members-fields-table.php:43 +msgid "delete" +msgstr "" + +#: includes/admin/tabs/class-wp-members-fields-table.php:57 +msgid "Display Label" +msgstr "" + +#: includes/admin/tabs/class-wp-members-fields-table.php:61 +msgid "Required" +msgstr "" + +#: includes/admin/tabs/class-wp-members-fields-table.php:63 +msgid "Users Screen" +msgstr "" + +#: includes/admin/tabs/class-wp-members-fields-table.php:64 +msgid "Users Search" +msgstr "" + +#: includes/admin/tabs/class-wp-members-fields-table.php:66 +msgid "Sort" +msgstr "" + +#: includes/admin/tabs/class-wp-members-fields-table.php:107 +msgid "Delete Selected" +msgstr "" + +#: includes/api/api-forms.php:584 +#, php-format +msgid "%s is a required field." +msgstr "" + +#: includes/class-wp-members-captcha.php:276 includes/deprecated.php:401 +msgid "You have entered an incorrect code value. Please try again." +msgstr "" + +#: includes/class-wp-members-dialogs.php:41 +msgid "First Name" +msgstr "Nom" + +#: includes/class-wp-members-dialogs.php:42 +msgid "Last Name" +msgstr "Cognoms" + +#: includes/class-wp-members-dialogs.php:43 +msgid "Address 1" +msgstr "Adreça (línia 1)" + +#: includes/class-wp-members-dialogs.php:44 +msgid "Address 2" +msgstr "Adreça (línia 2)" + +#: includes/class-wp-members-dialogs.php:45 +msgid "City" +msgstr "Ciutat" + +#: includes/class-wp-members-dialogs.php:46 +msgid "State" +msgstr "Província" + +#: includes/class-wp-members-dialogs.php:47 +msgid "Zip" +msgstr "CP" + +#: includes/class-wp-members-dialogs.php:48 +msgid "Country" +msgstr "País" + +#: includes/class-wp-members-dialogs.php:49 +msgid "Day Phone" +msgstr "Telèfon" + +#: includes/class-wp-members-dialogs.php:50 +#: includes/class-wp-members-dialogs.php:92 +msgid "Email" +msgstr "" + +#: includes/class-wp-members-dialogs.php:51 +msgid "Confirm Email" +msgstr "" + +#: includes/class-wp-members-dialogs.php:52 +msgid "Website" +msgstr "Lloc web" + +#: includes/class-wp-members-dialogs.php:53 +msgid "Biographical Info" +msgstr "Informació biogràfica" + +#: includes/class-wp-members-dialogs.php:54 +#: includes/class-wp-members-dialogs.php:74 +#: includes/class-wp-members-dialogs.php:159 +msgid "Password" +msgstr "" + +#: includes/class-wp-members-dialogs.php:55 +msgid "Confirm Password" +msgstr "" + +#: includes/class-wp-members-dialogs.php:56 +#: includes/class-wp-members-forms.php:2165 +msgid "TOS" +msgstr "Condicions d'ús" + +#: includes/class-wp-members-dialogs.php:66 +msgid "You are not logged in." +msgstr "No ha entrat en" + +#: includes/class-wp-members-dialogs.php:72 +msgid "Existing Users Log In" +msgstr "Usuaris Existents Entrada" + +#: includes/class-wp-members-dialogs.php:73 +#: includes/class-wp-members-dialogs.php:158 +msgid "Username or Email" +msgstr "" + +#: includes/class-wp-members-dialogs.php:75 +#: includes/class-wp-members-shortcodes.php:773 +msgid "Log In" +msgstr "" + +#: includes/class-wp-members-dialogs.php:76 +msgid "Remember Me" +msgstr "" + +#: includes/class-wp-members-dialogs.php:77 +msgid "Forgot password?" +msgstr "Has oblidat la contrasenya?" + +#: includes/class-wp-members-dialogs.php:78 +msgid "Click here to reset" +msgstr "Prem aquí per reiniciar" + +#: includes/class-wp-members-dialogs.php:79 +msgid "New User?" +msgstr "Nou usuari?" + +#: includes/class-wp-members-dialogs.php:80 +msgid "Click here to register" +msgstr "Prem aquí per registrar-te" + +#: includes/class-wp-members-dialogs.php:83 +#: includes/class-wp-members-dialogs.php:142 +msgid "Change Password" +msgstr "Canvia la contrasenya" + +#: includes/class-wp-members-dialogs.php:84 +msgid "New password" +msgstr "" + +#: includes/class-wp-members-dialogs.php:85 +msgid "Confirm new password" +msgstr "" + +#: includes/class-wp-members-dialogs.php:86 +msgid "Update Password" +msgstr "Actualitza la contrasenya" + +#: includes/class-wp-members-dialogs.php:87 +msgid "Password successfully changed!" +msgstr "" + +#: includes/class-wp-members-dialogs.php:90 +msgid "Reset Forgotten Password" +msgstr "Reinicia la contrasenya oblidada" + +#: includes/class-wp-members-dialogs.php:93 +msgid "Reset Password" +msgstr "" + +#: includes/class-wp-members-dialogs.php:94 +msgid "Forgot username?" +msgstr "" + +#: includes/class-wp-members-dialogs.php:95 +msgid "Click here" +msgstr "" + +#: includes/class-wp-members-dialogs.php:98 +#: includes/class-wp-members-dialogs.php:100 +msgid "Retrieve username" +msgstr "" + +#: includes/class-wp-members-dialogs.php:99 +msgid "Email Address" +msgstr "" + +#: includes/class-wp-members-dialogs.php:103 +msgid "New User Registration" +msgstr "Registre d'un nou usuari" + +#: includes/class-wp-members-dialogs.php:104 +msgid "Choose a Username" +msgstr "Escull un nom d'usuari" + +#: includes/class-wp-members-dialogs.php:105 +msgid "Input the code:" +msgstr "" + +#: includes/class-wp-members-dialogs.php:106 +#: includes/class-wp-members-forms.php:2164 +#, php-format +msgid "Please indicate that you agree to the %s Terms of Service %s" +msgstr "" + +#: includes/class-wp-members-dialogs.php:107 +msgid "Reset Form" +msgstr "Restablir el Formulari" + +#: includes/class-wp-members-dialogs.php:108 +#: includes/class-wp-members-dialogs.php:162 +#: includes/class-wp-members-shortcodes.php:770 +#: includes/class-wp-members-user.php:186 +msgid "Register" +msgstr "" + +#: includes/class-wp-members-dialogs.php:110 +msgid "Required field" +msgstr "Camp obligatori" + +#: includes/class-wp-members-dialogs.php:113 +msgid "Edit Your Information" +msgstr "Edita la teva informació" + +#: includes/class-wp-members-dialogs.php:115 +msgid "Update Profile" +msgstr "Actualitzar Perfil" + +#: includes/class-wp-members-dialogs.php:116 +msgid "Update this file" +msgstr "" + +#: includes/class-wp-members-dialogs.php:119 +msgid "Login Failed!" +msgstr "¡Error d'identificació!" + +#: includes/class-wp-members-dialogs.php:120 +msgid "You entered an invalid username or password." +msgstr "Ha introduit un nom d'usuari o una contrasenya incorrecta" + +#: includes/class-wp-members-dialogs.php:121 +msgid "Click here to continue." +msgstr "Prem aquí per continuar." + +#: includes/class-wp-members-dialogs.php:122 +msgid "Password fields cannot be empty" +msgstr "La contrasenya no coincideix" + +#: includes/class-wp-members-dialogs.php:123 +msgid "Sorry, that email address was not found." +msgstr "" + +#: includes/class-wp-members-dialogs.php:124 +#, php-format +msgid "An email was sent to %s with your username." +msgstr "" + +#: includes/class-wp-members-dialogs.php:125 +#, php-format +msgid "Sorry, %s is a required field." +msgstr "Disculpa, %s és un camp obligatori." + +#: includes/class-wp-members-dialogs.php:126 +msgid "You must enter a valid email address." +msgstr "Heu d'introduir un adreça de correu electrònic vàlida" + +#: includes/class-wp-members-dialogs.php:127 +msgid "The username cannot include non-alphanumeric characters." +msgstr "El nom d'usuari no pot contenir caràcters que no siguin alfanumèrics." + +#: includes/class-wp-members-dialogs.php:128 +msgid "Sorry, username is a required field" +msgstr "Disculpa, el nom d'usuari és obligatori" + +#: includes/class-wp-members-dialogs.php:129 +msgid "Sorry, that username is taken, Please try another." +msgstr "" + +#: includes/class-wp-members-dialogs.php:130 +msgid "Sorry, that email address already has an account. Please try another." +msgstr "" + +#: includes/class-wp-members-dialogs.php:131 +#: includes/class-wp-members-dialogs.php:174 +msgid "Passwords did not match." +msgstr "Les contrasenyes no coincideixen" + +#: includes/class-wp-members-dialogs.php:132 +msgid "Emails did not match." +msgstr "Les correus electrònics no coincideixen" + +#: includes/class-wp-members-dialogs.php:133 +msgid "You must complete the CAPTCHA form." +msgstr "Heu de completar la paraula mostrada en la imatge" + +#: includes/class-wp-members-dialogs.php:134 +msgid "CAPTCHA was not valid." +msgstr "" + +#: includes/class-wp-members-dialogs.php:135 +msgid "There was an error processing the form." +msgstr "Hi hagut un error amb el formulari" + +#: includes/class-wp-members-dialogs.php:136 +msgid "There was an error with the CAPTCHA form." +msgstr "Hi hagut un error amb el formulari de CAPTCHA" + +#: includes/class-wp-members-dialogs.php:137 +#, php-format +msgid "" +"Sorry, you can only upload the following file types for the %s field: %s." +msgstr "" + +#: includes/class-wp-members-dialogs.php:138 +#: includes/class-wp-members-dialogs.php:171 +msgid "Your information was updated!" +msgstr "La teva informació ha estat actualitzada!" + +#: includes/class-wp-members-dialogs.php:141 +msgid "Edit My Information" +msgstr "Editar la meva informació" + +#: includes/class-wp-members-dialogs.php:143 +#: includes/class-wp-members-dialogs.php:146 +#: includes/class-wp-members-dialogs.php:148 +#: includes/class-wp-members-dialogs.php:153 +#, php-format +msgid "You are logged in as %s" +msgstr "S'ha identificat com %s" + +#: includes/class-wp-members-dialogs.php:144 +msgid "Log out" +msgstr "" + +#: includes/class-wp-members-dialogs.php:145 +msgid "Edit profile" +msgstr "" + +#: includes/class-wp-members-dialogs.php:145 +msgid "Begin using the site." +msgstr "Comença a utilitzar el web" + +#: includes/class-wp-members-dialogs.php:147 +msgid "Click to log out" +msgstr "Prem aquí per desconnectar-te" + +#: includes/class-wp-members-dialogs.php:149 +msgid "click to log out" +msgstr "Prem aquí per desconnectar-te" + +#: includes/class-wp-members-dialogs.php:150 +msgid "Log Out" +msgstr "" + +#: includes/class-wp-members-dialogs.php:154 +msgid "click here to log out" +msgstr "Prem aquí per desconnectar-te" + +#: includes/class-wp-members-dialogs.php:155 +msgid "Login Failed!
    You entered an invalid username or password." +msgstr "" +"Identificació fallada!
    Has introduit un nom d'usuari o una contrasenya " +"incorrectes." + +#: includes/class-wp-members-dialogs.php:156 +msgid "Invalid username or password." +msgstr "" + +#: includes/class-wp-members-dialogs.php:160 includes/class-wp-members.php:1745 +msgid "log in" +msgstr "Identifica't" + +#: includes/class-wp-members-dialogs.php:161 +msgid "Forgot?" +msgstr "Has oblidat la contrasenya?" + +#: includes/class-wp-members-dialogs.php:165 +msgid "" +"This content is restricted to site members. If you are an existing user, " +"please log in. New users may register below." +msgstr "" +"Aquest contingut és exclussiu pels usuaris registrats. Si ja ets un usuari " +"registrat, siusplau identifica't. Si és un nou usuari, siusplau registra't. " + +#: includes/class-wp-members-dialogs.php:166 +msgid "" +"Congratulations! Your registration was successful.

    You may now " +"log in using the password that was emailed to you." +msgstr "" +"Felicitats! El procés de registre s'ha completat.

    Pots iniciar " +"la sessió identifican-te amb la contrasenya que ha estat enviada a la teva " +"adreça de correu. " + +#: includes/class-wp-members-dialogs.php:169 +msgid "Sorry, that username is taken, please try another." +msgstr "" +"Ho sentim, aquest nom d'usuari ja està agafat, siusplau prova'n un altre. " + +#: includes/class-wp-members-dialogs.php:170 +msgid "" +"Sorry, that email address already has an account.
    Please try another." +msgstr "Ho sentim, aquest email ja està agafat, siusplau prova'n un altre. " + +#: includes/class-wp-members-dialogs.php:175 +msgid "Password successfully changed." +msgstr "" + +#: includes/class-wp-members-dialogs.php:176 +msgid "Invalid username or email address." +msgstr "" + +#: includes/class-wp-members-dialogs.php:177 +msgid "" +"Password successfully reset! An email containing a new password has been " +"sent to the email address on file for your account." +msgstr "" + +#: includes/class-wp-members-dialogs.php:178 +msgid "" +"Reset request received. An email with instructions to complete the password " +"reset has been sent." +msgstr "" + +#: includes/class-wp-members-dialogs.php:180 +msgid "This content requires the following membership: " +msgstr "" + +#: includes/class-wp-members-dialogs.php:181 +msgid "This content requires one of the following memberships: " +msgstr "" + +#: includes/class-wp-members-forms.php:84 +#: includes/class-wp-members-forms.php:350 +msgid "Choose membership" +msgstr "" + +#: includes/class-wp-members-forms.php:1898 +#: includes/class-wp-members-user-profile.php:510 +msgid "Activate this user?" +msgstr "Activar usuari?" + +#: includes/class-wp-members-forms.php:2165 templates/tos.php:20 +msgid "Terms of Service" +msgstr "Condicions d'us" + +#: includes/class-wp-members-menus.php:131 +msgid "Display" +msgstr "" + +#: includes/class-wp-members-menus.php:139 +msgid "Logged In Users" +msgstr "" + +#: includes/class-wp-members-menus.php:146 +msgid "Logged Out Users" +msgstr "" + +#: includes/class-wp-members-menus.php:153 +msgid "All Users" +msgstr "" + +#: includes/class-wp-members-menus.php:167 +#, php-format +msgid "%sAdd membership products%s to restrict menu to a membership" +msgstr "" + +#: includes/class-wp-members-menus.php:169 +msgid "Restrict menu item to a membership product" +msgstr "" + +#: includes/class-wp-members-products.php:342 +#, php-format +msgid "All %s" +msgstr "" + +#: includes/class-wp-members-products.php:343 +#, php-format +msgid "Add New %s" +msgstr "" + +#: includes/class-wp-members-products.php:344 +msgid "Add New" +msgstr "" + +#: includes/class-wp-members-products.php:345 +#, php-format +msgid "New %s" +msgstr "" + +#: includes/class-wp-members-products.php:346 +#, php-format +msgid "Edit %s" +msgstr "" + +#: includes/class-wp-members-products.php:347 +#, php-format +msgid "Update %s" +msgstr "" + +#: includes/class-wp-members-products.php:348 +#: includes/class-wp-members-products.php:349 +#, php-format +msgid "View %s" +msgstr "" + +#: includes/class-wp-members-products.php:350 +#, php-format +msgid "Search %s" +msgstr "" + +#: includes/class-wp-members-products.php:351 +msgid "Not found" +msgstr "" + +#: includes/class-wp-members-products.php:352 +msgid "Not found in Trash" +msgstr "" + +#: includes/class-wp-members-products.php:353 +msgid "Insert into item" +msgstr "" + +#: includes/class-wp-members-products.php:354 +#, php-format +msgid "Save %s Details" +msgstr "" + +#: includes/class-wp-members-products.php:355 +msgid "Membership Attributes" +msgstr "" + +#: includes/class-wp-members-products.php:358 +msgid "Membership Product" +msgstr "" + +#: includes/class-wp-members-products.php:359 +msgid "WP-Members Membership Products" +msgstr "" + +#: includes/class-wp-members-pwd-reset.php:35 +#: includes/class-wp-members-pwd-reset.php:36 +msgid "" +"Sorry, no password reset key was found. Please check your email and try " +"again." +msgstr "" + +#: includes/class-wp-members-pwd-reset.php:37 +msgid "Sorry, the password reset key is expired." +msgstr "" + +#: includes/class-wp-members-pwd-reset.php:167 +msgid "The passwords do not match." +msgstr "" + +#: includes/class-wp-members-shortcodes.php:134 +msgid "" +"This is a generic message to display the form message dialog in the " +"Customizer." +msgstr "" + +#: includes/class-wp-members-shortcodes.php:699 +msgid "Click here to log out." +msgstr "" + +#: includes/class-wp-members-user-profile.php:58 +msgid "WP-Members Additional Fields" +msgstr "WP-Members camps adicionals" + +#: includes/class-wp-members-user-profile.php:58 +msgid "Additional Information" +msgstr "Informació Addicional" + +#: includes/class-wp-members-user-profile.php:500 +msgid "Reactivate this user?" +msgstr "Voleu tornar a activar aquest usuari?" + +#: includes/class-wp-members-user-profile.php:505 +msgid "Deactivate this user?" +msgstr "Desactivar usuari?" + +#: includes/class-wp-members-user-profile.php:559 +msgid "IP @ registration" +msgstr "Adreça IP" + +#: includes/class-wp-members-user.php:1171 +msgid "ERROR: User has not been activated." +msgstr "ERROR: L'usuari no ha estat activat." + +#: includes/class-wp-members-validation-link.php:32 +msgid "Click to validate your account: " +msgstr "" + +#: includes/class-wp-members-validation-link.php:33 +msgid "Thank you for validating your account." +msgstr "" + +#: includes/class-wp-members-validation-link.php:34 +msgid "Validation key was expired or invalid" +msgstr "" + +#: includes/class-wp-members-validation-link.php:35 +msgid "Your account is now pending approval" +msgstr "" + +#: includes/class-wp-members-validation-link.php:284 +msgid "ERROR: User has not confirmed their account." +msgstr "" + +#: includes/class-wp-members-widget.php:24 +msgid "Displays the WP-Members sidebar login." +msgstr "" + +#: includes/class-wp-members-widget.php:39 +#: includes/class-wp-members-widget.php:82 +msgid "Login Status" +msgstr "Estat de la identificació" + +#: includes/class-wp-members-widget.php:46 +msgid "Title:" +msgstr "Titol:" + +#: includes/class-wp-members-widget.php:50 +msgid "Redirect to (optional):" +msgstr "" + +#: includes/class-wp-members.php:1087 includes/class-wp-members.php:1098 +msgid "You must be logged in to view this content." +msgstr "" + +#: includes/class-wp-members.php:1104 +msgid "The page you are looking for does not exist" +msgstr "" + +#: includes/class-wp-members.php:1352 +#, php-format +msgid "" +"You have a linked page in the WP-Members page settings that corresponds to a " +"post ID that no longer exists. Please %s review and update the %s page " +"settings %s." +msgstr "" + +#: includes/class-wp-members.php:1472 +msgid "Show forms as logged out" +msgstr "" + +#: includes/class-wp-members.php:1481 +msgid "Show form message dialog" +msgstr "" + +#: includes/class-wp-members.php:1558 +msgid "(more…)" +msgstr "" + +#: includes/class-wp-members.php:1746 +msgid "log out" +msgstr "" + +#: includes/cli/class-wp-members-cli-user.php:24 +#: includes/cli/class-wp-members-cli-user.php:62 +msgid "Moderated registration is not enabled in WP-Members options." +msgstr "" + +#: includes/cli/class-wp-members-cli-user.php:35 +msgid "User activated." +msgstr "" + +#: includes/cli/class-wp-members-cli-user.php:37 +msgid "Email notification sent to user." +msgstr "" + +#: includes/cli/class-wp-members-cli-user.php:40 +msgid "User is already activated." +msgstr "" + +#: includes/cli/class-wp-members-cli-user.php:67 +msgid "User deactivated." +msgstr "" + +#: includes/cli/class-wp-members-cli-user.php:88 +msgid "Invalid user ID. Please specify a valid user. Try `wp user list`." +msgstr "" + +#: includes/cli/class-wp-members-cli-user.php:91 +msgid "No user id specified. Must specify user id as --id=123" +msgstr "" + +#: includes/cli/class-wp-members-cli-user.php:208 +#, php-format +msgid "User: %s" +msgstr "" + +#: includes/cli/class-wp-members-cli-user.php:248 +#, php-format +msgid "User role: %s" +msgstr "" + +#: includes/deprecated.php:373 +msgid "We were unable to validate the public key." +msgstr "No s'ha pogut validar la clau pública." + +#: includes/deprecated.php:377 +msgid "We were unable to validate the private key." +msgstr "No s'ha pogut validar la clau privada." + +#: includes/deprecated.php:381 +msgid "The challenge parameter of the verify script was incorrect." +msgstr "El paràmetre de verificació del script és incorrecte." + +#: includes/deprecated.php:385 +msgid "The CAPTCHA solution was incorrect." +msgstr "La resolució de CAPTCHA és incorrecte." + +#: includes/deprecated.php:389 +msgid "The parameters to verify were incorrect" +msgstr "Els paràmetres a verificar són incorrectes" + +#: includes/deprecated.php:393 +msgid "" +"reCAPTCHA API keys are tied to a specific domain name for security reasons." +msgstr "" +"Les claus de reCAPTCHA van associades a un domini específic per raons de " +"seguretat. " + +#: includes/deprecated.php:397 +msgid "The reCAPTCHA server was not reached. Please try to resubmit." +msgstr "El servidor de reCAPTCHA no respond, siusplau intenta-ho de nou." + +#. translators: %s: title of menu item which is invalid +#: includes/walkers/class-wp-members-walker-nav-menu.php:92 +#, php-format +msgid "%s (Invalid)" +msgstr "" + +#. translators: %s: title of menu item in draft status +#: includes/walkers/class-wp-members-walker-nav-menu.php:96 +#, php-format +msgid "%s (Pending)" +msgstr "" + +#: includes/walkers/class-wp-members-walker-nav-menu.php:123 +msgid "Move up" +msgstr "" + +#: includes/walkers/class-wp-members-walker-nav-menu.php:136 +msgid "Move down" +msgstr "" + +#: includes/walkers/class-wp-members-walker-nav-menu.php:138 +msgid "Edit Menu Item" +msgstr "" + +#: includes/walkers/class-wp-members-walker-nav-menu.php:149 +msgid "URL" +msgstr "" + +#: includes/walkers/class-wp-members-walker-nav-menu.php:156 +msgid "Navigation Label" +msgstr "" + +#: includes/walkers/class-wp-members-walker-nav-menu.php:162 +msgid "Title Attribute" +msgstr "" + +#: includes/walkers/class-wp-members-walker-nav-menu.php:169 +msgid "Open link in a new window/tab" +msgstr "" + +#: includes/walkers/class-wp-members-walker-nav-menu.php:174 +msgid "CSS Classes (optional)" +msgstr "" + +#: includes/walkers/class-wp-members-walker-nav-menu.php:180 +msgid "Link Relationship (XFN)" +msgstr "" + +#: includes/walkers/class-wp-members-walker-nav-menu.php:188 +msgid "" +"The description will be displayed in the menu if the current theme supports " +"it." +msgstr "" + +#: includes/walkers/class-wp-members-walker-nav-menu.php:210 +#, php-format +msgid "Original: %s" +msgstr "" + +#: includes/walkers/class-wp-members-walker-nav-menu.php:223 +msgid "Remove" +msgstr "" + +#: templates/tos.php:32 +#, php-format +msgid "%sclose%s" +msgstr "%stanca%s" + +#: templates/tos.php:34 +#, php-format +msgid "%sprint%s" +msgstr "%simprimeix%s" + +#. Plugin Name of the plugin/theme +msgid "WP-Members" +msgstr "" + +#. Plugin URI of the plugin/theme +msgid "https://rocketgeek.com" +msgstr "" + +#. Description of the plugin/theme +msgid "" +"WP access restriction and user registration. For more information on plugin " +"features, refer to the online Users Guide. A Quick Start Guide is also available. WP-" +"Members(tm) is a trademark of butlerblog.com." +msgstr "" + +#. Author of the plugin/theme +msgid "Chad Butler" +msgstr "" + +#. Author URI of the plugin/theme +msgid "https://butlerblog.com/" +msgstr "" + +#~ msgid "Block" +#~ msgstr "Bloquejar" + +#~ msgid "Manage reCAPTCHA Options" +#~ msgstr "Gestionar les opcions de reCAPTCHA" + +#~ msgid "" +#~ "reCAPTCHA is a free, accessible CAPTCHA service that helps to digitize " +#~ "books while blocking spam on your blog." +#~ msgstr "" +#~ "reCAPTCHA és un servei gratuit i accessible que ajuda als registres " +#~ "digitals mentre bloqueja el spam del seu blog." + +#, php-format +#~ msgid "" +#~ "reCAPTCHA asks commenters to retype two words scanned from a book to " +#~ "prove that they are a human. This verifies that they are not a spambot " +#~ "while also correcting the automatic scans of old books. So you get less " +#~ "spam, and the world gets accurately digitized books. Everybody wins! For " +#~ "details, visit the %s reCAPTCHA website%s" +#~ msgstr "" +#~ "reCAPTCHA pregunta als usuaris una clau de dues paraules mostrades en una " +#~ "imatge com a prova de que som humans. Això verifica que no som robots de " +#~ "spam inscrivint-nos automàticament. Així s'aconseguirà menys spam i més " +#~ "exactitud en els registres. Tothom hi guanya! Per a més informació, " +#~ "visiteu el %s lloc web de reCAPTCHA %s" + +#, php-format +#~ msgid "" +#~ "reCAPTCHA requires an API key, consisting of a \"public\" and a \"private" +#~ "\" key. You can sign up for a %s free reCAPTCHA key%s" +#~ msgstr "" +#~ "reCAPTCHA requereix una clau d'encriptació pública y privada. Pot apuntar-" +#~ "se per %s per aconseguir claus gratuïtes%s." + +#~ msgid "Public Key" +#~ msgstr "Clau pública" + +#~ msgid "Private Key" +#~ msgstr "Clau privada" + +#~ msgid "Choose Theme" +#~ msgstr "Escull el tema" + +#~ msgid "Red" +#~ msgstr "Vermell" + +#~ msgid "White" +#~ msgstr "Blanc" + +#~ msgid "Black Glass" +#~ msgstr "Negre cristall" + +#~ msgid "Clean" +#~ msgstr "Clar" + +#~ msgid "Active" +#~ msgstr "Activar" + +#~ msgid "Enable CAPTCHA" +#~ msgstr "Permetre CAPTCHA" + +#~ msgid "Passwords did not match.

    Please try again." +#~ msgstr "" +#~ "Les contrasenyes no coincideixen

    Siusplau intenta-ho de nou." + +#~ msgid "Either the username or email address do not exist in our records." +#~ msgstr "El nom d'usuari o email no existeixen en la nostra base de dades." + +#~ msgid "Click to log out." +#~ msgstr "Prem aquí per desconnectar-te" + +#~ msgid "You have set WP-Members to turn off the registration process" +#~ msgstr "Ha configurat WP-Members per desactivar el procés de registre " + +#~ msgid "" +#~ "but you also set to moderate and/or email admin new registrations. You " +#~ "will need to set up a registration page for users to register." +#~ msgstr "" +#~ "però també s'estableix com a moderador i/o l'administrador email per a " +#~ "nous registres. Necessiteu establir una pàgina de registres pels usuaris " +#~ "que vulguin registrar-se" + +#~ msgid "Unblocked?" +#~ msgstr "Desbloquejat?" + +#~ msgid "Blocked?" +#~ msgstr "Bloquejat?" + +#~ msgid "Field Label is required for adding a new field. Nothing was updated." +#~ msgstr "" +#~ "Es requereix etiqueta del camp per afegir un nou camp. Res s'ha " +#~ "actualitzat." + +#~ msgid "Option Name is required for adding a new field. Nothing was updated." +#~ msgstr "" +#~ "L'opció del Nom és requereix per incloure un nou camp. Res s'ha " +#~ "actualitzat." + +#~ msgid "field was added" +#~ msgstr "es va afegir camp" + +#~ msgid "field was updated" +#~ msgstr "camp s'actualitza" + +#~ msgid "Option Name" +#~ msgstr "Opcions" + +#~ msgid "Additional information for checkbox fields" +#~ msgstr "Informació addicional per als camps de casella de verificació" + +#~ msgid "Additional information for dropdown fields" +#~ msgstr "Informació addicional per als camps desplegables" + +#~ msgid "For dropdown, array of values:" +#~ msgstr "Pel desplegable, valors:" + +#~ msgid "" +#~ "Determine which fields will display and which are required. This " +#~ "includes all fields, both native WP fields and WP-Members custom fields." +#~ msgstr "" +#~ "Determina quins camps es mostraran i quins són obligatoris. Això inclou " +#~ "tots els camps, els natius de WP com els creats a WP-Members." + +#~ msgid "(Note: Email is always mandatory and cannot be changed.)" +#~ msgstr "(Nota: el camp email és obligatori, no pot canviar-se)" + +#~ msgid "Add/Delete" +#~ msgstr "Inclou/Suprimeix" + +#~ msgid "Checked?" +#~ msgstr "Comprovat?" + +#~ msgid "Delete" +#~ msgstr "Suprimeix" + +#~ msgid "(Email cannot be removed)" +#~ msgstr "(Nota: el camp de l'email és obligatori, no es pot canviar)" + +#~ msgid "Update Fields" +#~ msgstr "Actualitzar camps" + +#~ msgid "Please indicate that you agree to the %s TOS %s" +#~ msgstr "" +#~ "Siusplau indiqueu que heu llegit i esteu d'acord amb les %s condicions " +#~ "d'ús %s" + +#~ msgid "Post Restriction" +#~ msgstr "Restricció de l'anunci" + +#~ msgid "Page Restriction" +#~ msgstr "Pàgina Restricció" + +#~ msgid "dropdown" +#~ msgstr "desplegable" + +#~ msgid "Block Posts by default" +#~ msgstr "Bloquejar entrades per defecte" + +#~ msgid "" +#~ "Note: Posts can still be individually blocked or unblocked at the article " +#~ "level" +#~ msgstr "" +#~ "Nota: les entrades poden ser bloquejades o desbloquejades a nivell " +#~ "d'article" + +#~ msgid "Block Pages by default" +#~ msgstr "Bloquejar pàgines per defecte" + +#~ msgid "" +#~ "Note: Pages can still be individually blocked or unblocked at the article " +#~ "level" +#~ msgstr "" +#~ "Nota: les pàgines encara poden ser bloquejades o no bloquejades a nivell " +#~ "d'article" + +#~ msgid "Show excerpts" +#~ msgstr "Mostra resums" + +#~ msgid "" +#~ "Shows excerpted content above the login/registration on both Posts and " +#~ "Pages" +#~ msgstr "" +#~ "Mostra resums de contingut sobre el formulari d'accés, tant en entrades " +#~ "com en pàgines" + +#~ msgid "Turns on CAPTCHA for registration" +#~ msgstr "Activa CAPTCHA pel registre" + +#~ msgid "Hide registration" +#~ msgstr "Amaga registre" + +#~ msgid "Optional" +#~ msgstr "Opcional" + +#~ msgid "AIM" +#~ msgstr "AIM" + +#~ msgid "Yahoo IM" +#~ msgstr "Yahoo IM" + +#~ msgid "Jabber/Google Talk" +#~ msgstr "Jabber/Google Talk" + +#~ msgid "" +#~ "Password successfully changed!

    You will need to re-login with " +#~ "your new password." +#~ msgstr "" +#~ "La contrasenya s'ha canviat correctament!.

    Hauràs de tornar-te " +#~ "identificar utilitzant la nova contrasenya." + +#~ msgid "" +#~ "Password successfully reset!

    An email containing a new " +#~ "password has been sent to the email address on file for your account. You " +#~ "may change this random password then re-login with your new password." +#~ msgstr "" +#~ "La contrasenya ha estat restablerta correctament

    Li enviarem " +#~ "un email amb la nova contrasenya a l'adreça que ha registrat. Podrà " +#~ "canviar la contrasenya a l'atzar i després iniciar la sessió amb una nova " +#~ "contrasenya." diff --git a/i18n/languages/wp-members-da_DK.mo b/i18n/languages/wp-members-da_DK.mo new file mode 100644 index 00000000..46fc1079 Binary files /dev/null and b/i18n/languages/wp-members-da_DK.mo differ diff --git a/i18n/languages/wp-members-da_DK.po b/i18n/languages/wp-members-da_DK.po new file mode 100644 index 00000000..b563ce8b --- /dev/null +++ b/i18n/languages/wp-members-da_DK.po @@ -0,0 +1,2789 @@ +# Copyright (C) 2010 WP-Members +# This file is distributed under the same license as the WP-Members package. +msgid "" +msgstr "" +"Project-Id-Version: WP-Members 3.2.6\n" +"Report-Msgid-Bugs-To: http://wordpress.org/tag/wp-members\n" +"POT-Creation-Date: 2023-01-06 15:20-0500\n" +"PO-Revision-Date: 2023-01-06 15:21-0500\n" +"Last-Translator: Chad Butler \n" +"Language-Team: mikael.boldt@mail.dk\n" +"Language: da_DK\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Poedit-SourceCharset: UTF-8\n" +"X-Poedit-KeywordsList: __;_e;_c\n" +"X-Poedit-Basepath: D:/downloads/wp-members\n" +"X-Generator: Poedit 2.4.3\n" +"X-Poedit-SearchPath-0: D:/downloads/wp-members\n" + +#: includes/admin/class-wp-members-admin-api.php:254 +msgid "Custom email" +msgstr "" + +#: includes/admin/class-wp-members-admin-api.php:255 +#: includes/admin/class-wp-members-admin-api.php:257 +msgid "Subject" +msgstr "Emne" + +#: includes/admin/class-wp-members-admin-api.php:258 +msgid "Body" +msgstr "Brødtekst" + +#: includes/admin/class-wp-members-admin-api.php:260 +msgid "Your custom email message content." +msgstr "" + +#: includes/admin/class-wp-members-admin-api.php:338 +msgid "Options" +msgstr "Valg" + +#: includes/admin/class-wp-members-admin-api.php:339 +msgid "Fields" +msgstr "Felter" + +#: includes/admin/class-wp-members-admin-api.php:340 +msgid "Dialogs" +msgstr "Dialog" + +#: includes/admin/class-wp-members-admin-api.php:341 +msgid "Emails" +msgstr "Email" + +#: includes/admin/class-wp-members-admin-api.php:357 +msgid "New Registration" +msgstr "Ny Bruger Registrering" + +#: includes/admin/class-wp-members-admin-api.php:365 +#: includes/admin/class-wp-members-admin-api.php:383 +msgid "User email validated" +msgstr "" + +#: includes/admin/class-wp-members-admin-api.php:375 +msgid "Registration is Moderated" +msgstr "Registrering fuldført" + +#: includes/admin/class-wp-members-admin-api.php:391 +msgid "Registration is Moderated, User is Approved" +msgstr "Din registrering er godkendt" + +#: includes/admin/class-wp-members-admin-api.php:399 +msgid "Password Reset" +msgstr "Kodeord Nulstillet" + +#: includes/admin/class-wp-members-admin-api.php:406 +msgid "Retrieve Username" +msgstr "" + +#: includes/admin/class-wp-members-admin-api.php:414 +msgid "Admin Notification" +msgstr "Admin Meddelelse" + +#: includes/admin/class-wp-members-admin-api.php:440 +msgid "Restricted post (or page), displays above the login/registration form" +msgstr "" +"Vises over Log på / Registrering på Post eller Side med begrænset adgang" + +#: includes/admin/class-wp-members-admin-api.php:441 +msgid "Username is taken" +msgstr "Brugernavn er taget" + +#: includes/admin/class-wp-members-admin-api.php:442 +msgid "Email is registered" +msgstr "Email er registreret" + +#: includes/admin/class-wp-members-admin-api.php:443 +msgid "Registration completed" +msgstr "Registrering fuldført - afventer godkendelse" + +#: includes/admin/class-wp-members-admin-api.php:444 +msgid "User update" +msgstr "Bruger opdatering" + +#: includes/admin/class-wp-members-admin-api.php:445 +msgid "Passwords did not match" +msgstr "Kodeordene er ikke ens" + +#: includes/admin/class-wp-members-admin-api.php:446 +msgid "Password changes" +msgstr "Ændret Kodeord" + +#: includes/admin/class-wp-members-admin-api.php:447 +msgid "Username or email do not exist when trying to reset forgotten password" +msgstr "" +"Brugernavn eller Email eksisterer ikke når glemt Kodeord forsøges nulstillet" + +#: includes/admin/class-wp-members-admin-api.php:448 +msgid "Password reset" +msgstr "Nulstil Kodeord" + +#: includes/admin/class-wp-members-admin-api.php:547 +msgid "Close" +msgstr "" + +#: includes/admin/class-wp-members-admin-api.php:596 +msgid "Settings" +msgstr "Indstillinger" + +#: includes/admin/class-wp-members-admin-posts.php:30 +#: includes/admin/class-wp-members-admin-posts.php:33 +msgid "Unrestrict" +msgstr "" + +#: includes/admin/class-wp-members-admin-posts.php:31 +#: includes/admin/class-wp-members-admin-posts.php:34 +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:110 +msgid "Restrict" +msgstr "" + +#: includes/admin/class-wp-members-admin-posts.php:32 +#: includes/admin/class-wp-members-admin-posts.php:35 +msgid "Hide" +msgstr "" + +#: includes/admin/class-wp-members-admin-posts.php:125 +#, php-format +msgid "%s restricted" +msgstr "" + +#: includes/admin/class-wp-members-admin-posts.php:125 +#, php-format +msgid "%s unrestricted" +msgstr "" + +#: includes/admin/class-wp-members-admin-posts.php:165 +#, php-format +msgid "%s Restriction" +msgstr "" + +#: includes/admin/class-wp-members-admin-posts.php:195 +#: includes/admin/class-wp-members-admin-posts.php:342 +#: includes/admin/class-wp-members-admin-posts.php:345 +msgid "Unrestricted" +msgstr "" + +#: includes/admin/class-wp-members-admin-posts.php:196 +#: includes/admin/class-wp-members-admin-posts.php:339 +#: includes/admin/class-wp-members-admin-posts.php:347 +msgid "Restricted" +msgstr "" + +#: includes/admin/class-wp-members-admin-posts.php:197 +#: includes/admin/class-wp-members-admin-posts.php:349 +msgid "Hidden" +msgstr "" + +#: includes/admin/class-wp-members-admin-posts.php:203 +msgid "Status:" +msgstr "" + +#: includes/admin/class-wp-members-admin-posts.php:203 +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:68 +#: includes/admin/tabs/class-wp-members-fields-table.php:65 +#: includes/walkers/class-wp-members-walker-nav-menu.php:140 +msgid "Edit" +msgstr "Redigere" + +#: includes/admin/class-wp-members-admin-posts.php:218 +msgid "Ok" +msgstr "" + +#: includes/admin/class-wp-members-admin-posts.php:219 +#: includes/walkers/class-wp-members-walker-nav-menu.php:224 +msgid "Cancel" +msgstr "" + +#: includes/admin/class-wp-members-admin-posts.php:305 +msgid "Status" +msgstr "" + +#: includes/admin/class-wp-members-admin-users.php:28 +#: includes/admin/class-wp-members-admin-users.php:34 +#: includes/admin/class-wp-members-admin-users.php:79 +msgid "Activate" +msgstr "Aktiver" + +#: includes/admin/class-wp-members-admin-users.php:29 +#: includes/admin/class-wp-members-admin-users.php:35 +#: includes/admin/class-wp-members-admin-users.php:82 +msgid "Deactivate" +msgstr "" + +#: includes/admin/class-wp-members-admin-users.php:31 +#: includes/admin/class-wp-members-admin-users.php:37 +msgid "Export" +msgstr "Eksporter" + +#: includes/admin/class-wp-members-admin-users.php:32 +#: includes/admin/class-wp-members-admin-users.php:38 +msgid "Export All Users" +msgstr "Eksporter Alle Brugere" + +#: includes/admin/class-wp-members-admin-users.php:61 +msgid "Confirm" +msgstr "" + +#: includes/admin/class-wp-members-admin-users.php:64 +msgid "Unconfirm" +msgstr "" + +#: includes/admin/class-wp-members-admin-users.php:147 +#, php-format +msgid "%s users activated" +msgstr "" + +#: includes/admin/class-wp-members-admin-users.php:147 +#, php-format +msgid "%s users deactivated" +msgstr "" + +#: includes/admin/class-wp-members-admin-users.php:150 +msgid "No users selected" +msgstr "" + +#: includes/admin/class-wp-members-admin-users.php:168 +msgid "You cannot activate or deactivate yourself" +msgstr "" + +#: includes/admin/class-wp-members-admin-users.php:173 +#, php-format +msgid "%s activated" +msgstr "" + +#: includes/admin/class-wp-members-admin-users.php:178 +#, php-format +msgid "%s deactivated" +msgstr "" + +#: includes/admin/class-wp-members-admin-users.php:182 +msgid "That user is already active" +msgstr "" + +#: includes/admin/class-wp-members-admin-users.php:198 +msgid "You cannot confirm or unconfirm yourself" +msgstr "" + +#: includes/admin/class-wp-members-admin-users.php:203 +#, php-format +msgid "%s confirmed" +msgstr "" + +#: includes/admin/class-wp-members-admin-users.php:208 +#, php-format +msgid "%s unconfirmed" +msgstr "" + +#: includes/admin/class-wp-members-admin-users.php:212 +msgid "That user is already confirmed" +msgstr "" + +#: includes/admin/class-wp-members-admin-users.php:341 +msgid "Pending" +msgstr "" + +#: includes/admin/class-wp-members-admin-users.php:342 +msgid "Trial" +msgstr "" + +#: includes/admin/class-wp-members-admin-users.php:343 +#: includes/admin/class-wp-members-user-export.php:289 +msgid "Subscription" +msgstr "Abonnement" + +#: includes/admin/class-wp-members-admin-users.php:344 +msgid "Expired" +msgstr "" + +#: includes/admin/class-wp-members-admin-users.php:347 +#: includes/admin/class-wp-members-admin-users.php:410 +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:457 +msgid "Activated" +msgstr "" + +#: includes/admin/class-wp-members-admin-users.php:348 +msgid "Pending Activation" +msgstr "" + +#: includes/admin/class-wp-members-admin-users.php:349 +msgid "Deactivated" +msgstr "" + +#: includes/admin/class-wp-members-admin-users.php:352 +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:456 +msgid "Confirmed" +msgstr "" + +#: includes/admin/class-wp-members-admin-users.php:353 +msgid "Not Confirmed" +msgstr "" + +#: includes/admin/class-wp-members-admin-users.php:355 +msgid "Not Exported" +msgstr "" + +#: includes/admin/class-wp-members-admin-users.php:475 +msgid "Not confirmed" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:67 +msgid "Slug" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:68 +#: includes/admin/class-wp-members-user-export.php:294 +msgid "Role" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:69 +#: includes/admin/class-wp-members-products-admin.php:740 +#: includes/admin/class-wp-members-user-export.php:290 +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:460 +msgid "Expires" +msgstr "Udløber" + +#: includes/admin/class-wp-members-products-admin.php:71 +msgid "Default" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:73 +msgid "Last updated" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:97 +msgid "slug:" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:100 +msgid "No role required" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:105 +msgid "Does not expire" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:109 +#: includes/admin/class-wp-members-user-export.php:199 +msgid "Yes" +msgstr "Ja" + +#: includes/admin/class-wp-members-products-admin.php:145 +msgid "Membership Product Details" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:153 +msgid "Membership Product Message (optional)" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:169 +msgid "Access by child membership" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:185 +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:62 +msgid "Posts" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:186 +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:63 +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:249 +msgid "Pages" +msgstr "Sider" + +#: includes/admin/class-wp-members-products-admin.php:213 +#: includes/admin/class-wp-members-products-admin.php:262 +#: includes/admin/class-wp-members-products-admin.php:309 +msgid "Period" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:213 +msgid "Day" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:213 +msgid "Week" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:213 +msgid "Month" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:213 +msgid "Year" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:226 +msgid "Name (slug)" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:228 +msgid "Optional Defaults" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:231 +msgid "Assign as default at registration? (optional)" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:239 +#, php-format +msgid "Pre-selected by default for new %s" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:245 +msgid "Optional Properties" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:248 +msgid "Role Required? (optional)" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:251 +msgid "No Role" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:257 +msgid "Expires (optional)" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:259 +#: includes/admin/class-wp-members-products-admin.php:261 +#: includes/admin/class-wp-members-products-admin.php:306 +#: includes/admin/class-wp-members-products-admin.php:308 +msgid "Number" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:267 +msgid "Use \"no gap\" renewal" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:271 +msgid "Use a fixed period (such as Jan 1 - Dec 31, or Sept 1 - Aug 31)" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:288 +#: includes/admin/class-wp-members-products-admin.php:289 +msgid "Period Start (dd-mm)" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:290 +#: includes/admin/class-wp-members-products-admin.php:291 +msgid "Period End (dd-mm)" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:304 +msgid "Fixed period grace period" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:313 +msgid "" +"Grace period is the point at which expiration date is for following time " +"period. For example, if user who register August 1st would be part of the " +"following year's Sept 1 - Aug 31 membership, set this at 1 Month. Leave " +"blank for no grace period." +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:376 +msgid "" +"Restricted Message (displays when a user does not have access to a " +"membership)" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:502 +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:239 +#: includes/class-wp-members-forms.php:1196 +#: includes/class-wp-members-user-profile.php:132 +msgid "None" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:517 +msgid "Restrict access by membership:" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:598 +msgid "Required Membership" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:644 +#: includes/admin/class-wp-members-products-admin.php:745 +#: includes/class-wp-members-products.php:335 +msgid "Membership" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:680 +msgid "expires:" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:709 +#: includes/class-wp-members-products.php:336 +#: includes/class-wp-members-products.php:341 +msgid "Memberships" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:736 +msgid "Membership Access" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:744 +msgid "Action" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:746 +msgid "Enabled?" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:757 +msgid "Enable" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:758 +msgid "Disable" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:759 +msgid "Update" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:764 +msgid "Expiration date (optional)" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:795 +#, php-format +msgid "No memberships have been created. %sCreate new memberships here%s" +msgstr "" + +#: includes/admin/class-wp-members-user-export.php:199 +msgid "No" +msgstr "Nej" + +#: includes/admin/class-wp-members-user-export.php:264 +msgid "You do not have the required user capabilities to export users." +msgstr "" + +#: includes/admin/class-wp-members-user-export.php:277 +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:461 +msgid "User ID" +msgstr "" + +#: includes/admin/class-wp-members-user-export.php:284 +#: includes/class-wp-members-dialogs.php:91 +#: includes/class-wp-members-dialogs.php:114 +msgid "Username" +msgstr "Brugernavn" + +#: includes/admin/class-wp-members-user-export.php:286 +msgid "Activated?" +msgstr "Aktiveret?" + +#: includes/admin/class-wp-members-user-export.php:292 +msgid "Registered" +msgstr "Registreret" + +#: includes/admin/class-wp-members-user-export.php:293 +msgid "IP" +msgstr "IP" + +#: includes/admin/dialogs.php:117 +msgid "" +"Your WP settings allow anyone to register - this is not the recommended " +"setting." +msgstr "" +"Dine WP indstillinger tillader alle at registrere sig - dette kan ikke " +"anbefales." + +#: includes/admin/dialogs.php:118 +#, php-format +msgid "" +"You can %s change this here %s making sure the box next to \"Anyone can " +"register\" is unchecked." +msgstr "" +"Du kan %s ændre dette her %s ved at sørge for boksen ved siden af \"Alle kan " +"registrere \" er u-markeret." + +#: includes/admin/dialogs.php:119 +msgid "" +"This setting allows a link on the /wp-login.php page to register using the " +"WP native registration process thus circumventing any registration you are " +"using with WP-Members. In some cases, this may suit the users wants/needs, " +"but most users should uncheck this option. If you do not change this " +"setting, you can choose to ignore these warning messages under WP-Members " +"Settings." +msgstr "" +"Denne indstilling tillader at et link på /wp-login.php siden for at lade sig " +"registrere ved hjælp af WP oprindelige registreringsprocessen således omgår " +"enhver form for registrering, du bruger sammen med WP-Members. I nogle " +"tilfælde passer dette til brugernes ønsker/behov, men de fleste brugere bør " +"fjerne markeringen af denne mulighed. Hvis du ikke ændrer denne indstilling, " +"kan du vælge at ignorere disse advarsler i henhold til WP-medlemmer " +"indstillinger." + +#: includes/admin/dialogs.php:123 +msgid "" +"Your WP settings allow anyone to comment - this is not the recommended " +"setting." +msgstr "" +"Dine WP indstillinger tillader alle at skrive kommentarer - denne " +"indstilling kan ikke anbefales." + +#: includes/admin/dialogs.php:124 +#, php-format +msgid "" +"You can %s change this here %s by checking the box next to \"Users must be " +"registered and logged in to comment.\"" +msgstr "" +"Du kan %s ændre dette her %s ved at sørge for boksen ved siden af \"Brugere " +"skal være registrerede og logget ind for at kommentere \" er markeret." + +#: includes/admin/dialogs.php:125 +msgid "" +"This setting allows any users to comment, whether or not they are " +"registered. Depending on how you are using WP-Members will determine whether " +"you should change this setting or not. If you do not change this setting, " +"you can choose to ignore these warning messages under WP-Members Settings." +msgstr "" +"Denne indstilling gør det muligt for alle brugere at kommentere, selv om de " +"ikker er registreret. Afhængigt af, hvordan du bruger WP-Members afgør om " +"du bør ændre denne indstilling eller ej. Hvis du ikke ændrer denne " +"indstilling, kan du vælge at ignorere disse advarsler i henhold til WP-" +"Members indstillinger." + +#: includes/admin/dialogs.php:129 +msgid "" +"Your WP settings allow full text rss feeds - this is not the recommended " +"setting." +msgstr "" +"Din WP indstilling tilader fuld RSS feeds - denne indstilling kan ikke " +"anbefales" + +#: includes/admin/dialogs.php:130 +#, php-format +msgid "" +"You can %s change this here %s by changing \"For each article in a feed, show" +"\" to \"Summary.\"" +msgstr "" +"Du kan %s ændre dette %s ved at ændre \"For hvert indlæg, vis \" to \"Resume." +"\"" + +#: includes/admin/dialogs.php:131 +msgid "" +"Leaving this set to full text allows anyone to read your protected content " +"in an RSS reader. Changing this to Summary prevents this as your feeds will " +"only show summary text." +msgstr "" +"At sætte RSS til fuld tekst giver alle mulighed for at læse dit beskyttet " +"indhold i en RSS-læser. At ændre RSS til Oversigt forhindrer dette og dine " +"feeds vil kun blive vist som summarisk tekst." + +#: includes/admin/dialogs.php:135 +msgid "You have set WP-Members to hold registrations for approval" +msgstr "Du har sat WP-Members til at vente på godkendelse af registreringer" + +#: includes/admin/dialogs.php:136 +msgid "" +"but you have not changed the default message for \"Registration Completed\" " +"under \"WP-Members Dialogs and Error Messages.\" You should change this " +"message to let users know they are pending approval." +msgstr "" +"men du har ikke ændret standard besked for \"Registrering fuldført\" under " +"\"WP-Members Dialoger og Fejlmeldinger.\" Du bør ændre denne besked så " +"brugerne ved at deres tilmelding afventer godkendelsel." + +#: includes/admin/dialogs.php:140 +msgid "You have turned on reCAPTCHA" +msgstr "Du har slået reCAPTCHA til" + +#: includes/admin/dialogs.php:141 +msgid "" +"but you have not entered API keys. You will need both a public and private " +"key. The CAPTCHA will not display unless a valid API key is included." +msgstr "" +"men du ikke har indtastet API nøgler. Du skal bruge både en offentlig og " +"privat nøgle. Den CAPTCHA vises ikke, medmindre at en gyldig API-nøgle er " +"inkluderet." + +#: includes/admin/dialogs.php:145 +msgid "You have active settings that are not recommended." +msgstr "" + +#: includes/admin/dialogs.php:146 +msgid "" +"If you will not be changing these settings, you can turn off these warning " +"messages by checking the \"Ignore warning messages\" in the settings below." +msgstr "" + +#: includes/admin/dialogs.php:174 +msgid "Version:" +msgstr "Version:" + +#: includes/admin/dialogs.php:175 +msgid "Quick Start Guide" +msgstr "" + +#: includes/admin/dialogs.php:176 +msgid "Online User Guide" +msgstr "" + +#: includes/admin/dialogs.php:177 +msgid "FAQs" +msgstr "" + +#: includes/admin/dialogs.php:184 +msgid "Thank you for using WP-Members" +msgstr "Thank you for using WP-Members" + +#: includes/admin/dialogs.php:185 +msgid "A plugin developed by" +msgstr "" + +#: includes/admin/dialogs.php:186 +msgid "Follow" +msgstr "Følg" + +#: includes/admin/dialogs.php:203 includes/admin/dialogs.php:207 +msgid "Latest from RocketGeek" +msgstr "" + +#: includes/admin/dialogs.php:224 +msgid "Like WP-Members?" +msgstr "" + +#: includes/admin/dialogs.php:225 +#, php-format +msgid "" +"If you like WP-Members please give it a %s★★★★★" +"%s rating. Thanks!!" +msgstr "" + +#: includes/admin/dialogs.php:236 includes/admin/dialogs.php:249 +msgid "Latest from ButlerBlog" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:67 +#, php-format +msgid "See the %sUsers Guide on CAPTCHA%s." +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:74 +#: includes/admin/tabs/class-wp-members-admin-tab-dialogs.php:57 +#: includes/admin/tabs/class-wp-members-admin-tab-emails.php:109 +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:134 +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:78 +msgid "Need help?" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:85 +msgid "Manage CAPTCHA Options" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:91 +msgid "CAPTCHA Type" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:96 +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:243 +msgid "reCAPTCHA v2" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:97 +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:244 +msgid "reCAPTCHA v3" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:98 +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:245 +msgid "Really Simple CAPTCHA" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:99 +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:246 +msgid "hCaptcha" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:106 +msgid "" +"CAPTCHA type was changed. Please verify and update the settings below for " +"the new CAPTCHA type." +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:117 +msgid "reCAPTCHA Keys" +msgstr "reCAPTCHA Keys" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:120 +#, php-format +msgid "" +"reCAPTCHA requires an API key, consisting of a \"site\" and a \"secret\" " +"key. You can sign up for a %s free reCAPTCHA key%s" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:122 +msgid "Site Key" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:123 +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:139 +msgid "Secret Key" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:133 +msgid "hCaptcha Keys" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:136 +#, php-format +msgid "" +"hCaptcha requires an API key. You can sign up for %s an hCaptcha API key " +"here %s" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:138 +msgid "API Key" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:170 +msgid "Characters for image" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:174 +msgid "Number of characters" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:178 +msgid "Image dimensions" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:179 +msgid "Width" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:179 +msgid "Height" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:182 +msgid "Font color of characters" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:186 +msgid "Background color of image" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:190 +msgid "Font size" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:194 +msgid "Width between characters" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:198 +msgid "Image type" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:213 +msgid "" +"To use Really Simple CAPTCHA, you must have the Really Simple CAPTCHA plugin " +"installed and activated." +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:241 +msgid "Update CAPTCHA Settings" +msgstr "Update CAPTCHA Settings" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:319 +msgid "CAPTCHA was updated for WP-Members" +msgstr "CAPTCHA er opdateret for WP-Members" + +#: includes/admin/tabs/class-wp-members-admin-tab-dialogs.php:67 +msgid "Dialogs and Error Messages" +msgstr "Dialoger og Fejlmeldinger" + +#: includes/admin/tabs/class-wp-members-admin-tab-dialogs.php:69 +#, php-format +msgid "" +"You can customize the text for dialogs and error messages. Simple HTML is " +"allowed %s etc." +msgstr "" +"Du kan tilpasse tekster til dialog og fejlmeldinger. Simpel HTML er tilladt " +"%s osv." + +#: includes/admin/tabs/class-wp-members-admin-tab-dialogs.php:80 +msgid "Terms of Service (TOS)" +msgstr "Vilkår for Deltagelse" + +#: includes/admin/tabs/class-wp-members-admin-tab-dialogs.php:87 +msgid "Update Dialogs" +msgstr "Opdater Dialoger" + +#: includes/admin/tabs/class-wp-members-admin-tab-dialogs.php:124 +msgid "WP-Members dialogs were updated" +msgstr "WP-Members dialoger er opdateret" + +#: includes/admin/tabs/class-wp-members-admin-tab-dropins.php:88 +#: includes/admin/tabs/class-wp-members-dropins-table.php:180 +msgid "WP-Members Dropin settings were updated" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-dropins.php:216 +msgid "Manage Dropins" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-dropins.php:217 +msgid "Current dropin folder: " +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-dropins.php:218 +msgid "" +"You can change location of the dropin folder using the " +"wpmem_dropin_folder filter." +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-emails.php:57 +msgid "Email Messages" +msgstr "Email Besked" + +#: includes/admin/tabs/class-wp-members-admin-tab-emails.php:60 +msgid "You can customize the content of the emails sent by the plugin." +msgstr "Du kan tilpasse indholdet af emails sendt fra denne plugin" + +#: includes/admin/tabs/class-wp-members-admin-tab-emails.php:62 +msgid "A list of shortcodes is available here." +msgstr "liste med shortcodes kan ses her." + +#: includes/admin/tabs/class-wp-members-admin-tab-emails.php:69 +msgid "Set a custom email address" +msgstr "Indsæt en gyldig Email-adresse" + +#: includes/admin/tabs/class-wp-members-admin-tab-emails.php:70 +#: includes/admin/tabs/class-wp-members-admin-tab-emails.php:74 +#: includes/admin/tabs/class-wp-members-admin-tab-emails.php:93 +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:163 +msgid "(optional)" +msgstr "(obligatorisk)" + +#: includes/admin/tabs/class-wp-members-admin-tab-emails.php:73 +msgid "Set a custom email name" +msgstr "Skriv dit email navn her" + +#: includes/admin/tabs/class-wp-members-admin-tab-emails.php:77 +msgid "Send HTML email" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-emails.php:93 +msgid "Email Signature" +msgstr "Email underskrift" + +#: includes/admin/tabs/class-wp-members-admin-tab-emails.php:101 +msgid "Update Emails" +msgstr "Opdater Emails" + +#: includes/admin/tabs/class-wp-members-admin-tab-emails.php:172 +msgid "WP-Members emails were updated" +msgstr "WP-Members emails er opdateret" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:93 +#: includes/class-wp-members-dialogs.php:65 +msgid "No fields selected for deletion" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:95 +msgid "Are you sure you want to delete the following fields?" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:122 +msgid "Fields deleted" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:136 +msgid "Field Manager Documentation" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:164 +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:315 +#: includes/class-wp-members-forms.php:1629 +#: includes/class-wp-members-forms.php:1821 +#: includes/class-wp-members-user-profile.php:181 +msgid "(required)" +msgstr "(påkrævet)" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:169 +msgid "Edit Field" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:169 +msgid "Add a Field" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:174 +msgid "Field Label" +msgstr "Felt Etiket" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:176 +msgid "The name of the field as it will be displayed to the user." +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:179 +#: includes/admin/tabs/class-wp-members-fields-table.php:58 +msgid "Meta Key" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:185 +msgid "" +"The database meta value for the field. It must be unique and contain no " +"spaces (underscores are ok)." +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:189 +#: includes/admin/tabs/class-wp-members-fields-table.php:59 +msgid "Field Type" +msgstr "Felt Type" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:195 +msgid "text" +msgstr "Tekst" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:196 +msgid "email" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:197 +msgid "textarea" +msgstr "Tekstfelt" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:198 +msgid "checkbox" +msgstr "Markeringsboks" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:199 +msgid "multiple checkbox" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:200 +msgid "select (dropdown)" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:201 +msgid "multiple select" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:202 +msgid "radio group" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:203 +msgid "password" +msgstr "Kodeord" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:204 +msgid "image" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:205 +msgid "file" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:206 +msgid "url" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:207 +msgid "number" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:208 +msgid "date" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:209 +msgid "hidden" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:211 +msgid "membership" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:217 +#: includes/admin/tabs/class-wp-members-fields-table.php:60 +msgid "Display?" +msgstr "Vis?" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:221 +msgid "This field is always displayed" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:226 +msgid "Required?" +msgstr "Obligatorisk?" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:230 +msgid "This field is always required" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:236 +msgid "Allow HTML?" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:243 +msgid "Placeholder" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:251 +msgid "Pattern" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:259 +msgid "Title" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:268 +msgid "Minimum Value" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:272 +msgid "Maximum Value" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:280 +msgid "Rows" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:284 +msgid "Columns" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:292 +msgid "Accepted file types:" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:297 +msgid "Accepted file types should be set like this: jpg|jpeg|png|gif" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:304 +msgid "Checked by default?" +msgstr "Markering?" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:308 +msgid "HTML label position" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:310 +msgid "Before the input tag" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:311 +msgid "After the input tag" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:312 +msgid "" +"Selecting \"after\" will generally display the label to the right of the " +"checkbox" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:315 +msgid "Stored value if checked:" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:336 +msgid "Stored values delimiter:" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:345 +msgid "Values (Displayed|Stored):" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:370 +msgid "Options should be Option Name|option_value," +msgstr "Valg skal skrives Valg Navn|valg_værdi," + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:374 +msgid "Visit plugin site for more information" +msgstr "Besøg Plugin Site for mere information" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:381 +msgid "Value" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:400 +msgid "Save Changes" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:400 +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:527 +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:528 +msgid "Add Field" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:402 +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:726 +msgid "Return to Fields Table" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:449 +msgid "Drag and drop to reorder fields" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:455 +msgid "Registration Date" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:458 +msgid "Registration IP" +msgstr "IP @ registration" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:459 +msgid "Subscription Type" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:495 +msgid "Manage Fields" +msgstr "Administrer Felter" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:595 +msgid "WP-Members fields were updated" +msgstr "WP-Members felter er opdateret" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:617 +msgid "Field Label is required. Nothing was updated." +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:618 +msgid "Meta Key is required. Nothing was updated." +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:620 +msgid "Meta Key must contain only letters, numbers, and underscores" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:627 +msgid "A field with that meta key already exists" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:632 +#, php-format +msgid "" +"Sorry, \"%s\" is a reserved term. " +"Field was not added." +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:673 +msgid "Checked value is required for checkboxes. Nothing was updated." +msgstr "" +"Felt-etikette er nødvendig for at tilføje et nyt felt. Intet er ændret." + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:705 +msgid "A value is required for hidden fields. Nothing was updated." +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:712 +#, php-format +msgid "%s was added" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:725 +#, php-format +msgid "%s was updated" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:768 +msgid "Form field order updated." +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:56 +#, php-format +msgid "%sChange%s or %sFilter%s this address" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:57 +#, php-format +msgid "See the %sUsers Guide on plugin options%s." +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:90 +msgid "Manage Options" +msgstr "Administrer Valgmuligheder" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:94 +msgid "Content" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:105 +msgid "Content Restriction" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:109 +msgid "Do not restrict" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:123 +msgid "Show Excerpts" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:124 +msgid "Show Login Form" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:125 +msgid "Show Registration Form" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:126 +msgid "Auto Excerpt:" +msgstr "Vis Uddrag" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:148 +msgid "Number of words in excerpt:" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:149 +msgid "Custom read more link (optional):" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:163 +msgid "Time-based expiration" +msgstr "Time-based expiration" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:163 +msgid "Allows for access to expire" +msgstr "Allows for access to expire" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:164 +msgid "Trial period" +msgstr "Prøveperiode" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:164 +msgid "Allows for a trial period" +msgstr "Tillader en prøveperiode" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:166 +msgid "Subscription Settings" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:176 +msgid "New Feature Settings" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:182 +msgid "Legacy Password Reset" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:182 +#, php-format +msgid "Use legacy password reset. %s(Requires additional configuration)%s" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:184 +msgid "Legacy Login Error" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:184 +msgid "Use legacy WP-Members login error instead of WP error object." +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:187 +msgid "WooCommerce My Account" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:187 +msgid "Add WP-Members fields to WooCommerce My Account registration" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:188 +msgid "WooCommerce Checkout" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:188 +msgid "Add WP-Members fields to WooCommerce registration during checkout" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:204 +msgid "Other Settings" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:214 +msgid "Enable memberships" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:214 +#, php-format +msgid "Enables creation of different %s membership products %s" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:215 +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:223 +msgid "Clone menus" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:215 +msgid "Enables logged in menus" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:216 +msgid "Notify admin" +msgstr "Underret Admin" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:216 +#, php-format +msgid "Notify %s for each new registration? %s" +msgstr "Send email til %s for hver ny registrering? %s" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:217 +msgid "Moderate registration" +msgstr "Rediger registrering" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:217 +msgid "Holds new registrations for admin approval" +msgstr "Tilbageholder nye registreringer for godkendelse fra Admin" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:218 +msgid "Confirmation Link" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:218 +#, php-format +msgid "" +"Send email confirmation link on new registration. %s(Requires additional " +"configuration)%s" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:219 +msgid "Ignore warning messages" +msgstr "Ignorer advarsels-beskeder" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:219 +msgid "Ignores WP-Members warning messages in the admin panel" +msgstr "Ignorerer WP-Members advarsels-beskeder i administrationspanelet" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:233 +msgid "Attribution" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:235 +msgid "" +"Attribution is appreciated! Display \"powered by\" link on register form?" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:238 +msgid "Enable CAPTCHA for Registration" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:253 +msgid "Login Page:" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:256 +msgid "Specify a login page (optional)" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:265 +msgid "Register Page:" +msgstr "Register Page:" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:268 +msgid "For creating a register link in the login form" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:277 +msgid "User Profile Page:" +msgstr "Brugeren Profil Sider" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:280 +msgid "For creating a forgot password link in the login form" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:286 +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:288 +msgid "Stylesheet" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:297 +msgid "Custom Stylesheet:" +msgstr "Custom Stylesheet:" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:302 +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:329 +msgid "Update Settings" +msgstr "Opdater Indstillinger" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:310 +msgid "Custom Post Types" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:316 +msgid "Add to WP-Members Settings" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:332 +msgid "" +"Please keep in mind that Custom Post Types are \"custom\" and therefore, not " +"all of them will function exactly the same way. WP-Members will certainly " +"work with any post type that operate like a post or a page; but you will " +"need to review any custom post type added to determine that it functions the " +"way you expect." +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:342 +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:343 +msgid "WP-Members Settings" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:344 +msgid "" +"The following is your WP-Members settings information if needed for support." +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:378 +msgid "Click to Copy" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:458 +msgid "Custom Post Type settings were updated" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:579 +msgid "WP-Members settings were updated" +msgstr "WP-Member indstillinger er opdateret" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:651 +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:682 +msgid "USE CUSTOM URL BELOW" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:671 +msgid "Select a page" +msgstr "vælg en sider" + +#: includes/admin/tabs/class-wp-members-dropins-table.php:70 +msgid "Name" +msgstr "" + +#: includes/admin/tabs/class-wp-members-dropins-table.php:71 +msgid "Enabled" +msgstr "" + +#: includes/admin/tabs/class-wp-members-dropins-table.php:72 +msgid "File" +msgstr "" + +#: includes/admin/tabs/class-wp-members-dropins-table.php:73 +msgid "Version" +msgstr "" + +#: includes/admin/tabs/class-wp-members-dropins-table.php:74 +#: includes/walkers/class-wp-members-walker-nav-menu.php:186 +msgid "Description" +msgstr "" + +#: includes/admin/tabs/class-wp-members-dropins-table.php:117 +#: includes/admin/tabs/class-wp-members-fields-table.php:108 +msgid "Save Settings" +msgstr "" + +#: includes/admin/tabs/class-wp-members-fields-table.php:43 +msgid "delete" +msgstr "" + +#: includes/admin/tabs/class-wp-members-fields-table.php:57 +msgid "Display Label" +msgstr "" + +#: includes/admin/tabs/class-wp-members-fields-table.php:61 +msgid "Required" +msgstr "" + +#: includes/admin/tabs/class-wp-members-fields-table.php:63 +msgid "Users Screen" +msgstr "" + +#: includes/admin/tabs/class-wp-members-fields-table.php:64 +msgid "Users Search" +msgstr "" + +#: includes/admin/tabs/class-wp-members-fields-table.php:66 +msgid "Sort" +msgstr "" + +#: includes/admin/tabs/class-wp-members-fields-table.php:107 +msgid "Delete Selected" +msgstr "" + +#: includes/api/api-forms.php:584 +#, php-format +msgid "%s is a required field." +msgstr "" + +#: includes/class-wp-members-captcha.php:276 includes/deprecated.php:401 +msgid "You have entered an incorrect code value. Please try again." +msgstr "" + +#: includes/class-wp-members-dialogs.php:41 +msgid "First Name" +msgstr "Fornavn" + +#: includes/class-wp-members-dialogs.php:42 +msgid "Last Name" +msgstr "Efternavn" + +#: includes/class-wp-members-dialogs.php:43 +msgid "Address 1" +msgstr "Adresse1" + +#: includes/class-wp-members-dialogs.php:44 +msgid "Address 2" +msgstr "Adresse2" + +#: includes/class-wp-members-dialogs.php:45 +msgid "City" +msgstr "By" + +#: includes/class-wp-members-dialogs.php:46 +msgid "State" +msgstr "Region" + +#: includes/class-wp-members-dialogs.php:47 +msgid "Zip" +msgstr "Postnr" + +#: includes/class-wp-members-dialogs.php:48 +msgid "Country" +msgstr "Land" + +#: includes/class-wp-members-dialogs.php:49 +msgid "Day Phone" +msgstr "Telefon" + +#: includes/class-wp-members-dialogs.php:50 +#: includes/class-wp-members-dialogs.php:92 +msgid "Email" +msgstr "Email" + +#: includes/class-wp-members-dialogs.php:51 +msgid "Confirm Email" +msgstr "" + +#: includes/class-wp-members-dialogs.php:52 +msgid "Website" +msgstr "Website" + +#: includes/class-wp-members-dialogs.php:53 +msgid "Biographical Info" +msgstr "Biographical Info" + +#: includes/class-wp-members-dialogs.php:54 +#: includes/class-wp-members-dialogs.php:74 +#: includes/class-wp-members-dialogs.php:159 +msgid "Password" +msgstr "Kodeord" + +#: includes/class-wp-members-dialogs.php:55 +msgid "Confirm Password" +msgstr "" + +#: includes/class-wp-members-dialogs.php:56 +#: includes/class-wp-members-forms.php:2165 +msgid "TOS" +msgstr "VfD" + +#: includes/class-wp-members-dialogs.php:66 +msgid "You are not logged in." +msgstr "Du er ikke logget ind." + +#: includes/class-wp-members-dialogs.php:72 +msgid "Existing Users Log In" +msgstr "Logge Ind" + +#: includes/class-wp-members-dialogs.php:73 +#: includes/class-wp-members-dialogs.php:158 +msgid "Username or Email" +msgstr "" + +#: includes/class-wp-members-dialogs.php:75 +#: includes/class-wp-members-shortcodes.php:773 +msgid "Log In" +msgstr "Logge ind" + +#: includes/class-wp-members-dialogs.php:76 +msgid "Remember Me" +msgstr "" + +#: includes/class-wp-members-dialogs.php:77 +msgid "Forgot password?" +msgstr "Glemt Kodeord?" + +#: includes/class-wp-members-dialogs.php:78 +msgid "Click here to reset" +msgstr "Klik her for at nulstille" + +#: includes/class-wp-members-dialogs.php:79 +msgid "New User?" +msgstr "Ny Bruger" + +#: includes/class-wp-members-dialogs.php:80 +msgid "Click here to register" +msgstr "Klik her for at registrere" + +#: includes/class-wp-members-dialogs.php:83 +#: includes/class-wp-members-dialogs.php:142 +msgid "Change Password" +msgstr "Skift Kodeord" + +#: includes/class-wp-members-dialogs.php:84 +msgid "New password" +msgstr "" + +#: includes/class-wp-members-dialogs.php:85 +msgid "Confirm new password" +msgstr "" + +#: includes/class-wp-members-dialogs.php:86 +msgid "Update Password" +msgstr "Opdater Kodeord" + +#: includes/class-wp-members-dialogs.php:87 +msgid "Password successfully changed!" +msgstr "" + +#: includes/class-wp-members-dialogs.php:90 +msgid "Reset Forgotten Password" +msgstr "Nulstil glemt Kodeord" + +#: includes/class-wp-members-dialogs.php:93 +msgid "Reset Password" +msgstr "Nulstil Kodeord" + +#: includes/class-wp-members-dialogs.php:94 +msgid "Forgot username?" +msgstr "" + +#: includes/class-wp-members-dialogs.php:95 +msgid "Click here" +msgstr "" + +#: includes/class-wp-members-dialogs.php:98 +#: includes/class-wp-members-dialogs.php:100 +msgid "Retrieve username" +msgstr "" + +#: includes/class-wp-members-dialogs.php:99 +msgid "Email Address" +msgstr "" + +#: includes/class-wp-members-dialogs.php:103 +msgid "New User Registration" +msgstr "Ny Bruger Registrering" + +#: includes/class-wp-members-dialogs.php:104 +msgid "Choose a Username" +msgstr "Vælg et Brugernavn" + +#: includes/class-wp-members-dialogs.php:105 +msgid "Input the code:" +msgstr "" + +#: includes/class-wp-members-dialogs.php:106 +#: includes/class-wp-members-forms.php:2164 +#, php-format +msgid "Please indicate that you agree to the %s Terms of Service %s" +msgstr "" + +#: includes/class-wp-members-dialogs.php:107 +msgid "Reset Form" +msgstr "" + +#: includes/class-wp-members-dialogs.php:108 +#: includes/class-wp-members-dialogs.php:162 +#: includes/class-wp-members-shortcodes.php:770 +#: includes/class-wp-members-user.php:186 +msgid "Register" +msgstr "Registrer" + +#: includes/class-wp-members-dialogs.php:110 +msgid "Required field" +msgstr "Obligatorisk felt" + +#: includes/class-wp-members-dialogs.php:113 +msgid "Edit Your Information" +msgstr "Rediger dine Oplysninger" + +#: includes/class-wp-members-dialogs.php:115 +msgid "Update Profile" +msgstr "Opdater Profil" + +#: includes/class-wp-members-dialogs.php:116 +msgid "Update this file" +msgstr "" + +#: includes/class-wp-members-dialogs.php:119 +msgid "Login Failed!" +msgstr "Log på fejlede!" + +#: includes/class-wp-members-dialogs.php:120 +msgid "You entered an invalid username or password." +msgstr "Du har skrevet forkert Brugernavn eller Kodeord." + +#: includes/class-wp-members-dialogs.php:121 +msgid "Click here to continue." +msgstr "Klik her for at fortsætte." + +#: includes/class-wp-members-dialogs.php:122 +msgid "Password fields cannot be empty" +msgstr "Kodeordsfelt må ikke være tomt" + +#: includes/class-wp-members-dialogs.php:123 +msgid "Sorry, that email address was not found." +msgstr "" + +#: includes/class-wp-members-dialogs.php:124 +#, php-format +msgid "An email was sent to %s with your username." +msgstr "" + +#: includes/class-wp-members-dialogs.php:125 +#, php-format +msgid "Sorry, %s is a required field." +msgstr "%s skal udfyldes, er et obligatorisk felt." + +#: includes/class-wp-members-dialogs.php:126 +msgid "You must enter a valid email address." +msgstr "Du skal indtaste en gyldig Email-adresse. " + +#: includes/class-wp-members-dialogs.php:127 +msgid "The username cannot include non-alphanumeric characters." +msgstr "Brugernavn må kun indeholde bogstaver." + +#: includes/class-wp-members-dialogs.php:128 +msgid "Sorry, username is a required field" +msgstr "Brugernavn skal udfyldes, er et obligatorisk felt" + +#: includes/class-wp-members-dialogs.php:129 +msgid "Sorry, that username is taken, Please try another." +msgstr "" + +#: includes/class-wp-members-dialogs.php:130 +msgid "Sorry, that email address already has an account. Please try another." +msgstr "" + +#: includes/class-wp-members-dialogs.php:131 +#: includes/class-wp-members-dialogs.php:174 +msgid "Passwords did not match." +msgstr "Adgangskoder matcher ikke." + +#: includes/class-wp-members-dialogs.php:132 +msgid "Emails did not match." +msgstr "Emails matchede ikke." + +#: includes/class-wp-members-dialogs.php:133 +msgid "You must complete the CAPTCHA form." +msgstr "Du skal færdiggøre CAPTCHA skemaet." + +#: includes/class-wp-members-dialogs.php:134 +msgid "CAPTCHA was not valid." +msgstr "" + +#: includes/class-wp-members-dialogs.php:135 +msgid "There was an error processing the form." +msgstr "Der var en fejl under behandling formularen." + +#: includes/class-wp-members-dialogs.php:136 +msgid "There was an error with the CAPTCHA form." +msgstr "Der opstod en fejl in CAPTCHA skemaet." + +#: includes/class-wp-members-dialogs.php:137 +#, php-format +msgid "" +"Sorry, you can only upload the following file types for the %s field: %s." +msgstr "" + +#: includes/class-wp-members-dialogs.php:138 +#: includes/class-wp-members-dialogs.php:171 +msgid "Your information was updated!" +msgstr "Dine Oplysninger er blevet opdateret!" + +#: includes/class-wp-members-dialogs.php:141 +msgid "Edit My Information" +msgstr "Rediger mine info" + +#: includes/class-wp-members-dialogs.php:143 +#: includes/class-wp-members-dialogs.php:146 +#: includes/class-wp-members-dialogs.php:148 +#: includes/class-wp-members-dialogs.php:153 +#, php-format +msgid "You are logged in as %s" +msgstr "Du er logget på som %s" + +#: includes/class-wp-members-dialogs.php:144 +msgid "Log out" +msgstr "" + +#: includes/class-wp-members-dialogs.php:145 +msgid "Edit profile" +msgstr "" + +#: includes/class-wp-members-dialogs.php:145 +msgid "Begin using the site." +msgstr "Begynd at bruge sitet" + +#: includes/class-wp-members-dialogs.php:147 +msgid "Click to log out" +msgstr "Klik for at logge ud" + +#: includes/class-wp-members-dialogs.php:149 +msgid "click to log out" +msgstr "klik for at logge ud" + +#: includes/class-wp-members-dialogs.php:150 +msgid "Log Out" +msgstr "" + +#: includes/class-wp-members-dialogs.php:154 +msgid "click here to log out" +msgstr "Klik her for at logge ud" + +#: includes/class-wp-members-dialogs.php:155 +msgid "Login Failed!
    You entered an invalid username or password." +msgstr "Log på fejlede!
    Forkert Brugernavn eller Kodeord." + +#: includes/class-wp-members-dialogs.php:156 +msgid "Invalid username or password." +msgstr "" + +#: includes/class-wp-members-dialogs.php:160 includes/class-wp-members.php:1745 +msgid "log in" +msgstr "logge ind" + +#: includes/class-wp-members-dialogs.php:161 +msgid "Forgot?" +msgstr "Glemt?" + +#: includes/class-wp-members-dialogs.php:165 +msgid "" +"This content is restricted to site members. If you are an existing user, " +"please log in. New users may register below." +msgstr "" +"Dette er en lukket Brugerside. Hvis du er registreret bruger kan du logge på " +"ellers må du lade dig registrere." + +#: includes/class-wp-members-dialogs.php:166 +msgid "" +"Congratulations! Your registration was successful.

    You may now " +"log in using the password that was emailed to you." +msgstr "" +"Tillykke din registrering er gennemført.

    Du kan nu logge på ved " +"hjælp af det Kodeord som er blevet sendt til dig." + +#: includes/class-wp-members-dialogs.php:169 +msgid "Sorry, that username is taken, please try another." +msgstr "Dette Brugernavn er taget. Prøv et andet." + +#: includes/class-wp-members-dialogs.php:170 +msgid "" +"Sorry, that email address already has an account.
    Please try another." +msgstr "" +"Denne Email-adresse er allerede tilknyttet en bruger.
    Prøv en anden." + +#: includes/class-wp-members-dialogs.php:175 +msgid "Password successfully changed." +msgstr "" + +#: includes/class-wp-members-dialogs.php:176 +msgid "Invalid username or email address." +msgstr "" + +#: includes/class-wp-members-dialogs.php:177 +msgid "" +"Password successfully reset! An email containing a new password has been " +"sent to the email address on file for your account." +msgstr "" + +#: includes/class-wp-members-dialogs.php:178 +msgid "" +"Reset request received. An email with instructions to complete the password " +"reset has been sent." +msgstr "" + +#: includes/class-wp-members-dialogs.php:180 +msgid "This content requires the following membership: " +msgstr "" + +#: includes/class-wp-members-dialogs.php:181 +msgid "This content requires one of the following memberships: " +msgstr "" + +#: includes/class-wp-members-forms.php:84 +#: includes/class-wp-members-forms.php:350 +msgid "Choose membership" +msgstr "" + +#: includes/class-wp-members-forms.php:1898 +#: includes/class-wp-members-user-profile.php:510 +msgid "Activate this user?" +msgstr "Aktiver denne bruger?" + +#: includes/class-wp-members-forms.php:2165 templates/tos.php:20 +msgid "Terms of Service" +msgstr "Vilkår for Deltagelse" + +#: includes/class-wp-members-menus.php:131 +msgid "Display" +msgstr "" + +#: includes/class-wp-members-menus.php:139 +msgid "Logged In Users" +msgstr "" + +#: includes/class-wp-members-menus.php:146 +msgid "Logged Out Users" +msgstr "" + +#: includes/class-wp-members-menus.php:153 +msgid "All Users" +msgstr "" + +#: includes/class-wp-members-menus.php:167 +#, php-format +msgid "%sAdd membership products%s to restrict menu to a membership" +msgstr "" + +#: includes/class-wp-members-menus.php:169 +msgid "Restrict menu item to a membership product" +msgstr "" + +#: includes/class-wp-members-products.php:342 +#, php-format +msgid "All %s" +msgstr "" + +#: includes/class-wp-members-products.php:343 +#, php-format +msgid "Add New %s" +msgstr "" + +#: includes/class-wp-members-products.php:344 +msgid "Add New" +msgstr "Tilføj Ny" + +#: includes/class-wp-members-products.php:345 +#, php-format +msgid "New %s" +msgstr "" + +#: includes/class-wp-members-products.php:346 +#, php-format +msgid "Edit %s" +msgstr "" + +#: includes/class-wp-members-products.php:347 +#, php-format +msgid "Update %s" +msgstr "" + +#: includes/class-wp-members-products.php:348 +#: includes/class-wp-members-products.php:349 +#, php-format +msgid "View %s" +msgstr "" + +#: includes/class-wp-members-products.php:350 +#, php-format +msgid "Search %s" +msgstr "" + +#: includes/class-wp-members-products.php:351 +msgid "Not found" +msgstr "" + +#: includes/class-wp-members-products.php:352 +msgid "Not found in Trash" +msgstr "" + +#: includes/class-wp-members-products.php:353 +msgid "Insert into item" +msgstr "" + +#: includes/class-wp-members-products.php:354 +#, php-format +msgid "Save %s Details" +msgstr "" + +#: includes/class-wp-members-products.php:355 +msgid "Membership Attributes" +msgstr "" + +#: includes/class-wp-members-products.php:358 +msgid "Membership Product" +msgstr "" + +#: includes/class-wp-members-products.php:359 +msgid "WP-Members Membership Products" +msgstr "" + +#: includes/class-wp-members-pwd-reset.php:35 +#: includes/class-wp-members-pwd-reset.php:36 +msgid "" +"Sorry, no password reset key was found. Please check your email and try " +"again." +msgstr "" + +#: includes/class-wp-members-pwd-reset.php:37 +msgid "Sorry, the password reset key is expired." +msgstr "" + +#: includes/class-wp-members-pwd-reset.php:167 +msgid "The passwords do not match." +msgstr "" + +#: includes/class-wp-members-shortcodes.php:134 +msgid "" +"This is a generic message to display the form message dialog in the " +"Customizer." +msgstr "" + +#: includes/class-wp-members-shortcodes.php:699 +msgid "Click here to log out." +msgstr "" + +#: includes/class-wp-members-user-profile.php:58 +msgid "WP-Members Additional Fields" +msgstr "WP-Members Ekstra Felter" + +#: includes/class-wp-members-user-profile.php:58 +msgid "Additional Information" +msgstr "Yderligere Information" + +#: includes/class-wp-members-user-profile.php:500 +msgid "Reactivate this user?" +msgstr "Genaktivere denne bruger?" + +#: includes/class-wp-members-user-profile.php:505 +msgid "Deactivate this user?" +msgstr "Deactivate this user?" + +#: includes/class-wp-members-user-profile.php:559 +msgid "IP @ registration" +msgstr "IP @ registration" + +#: includes/class-wp-members-user.php:1171 +msgid "ERROR: User has not been activated." +msgstr "" + +#: includes/class-wp-members-validation-link.php:32 +msgid "Click to validate your account: " +msgstr "" + +#: includes/class-wp-members-validation-link.php:33 +msgid "Thank you for validating your account." +msgstr "" + +#: includes/class-wp-members-validation-link.php:34 +msgid "Validation key was expired or invalid" +msgstr "" + +#: includes/class-wp-members-validation-link.php:35 +msgid "Your account is now pending approval" +msgstr "" + +#: includes/class-wp-members-validation-link.php:284 +msgid "ERROR: User has not confirmed their account." +msgstr "" + +#: includes/class-wp-members-widget.php:24 +msgid "Displays the WP-Members sidebar login." +msgstr "" + +#: includes/class-wp-members-widget.php:39 +#: includes/class-wp-members-widget.php:82 +msgid "Login Status" +msgstr "Log Status" + +#: includes/class-wp-members-widget.php:46 +msgid "Title:" +msgstr "Titel:" + +#: includes/class-wp-members-widget.php:50 +msgid "Redirect to (optional):" +msgstr "" + +#: includes/class-wp-members.php:1087 includes/class-wp-members.php:1098 +msgid "You must be logged in to view this content." +msgstr "" + +#: includes/class-wp-members.php:1104 +msgid "The page you are looking for does not exist" +msgstr "" + +#: includes/class-wp-members.php:1352 +#, php-format +msgid "" +"You have a linked page in the WP-Members page settings that corresponds to a " +"post ID that no longer exists. Please %s review and update the %s page " +"settings %s." +msgstr "" + +#: includes/class-wp-members.php:1472 +msgid "Show forms as logged out" +msgstr "" + +#: includes/class-wp-members.php:1481 +msgid "Show form message dialog" +msgstr "" + +#: includes/class-wp-members.php:1558 +msgid "(more…)" +msgstr "(mere…)" + +#: includes/class-wp-members.php:1746 +msgid "log out" +msgstr "" + +#: includes/cli/class-wp-members-cli-user.php:24 +#: includes/cli/class-wp-members-cli-user.php:62 +msgid "Moderated registration is not enabled in WP-Members options." +msgstr "" + +#: includes/cli/class-wp-members-cli-user.php:35 +msgid "User activated." +msgstr "" + +#: includes/cli/class-wp-members-cli-user.php:37 +msgid "Email notification sent to user." +msgstr "" + +#: includes/cli/class-wp-members-cli-user.php:40 +msgid "User is already activated." +msgstr "" + +#: includes/cli/class-wp-members-cli-user.php:67 +msgid "User deactivated." +msgstr "" + +#: includes/cli/class-wp-members-cli-user.php:88 +msgid "Invalid user ID. Please specify a valid user. Try `wp user list`." +msgstr "" + +#: includes/cli/class-wp-members-cli-user.php:91 +msgid "No user id specified. Must specify user id as --id=123" +msgstr "" + +#: includes/cli/class-wp-members-cli-user.php:208 +#, php-format +msgid "User: %s" +msgstr "" + +#: includes/cli/class-wp-members-cli-user.php:248 +#, php-format +msgid "User role: %s" +msgstr "" + +#: includes/deprecated.php:373 +msgid "We were unable to validate the public key." +msgstr "Det var ikke muligt at validere den offentlige nøgle." + +#: includes/deprecated.php:377 +msgid "We were unable to validate the private key." +msgstr "Det var ikke muligt at validere den private nøgle." + +#: includes/deprecated.php:381 +msgid "The challenge parameter of the verify script was incorrect." +msgstr "The challenge parameter of the verify script was incorrect." + +#: includes/deprecated.php:385 +msgid "The CAPTCHA solution was incorrect." +msgstr "CAPTCHA løsningen er ikke fuldstændig." + +#: includes/deprecated.php:389 +msgid "The parameters to verify were incorrect" +msgstr "Verificierings-parametrene er forkerte" + +#: includes/deprecated.php:393 +msgid "" +"reCAPTCHA API keys are tied to a specific domain name for security reasons." +msgstr "" +"Af sikkerhedsmæssige årsager er reCAPTCHA API nøglen er tilknyttet et " +"specifikt domænenavn." + +#: includes/deprecated.php:397 +msgid "The reCAPTCHA server was not reached. Please try to resubmit." +msgstr "reCAPTCHA serveren blev ikke tilsluttet. Prøv igen." + +#. translators: %s: title of menu item which is invalid +#: includes/walkers/class-wp-members-walker-nav-menu.php:92 +#, php-format +msgid "%s (Invalid)" +msgstr "" + +#. translators: %s: title of menu item in draft status +#: includes/walkers/class-wp-members-walker-nav-menu.php:96 +#, php-format +msgid "%s (Pending)" +msgstr "" + +#: includes/walkers/class-wp-members-walker-nav-menu.php:123 +msgid "Move up" +msgstr "" + +#: includes/walkers/class-wp-members-walker-nav-menu.php:136 +msgid "Move down" +msgstr "" + +#: includes/walkers/class-wp-members-walker-nav-menu.php:138 +msgid "Edit Menu Item" +msgstr "" + +#: includes/walkers/class-wp-members-walker-nav-menu.php:149 +msgid "URL" +msgstr "" + +#: includes/walkers/class-wp-members-walker-nav-menu.php:156 +msgid "Navigation Label" +msgstr "" + +#: includes/walkers/class-wp-members-walker-nav-menu.php:162 +msgid "Title Attribute" +msgstr "" + +#: includes/walkers/class-wp-members-walker-nav-menu.php:169 +msgid "Open link in a new window/tab" +msgstr "" + +#: includes/walkers/class-wp-members-walker-nav-menu.php:174 +msgid "CSS Classes (optional)" +msgstr "" + +#: includes/walkers/class-wp-members-walker-nav-menu.php:180 +msgid "Link Relationship (XFN)" +msgstr "" + +#: includes/walkers/class-wp-members-walker-nav-menu.php:188 +msgid "" +"The description will be displayed in the menu if the current theme supports " +"it." +msgstr "" + +#: includes/walkers/class-wp-members-walker-nav-menu.php:210 +#, php-format +msgid "Original: %s" +msgstr "" + +#: includes/walkers/class-wp-members-walker-nav-menu.php:223 +msgid "Remove" +msgstr "" + +#: templates/tos.php:32 +#, php-format +msgid "%sclose%s" +msgstr "%sluk%s" + +#: templates/tos.php:34 +#, php-format +msgid "%sprint%s" +msgstr "%sudskriv%s" + +#. Plugin Name of the plugin/theme +msgid "WP-Members" +msgstr "WP-Members" + +#. Plugin URI of the plugin/theme +msgid "https://rocketgeek.com" +msgstr "" + +#. Description of the plugin/theme +msgid "" +"WP access restriction and user registration. For more information on plugin " +"features, refer to the online Users Guide. A Quick Start Guide is also available. WP-" +"Members(tm) is a trademark of butlerblog.com." +msgstr "" + +#. Author of the plugin/theme +msgid "Chad Butler" +msgstr "" + +#. Author URI of the plugin/theme +msgid "https://butlerblog.com/" +msgstr "" + +#~ msgid "Block" +#~ msgstr "Bloker" + +#~ msgid "Manage reCAPTCHA Options" +#~ msgstr "Administrer reCAPTCHA Valg" + +#~ msgid "" +#~ "reCAPTCHA is a free, accessible CAPTCHA service that helps to digitize " +#~ "books while blocking spam on your blog." +#~ msgstr "" +#~ "reCAPTCHA is a free, accessible CAPTCHA service that helps to digitize " +#~ "books while blocking spam on your blog." + +#, php-format +#~ msgid "" +#~ "reCAPTCHA asks commenters to retype two words scanned from a book to " +#~ "prove that they are a human. This verifies that they are not a spambot " +#~ "while also correcting the automatic scans of old books. So you get less " +#~ "spam, and the world gets accurately digitized books. Everybody wins! For " +#~ "details, visit the %s reCAPTCHA website%s" +#~ msgstr "" +#~ "reCAPTCHA asks commenters to retype two words scanned from a book to " +#~ "prove that they are a human. This verifies that they are not a spambot " +#~ "while also correcting the automatic scans of old books. So you get less " +#~ "spam, and the world gets accurately digitized books. Everybody wins! For " +#~ "details, visit the %s reCAPTCHA website%s" + +#, php-format +#~ msgid "" +#~ "reCAPTCHA requires an API key, consisting of a \"public\" and a \"private" +#~ "\" key. You can sign up for a %s free reCAPTCHA key%s" +#~ msgstr "" +#~ "reCAPTCHA requires an API key, consisting of a \"public\" and a \"private" +#~ "\" key. You can sign up for a %s free reCAPTCHA key%s" + +#~ msgid "Public Key" +#~ msgstr "Public Key" + +#~ msgid "Private Key" +#~ msgstr "Private Key" + +#~ msgid "Choose Theme" +#~ msgstr "Choose Theme" + +#~ msgid "Red" +#~ msgstr "Rød" + +#~ msgid "White" +#~ msgstr "Hvid" + +#~ msgid "Black Glass" +#~ msgstr "Sort Glas" + +#~ msgid "Clean" +#~ msgstr "Ren" + +#~ msgid "Active" +#~ msgstr "Aktiver" + +#~ msgid "Enable CAPTCHA" +#~ msgstr "Muliggøre CAPTCHA" + +#~ msgid "Passwords did not match.

    Please try again." +#~ msgstr "Kodeordene er ikke ens.

    Prøv igen." + +#~ msgid "Either the username or email address do not exist in our records." +#~ msgstr "Brugernavn eller Email-adresse eksisterer ikke i databasen." + +#~ msgid "Click to log out." +#~ msgstr "Klik for at logge ud." + +#~ msgid "You have set WP-Members to turn off the registration process" +#~ msgstr "Du har sat WP-Members til at afbryde registreringsprocessen" + +#~ msgid "" +#~ "but you also set to moderate and/or email admin new registrations. You " +#~ "will need to set up a registration page for users to register." +#~ msgstr "" +#~ "men du skal også ændre og / eller e-mail admin for nye registreringer. Du " +#~ "skal oprette en registreringsside for brugere." + +#~ msgid "Field Label is required for adding a new field. Nothing was updated." +#~ msgstr "" +#~ "Felt-etikette er nødvendig for at tilføje et nyt felt. Intet er ændret." + +#~ msgid "Option Name is required for adding a new field. Nothing was updated." +#~ msgstr "" +#~ "Valgt Navn er nødvendigt for at tilføje et nyt felt. Intet er ændret." + +#~ msgid "field was added" +#~ msgstr "Felt Etiket" + +#~ msgid "field was updated" +#~ msgstr "WP-Members felter er opdateret" + +#~ msgid "Option Name" +#~ msgstr "Valgt Navn" + +#~ msgid "For dropdown, array of values:" +#~ msgstr "Til Dropdown, tabel med valg:" + +#~ msgid "" +#~ "Determine which fields will display and which are required. This " +#~ "includes all fields, both native WP fields and WP-Members custom fields." +#~ msgstr "" +#~ "Beslut hvilke felter der skal vises og hvilke der er obligatoriske. Dette " +#~ "inkluderer både almindelige WP felter og WP-Member felter" + +#~ msgid "(Note: Email is always mandatory and cannot be changed.)" +#~ msgstr "(Bemærk: Email er altid obligatorisk - og kan ikke ændres.)" + +#~ msgid "Add/Delete" +#~ msgstr "Tilføj/Slet" + +#~ msgid "Checked?" +#~ msgstr "Markering?" + +#~ msgid "Delete" +#~ msgstr "Slet" + +#~ msgid "(Email cannot be removed)" +#~ msgstr "(Email kan ikke slettes)" + +#~ msgid "Update Fields" +#~ msgstr "Opdater Felter" + +#~ msgid "Please indicate that you agree to the %s TOS %s" +#~ msgstr "Marker at du accepterer %sVilkår for Deltagelse %s" + +#~ msgid "dropdown" +#~ msgstr "Dropdown" + +#~ msgid "Block Posts by default" +#~ msgstr "Bloker Poster som standard" + +#~ msgid "" +#~ "Note: Posts can still be individually blocked or unblocked at the article " +#~ "level" +#~ msgstr "" +#~ "Bemærk: Poster kan stadig blokeres eller frigives individuelt under " +#~ "redigering" + +#~ msgid "Block Pages by default" +#~ msgstr "Bloker Sider som standard" + +#~ msgid "" +#~ "Note: Pages can still be individually blocked or unblocked at the article " +#~ "level" +#~ msgstr "" +#~ "Bemærk: Sider kan stadig blokeres eller frigives individuelt under " +#~ "redigering" + +#~ msgid "Show excerpts" +#~ msgstr "Vis Uddrag" + +#~ msgid "" +#~ "Shows excerpted content above the login/registration on both Posts and " +#~ "Pages" +#~ msgstr "Vis uddrag inden Log på / Registrering af både Poster og Sider" + +#~ msgid "Turns on CAPTCHA for registration" +#~ msgstr "Slår CAPTCHA til under registrering" + +#~ msgid "Hide registration" +#~ msgstr "Skjul Registrering" + +#~ msgid "Optional" +#~ msgstr "Valgfrit" + +#~ msgid "AIM" +#~ msgstr "AIM" + +#~ msgid "Yahoo IM" +#~ msgstr "Yahoo IM" + +#~ msgid "Jabber/Google Talk" +#~ msgstr "Jabber/Google Talk" + +#~ msgid "" +#~ "Password successfully changed!

    You will need to re-login with " +#~ "your new password." +#~ msgstr "" +#~ "Kodeordet er nu ændret!

    Du bliver nød til at logge på igen med " +#~ "dit nye Kodeord." + +#~ msgid "" +#~ "Password successfully reset!

    An email containing a new " +#~ "password has been sent to the email address on file for your account. You " +#~ "may change this random password then re-login with your new password." +#~ msgstr "" +#~ "Kodeord er nulstillet!

    En Email med nyt kodeord er blevet " +#~ "sendt til din Email-adresse. Du kan skifte det tilfældige kodeord med et " +#~ "nyt efter at du har logget dig på." + +#~ msgid "Custom" +#~ msgstr "Custom" + +#~ msgid "edit" +#~ msgstr "redigere" + +#~ msgid "Use reCAPTCHA" +#~ msgstr "Brug reCAPTCHA" + +#~ msgid "New Password" +#~ msgstr "Nyt Kodeord" + +#~ msgid "Repeat Password" +#~ msgstr "Gentag Kodeord" + +#~ msgid "Remember me" +#~ msgstr "Husk mig" + +#~ msgid "Turn off registration" +#~ msgstr "Afbryd registrering" + +#~ msgid "Turns off the registration process, only allows login" +#~ msgstr "Afbryder registreringsprocessen, tillader kun log på" + +#~ msgid "Legacy forms" +#~ msgstr "Legacy forms" + +#~ msgid "" +#~ "Uses the pre-2.5.1 table-based forms (leave off to use CSS table-less " +#~ "forms)" +#~ msgstr "" +#~ "Uses the pre-2.5.1 table-based forms (leave off to use CSS table-less " +#~ "forms)" + +#~ msgid "Members Area URL:" +#~ msgstr "Members Area URL:" + +#~ msgid "Add" +#~ msgstr "Tilføj" + +#~ msgid "WP-Members expiration periods were updated" +#~ msgstr "WP-Members prøveperiode er opdateret" + +#~ msgid "" +#~ "Settings were saved, but you have required fields that are not set to " +#~ "display!" +#~ msgstr "" +#~ "Indstillingerne er gemt, men der er obligatoriske felter, som ikke er " +#~ "indstillet til at blive vist!" + +#~ msgid "" +#~ "Note: This will not cause an error for the end user, as only displayed " +#~ "fields are validated. However, you should still check that your " +#~ "displayed and required fields match up. Mismatched fields are " +#~ "highlighted below." +#~ msgstr "" +#~ "Bemærk: Dette vil ikke medføre en fejl for slutbrugeren, da kun viste " +#~ "felter er valideret. Du bør dog stadig kontrollere, at dine viste, og " +#~ "krævede felter passer sammen. Forkerte felter er fremhævet nedenfor." + +#~ msgid "If you find this plugin useful, please consider making a donation" +#~ msgstr "If you find this plugin useful, please consider making a donation" + +#~ msgid "Subscriptions" +#~ msgstr "Abonnement" + +#~ msgid "PayPal Settings" +#~ msgstr "PayPal Settings" + +#~ msgid "If you find this plugin useful, please consider a %s donation %s" +#~ msgstr "If you find this plugin useful, please consider a %s donation %s" + +#~ msgid "%d users were activated." +#~ msgstr "%d brugere er aktiverede." + +#~ msgid "" +#~ "Users ready to export, %s click here %s to generate and download a CSV." +#~ msgstr "" +#~ "Brugere klar til export %s Klik her %s for at generere og downloade en " +#~ "CSV." + +#~ msgid "WP-Members Users" +#~ msgstr "WP-Members Brugere" + +#~ msgid "No users matched your criteria" +#~ msgstr "Ingen brugere matchede dine kriterier" + +#~ msgid "Bulk Actions" +#~ msgstr "Gruppe handling" + +#~ msgid "Apply" +#~ msgstr "Ansøge" + +#~ msgid "Indicates a required field" +#~ msgstr "Et obligatorisk felt" + +#~ msgid "Login" +#~ msgstr "Log på" + +#~ msgid "Clear Form" +#~ msgstr "Ryd indhold" + +#~ msgid "Submit" +#~ msgstr "Indsend" + +#~ msgid "Cheatin’ uh?" +#~ msgstr "Snyder du?" + +#~ msgid "there was an error and no users were exported" +#~ msgstr "der opstod en fejl og ingen Brugere blev eksporteret" + +#~ msgid "login" +#~ msgstr "log på" + +#~ msgid "" +#~ "Please indicate that you have read and agree to the %s Terms of Service %s" +#~ msgstr "Marker at du har læst og accepteret %sVilkår for Deltagelse %s" + +#~ msgid "You may change your password here: %s" +#~ msgstr "Du kan skifte Kodeord her: %s" + +#~ msgid "Your registration info for %s" +#~ msgstr "Dine registrerings info for %s" + +#~ msgid "Thank you for registering for %s" +#~ msgstr "Tak for din registrering på %s" + +#~ msgid "Your registration information is below." +#~ msgstr "Dine oplysninger er listet nedenfor." + +#~ msgid "You may wish to retain a copy for your records." +#~ msgstr "Gem dine oplysninger." + +#~ msgid "username: %s" +#~ msgstr "Brugernavn: %s" + +#~ msgid "password: %s" +#~ msgstr "Kodeord: %s" + +#~ msgid "You may login here:" +#~ msgstr "Log på her:" + +#~ msgid "" +#~ "Thank you for registering for %s. Your registration has been received and " +#~ "is pending approval." +#~ msgstr "" +#~ "Tak for din registrering på %s. Din registreing er modtaget og afventer " +#~ "godkendelse." + +#~ msgid "You will receive login instructions upon approval of your account" +#~ msgstr "" +#~ "Du vil modtage instruks om Log på proceduren når din registrering er " +#~ "godkendt." + +#~ msgid "Your registration for %s has been approved." +#~ msgstr "Din registrering på %s er godkendt." + +#~ msgid "You may login at: %s" +#~ msgstr "Du kan nu logge på %s" + +#~ msgid "You originally registered at:" +#~ msgstr "Du er oprindeligt registreret på:" + +#~ msgid "Password reset for %s" +#~ msgstr "Kodeordet er nulstillet for %s" + +#~ msgid "Your password for %s has been reset" +#~ msgstr "Dit Kodeord for %s er nulstillet" + +#~ msgid "" +#~ "Your new password is included below. You may wish to retain a copy for " +#~ "your records." +#~ msgstr "Dit nye Kodeord står nedenfor. Gem dine oplysninger." + +#~ msgid "This is an automated message from %s" +#~ msgstr "Dette er en automatisk besked fra %s" + +#~ msgid "Please do not reply to this address" +#~ msgstr "Undlad venligst at svare på denne Email" + +#~ msgid "New user registration for %s" +#~ msgstr "Ny bruger registrering for %s" + +#~ msgid "The following user registered for %s" +#~ msgstr "Følgende bruger er registreret på %s" + +#~ msgid "and is pending admin approval" +#~ msgstr "og afventer Admins godkendelse" diff --git a/i18n/languages/wp-members-fi.mo b/i18n/languages/wp-members-fi.mo new file mode 100644 index 00000000..77a991c4 Binary files /dev/null and b/i18n/languages/wp-members-fi.mo differ diff --git a/i18n/languages/wp-members-fi.po b/i18n/languages/wp-members-fi.po new file mode 100644 index 00000000..8f0f0835 --- /dev/null +++ b/i18n/languages/wp-members-fi.po @@ -0,0 +1,2794 @@ +# Copyright (C) 2010 WP-Members +# This file is distributed under the same license as the WP-Members package. +msgid "" +msgstr "" +"Project-Id-Version: WP-Members 3.2.6\n" +"Report-Msgid-Bugs-To: http://wordpress.org/tag/wp-members\n" +"POT-Creation-Date: 2023-01-06 15:20-0500\n" +"PO-Revision-Date: 2023-01-06 15:21-0500\n" +"Last-Translator: \n" +"Language-Team: Suomentaja \n" +"Language: fi_FI\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Poedit 2.4.3\n" + +#: includes/admin/class-wp-members-admin-api.php:254 +msgid "Custom email" +msgstr "" + +#: includes/admin/class-wp-members-admin-api.php:255 +#: includes/admin/class-wp-members-admin-api.php:257 +msgid "Subject" +msgstr "" + +#: includes/admin/class-wp-members-admin-api.php:258 +msgid "Body" +msgstr "" + +#: includes/admin/class-wp-members-admin-api.php:260 +msgid "Your custom email message content." +msgstr "" + +#: includes/admin/class-wp-members-admin-api.php:338 +msgid "Options" +msgstr "Asetukset" + +#: includes/admin/class-wp-members-admin-api.php:339 +msgid "Fields" +msgstr "Kentät" + +#: includes/admin/class-wp-members-admin-api.php:340 +msgid "Dialogs" +msgstr "Dialogit" + +#: includes/admin/class-wp-members-admin-api.php:341 +msgid "Emails" +msgstr "" + +#: includes/admin/class-wp-members-admin-api.php:357 +msgid "New Registration" +msgstr "Uusi rekisteröinti" + +#: includes/admin/class-wp-members-admin-api.php:365 +#: includes/admin/class-wp-members-admin-api.php:383 +msgid "User email validated" +msgstr "" + +#: includes/admin/class-wp-members-admin-api.php:375 +msgid "Registration is Moderated" +msgstr "" + +#: includes/admin/class-wp-members-admin-api.php:391 +msgid "Registration is Moderated, User is Approved" +msgstr "" + +#: includes/admin/class-wp-members-admin-api.php:399 +msgid "Password Reset" +msgstr "Salasanan nollaus" + +#: includes/admin/class-wp-members-admin-api.php:406 +msgid "Retrieve Username" +msgstr "" + +#: includes/admin/class-wp-members-admin-api.php:414 +msgid "Admin Notification" +msgstr "Ilmoita pääkäyttäjälle" + +#: includes/admin/class-wp-members-admin-api.php:440 +msgid "Restricted post (or page), displays above the login/registration form" +msgstr "" +"Suojattu sisältö (artikkeli tai sivu), näkyy sisäänkirjautumis ja " +"rekisteröitymislomakkeen yläpuolella." + +#: includes/admin/class-wp-members-admin-api.php:441 +msgid "Username is taken" +msgstr "Käyttäjätunnus on jo varattu" + +#: includes/admin/class-wp-members-admin-api.php:442 +msgid "Email is registered" +msgstr "Sähköpostiosoite on jo käytössä" + +#: includes/admin/class-wp-members-admin-api.php:443 +msgid "Registration completed" +msgstr "Rekisteröinti on valmis" + +#: includes/admin/class-wp-members-admin-api.php:444 +msgid "User update" +msgstr "Käyttäjän päivitys" + +#: includes/admin/class-wp-members-admin-api.php:445 +msgid "Passwords did not match" +msgstr "Salasanat eivät täsmää" + +#: includes/admin/class-wp-members-admin-api.php:446 +msgid "Password changes" +msgstr "Salasana vaihtuu" + +#: includes/admin/class-wp-members-admin-api.php:447 +msgid "Username or email do not exist when trying to reset forgotten password" +msgstr "" +"Unohtunutta salasanaa yritettiin nollata väärällä käyttäjätunnuksella tai " +"sähköpostilla" + +#: includes/admin/class-wp-members-admin-api.php:448 +msgid "Password reset" +msgstr "Salasanan nollaus" + +#: includes/admin/class-wp-members-admin-api.php:547 +msgid "Close" +msgstr "" + +#: includes/admin/class-wp-members-admin-api.php:596 +msgid "Settings" +msgstr "Asetukset" + +#: includes/admin/class-wp-members-admin-posts.php:30 +#: includes/admin/class-wp-members-admin-posts.php:33 +msgid "Unrestrict" +msgstr "" + +#: includes/admin/class-wp-members-admin-posts.php:31 +#: includes/admin/class-wp-members-admin-posts.php:34 +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:110 +msgid "Restrict" +msgstr "" + +#: includes/admin/class-wp-members-admin-posts.php:32 +#: includes/admin/class-wp-members-admin-posts.php:35 +msgid "Hide" +msgstr "" + +#: includes/admin/class-wp-members-admin-posts.php:125 +#, php-format +msgid "%s restricted" +msgstr "" + +#: includes/admin/class-wp-members-admin-posts.php:125 +#, php-format +msgid "%s unrestricted" +msgstr "" + +#: includes/admin/class-wp-members-admin-posts.php:165 +#, php-format +msgid "%s Restriction" +msgstr "" + +#: includes/admin/class-wp-members-admin-posts.php:195 +#: includes/admin/class-wp-members-admin-posts.php:342 +#: includes/admin/class-wp-members-admin-posts.php:345 +msgid "Unrestricted" +msgstr "" + +#: includes/admin/class-wp-members-admin-posts.php:196 +#: includes/admin/class-wp-members-admin-posts.php:339 +#: includes/admin/class-wp-members-admin-posts.php:347 +msgid "Restricted" +msgstr "" + +#: includes/admin/class-wp-members-admin-posts.php:197 +#: includes/admin/class-wp-members-admin-posts.php:349 +msgid "Hidden" +msgstr "" + +#: includes/admin/class-wp-members-admin-posts.php:203 +msgid "Status:" +msgstr "" + +#: includes/admin/class-wp-members-admin-posts.php:203 +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:68 +#: includes/admin/tabs/class-wp-members-fields-table.php:65 +#: includes/walkers/class-wp-members-walker-nav-menu.php:140 +#, fuzzy +msgid "Edit" +msgstr "Täytä omat tietosi" + +#: includes/admin/class-wp-members-admin-posts.php:218 +msgid "Ok" +msgstr "" + +#: includes/admin/class-wp-members-admin-posts.php:219 +#: includes/walkers/class-wp-members-walker-nav-menu.php:224 +msgid "Cancel" +msgstr "" + +#: includes/admin/class-wp-members-admin-posts.php:305 +msgid "Status" +msgstr "" + +#: includes/admin/class-wp-members-admin-users.php:28 +#: includes/admin/class-wp-members-admin-users.php:34 +#: includes/admin/class-wp-members-admin-users.php:79 +msgid "Activate" +msgstr "Aktivoi" + +#: includes/admin/class-wp-members-admin-users.php:29 +#: includes/admin/class-wp-members-admin-users.php:35 +#: includes/admin/class-wp-members-admin-users.php:82 +msgid "Deactivate" +msgstr "" + +#: includes/admin/class-wp-members-admin-users.php:31 +#: includes/admin/class-wp-members-admin-users.php:37 +msgid "Export" +msgstr "Vie" + +#: includes/admin/class-wp-members-admin-users.php:32 +#: includes/admin/class-wp-members-admin-users.php:38 +msgid "Export All Users" +msgstr "viedä kaikki käyttäjät" + +#: includes/admin/class-wp-members-admin-users.php:61 +msgid "Confirm" +msgstr "" + +#: includes/admin/class-wp-members-admin-users.php:64 +msgid "Unconfirm" +msgstr "" + +#: includes/admin/class-wp-members-admin-users.php:147 +#, php-format +msgid "%s users activated" +msgstr "" + +#: includes/admin/class-wp-members-admin-users.php:147 +#, php-format +msgid "%s users deactivated" +msgstr "" + +#: includes/admin/class-wp-members-admin-users.php:150 +msgid "No users selected" +msgstr "" + +#: includes/admin/class-wp-members-admin-users.php:168 +msgid "You cannot activate or deactivate yourself" +msgstr "" + +#: includes/admin/class-wp-members-admin-users.php:173 +#, php-format +msgid "%s activated" +msgstr "" + +#: includes/admin/class-wp-members-admin-users.php:178 +#, php-format +msgid "%s deactivated" +msgstr "" + +#: includes/admin/class-wp-members-admin-users.php:182 +msgid "That user is already active" +msgstr "" + +#: includes/admin/class-wp-members-admin-users.php:198 +msgid "You cannot confirm or unconfirm yourself" +msgstr "" + +#: includes/admin/class-wp-members-admin-users.php:203 +#, php-format +msgid "%s confirmed" +msgstr "" + +#: includes/admin/class-wp-members-admin-users.php:208 +#, php-format +msgid "%s unconfirmed" +msgstr "" + +#: includes/admin/class-wp-members-admin-users.php:212 +msgid "That user is already confirmed" +msgstr "" + +#: includes/admin/class-wp-members-admin-users.php:341 +msgid "Pending" +msgstr "" + +#: includes/admin/class-wp-members-admin-users.php:342 +msgid "Trial" +msgstr "" + +#: includes/admin/class-wp-members-admin-users.php:343 +#: includes/admin/class-wp-members-user-export.php:289 +msgid "Subscription" +msgstr "Tilaus" + +#: includes/admin/class-wp-members-admin-users.php:344 +msgid "Expired" +msgstr "" + +#: includes/admin/class-wp-members-admin-users.php:347 +#: includes/admin/class-wp-members-admin-users.php:410 +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:457 +msgid "Activated" +msgstr "" + +#: includes/admin/class-wp-members-admin-users.php:348 +msgid "Pending Activation" +msgstr "" + +#: includes/admin/class-wp-members-admin-users.php:349 +msgid "Deactivated" +msgstr "" + +#: includes/admin/class-wp-members-admin-users.php:352 +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:456 +msgid "Confirmed" +msgstr "" + +#: includes/admin/class-wp-members-admin-users.php:353 +msgid "Not Confirmed" +msgstr "" + +#: includes/admin/class-wp-members-admin-users.php:355 +msgid "Not Exported" +msgstr "" + +#: includes/admin/class-wp-members-admin-users.php:475 +msgid "Not confirmed" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:67 +msgid "Slug" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:68 +#: includes/admin/class-wp-members-user-export.php:294 +msgid "Role" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:69 +#: includes/admin/class-wp-members-products-admin.php:740 +#: includes/admin/class-wp-members-user-export.php:290 +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:460 +msgid "Expires" +msgstr "Vanhenee" + +#: includes/admin/class-wp-members-products-admin.php:71 +msgid "Default" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:73 +msgid "Last updated" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:97 +msgid "slug:" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:100 +msgid "No role required" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:105 +msgid "Does not expire" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:109 +#: includes/admin/class-wp-members-user-export.php:199 +msgid "Yes" +msgstr "Kyllä" + +#: includes/admin/class-wp-members-products-admin.php:145 +msgid "Membership Product Details" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:153 +msgid "Membership Product Message (optional)" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:169 +msgid "Access by child membership" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:185 +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:62 +msgid "Posts" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:186 +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:63 +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:249 +#, fuzzy +msgid "Pages" +msgstr "Estä sivujen näkyvyys oletusarvoisesti" + +#: includes/admin/class-wp-members-products-admin.php:213 +#: includes/admin/class-wp-members-products-admin.php:262 +#: includes/admin/class-wp-members-products-admin.php:309 +msgid "Period" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:213 +msgid "Day" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:213 +msgid "Week" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:213 +msgid "Month" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:213 +msgid "Year" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:226 +msgid "Name (slug)" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:228 +msgid "Optional Defaults" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:231 +msgid "Assign as default at registration? (optional)" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:239 +#, php-format +msgid "Pre-selected by default for new %s" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:245 +msgid "Optional Properties" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:248 +msgid "Role Required? (optional)" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:251 +msgid "No Role" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:257 +msgid "Expires (optional)" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:259 +#: includes/admin/class-wp-members-products-admin.php:261 +#: includes/admin/class-wp-members-products-admin.php:306 +#: includes/admin/class-wp-members-products-admin.php:308 +msgid "Number" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:267 +msgid "Use \"no gap\" renewal" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:271 +msgid "Use a fixed period (such as Jan 1 - Dec 31, or Sept 1 - Aug 31)" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:288 +#: includes/admin/class-wp-members-products-admin.php:289 +msgid "Period Start (dd-mm)" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:290 +#: includes/admin/class-wp-members-products-admin.php:291 +msgid "Period End (dd-mm)" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:304 +msgid "Fixed period grace period" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:313 +msgid "" +"Grace period is the point at which expiration date is for following time " +"period. For example, if user who register August 1st would be part of the " +"following year's Sept 1 - Aug 31 membership, set this at 1 Month. Leave " +"blank for no grace period." +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:376 +msgid "" +"Restricted Message (displays when a user does not have access to a " +"membership)" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:502 +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:239 +#: includes/class-wp-members-forms.php:1196 +#: includes/class-wp-members-user-profile.php:132 +msgid "None" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:517 +msgid "Restrict access by membership:" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:598 +msgid "Required Membership" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:644 +#: includes/admin/class-wp-members-products-admin.php:745 +#: includes/class-wp-members-products.php:335 +msgid "Membership" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:680 +msgid "expires:" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:709 +#: includes/class-wp-members-products.php:336 +#: includes/class-wp-members-products.php:341 +msgid "Memberships" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:736 +msgid "Membership Access" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:744 +msgid "Action" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:746 +msgid "Enabled?" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:757 +msgid "Enable" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:758 +msgid "Disable" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:759 +msgid "Update" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:764 +msgid "Expiration date (optional)" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:795 +#, php-format +msgid "No memberships have been created. %sCreate new memberships here%s" +msgstr "" + +#: includes/admin/class-wp-members-user-export.php:199 +msgid "No" +msgstr "Ei" + +#: includes/admin/class-wp-members-user-export.php:264 +msgid "You do not have the required user capabilities to export users." +msgstr "" + +#: includes/admin/class-wp-members-user-export.php:277 +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:461 +msgid "User ID" +msgstr "" + +#: includes/admin/class-wp-members-user-export.php:284 +#: includes/class-wp-members-dialogs.php:91 +#: includes/class-wp-members-dialogs.php:114 +msgid "Username" +msgstr "Käyttäjätunnus" + +#: includes/admin/class-wp-members-user-export.php:286 +msgid "Activated?" +msgstr "Aktivoitu?" + +#: includes/admin/class-wp-members-user-export.php:292 +msgid "Registered" +msgstr "Rekisteröity" + +#: includes/admin/class-wp-members-user-export.php:293 +msgid "IP" +msgstr "IP" + +#: includes/admin/dialogs.php:117 +msgid "" +"Your WP settings allow anyone to register - this is not the recommended " +"setting." +msgstr "" +"WP asetuksesi sallivat kenen tahansa rekisteröityä. Tämä ei ole suositeltava " +"asetus." + +#: includes/admin/dialogs.php:118 +#, php-format +msgid "" +"You can %s change this here %s making sure the box next to \"Anyone can " +"register\" is unchecked." +msgstr "" +"Voit %s muuttaa tästä %s \"Kuka tahansa voi rekisteröityä\" asetuksen." + +#: includes/admin/dialogs.php:119 +msgid "" +"This setting allows a link on the /wp-login.php page to register using the " +"WP native registration process thus circumventing any registration you are " +"using with WP-Members. In some cases, this may suit the users wants/needs, " +"but most users should uncheck this option. If you do not change this " +"setting, you can choose to ignore these warning messages under WP-Members " +"Settings." +msgstr "" +"Tämä asetus sallii /wp-login.php sivulla olevan linkin käyttää Wordpressin " +"omaa rekisteröintiprosessia, joka näin mahdollistaa WP-Members " +"rekisteröintiprosessin kiertämisen. Yleensä tätä ei suositella, mutta jos et " +"muuta tätä asetusta, voit valita varoitusten hylkäämisen WP-Members " +"asetuspaneelista." + +#: includes/admin/dialogs.php:123 +msgid "" +"Your WP settings allow anyone to comment - this is not the recommended " +"setting." +msgstr "" +"WP asetuksesi sallivat kenen tahansa kommentoida. Tämä ei ole suositeltava " +"asetus." + +#: includes/admin/dialogs.php:124 +#, php-format +msgid "" +"You can %s change this here %s by checking the box next to \"Users must be " +"registered and logged in to comment.\"" +msgstr "" +"Voit %s muuttaa tästä %s \"Kuka tahansa voi rekisteröityä\" asetuksen." + +#: includes/admin/dialogs.php:125 +msgid "" +"This setting allows any users to comment, whether or not they are " +"registered. Depending on how you are using WP-Members will determine whether " +"you should change this setting or not. If you do not change this setting, " +"you can choose to ignore these warning messages under WP-Members Settings." +msgstr "" +"WP asetuksesi sallivat kenen tahansa kommentoida, riippumatta siitä olivatko " +"he rekisteröityneitä tai ei. Riippuen käyttötavastasi tämä saattaa olla " +"järkevää tai sitten ei. Jos et muuta tätä asetusta, voit valita varoitusten " +"hylkäämisen WP-Members asetuspaneelista." + +#: includes/admin/dialogs.php:129 +msgid "" +"Your WP settings allow full text rss feeds - this is not the recommended " +"setting." +msgstr "" +"WP asetukset sallivat RSS syötteet täydellä tekstillä. Tätä ei suositella." + +#: includes/admin/dialogs.php:130 +#, php-format +msgid "" +"You can %s change this here %s by changing \"For each article in a feed, show" +"\" to \"Summary.\"" +msgstr "" + +#: includes/admin/dialogs.php:131 +msgid "" +"Leaving this set to full text allows anyone to read your protected content " +"in an RSS reader. Changing this to Summary prevents this as your feeds will " +"only show summary text." +msgstr "" +"Jos jätät tämän asetuksen päälle, kuka tahansa voi lukea kaiken suojatun " +"sisällön RSS lukijalla. Voit sen sijaan valita että vain lyhyt yhteenveto " +"näytetään." + +#: includes/admin/dialogs.php:135 +msgid "You have set WP-Members to hold registrations for approval" +msgstr "WP-Members säilöö rekisteröinnit hyväksyntää varten" + +#: includes/admin/dialogs.php:136 +msgid "" +"but you have not changed the default message for \"Registration Completed\" " +"under \"WP-Members Dialogs and Error Messages.\" You should change this " +"message to let users know they are pending approval." +msgstr "" + +#: includes/admin/dialogs.php:140 +msgid "You have turned on reCAPTCHA" +msgstr "Olet ottanut käyttöön reCAPTCHA:n" + +#: includes/admin/dialogs.php:141 +msgid "" +"but you have not entered API keys. You will need both a public and private " +"key. The CAPTCHA will not display unless a valid API key is included." +msgstr "" + +#: includes/admin/dialogs.php:145 +msgid "You have active settings that are not recommended." +msgstr "" + +#: includes/admin/dialogs.php:146 +msgid "" +"If you will not be changing these settings, you can turn off these warning " +"messages by checking the \"Ignore warning messages\" in the settings below." +msgstr "" + +#: includes/admin/dialogs.php:174 +msgid "Version:" +msgstr "Versio:" + +#: includes/admin/dialogs.php:175 +msgid "Quick Start Guide" +msgstr "" + +#: includes/admin/dialogs.php:176 +msgid "Online User Guide" +msgstr "" + +#: includes/admin/dialogs.php:177 +msgid "FAQs" +msgstr "" + +#: includes/admin/dialogs.php:184 +msgid "Thank you for using WP-Members" +msgstr "Kiitos kun käytät WP-Members lisäosaa!" + +#: includes/admin/dialogs.php:185 +msgid "A plugin developed by" +msgstr "" + +#: includes/admin/dialogs.php:186 +msgid "Follow" +msgstr "Seuraa" + +#: includes/admin/dialogs.php:203 includes/admin/dialogs.php:207 +msgid "Latest from RocketGeek" +msgstr "" + +#: includes/admin/dialogs.php:224 +msgid "Like WP-Members?" +msgstr "" + +#: includes/admin/dialogs.php:225 +#, php-format +msgid "" +"If you like WP-Members please give it a %s★★★★★" +"%s rating. Thanks!!" +msgstr "" + +#: includes/admin/dialogs.php:236 includes/admin/dialogs.php:249 +msgid "Latest from ButlerBlog" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:67 +#, php-format +msgid "See the %sUsers Guide on CAPTCHA%s." +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:74 +#: includes/admin/tabs/class-wp-members-admin-tab-dialogs.php:57 +#: includes/admin/tabs/class-wp-members-admin-tab-emails.php:109 +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:134 +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:78 +msgid "Need help?" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:85 +msgid "Manage CAPTCHA Options" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:91 +msgid "CAPTCHA Type" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:96 +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:243 +msgid "reCAPTCHA v2" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:97 +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:244 +msgid "reCAPTCHA v3" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:98 +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:245 +msgid "Really Simple CAPTCHA" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:99 +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:246 +msgid "hCaptcha" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:106 +msgid "" +"CAPTCHA type was changed. Please verify and update the settings below for " +"the new CAPTCHA type." +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:117 +msgid "reCAPTCHA Keys" +msgstr "reCAPTCHA avaimet" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:120 +#, php-format +msgid "" +"reCAPTCHA requires an API key, consisting of a \"site\" and a \"secret\" " +"key. You can sign up for a %s free reCAPTCHA key%s" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:122 +msgid "Site Key" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:123 +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:139 +msgid "Secret Key" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:133 +msgid "hCaptcha Keys" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:136 +#, php-format +msgid "" +"hCaptcha requires an API key. You can sign up for %s an hCaptcha API key " +"here %s" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:138 +msgid "API Key" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:170 +msgid "Characters for image" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:174 +msgid "Number of characters" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:178 +msgid "Image dimensions" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:179 +msgid "Width" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:179 +msgid "Height" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:182 +msgid "Font color of characters" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:186 +msgid "Background color of image" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:190 +msgid "Font size" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:194 +msgid "Width between characters" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:198 +msgid "Image type" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:213 +msgid "" +"To use Really Simple CAPTCHA, you must have the Really Simple CAPTCHA plugin " +"installed and activated." +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:241 +msgid "Update CAPTCHA Settings" +msgstr "Päivitä CAPTCHA asetukset" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:319 +msgid "CAPTCHA was updated for WP-Members" +msgstr "CAPTCHA on päivitetty WP-Members:iä varten" + +#: includes/admin/tabs/class-wp-members-admin-tab-dialogs.php:67 +msgid "Dialogs and Error Messages" +msgstr "Dialogit ja virheilmoitukset" + +#: includes/admin/tabs/class-wp-members-admin-tab-dialogs.php:69 +#, php-format +msgid "" +"You can customize the text for dialogs and error messages. Simple HTML is " +"allowed %s etc." +msgstr "" +"Voit mukauttaa dialogien ja virheilmoitusten tekstejä. Yksinkertainen HTML " +"on sallittua: %s jne." + +#: includes/admin/tabs/class-wp-members-admin-tab-dialogs.php:80 +msgid "Terms of Service (TOS)" +msgstr "Käyttöehdot" + +#: includes/admin/tabs/class-wp-members-admin-tab-dialogs.php:87 +msgid "Update Dialogs" +msgstr "Päivitä dialogit" + +#: includes/admin/tabs/class-wp-members-admin-tab-dialogs.php:124 +msgid "WP-Members dialogs were updated" +msgstr "WP-Members dialogit on päivitetty" + +#: includes/admin/tabs/class-wp-members-admin-tab-dropins.php:88 +#: includes/admin/tabs/class-wp-members-dropins-table.php:180 +msgid "WP-Members Dropin settings were updated" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-dropins.php:216 +msgid "Manage Dropins" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-dropins.php:217 +msgid "Current dropin folder: " +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-dropins.php:218 +msgid "" +"You can change location of the dropin folder using the " +"wpmem_dropin_folder filter." +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-emails.php:57 +msgid "Email Messages" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-emails.php:60 +msgid "You can customize the content of the emails sent by the plugin." +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-emails.php:62 +msgid "A list of shortcodes is available here." +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-emails.php:69 +msgid "Set a custom email address" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-emails.php:70 +#: includes/admin/tabs/class-wp-members-admin-tab-emails.php:74 +#: includes/admin/tabs/class-wp-members-admin-tab-emails.php:93 +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:163 +msgid "(optional)" +msgstr "(valinnainen)" + +#: includes/admin/tabs/class-wp-members-admin-tab-emails.php:73 +msgid "Set a custom email name" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-emails.php:77 +msgid "Send HTML email" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-emails.php:93 +msgid "Email Signature" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-emails.php:101 +msgid "Update Emails" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-emails.php:172 +msgid "WP-Members emails were updated" +msgstr "WP-Members sähköpostit on päivitetty" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:93 +#: includes/class-wp-members-dialogs.php:65 +msgid "No fields selected for deletion" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:95 +msgid "Are you sure you want to delete the following fields?" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:122 +msgid "Fields deleted" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:136 +msgid "Field Manager Documentation" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:164 +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:315 +#: includes/class-wp-members-forms.php:1629 +#: includes/class-wp-members-forms.php:1821 +#: includes/class-wp-members-user-profile.php:181 +msgid "(required)" +msgstr "(rakollinen)" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:169 +msgid "Edit Field" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:169 +msgid "Add a Field" +msgstr "Lisätä Kentän" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:174 +msgid "Field Label" +msgstr "Kentän otsikko" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:176 +msgid "The name of the field as it will be displayed to the user." +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:179 +#: includes/admin/tabs/class-wp-members-fields-table.php:58 +msgid "Meta Key" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:185 +msgid "" +"The database meta value for the field. It must be unique and contain no " +"spaces (underscores are ok)." +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:189 +#: includes/admin/tabs/class-wp-members-fields-table.php:59 +msgid "Field Type" +msgstr "Kentän tyyppi" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:195 +msgid "text" +msgstr "teksti" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:196 +msgid "email" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:197 +msgid "textarea" +msgstr "Tekstialue" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:198 +msgid "checkbox" +msgstr "rastitus" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:199 +msgid "multiple checkbox" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:200 +msgid "select (dropdown)" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:201 +msgid "multiple select" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:202 +msgid "radio group" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:203 +msgid "password" +msgstr "Salasana" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:204 +msgid "image" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:205 +msgid "file" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:206 +msgid "url" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:207 +msgid "number" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:208 +msgid "date" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:209 +msgid "hidden" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:211 +msgid "membership" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:217 +#: includes/admin/tabs/class-wp-members-fields-table.php:60 +msgid "Display?" +msgstr "Näkyvissä?" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:221 +msgid "This field is always displayed" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:226 +msgid "Required?" +msgstr "Pakollinen?" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:230 +msgid "This field is always required" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:236 +msgid "Allow HTML?" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:243 +msgid "Placeholder" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:251 +msgid "Pattern" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:259 +msgid "Title" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:268 +msgid "Minimum Value" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:272 +msgid "Maximum Value" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:280 +msgid "Rows" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:284 +msgid "Columns" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:292 +msgid "Accepted file types:" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:297 +msgid "Accepted file types should be set like this: jpg|jpeg|png|gif" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:304 +msgid "Checked by default?" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:308 +msgid "HTML label position" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:310 +msgid "Before the input tag" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:311 +msgid "After the input tag" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:312 +msgid "" +"Selecting \"after\" will generally display the label to the right of the " +"checkbox" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:315 +msgid "Stored value if checked:" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:336 +msgid "Stored values delimiter:" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:345 +msgid "Values (Displayed|Stored):" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:370 +msgid "Options should be Option Name|option_value," +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:374 +msgid "Visit plugin site for more information" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:381 +msgid "Value" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:400 +msgid "Save Changes" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:400 +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:527 +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:528 +msgid "Add Field" +msgstr "Lisätä Kentän" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:402 +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:726 +msgid "Return to Fields Table" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:449 +msgid "Drag and drop to reorder fields" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:455 +msgid "Registration Date" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:458 +msgid "Registration IP" +msgstr "IP @ rekisteröinnissä" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:459 +msgid "Subscription Type" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:495 +msgid "Manage Fields" +msgstr "Hallitse kenttiä" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:595 +msgid "WP-Members fields were updated" +msgstr "WP-Members kentät on päivitetty" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:617 +msgid "Field Label is required. Nothing was updated." +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:618 +msgid "Meta Key is required. Nothing was updated." +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:620 +msgid "Meta Key must contain only letters, numbers, and underscores" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:627 +msgid "A field with that meta key already exists" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:632 +#, php-format +msgid "" +"Sorry, \"%s\" is a reserved term. " +"Field was not added." +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:673 +msgid "Checked value is required for checkboxes. Nothing was updated." +msgstr "" +"Kentän otsikko vaaditaan uuden kentän lisäämiseksi. Mitään ei nyt " +"päivitetty." + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:705 +msgid "A value is required for hidden fields. Nothing was updated." +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:712 +#, php-format +msgid "%s was added" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:725 +#, php-format +msgid "%s was updated" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:768 +msgid "Form field order updated." +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:56 +#, php-format +msgid "%sChange%s or %sFilter%s this address" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:57 +#, php-format +msgid "See the %sUsers Guide on plugin options%s." +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:90 +msgid "Manage Options" +msgstr "Hallitse optioita" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:94 +msgid "Content" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:105 +msgid "Content Restriction" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:109 +msgid "Do not restrict" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:123 +msgid "Show Excerpts" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:124 +msgid "Show Login Form" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:125 +msgid "Show Registration Form" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:126 +msgid "Auto Excerpt:" +msgstr "Näytä yhteenvedot" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:148 +msgid "Number of words in excerpt:" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:149 +msgid "Custom read more link (optional):" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:163 +msgid "Time-based expiration" +msgstr "Ajastettu vanhentuminen" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:163 +msgid "Allows for access to expire" +msgstr "Sisäänpääsyn sallitaan vanhentua" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:164 +msgid "Trial period" +msgstr "Koeaika" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:164 +msgid "Allows for a trial period" +msgstr "Sallii koeajan käytön" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:166 +msgid "Subscription Settings" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:176 +msgid "New Feature Settings" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:182 +msgid "Legacy Password Reset" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:182 +#, php-format +msgid "Use legacy password reset. %s(Requires additional configuration)%s" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:184 +msgid "Legacy Login Error" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:184 +msgid "Use legacy WP-Members login error instead of WP error object." +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:187 +msgid "WooCommerce My Account" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:187 +msgid "Add WP-Members fields to WooCommerce My Account registration" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:188 +msgid "WooCommerce Checkout" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:188 +msgid "Add WP-Members fields to WooCommerce registration during checkout" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:204 +msgid "Other Settings" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:214 +msgid "Enable memberships" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:214 +#, php-format +msgid "Enables creation of different %s membership products %s" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:215 +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:223 +msgid "Clone menus" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:215 +msgid "Enables logged in menus" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:216 +msgid "Notify admin" +msgstr "Ilmoita pääkäyttäjälle" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:216 +#, php-format +msgid "Notify %s for each new registration? %s" +msgstr "Lähetä sähköposti %s jokaisen rekisteröitymisen yhteydessä? %s" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:217 +msgid "Moderate registration" +msgstr "Moderoi rekisteröitymiset" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:217 +msgid "Holds new registrations for admin approval" +msgstr "Pääkäyttäjän hyväksyntä vaaditaan" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:218 +msgid "Confirmation Link" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:218 +#, php-format +msgid "" +"Send email confirmation link on new registration. %s(Requires additional " +"configuration)%s" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:219 +msgid "Ignore warning messages" +msgstr "Varoitukset jätetään huomioimatta" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:219 +msgid "Ignores WP-Members warning messages in the admin panel" +msgstr "WP-Members hallintapaneelin varoitusten hylkääminen" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:233 +msgid "Attribution" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:235 +msgid "" +"Attribution is appreciated! Display \"powered by\" link on register form?" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:238 +msgid "Enable CAPTCHA for Registration" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:253 +msgid "Login Page:" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:256 +msgid "Specify a login page (optional)" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:265 +msgid "Register Page:" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:268 +msgid "For creating a register link in the login form" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:277 +msgid "User Profile Page:" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:280 +msgid "For creating a forgot password link in the login form" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:286 +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:288 +msgid "Stylesheet" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:297 +msgid "Custom Stylesheet:" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:302 +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:329 +msgid "Update Settings" +msgstr "Päivitä asetukset" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:310 +msgid "Custom Post Types" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:316 +msgid "Add to WP-Members Settings" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:332 +msgid "" +"Please keep in mind that Custom Post Types are \"custom\" and therefore, not " +"all of them will function exactly the same way. WP-Members will certainly " +"work with any post type that operate like a post or a page; but you will " +"need to review any custom post type added to determine that it functions the " +"way you expect." +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:342 +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:343 +msgid "WP-Members Settings" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:344 +msgid "" +"The following is your WP-Members settings information if needed for support." +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:378 +msgid "Click to Copy" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:458 +msgid "Custom Post Type settings were updated" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:579 +msgid "WP-Members settings were updated" +msgstr "WP-Members asetukset on päivitetty" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:651 +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:682 +msgid "USE CUSTOM URL BELOW" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:671 +msgid "Select a page" +msgstr "" + +#: includes/admin/tabs/class-wp-members-dropins-table.php:70 +msgid "Name" +msgstr "" + +#: includes/admin/tabs/class-wp-members-dropins-table.php:71 +msgid "Enabled" +msgstr "" + +#: includes/admin/tabs/class-wp-members-dropins-table.php:72 +msgid "File" +msgstr "" + +#: includes/admin/tabs/class-wp-members-dropins-table.php:73 +msgid "Version" +msgstr "" + +#: includes/admin/tabs/class-wp-members-dropins-table.php:74 +#: includes/walkers/class-wp-members-walker-nav-menu.php:186 +msgid "Description" +msgstr "" + +#: includes/admin/tabs/class-wp-members-dropins-table.php:117 +#: includes/admin/tabs/class-wp-members-fields-table.php:108 +msgid "Save Settings" +msgstr "" + +#: includes/admin/tabs/class-wp-members-fields-table.php:43 +msgid "delete" +msgstr "" + +#: includes/admin/tabs/class-wp-members-fields-table.php:57 +msgid "Display Label" +msgstr "" + +#: includes/admin/tabs/class-wp-members-fields-table.php:61 +msgid "Required" +msgstr "" + +#: includes/admin/tabs/class-wp-members-fields-table.php:63 +msgid "Users Screen" +msgstr "" + +#: includes/admin/tabs/class-wp-members-fields-table.php:64 +msgid "Users Search" +msgstr "" + +#: includes/admin/tabs/class-wp-members-fields-table.php:66 +msgid "Sort" +msgstr "" + +#: includes/admin/tabs/class-wp-members-fields-table.php:107 +msgid "Delete Selected" +msgstr "" + +#: includes/api/api-forms.php:584 +#, php-format +msgid "%s is a required field." +msgstr "" + +#: includes/class-wp-members-captcha.php:276 includes/deprecated.php:401 +msgid "You have entered an incorrect code value. Please try again." +msgstr "" + +#: includes/class-wp-members-dialogs.php:41 +msgid "First Name" +msgstr "Etunimi" + +#: includes/class-wp-members-dialogs.php:42 +msgid "Last Name" +msgstr "Sukunimi" + +#: includes/class-wp-members-dialogs.php:43 +msgid "Address 1" +msgstr "Katuosoite" + +#: includes/class-wp-members-dialogs.php:44 +msgid "Address 2" +msgstr "Osoiterivi 2" + +#: includes/class-wp-members-dialogs.php:45 +msgid "City" +msgstr "Paikkakunta" + +#: includes/class-wp-members-dialogs.php:46 +msgid "State" +msgstr "Maakunta/osavaltio" + +#: includes/class-wp-members-dialogs.php:47 +msgid "Zip" +msgstr "Postinumero" + +#: includes/class-wp-members-dialogs.php:48 +msgid "Country" +msgstr "Maa" + +#: includes/class-wp-members-dialogs.php:49 +msgid "Day Phone" +msgstr "Puhelin" + +#: includes/class-wp-members-dialogs.php:50 +#: includes/class-wp-members-dialogs.php:92 +msgid "Email" +msgstr "sähköpostiosoite" + +#: includes/class-wp-members-dialogs.php:51 +msgid "Confirm Email" +msgstr "" + +#: includes/class-wp-members-dialogs.php:52 +msgid "Website" +msgstr "Omat nettisivusi" + +#: includes/class-wp-members-dialogs.php:53 +msgid "Biographical Info" +msgstr "Kuvaus sinusta" + +#: includes/class-wp-members-dialogs.php:54 +#: includes/class-wp-members-dialogs.php:74 +#: includes/class-wp-members-dialogs.php:159 +msgid "Password" +msgstr "Salasana" + +#: includes/class-wp-members-dialogs.php:55 +msgid "Confirm Password" +msgstr "" + +#: includes/class-wp-members-dialogs.php:56 +#: includes/class-wp-members-forms.php:2165 +msgid "TOS" +msgstr "Käyttöehdot" + +#: includes/class-wp-members-dialogs.php:66 +msgid "You are not logged in." +msgstr "" + +#: includes/class-wp-members-dialogs.php:72 +msgid "Existing Users Log In" +msgstr "Kirjaudu sisään" + +#: includes/class-wp-members-dialogs.php:73 +#: includes/class-wp-members-dialogs.php:158 +msgid "Username or Email" +msgstr "" + +#: includes/class-wp-members-dialogs.php:75 +#: includes/class-wp-members-shortcodes.php:773 +msgid "Log In" +msgstr "Kirjaudu sisään" + +#: includes/class-wp-members-dialogs.php:76 +msgid "Remember Me" +msgstr "" + +#: includes/class-wp-members-dialogs.php:77 +msgid "Forgot password?" +msgstr "Unohditko salasanasi?" + +#: includes/class-wp-members-dialogs.php:78 +msgid "Click here to reset" +msgstr "Klikkaa tästä nollataksesi" + +#: includes/class-wp-members-dialogs.php:79 +msgid "New User?" +msgstr "Uusi käyttäjä?" + +#: includes/class-wp-members-dialogs.php:80 +msgid "Click here to register" +msgstr "Klikkaa tästä rekisteröityäksesi" + +#: includes/class-wp-members-dialogs.php:83 +#: includes/class-wp-members-dialogs.php:142 +msgid "Change Password" +msgstr "Vaihda salasanaa" + +#: includes/class-wp-members-dialogs.php:84 +msgid "New password" +msgstr "" + +#: includes/class-wp-members-dialogs.php:85 +msgid "Confirm new password" +msgstr "" + +#: includes/class-wp-members-dialogs.php:86 +msgid "Update Password" +msgstr "Päivitä salasana" + +#: includes/class-wp-members-dialogs.php:87 +msgid "Password successfully changed!" +msgstr "" + +#: includes/class-wp-members-dialogs.php:90 +msgid "Reset Forgotten Password" +msgstr "Unohtuneen salasanan nollaus" + +#: includes/class-wp-members-dialogs.php:93 +msgid "Reset Password" +msgstr "Nollaa salasana" + +#: includes/class-wp-members-dialogs.php:94 +msgid "Forgot username?" +msgstr "" + +#: includes/class-wp-members-dialogs.php:95 +msgid "Click here" +msgstr "" + +#: includes/class-wp-members-dialogs.php:98 +#: includes/class-wp-members-dialogs.php:100 +msgid "Retrieve username" +msgstr "" + +#: includes/class-wp-members-dialogs.php:99 +msgid "Email Address" +msgstr "" + +#: includes/class-wp-members-dialogs.php:103 +msgid "New User Registration" +msgstr "Uuden käyttäjän rekisteröinti" + +#: includes/class-wp-members-dialogs.php:104 +msgid "Choose a Username" +msgstr "Valitse käyttäjätunnus" + +#: includes/class-wp-members-dialogs.php:105 +msgid "Input the code:" +msgstr "" + +#: includes/class-wp-members-dialogs.php:106 +#: includes/class-wp-members-forms.php:2164 +#, php-format +msgid "Please indicate that you agree to the %s Terms of Service %s" +msgstr "" + +#: includes/class-wp-members-dialogs.php:107 +msgid "Reset Form" +msgstr "" + +#: includes/class-wp-members-dialogs.php:108 +#: includes/class-wp-members-dialogs.php:162 +#: includes/class-wp-members-shortcodes.php:770 +#: includes/class-wp-members-user.php:186 +msgid "Register" +msgstr "Rekisteröidy" + +#: includes/class-wp-members-dialogs.php:110 +msgid "Required field" +msgstr "Pakollinen tieto" + +#: includes/class-wp-members-dialogs.php:113 +msgid "Edit Your Information" +msgstr "Täytä omat tietosi" + +#: includes/class-wp-members-dialogs.php:115 +msgid "Update Profile" +msgstr "" + +#: includes/class-wp-members-dialogs.php:116 +msgid "Update this file" +msgstr "" + +#: includes/class-wp-members-dialogs.php:119 +msgid "Login Failed!" +msgstr "Sisäänkirjautuminen epäonnistui!" + +#: includes/class-wp-members-dialogs.php:120 +msgid "You entered an invalid username or password." +msgstr "Annoit väärän käyttäjätunnuksen tai salasanan." + +#: includes/class-wp-members-dialogs.php:121 +msgid "Click here to continue." +msgstr "Klikkaa tähän jatkaaksesi." + +#: includes/class-wp-members-dialogs.php:122 +msgid "Password fields cannot be empty" +msgstr "Salasanakentät eivät saa olla tyhjiä" + +#: includes/class-wp-members-dialogs.php:123 +msgid "Sorry, that email address was not found." +msgstr "" + +#: includes/class-wp-members-dialogs.php:124 +#, php-format +msgid "An email was sent to %s with your username." +msgstr "" + +#: includes/class-wp-members-dialogs.php:125 +#, php-format +msgid "Sorry, %s is a required field." +msgstr "Valitettavasti %s on pakollinen tieto." + +#: includes/class-wp-members-dialogs.php:126 +msgid "You must enter a valid email address." +msgstr "Annoit väärän käyttäjätunnuksen tai salasanan. " + +#: includes/class-wp-members-dialogs.php:127 +msgid "The username cannot include non-alphanumeric characters." +msgstr "Käyttäjätunnus voi sisältää ainoastaan kirjaimia ja numeroita." + +#: includes/class-wp-members-dialogs.php:128 +msgid "Sorry, username is a required field" +msgstr "Käyttäjätunnus on pakollinen tieto." + +#: includes/class-wp-members-dialogs.php:129 +msgid "Sorry, that username is taken, Please try another." +msgstr "" + +#: includes/class-wp-members-dialogs.php:130 +msgid "Sorry, that email address already has an account. Please try another." +msgstr "" + +#: includes/class-wp-members-dialogs.php:131 +#: includes/class-wp-members-dialogs.php:174 +msgid "Passwords did not match." +msgstr "Salasanat eivät täsmää" + +#: includes/class-wp-members-dialogs.php:132 +msgid "Emails did not match." +msgstr "Sähköpostit eivät täsmää" + +#: includes/class-wp-members-dialogs.php:133 +msgid "You must complete the CAPTCHA form." +msgstr "CAPTCHA lomake on täytettävä oikein." + +#: includes/class-wp-members-dialogs.php:134 +msgid "CAPTCHA was not valid." +msgstr "" + +#: includes/class-wp-members-dialogs.php:135 +msgid "There was an error processing the form." +msgstr "" + +#: includes/class-wp-members-dialogs.php:136 +msgid "There was an error with the CAPTCHA form." +msgstr "CAPTCHA lomakkeessa oli virhe." + +#: includes/class-wp-members-dialogs.php:137 +#, php-format +msgid "" +"Sorry, you can only upload the following file types for the %s field: %s." +msgstr "" + +#: includes/class-wp-members-dialogs.php:138 +#: includes/class-wp-members-dialogs.php:171 +msgid "Your information was updated!" +msgstr "Tietosi on päivitetty!" + +#: includes/class-wp-members-dialogs.php:141 +msgid "Edit My Information" +msgstr "Muuta omia tietojani" + +#: includes/class-wp-members-dialogs.php:143 +#: includes/class-wp-members-dialogs.php:146 +#: includes/class-wp-members-dialogs.php:148 +#: includes/class-wp-members-dialogs.php:153 +#, php-format +msgid "You are logged in as %s" +msgstr "Olet kirjautunut sisään tunnuksella %s" + +#: includes/class-wp-members-dialogs.php:144 +msgid "Log out" +msgstr "" + +#: includes/class-wp-members-dialogs.php:145 +msgid "Edit profile" +msgstr "" + +#: includes/class-wp-members-dialogs.php:145 +msgid "Begin using the site." +msgstr "Aloita sivuston käyttö." + +#: includes/class-wp-members-dialogs.php:147 +msgid "Click to log out" +msgstr "Ilmoittaa lähtevänsä" + +#: includes/class-wp-members-dialogs.php:149 +msgid "click to log out" +msgstr "ilmoittaa lähtevänsä" + +#: includes/class-wp-members-dialogs.php:150 +msgid "Log Out" +msgstr "" + +#: includes/class-wp-members-dialogs.php:154 +msgid "click here to log out" +msgstr "Klikkaa tästä kirjautuaksesi ulos" + +#: includes/class-wp-members-dialogs.php:155 +msgid "Login Failed!
    You entered an invalid username or password." +msgstr "" +"Sisäänkirjautuminen epäonnistui
    Käyttäjätunnus tai salasana väärin." + +#: includes/class-wp-members-dialogs.php:156 +msgid "Invalid username or password." +msgstr "" + +#: includes/class-wp-members-dialogs.php:160 includes/class-wp-members.php:1745 +msgid "log in" +msgstr "Kirjaudu" + +#: includes/class-wp-members-dialogs.php:161 +msgid "Forgot?" +msgstr "Unohdit?" + +#: includes/class-wp-members-dialogs.php:165 +msgid "" +"This content is restricted to site members. If you are an existing user, " +"please log in. New users may register below." +msgstr "" +"Tämä sisältö on rajattu vain rekisteröityneille käyttäjille. Jos sinulla on " +"tänne käyttäjätunnus, ole hyvä ja kirjaudu sisään. Uudet käyttäjät voivat " +"rekisteröityä alla olevan lomakkeen avulla." + +#: includes/class-wp-members-dialogs.php:166 +msgid "" +"Congratulations! Your registration was successful.

    You may now " +"log in using the password that was emailed to you." +msgstr "" +"Onnittelut! Rekisteröintisi onnistui.

    Voit nyt kirjautua " +"sisään salasanalla, joka lähetetään sinulle antamaasi sähköpostiosoitteeseen." + +#: includes/class-wp-members-dialogs.php:169 +msgid "Sorry, that username is taken, please try another." +msgstr "Antamasi käyttäjätunnus on jo varattu, kokeile jotain toista." + +#: includes/class-wp-members-dialogs.php:170 +msgid "" +"Sorry, that email address already has an account.
    Please try another." +msgstr "" +"Antamasi sähköpostiosoite on jo käytössä.
    Anna jokin toinen osoite." + +#: includes/class-wp-members-dialogs.php:175 +msgid "Password successfully changed." +msgstr "" + +#: includes/class-wp-members-dialogs.php:176 +msgid "Invalid username or email address." +msgstr "" + +#: includes/class-wp-members-dialogs.php:177 +msgid "" +"Password successfully reset! An email containing a new password has been " +"sent to the email address on file for your account." +msgstr "" + +#: includes/class-wp-members-dialogs.php:178 +msgid "" +"Reset request received. An email with instructions to complete the password " +"reset has been sent." +msgstr "" + +#: includes/class-wp-members-dialogs.php:180 +msgid "This content requires the following membership: " +msgstr "" + +#: includes/class-wp-members-dialogs.php:181 +msgid "This content requires one of the following memberships: " +msgstr "" + +#: includes/class-wp-members-forms.php:84 +#: includes/class-wp-members-forms.php:350 +msgid "Choose membership" +msgstr "" + +#: includes/class-wp-members-forms.php:1898 +#: includes/class-wp-members-user-profile.php:510 +msgid "Activate this user?" +msgstr "Aktivoi tämä käyttäjä?" + +#: includes/class-wp-members-forms.php:2165 templates/tos.php:20 +msgid "Terms of Service" +msgstr "" + +#: includes/class-wp-members-menus.php:131 +msgid "Display" +msgstr "" + +#: includes/class-wp-members-menus.php:139 +msgid "Logged In Users" +msgstr "" + +#: includes/class-wp-members-menus.php:146 +msgid "Logged Out Users" +msgstr "" + +#: includes/class-wp-members-menus.php:153 +msgid "All Users" +msgstr "" + +#: includes/class-wp-members-menus.php:167 +#, php-format +msgid "%sAdd membership products%s to restrict menu to a membership" +msgstr "" + +#: includes/class-wp-members-menus.php:169 +msgid "Restrict menu item to a membership product" +msgstr "" + +#: includes/class-wp-members-products.php:342 +#, php-format +msgid "All %s" +msgstr "" + +#: includes/class-wp-members-products.php:343 +#, php-format +msgid "Add New %s" +msgstr "" + +#: includes/class-wp-members-products.php:344 +msgid "Add New" +msgstr "Luo uusi" + +#: includes/class-wp-members-products.php:345 +#, php-format +msgid "New %s" +msgstr "" + +#: includes/class-wp-members-products.php:346 +#, php-format +msgid "Edit %s" +msgstr "" + +#: includes/class-wp-members-products.php:347 +#, php-format +msgid "Update %s" +msgstr "" + +#: includes/class-wp-members-products.php:348 +#: includes/class-wp-members-products.php:349 +#, php-format +msgid "View %s" +msgstr "" + +#: includes/class-wp-members-products.php:350 +#, php-format +msgid "Search %s" +msgstr "" + +#: includes/class-wp-members-products.php:351 +msgid "Not found" +msgstr "" + +#: includes/class-wp-members-products.php:352 +msgid "Not found in Trash" +msgstr "" + +#: includes/class-wp-members-products.php:353 +msgid "Insert into item" +msgstr "" + +#: includes/class-wp-members-products.php:354 +#, php-format +msgid "Save %s Details" +msgstr "" + +#: includes/class-wp-members-products.php:355 +msgid "Membership Attributes" +msgstr "" + +#: includes/class-wp-members-products.php:358 +msgid "Membership Product" +msgstr "" + +#: includes/class-wp-members-products.php:359 +msgid "WP-Members Membership Products" +msgstr "" + +#: includes/class-wp-members-pwd-reset.php:35 +#: includes/class-wp-members-pwd-reset.php:36 +msgid "" +"Sorry, no password reset key was found. Please check your email and try " +"again." +msgstr "" + +#: includes/class-wp-members-pwd-reset.php:37 +msgid "Sorry, the password reset key is expired." +msgstr "" + +#: includes/class-wp-members-pwd-reset.php:167 +msgid "The passwords do not match." +msgstr "" + +#: includes/class-wp-members-shortcodes.php:134 +msgid "" +"This is a generic message to display the form message dialog in the " +"Customizer." +msgstr "" + +#: includes/class-wp-members-shortcodes.php:699 +msgid "Click here to log out." +msgstr "" + +#: includes/class-wp-members-user-profile.php:58 +msgid "WP-Members Additional Fields" +msgstr "WP-Members lisäkentät" + +#: includes/class-wp-members-user-profile.php:58 +msgid "Additional Information" +msgstr "Lisätiedot" + +#: includes/class-wp-members-user-profile.php:500 +msgid "Reactivate this user?" +msgstr "" + +#: includes/class-wp-members-user-profile.php:505 +msgid "Deactivate this user?" +msgstr "Poistaa tämän käyttäjän?" + +#: includes/class-wp-members-user-profile.php:559 +msgid "IP @ registration" +msgstr "IP @ rekisteröinnissä" + +#: includes/class-wp-members-user.php:1171 +msgid "ERROR: User has not been activated." +msgstr "" + +#: includes/class-wp-members-validation-link.php:32 +msgid "Click to validate your account: " +msgstr "" + +#: includes/class-wp-members-validation-link.php:33 +msgid "Thank you for validating your account." +msgstr "" + +#: includes/class-wp-members-validation-link.php:34 +msgid "Validation key was expired or invalid" +msgstr "" + +#: includes/class-wp-members-validation-link.php:35 +msgid "Your account is now pending approval" +msgstr "" + +#: includes/class-wp-members-validation-link.php:284 +msgid "ERROR: User has not confirmed their account." +msgstr "" + +#: includes/class-wp-members-widget.php:24 +msgid "Displays the WP-Members sidebar login." +msgstr "" + +#: includes/class-wp-members-widget.php:39 +#: includes/class-wp-members-widget.php:82 +msgid "Login Status" +msgstr "Kirjautumisen tila" + +#: includes/class-wp-members-widget.php:46 +msgid "Title:" +msgstr "Otsikko:" + +#: includes/class-wp-members-widget.php:50 +msgid "Redirect to (optional):" +msgstr "" + +#: includes/class-wp-members.php:1087 includes/class-wp-members.php:1098 +msgid "You must be logged in to view this content." +msgstr "" + +#: includes/class-wp-members.php:1104 +msgid "The page you are looking for does not exist" +msgstr "" + +#: includes/class-wp-members.php:1352 +#, php-format +msgid "" +"You have a linked page in the WP-Members page settings that corresponds to a " +"post ID that no longer exists. Please %s review and update the %s page " +"settings %s." +msgstr "" + +#: includes/class-wp-members.php:1472 +msgid "Show forms as logged out" +msgstr "" + +#: includes/class-wp-members.php:1481 +msgid "Show form message dialog" +msgstr "" + +#: includes/class-wp-members.php:1558 +msgid "(more…)" +msgstr "" + +#: includes/class-wp-members.php:1746 +msgid "log out" +msgstr "" + +#: includes/cli/class-wp-members-cli-user.php:24 +#: includes/cli/class-wp-members-cli-user.php:62 +msgid "Moderated registration is not enabled in WP-Members options." +msgstr "" + +#: includes/cli/class-wp-members-cli-user.php:35 +msgid "User activated." +msgstr "" + +#: includes/cli/class-wp-members-cli-user.php:37 +msgid "Email notification sent to user." +msgstr "" + +#: includes/cli/class-wp-members-cli-user.php:40 +msgid "User is already activated." +msgstr "" + +#: includes/cli/class-wp-members-cli-user.php:67 +msgid "User deactivated." +msgstr "" + +#: includes/cli/class-wp-members-cli-user.php:88 +msgid "Invalid user ID. Please specify a valid user. Try `wp user list`." +msgstr "" + +#: includes/cli/class-wp-members-cli-user.php:91 +msgid "No user id specified. Must specify user id as --id=123" +msgstr "" + +#: includes/cli/class-wp-members-cli-user.php:208 +#, php-format +msgid "User: %s" +msgstr "" + +#: includes/cli/class-wp-members-cli-user.php:248 +#, php-format +msgid "User role: %s" +msgstr "" + +#: includes/deprecated.php:373 +msgid "We were unable to validate the public key." +msgstr "Julkisen avaimen varmennus epäonnistui." + +#: includes/deprecated.php:377 +msgid "We were unable to validate the private key." +msgstr "Yksityisen avaimen varmennus epäonnistui." + +#: includes/deprecated.php:381 +msgid "The challenge parameter of the verify script was incorrect." +msgstr "Haasteen parametri varmenneskriptissä oli väärä." + +#: includes/deprecated.php:385 +msgid "The CAPTCHA solution was incorrect." +msgstr "CAPTCHA ratkaisu oli väärin" + +#: includes/deprecated.php:389 +msgid "The parameters to verify were incorrect" +msgstr "Varmennusparametrit olivat väärin" + +#: includes/deprecated.php:393 +msgid "" +"reCAPTCHA API keys are tied to a specific domain name for security reasons." +msgstr "reCAPTCHA API-avaimet on sidottu tiettyyn domainiin tietoturvasyistä." + +#: includes/deprecated.php:397 +msgid "The reCAPTCHA server was not reached. Please try to resubmit." +msgstr "reCAPTCHA palvelin ei vastaa, yritä uudestaan." + +#. translators: %s: title of menu item which is invalid +#: includes/walkers/class-wp-members-walker-nav-menu.php:92 +#, php-format +msgid "%s (Invalid)" +msgstr "" + +#. translators: %s: title of menu item in draft status +#: includes/walkers/class-wp-members-walker-nav-menu.php:96 +#, php-format +msgid "%s (Pending)" +msgstr "" + +#: includes/walkers/class-wp-members-walker-nav-menu.php:123 +msgid "Move up" +msgstr "" + +#: includes/walkers/class-wp-members-walker-nav-menu.php:136 +msgid "Move down" +msgstr "" + +#: includes/walkers/class-wp-members-walker-nav-menu.php:138 +msgid "Edit Menu Item" +msgstr "" + +#: includes/walkers/class-wp-members-walker-nav-menu.php:149 +msgid "URL" +msgstr "" + +#: includes/walkers/class-wp-members-walker-nav-menu.php:156 +msgid "Navigation Label" +msgstr "" + +#: includes/walkers/class-wp-members-walker-nav-menu.php:162 +msgid "Title Attribute" +msgstr "" + +#: includes/walkers/class-wp-members-walker-nav-menu.php:169 +msgid "Open link in a new window/tab" +msgstr "" + +#: includes/walkers/class-wp-members-walker-nav-menu.php:174 +msgid "CSS Classes (optional)" +msgstr "" + +#: includes/walkers/class-wp-members-walker-nav-menu.php:180 +msgid "Link Relationship (XFN)" +msgstr "" + +#: includes/walkers/class-wp-members-walker-nav-menu.php:188 +msgid "" +"The description will be displayed in the menu if the current theme supports " +"it." +msgstr "" + +#: includes/walkers/class-wp-members-walker-nav-menu.php:210 +#, php-format +msgid "Original: %s" +msgstr "" + +#: includes/walkers/class-wp-members-walker-nav-menu.php:223 +msgid "Remove" +msgstr "" + +#: templates/tos.php:32 +#, php-format +msgid "%sclose%s" +msgstr "" + +#: templates/tos.php:34 +#, php-format +msgid "%sprint%s" +msgstr "" + +#. Plugin Name of the plugin/theme +msgid "WP-Members" +msgstr "WP-Members" + +#. Plugin URI of the plugin/theme +msgid "https://rocketgeek.com" +msgstr "" + +#. Description of the plugin/theme +msgid "" +"WP access restriction and user registration. For more information on plugin " +"features, refer to the online Users Guide. A Quick Start Guide is also available. WP-" +"Members(tm) is a trademark of butlerblog.com." +msgstr "" + +#. Author of the plugin/theme +msgid "Chad Butler" +msgstr "Chad Butler" + +#. Author URI of the plugin/theme +msgid "https://butlerblog.com/" +msgstr "" + +#~ msgid "Manage reCAPTCHA Options" +#~ msgstr "Hallitse reCAPTCHA asetuksia" + +#~ msgid "" +#~ "reCAPTCHA is a free, accessible CAPTCHA service that helps to digitize " +#~ "books while blocking spam on your blog." +#~ msgstr "" +#~ "reCAPTCHA on ilmainen CAPTCHA sovellus, joka auttaa kirjojen " +#~ "digitoinnissa samalla kun se estää roskapostitusten pääsyn blogiisi" + +#, php-format +#~ msgid "" +#~ "reCAPTCHA asks commenters to retype two words scanned from a book to " +#~ "prove that they are a human. This verifies that they are not a spambot " +#~ "while also correcting the automatic scans of old books. So you get less " +#~ "spam, and the world gets accurately digitized books. Everybody wins! For " +#~ "details, visit the %s reCAPTCHA website%s" +#~ msgstr "" +#~ "reCAPTCHA pyytää kommentoijia kirjoittamaan kaksi sanaa, jotka on " +#~ "skannattu kirjasta todistaakseen että kysessä on ihminen. Tällä " +#~ "varmistetaan että roskapostitusohjelmat eivät pääse kommentoimaan ja " +#~ "samalla vanhojen kirjojen skannauksia voidaan automatisoida. Lue enemmän " +#~ "%s reCAPTCHA kotisivulta %s" + +#, php-format +#~ msgid "" +#~ "reCAPTCHA requires an API key, consisting of a \"public\" and a \"private" +#~ "\" key. You can sign up for a %s free reCAPTCHA key%s" +#~ msgstr "" +#~ "reCAPTCHA vaatii API-avaimen, joka koostuu \"julkisesta\" ja " +#~ "\"yksityisestä\" avaimesta. Voit tilata itsellesi ilmaisen %s reCAPTCHA " +#~ "avaimen %s" + +#~ msgid "Public Key" +#~ msgstr "Julkinen avain" + +#~ msgid "Private Key" +#~ msgstr "Yksityinen avain" + +#~ msgid "Choose Theme" +#~ msgstr "Valitse teema" + +#~ msgid "Red" +#~ msgstr "Punainen" + +#~ msgid "White" +#~ msgstr "Valkoinen" + +#~ msgid "Black Glass" +#~ msgstr "Musta lasi" + +#~ msgid "Clean" +#~ msgstr "Puhdista" + +#~ msgid "Active" +#~ msgstr "Aktivoitu" + +#~ msgid "Enable CAPTCHA" +#~ msgstr "Ota käyttöön CAPTCHA" + +#~ msgid "Passwords did not match.

    Please try again." +#~ msgstr "Salasanat eivät täsmää.

    Yritä uudestaan." + +#~ msgid "Either the username or email address do not exist in our records." +#~ msgstr "Käyttäjätunnusta tai sähköpostiosoitetta ei löydy." + +#~ msgid "http://butlerblog.com/" +#~ msgstr "http://butlerblog.com/" + +#~ msgid "Click to log out." +#~ msgstr "Ilmoittaa lähtevänsä." + +#~ msgid "You have set WP-Members to turn off the registration process" +#~ msgstr "WP-Members on nyt estänyt rekisteröintiprosessin" + +#~ msgid "Field Label is required for adding a new field. Nothing was updated." +#~ msgstr "" +#~ "Kentän otsikko vaaditaan uuden kentän lisäämiseksi. Mitään ei nyt " +#~ "päivitetty." + +#~ msgid "Option Name is required for adding a new field. Nothing was updated." +#~ msgstr "" +#~ "Option nimi vaaditaan uuden kentän lisäämiseksi. Mitään ei nyt päivitetty." + +#~ msgid "Option Name" +#~ msgstr "Option nimi" + +#~ msgid "" +#~ "Determine which fields will display and which are required. This " +#~ "includes all fields, both native WP fields and WP-Members custom fields." +#~ msgstr "" +#~ "Määrittele mitkä kentät näytetään ja mitkä ovat pakollisia. Tähän " +#~ "kuuluvat kaikki kentät, sekä WP:n alkuperäiset että WP-Members lisäosan " +#~ "omat." + +#~ msgid "(Note: Email is always mandatory and cannot be changed.)" +#~ msgstr "(Huomaa: sähköposti on aina pakollinen, eikä tätä voi muuttaa.)" + +#~ msgid "Add/Delete" +#~ msgstr "Lisää/Poista" + +#~ msgid "Checked?" +#~ msgstr "Rastitettu?" + +#~ msgid "Delete" +#~ msgstr "Poista" + +#~ msgid "(Email cannot be removed)" +#~ msgstr "(sähköpostiosoitetta ei voi poistaa)" + +#~ msgid "Update Fields" +#~ msgstr "Päivitä kentät" + +#~ msgid "Please indicate that you agree to the %s TOS %s" +#~ msgstr "Ole hyvä ja vahvista lukeneesi ja ymmärtäneesi %s käyttöehdot %s" + +#, fuzzy +#~ msgid "" +#~ "WP access restriction and user registration. For more information on " +#~ "plugin features, refer to the online Users Guide. A Quick Start Guide is also available. WP-Members(tm) is a trademark of butlerblog.com." +#~ msgstr "" +#~ "WP käytön rajaaminen ja käyttäjien rekisteröinti. Lisätiedot ja " +#~ "käyttöohjeet (englanninkielellä) http://butlerblog.com/wp-members . Toimiva demo " +#~ "osoitteessa http://" +#~ "butlerblog.com/wpmembers . WP-Members (tm) on tavaramerkki, jonka " +#~ "omistaa butlerblog.com." + +#~ msgid "Page Restriction" +#~ msgstr "Uuden käyttäjän rekisteröinti" + +#~ msgid "Block Posts by default" +#~ msgstr "Estä artikkeleiden näkyvyys oletusarvoisesti" + +#~ msgid "" +#~ "Note: Posts can still be individually blocked or unblocked at the article " +#~ "level" +#~ msgstr "Huomaa: artikkeleiden näkyvyys voidaan sallia tai estää yksitellen" + +#~ msgid "Block Pages by default" +#~ msgstr "Estä sivujen näkyvyys oletusarvoisesti" + +#~ msgid "" +#~ "Note: Pages can still be individually blocked or unblocked at the article " +#~ "level" +#~ msgstr "Huomaa: sivujen näkyvyys voidaan sallia tai estää yksitellen" + +#~ msgid "Show excerpts" +#~ msgstr "Näytä yhteenvedot" + +#~ msgid "" +#~ "Shows excerpted content above the login/registration on both Posts and " +#~ "Pages" +#~ msgstr "" +#~ "Näyttää yhteenvedon sisällöstä sisäänkirjautumisen ja rekisteröitymisen " +#~ "yläpuolella sekä artikkeleissa ja sivuissa." + +#~ msgid "Turns on CAPTCHA for registration" +#~ msgstr "CAPTCHA käytössä rekisteröinnissä" + +#~ msgid "Optional" +#~ msgstr "Valinnainen" + +#~ msgid "Automatically creates an excerpt" +#~ msgstr "Näytä yhteenvedot" + +#~ msgid "AIM" +#~ msgstr "AIM" + +#~ msgid "Yahoo IM" +#~ msgstr "Yahoo IM" + +#~ msgid "Jabber/Google Talk" +#~ msgstr "Jabber/Google Talk" + +#~ msgid "" +#~ "Password successfully changed!

    You will need to re-login with " +#~ "your new password." +#~ msgstr "" +#~ "Salasana on vaihdettu!

    Sinun on kirjauduttava uudestaan sisään " +#~ "uudella salasanallasi." + +#~ msgid "" +#~ "Password successfully reset!

    An email containing a new " +#~ "password has been sent to the email address on file for your account. You " +#~ "may change this random password then re-login with your new password." +#~ msgstr "" +#~ "Salasana onnistuneesti vaihdettu!

    Sinulle on lähetetty " +#~ "sähköposti, joka sisältää uuden satunnaisesti tuotetun salasanan " +#~ "tilillesi. Voit vaihtaa salasanan haluamaasi kuin kirjaudut seuraavan " +#~ "kerran sisään." + +#~ msgid "Custom" +#~ msgstr "Mukautettu" + +#, fuzzy +#~ msgid "edit" +#~ msgstr "Täytä omat tietosi" + +#~ msgid "Use reCAPTCHA" +#~ msgstr "Ota käyttöön reCAPTCHA" + +#~ msgid "New Password" +#~ msgstr "Uusi salasana" + +#~ msgid "Repeat Password" +#~ msgstr "Toista salasana" + +#~ msgid "Remember me" +#~ msgstr "Muista minut" + +#~ msgid "Turn off registration" +#~ msgstr "Estä rekisteröinnit" + +#~ msgid "Turns off the registration process, only allows login" +#~ msgstr "" +#~ "Uusien käyttäjien rekisteröinti estetty, vain sisäänkirjautuminen sallittu" + +#~ msgid "Legacy forms" +#~ msgstr "Aiemmat lomakkeet" + +#~ msgid "" +#~ "Uses the pre-2.5.1 table-based forms (leave off to use CSS table-less " +#~ "forms)" +#~ msgstr "" +#~ "Käytä versiota 2.5.1 edeltäviä taulukkolomakkeita (älä valitse tätä, jos " +#~ "haluat CSS lomakkeet ilman taulukoita)" + +#~ msgid "Members Area URL:" +#~ msgstr "Jäsensivun URL:" + +#~ msgid "Add" +#~ msgstr "Lisää" + +#~ msgid "WP-Members expiration periods were updated" +#~ msgstr "WP-Members vanhentumisajat on päivitetty" + +#~ msgid "" +#~ "Settings were saved, but you have required fields that are not set to " +#~ "display!" +#~ msgstr "" +#~ "Asetukset päivitettiin, mutta pakollisia kenttiä eli ole asetettu " +#~ "näkymään!" + +#, fuzzy +#~ msgid "" +#~ "Note: This will not cause an error for the end user, as only displayed " +#~ "fields are validated. However, you should still check that your " +#~ "displayed and required fields match up. Mismatched fields are " +#~ "highlighted below." +#~ msgstr "" +#~ "HUOMAA: Tämä ei aiheuta virhettäloppukäyttäjän näkyviin, koska vain " +#~ "näkyvät kentät validoidaan. On kuitenkin suositeltavaa että tarkistat " +#~ "että \r\n" +#~ "\t\t\t\tnäytetyt ja vaaditut kentät täsmäävät. Kentät jotka eivät täsmää " +#~ "on korostettu alla." + +#~ msgid "If you find this plugin useful, please consider making a donation" +#~ msgstr "" +#~ "Jos tämä lisäosa on sinusta hyödyllinen, harkitsethan lahjoitusta " +#~ "tekijälle" + +#~ msgid "Subscriptions" +#~ msgstr "Tilaukset" + +#~ msgid "PayPal Settings" +#~ msgstr "Paypal asetukset" + +#~ msgid "If you find this plugin useful, please consider a %s donation %s" +#~ msgstr "" +#~ "Jos tämä lisäosa on sinusta hyödyllinen, harkitsethan tekijälle %s " +#~ "lahjoitusta %s" + +#~ msgid "%d users were activated." +#~ msgstr "%d käyttäjää aktivoitu." + +#~ msgid "" +#~ "Users ready to export, %s click here %s to generate and download a CSV." +#~ msgstr "" +#~ "Käyttäjät valmiina vientiin, %s klikkaa tästä %s luodaksesi ja " +#~ "ladataksesi CSV tiedoston." + +#~ msgid "WP-Members Users" +#~ msgstr "WP-Members Käyttäjät" + +#~ msgid "No users matched your criteria" +#~ msgstr "Yksikään käyttäjä ei vastannut ehtojasi" + +#~ msgid "Bulk Actions" +#~ msgstr "Massatoiminnot" + +#~ msgid "Apply" +#~ msgstr "Käytä" + +#, fuzzy +#~ msgid "Indicates a required field" +#~ msgstr "Käyttäjätunnus on pakollinen tieto." + +#~ msgid "Login" +#~ msgstr "Kirjaudu sisään" + +#~ msgid "Clear Form" +#~ msgstr "Tyhjennä lomake" + +#~ msgid "Submit" +#~ msgstr "Valmis" + +#~ msgid "Cheatin’ uh?" +#~ msgstr "Kusetusta’ vai?" + +#~ msgid "there was an error and no users were exported" +#~ msgstr "tapahtui virhe, eikä yhtään käyttäjää voitu viedä" + +#~ msgid "You are not currently logged in." +#~ msgstr "Et ole kirjautuneena sisään" + +#~ msgid "login" +#~ msgstr "Kirjaudu" + +#~ msgid "You may change your password here: %s" +#~ msgstr "Voit vaihtaa salasanasi täällä: %s" + +#~ msgid "Your registration info for %s" +#~ msgstr "Rekisteröintitiedot käyttäjälle %s" + +#~ msgid "Thank you for registering for %s" +#~ msgstr "Kiitos kun rekisteröidyit %s" + +#~ msgid "Your registration information is below." +#~ msgstr "Rekisteröintitietosi ovat seuraavat." + +#~ msgid "You may wish to retain a copy for your records." +#~ msgstr "" +#~ "On suositeltavaa että säilytät nämä tiedot itselläsi varmassa paikassa." + +#~ msgid "username: %s" +#~ msgstr "Käyttäjätunnus: %s" + +#~ msgid "password: %s" +#~ msgstr "Salasana: %s" + +#~ msgid "You may login here:" +#~ msgstr "Voit kirjautua sisään täältä:" + +#~ msgid "" +#~ "Thank you for registering for %s. Your registration has been received and " +#~ "is pending approval." +#~ msgstr "" +#~ "Kiitos kun rekisteröidyit sivustolle %s. Rekisteröintitiedot on " +#~ "vastaanotettu ja odottavat pääkäyttäjän hyväksyntää." + +#~ msgid "You will receive login instructions upon approval of your account" +#~ msgstr "" +#~ "Kun tilisi ja käyttäjätunnuksesi on hyväksytty, saat sähköpostilla " +#~ "yksityiskohtaiset tiedot sisäänkirjautumista varten." + +#~ msgid "Your registration for %s has been approved." +#~ msgstr "Rekisteröitymisesti sivulle %s on nyt hyväksytty." + +#~ msgid "You may login at: %s" +#~ msgstr "Voit kirjautua sisään täällä: %s" + +#~ msgid "You originally registered at:" +#~ msgstr "Olet alunperin rekisteröitynyt: " + +#~ msgid "Password reset for %s" +#~ msgstr "Salasanan nollaus tunnukselle %s" + +#~ msgid "Your password for %s has been reset" +#~ msgstr "Salasanasi tunnuksella %s on nollattu" + +#~ msgid "" +#~ "Your new password is included below. You may wish to retain a copy for " +#~ "your records." +#~ msgstr "Uusi salasanasi näkyy alla. Säilytä tästä kopio itselläsi." + +#~ msgid "This is an automated message from %s" +#~ msgstr "Tämä viesti on lähetetty automaattisesti osoitteesta %s" + +#~ msgid "Please do not reply to this address" +#~ msgstr "Älä vastaa tähän osoitteeseen" + +#~ msgid "New user registration for %s" +#~ msgstr "Uuden käyttäjän rekisteröinti nimellä %s" + +#~ msgid "The following user registered for %s" +#~ msgstr "Seuraava käyttäjä on rekisteröitynyt nimellä %s" + +#~ msgid "and is pending admin approval" +#~ msgstr "ja odottaa pääkäyttäjän hyväksyntää" + +#~ msgid "" +#~ "Please indicate that you have read and agree to the %s Terms of Service %s" +#~ msgstr "Ole hyvä ja vahvista lukeneesi ja ymmärtäneesi %s käyttöehdot %s" + +#~ msgid "http://butlerblog.com/wp-members/" +#~ msgstr "http://butlerblog.com/wp-members/" diff --git a/i18n/languages/wp-members-he_IL.mo b/i18n/languages/wp-members-he_IL.mo new file mode 100644 index 00000000..f55cedcf Binary files /dev/null and b/i18n/languages/wp-members-he_IL.mo differ diff --git a/i18n/languages/wp-members-he_IL.po b/i18n/languages/wp-members-he_IL.po new file mode 100644 index 00000000..7eb3d7af --- /dev/null +++ b/i18n/languages/wp-members-he_IL.po @@ -0,0 +1,2586 @@ +msgid "" +msgstr "" +"Project-Id-Version: WP-Members 3.2.6\n" +"POT-Creation-Date: 2023-01-06 15:20-0500\n" +"PO-Revision-Date: 2023-01-06 15:21-0500\n" +"Last-Translator: Ahrale \n" +"Language-Team: Ahrale | Atar4U.com\n" +"Language: he_IL\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Generator: Poedit 2.4.3\n" +"X-Poedit-Basepath: ..\n" +"X-Poedit-WPHeader: wp-members.php\n" +"X-Poedit-SourceCharset: UTF-8\n" +"X-Poedit-KeywordsList: __;_e;_n:1,2;_x:1,2c;_ex:1,2c;_nx:4c,1,2;esc_attr__;" +"esc_attr_e;esc_attr_x:1,2c;esc_html__;esc_html_e;esc_html_x:1,2c;_n_noop:1,2;" +"_nx_noop:3c,1,2;__ngettext_noop:1,2\n" +"X-Poedit-SearchPath-0: .\n" +"X-Poedit-SearchPathExcluded-0: *.js\n" + +#: includes/admin/class-wp-members-admin-api.php:254 +msgid "Custom email" +msgstr "" + +#: includes/admin/class-wp-members-admin-api.php:255 +#: includes/admin/class-wp-members-admin-api.php:257 +msgid "Subject" +msgstr "" + +#: includes/admin/class-wp-members-admin-api.php:258 +msgid "Body" +msgstr "" + +#: includes/admin/class-wp-members-admin-api.php:260 +msgid "Your custom email message content." +msgstr "" + +#: includes/admin/class-wp-members-admin-api.php:338 +msgid "Options" +msgstr "אפשרויות" + +#: includes/admin/class-wp-members-admin-api.php:339 +msgid "Fields" +msgstr "שדות" + +#: includes/admin/class-wp-members-admin-api.php:340 +msgid "Dialogs" +msgstr "תיבות דו-שיח" + +#: includes/admin/class-wp-members-admin-api.php:341 +msgid "Emails" +msgstr "אימיילים" + +#: includes/admin/class-wp-members-admin-api.php:357 +msgid "New Registration" +msgstr "רישום חדש" + +#: includes/admin/class-wp-members-admin-api.php:365 +#: includes/admin/class-wp-members-admin-api.php:383 +msgid "User email validated" +msgstr "" + +#: includes/admin/class-wp-members-admin-api.php:375 +msgid "Registration is Moderated" +msgstr "ההרשמה מסוננת" + +#: includes/admin/class-wp-members-admin-api.php:391 +msgid "Registration is Moderated, User is Approved" +msgstr "ההרשמה מסוננת, המשתמש מאושר" + +#: includes/admin/class-wp-members-admin-api.php:399 +msgid "Password Reset" +msgstr "איפוס סיסמה" + +#: includes/admin/class-wp-members-admin-api.php:406 +msgid "Retrieve Username" +msgstr "שחזור שם משתמש" + +#: includes/admin/class-wp-members-admin-api.php:414 +msgid "Admin Notification" +msgstr "הודעה להנהלה" + +#: includes/admin/class-wp-members-admin-api.php:440 +msgid "Restricted post (or page), displays above the login/registration form" +msgstr "פוסט מוגבלת (או עמוד), מוצג מעל טופס כניסה/הרשמה" + +#: includes/admin/class-wp-members-admin-api.php:441 +msgid "Username is taken" +msgstr "שם המשתמש כבר תפוס" + +#: includes/admin/class-wp-members-admin-api.php:442 +msgid "Email is registered" +msgstr "האימייל כבר רשום" + +#: includes/admin/class-wp-members-admin-api.php:443 +msgid "Registration completed" +msgstr "ההרשמה הושלמה" + +#: includes/admin/class-wp-members-admin-api.php:444 +msgid "User update" +msgstr "עדכון המשתמש" + +#: includes/admin/class-wp-members-admin-api.php:445 +msgid "Passwords did not match" +msgstr "הסיסמאות אינן תואמות" + +#: includes/admin/class-wp-members-admin-api.php:446 +msgid "Password changes" +msgstr "החלפת סיסמה" + +#: includes/admin/class-wp-members-admin-api.php:447 +msgid "Username or email do not exist when trying to reset forgotten password" +msgstr "שם המשתמש או האימייל אינם קיימים, כאשר מנסים לאפס את הסיסמה" + +#: includes/admin/class-wp-members-admin-api.php:448 +msgid "Password reset" +msgstr "איפוס סיסמה" + +#: includes/admin/class-wp-members-admin-api.php:547 +msgid "Close" +msgstr "" + +#: includes/admin/class-wp-members-admin-api.php:596 +msgid "Settings" +msgstr "הגדרות" + +#: includes/admin/class-wp-members-admin-posts.php:30 +#: includes/admin/class-wp-members-admin-posts.php:33 +msgid "Unrestrict" +msgstr "" + +#: includes/admin/class-wp-members-admin-posts.php:31 +#: includes/admin/class-wp-members-admin-posts.php:34 +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:110 +msgid "Restrict" +msgstr "" + +#: includes/admin/class-wp-members-admin-posts.php:32 +#: includes/admin/class-wp-members-admin-posts.php:35 +msgid "Hide" +msgstr "להסתיר" + +#: includes/admin/class-wp-members-admin-posts.php:125 +#, php-format +msgid "%s restricted" +msgstr "" + +#: includes/admin/class-wp-members-admin-posts.php:125 +#, php-format +msgid "%s unrestricted" +msgstr "" + +#: includes/admin/class-wp-members-admin-posts.php:165 +#, php-format +msgid "%s Restriction" +msgstr "הגבלת %s" + +#: includes/admin/class-wp-members-admin-posts.php:195 +#: includes/admin/class-wp-members-admin-posts.php:342 +#: includes/admin/class-wp-members-admin-posts.php:345 +msgid "Unrestricted" +msgstr "" + +#: includes/admin/class-wp-members-admin-posts.php:196 +#: includes/admin/class-wp-members-admin-posts.php:339 +#: includes/admin/class-wp-members-admin-posts.php:347 +msgid "Restricted" +msgstr "" + +#: includes/admin/class-wp-members-admin-posts.php:197 +#: includes/admin/class-wp-members-admin-posts.php:349 +msgid "Hidden" +msgstr "" + +#: includes/admin/class-wp-members-admin-posts.php:203 +msgid "Status:" +msgstr "" + +#: includes/admin/class-wp-members-admin-posts.php:203 +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:68 +#: includes/admin/tabs/class-wp-members-fields-table.php:65 +#: includes/walkers/class-wp-members-walker-nav-menu.php:140 +msgid "Edit" +msgstr "עריכה" + +#: includes/admin/class-wp-members-admin-posts.php:218 +msgid "Ok" +msgstr "" + +#: includes/admin/class-wp-members-admin-posts.php:219 +#: includes/walkers/class-wp-members-walker-nav-menu.php:224 +msgid "Cancel" +msgstr "" + +#: includes/admin/class-wp-members-admin-posts.php:305 +msgid "Status" +msgstr "" + +#: includes/admin/class-wp-members-admin-users.php:28 +#: includes/admin/class-wp-members-admin-users.php:34 +#: includes/admin/class-wp-members-admin-users.php:79 +msgid "Activate" +msgstr "הפעלה" + +#: includes/admin/class-wp-members-admin-users.php:29 +#: includes/admin/class-wp-members-admin-users.php:35 +#: includes/admin/class-wp-members-admin-users.php:82 +msgid "Deactivate" +msgstr "" + +#: includes/admin/class-wp-members-admin-users.php:31 +#: includes/admin/class-wp-members-admin-users.php:37 +msgid "Export" +msgstr "יצוא" + +#: includes/admin/class-wp-members-admin-users.php:32 +#: includes/admin/class-wp-members-admin-users.php:38 +msgid "Export All Users" +msgstr "יצוא כל המשתמשים" + +#: includes/admin/class-wp-members-admin-users.php:61 +msgid "Confirm" +msgstr "" + +#: includes/admin/class-wp-members-admin-users.php:64 +msgid "Unconfirm" +msgstr "" + +#: includes/admin/class-wp-members-admin-users.php:147 +#, php-format +msgid "%s users activated" +msgstr "" + +#: includes/admin/class-wp-members-admin-users.php:147 +#, php-format +msgid "%s users deactivated" +msgstr "" + +#: includes/admin/class-wp-members-admin-users.php:150 +msgid "No users selected" +msgstr "" + +#: includes/admin/class-wp-members-admin-users.php:168 +msgid "You cannot activate or deactivate yourself" +msgstr "" + +#: includes/admin/class-wp-members-admin-users.php:173 +#, php-format +msgid "%s activated" +msgstr "" + +#: includes/admin/class-wp-members-admin-users.php:178 +#, php-format +msgid "%s deactivated" +msgstr "" + +#: includes/admin/class-wp-members-admin-users.php:182 +msgid "That user is already active" +msgstr "" + +#: includes/admin/class-wp-members-admin-users.php:198 +msgid "You cannot confirm or unconfirm yourself" +msgstr "" + +#: includes/admin/class-wp-members-admin-users.php:203 +#, php-format +msgid "%s confirmed" +msgstr "" + +#: includes/admin/class-wp-members-admin-users.php:208 +#, php-format +msgid "%s unconfirmed" +msgstr "" + +#: includes/admin/class-wp-members-admin-users.php:212 +msgid "That user is already confirmed" +msgstr "" + +#: includes/admin/class-wp-members-admin-users.php:341 +msgid "Pending" +msgstr "" + +#: includes/admin/class-wp-members-admin-users.php:342 +msgid "Trial" +msgstr "" + +#: includes/admin/class-wp-members-admin-users.php:343 +#: includes/admin/class-wp-members-user-export.php:289 +msgid "Subscription" +msgstr "מנוי" + +#: includes/admin/class-wp-members-admin-users.php:344 +msgid "Expired" +msgstr "" + +#: includes/admin/class-wp-members-admin-users.php:347 +#: includes/admin/class-wp-members-admin-users.php:410 +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:457 +msgid "Activated" +msgstr "" + +#: includes/admin/class-wp-members-admin-users.php:348 +msgid "Pending Activation" +msgstr "" + +#: includes/admin/class-wp-members-admin-users.php:349 +msgid "Deactivated" +msgstr "" + +#: includes/admin/class-wp-members-admin-users.php:352 +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:456 +msgid "Confirmed" +msgstr "" + +#: includes/admin/class-wp-members-admin-users.php:353 +msgid "Not Confirmed" +msgstr "" + +#: includes/admin/class-wp-members-admin-users.php:355 +msgid "Not Exported" +msgstr "" + +#: includes/admin/class-wp-members-admin-users.php:475 +msgid "Not confirmed" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:67 +msgid "Slug" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:68 +#: includes/admin/class-wp-members-user-export.php:294 +msgid "Role" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:69 +#: includes/admin/class-wp-members-products-admin.php:740 +#: includes/admin/class-wp-members-user-export.php:290 +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:460 +msgid "Expires" +msgstr "פג תוקף" + +#: includes/admin/class-wp-members-products-admin.php:71 +msgid "Default" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:73 +msgid "Last updated" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:97 +msgid "slug:" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:100 +msgid "No role required" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:105 +msgid "Does not expire" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:109 +#: includes/admin/class-wp-members-user-export.php:199 +msgid "Yes" +msgstr "כן" + +#: includes/admin/class-wp-members-products-admin.php:145 +msgid "Membership Product Details" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:153 +msgid "Membership Product Message (optional)" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:169 +msgid "Access by child membership" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:185 +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:62 +msgid "Posts" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:186 +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:63 +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:249 +msgid "Pages" +msgstr "עמודים" + +#: includes/admin/class-wp-members-products-admin.php:213 +#: includes/admin/class-wp-members-products-admin.php:262 +#: includes/admin/class-wp-members-products-admin.php:309 +msgid "Period" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:213 +msgid "Day" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:213 +msgid "Week" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:213 +msgid "Month" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:213 +msgid "Year" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:226 +msgid "Name (slug)" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:228 +msgid "Optional Defaults" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:231 +msgid "Assign as default at registration? (optional)" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:239 +#, php-format +msgid "Pre-selected by default for new %s" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:245 +msgid "Optional Properties" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:248 +msgid "Role Required? (optional)" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:251 +msgid "No Role" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:257 +msgid "Expires (optional)" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:259 +#: includes/admin/class-wp-members-products-admin.php:261 +#: includes/admin/class-wp-members-products-admin.php:306 +#: includes/admin/class-wp-members-products-admin.php:308 +msgid "Number" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:267 +msgid "Use \"no gap\" renewal" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:271 +msgid "Use a fixed period (such as Jan 1 - Dec 31, or Sept 1 - Aug 31)" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:288 +#: includes/admin/class-wp-members-products-admin.php:289 +msgid "Period Start (dd-mm)" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:290 +#: includes/admin/class-wp-members-products-admin.php:291 +msgid "Period End (dd-mm)" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:304 +msgid "Fixed period grace period" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:313 +msgid "" +"Grace period is the point at which expiration date is for following time " +"period. For example, if user who register August 1st would be part of the " +"following year's Sept 1 - Aug 31 membership, set this at 1 Month. Leave " +"blank for no grace period." +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:376 +msgid "" +"Restricted Message (displays when a user does not have access to a " +"membership)" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:502 +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:239 +#: includes/class-wp-members-forms.php:1196 +#: includes/class-wp-members-user-profile.php:132 +msgid "None" +msgstr "ללא" + +#: includes/admin/class-wp-members-products-admin.php:517 +msgid "Restrict access by membership:" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:598 +msgid "Required Membership" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:644 +#: includes/admin/class-wp-members-products-admin.php:745 +#: includes/class-wp-members-products.php:335 +msgid "Membership" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:680 +msgid "expires:" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:709 +#: includes/class-wp-members-products.php:336 +#: includes/class-wp-members-products.php:341 +msgid "Memberships" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:736 +msgid "Membership Access" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:744 +msgid "Action" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:746 +msgid "Enabled?" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:757 +msgid "Enable" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:758 +msgid "Disable" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:759 +msgid "Update" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:764 +msgid "Expiration date (optional)" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:795 +#, php-format +msgid "No memberships have been created. %sCreate new memberships here%s" +msgstr "" + +#: includes/admin/class-wp-members-user-export.php:199 +msgid "No" +msgstr "לא" + +#: includes/admin/class-wp-members-user-export.php:264 +msgid "You do not have the required user capabilities to export users." +msgstr "" + +#: includes/admin/class-wp-members-user-export.php:277 +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:461 +msgid "User ID" +msgstr "" + +#: includes/admin/class-wp-members-user-export.php:284 +#: includes/class-wp-members-dialogs.php:91 +#: includes/class-wp-members-dialogs.php:114 +msgid "Username" +msgstr "שם משתמש" + +#: includes/admin/class-wp-members-user-export.php:286 +msgid "Activated?" +msgstr "פעיל?" + +#: includes/admin/class-wp-members-user-export.php:292 +msgid "Registered" +msgstr "רשום" + +#: includes/admin/class-wp-members-user-export.php:293 +msgid "IP" +msgstr "כתובת IP" + +#: includes/admin/dialogs.php:117 +msgid "" +"Your WP settings allow anyone to register - this is not the recommended " +"setting." +msgstr "הגדרות האתר שלך מאפשרות לכל אחד להירשם - זו אינה ההגדרה המומלצת." + +#: includes/admin/dialogs.php:118 +#, php-format +msgid "" +"You can %s change this here %s making sure the box next to \"Anyone can " +"register\" is unchecked." +msgstr "" +"באפשרותך %s לשנות את זה כאן %s ולוודא שתיבת הסימון ליד \"כל אחד יכול להירשם" +"\" אינה מסומנת." + +#: includes/admin/dialogs.php:119 +msgid "" +"This setting allows a link on the /wp-login.php page to register using the " +"WP native registration process thus circumventing any registration you are " +"using with WP-Members. In some cases, this may suit the users wants/needs, " +"but most users should uncheck this option. If you do not change this " +"setting, you can choose to ignore these warning messages under WP-Members " +"Settings." +msgstr "" +"הגדרה זו מאפשרת קישור בעמוד הכניסה /wp-login.php להרשמה תוך שימוש בתהליך " +"הרישום המקורי ולעקוף את הרישום שלך בוורדפרס-חברים. לפעמים זה עונה על הצורך, " +"אבל רוב המשתמשים צריכים לא לסמן את האפשרות הזו. אם אינך משנה הגדרה זו, אפשר " +"לבחור להתעלם מהודעות אזהרה אלו בהגדרות וורדפרס-חברים." + +#: includes/admin/dialogs.php:123 +msgid "" +"Your WP settings allow anyone to comment - this is not the recommended " +"setting." +msgstr "הגדרות האתר שלך מאפשרות לכל אחד להגיב - הגדרה זו אינה מומלצת." + +#: includes/admin/dialogs.php:124 +#, php-format +msgid "" +"You can %s change this here %s by checking the box next to \"Users must be " +"registered and logged in to comment.\"" +msgstr "" +"אפשר %sלשנות זאת כאן%s על-ידי סימון התיבה שליד \"משתמשים חייבים להיות רשומים " +"ומחוברים כדי להגיב\"" + +#: includes/admin/dialogs.php:125 +msgid "" +"This setting allows any users to comment, whether or not they are " +"registered. Depending on how you are using WP-Members will determine whether " +"you should change this setting or not. If you do not change this setting, " +"you can choose to ignore these warning messages under WP-Members Settings." +msgstr "" +"הגדרה זו מאפשרת לכל המשתמשים להגיב, בין אם הם רשומים ובין אם לאו. תלוי איך " +"אתה משתמש בוורדפרס-חברים, ייקבע אם עליך לשנות הגדרה זו או לא. אם לא תשנה " +"הגדרה זו, באפשרותך לבחור להתעלם מהודעות אזהרה אלו תחת הגדרות וורדפרס-חברים." + +#: includes/admin/dialogs.php:129 +msgid "" +"Your WP settings allow full text rss feeds - this is not the recommended " +"setting." +msgstr "הגדרות האתר שלך מאפשרות הזנות RSS בטקסט מלא - הגדרה זו אינה מומלצת." + +#: includes/admin/dialogs.php:130 +#, php-format +msgid "" +"You can %s change this here %s by changing \"For each article in a feed, show" +"\" to \"Summary.\"" +msgstr "" +"אפשר %sלשנות זאת כאן%s על-ידי שינוי \"עבור כל מאמר בהזנה,\" ל\"תקציר\"." + +#: includes/admin/dialogs.php:131 +msgid "" +"Leaving this set to full text allows anyone to read your protected content " +"in an RSS reader. Changing this to Summary prevents this as your feeds will " +"only show summary text." +msgstr "" +"השארת הגדרה זו לטקסט מלא מאפשרת לכל אחד לקרוא את התוכן המוגן בקורא הזנות " +"RSS. שינוי לתקציר מונע את זה כי ההזנות יציגו רק תקציר." + +#: includes/admin/dialogs.php:135 +msgid "You have set WP-Members to hold registrations for approval" +msgstr "הגדרת את וורדפרס-חברים לעכב הרשמה עד לקבלת אישור" + +#: includes/admin/dialogs.php:136 +msgid "" +"but you have not changed the default message for \"Registration Completed\" " +"under \"WP-Members Dialogs and Error Messages.\" You should change this " +"message to let users know they are pending approval." +msgstr "" +"אבל לא שינית את הודעת ברירת המחדל עבור \"ההרשמה הושלמה\" ב\"הודעות תיבות הדו-" +"שיח ושגיאות של של וורדפרס חברים\".צריך לשנות את ההודעה הזו כדי ליידע את " +"המשתמשים שהם בהמתנה לאישור." + +#: includes/admin/dialogs.php:140 +msgid "You have turned on reCAPTCHA" +msgstr "הפעלת את reCAPTCHA" + +#: includes/admin/dialogs.php:141 +msgid "" +"but you have not entered API keys. You will need both a public and private " +"key. The CAPTCHA will not display unless a valid API key is included." +msgstr "" +"אבל לא הזנת מפתחות API. צריך מפתח ציבורי ומפתח פרטי. קוד האימות לא יוצג ללא " +"מפתחות API." + +#: includes/admin/dialogs.php:145 +msgid "You have active settings that are not recommended." +msgstr "" + +#: includes/admin/dialogs.php:146 +msgid "" +"If you will not be changing these settings, you can turn off these warning " +"messages by checking the \"Ignore warning messages\" in the settings below." +msgstr "" + +#: includes/admin/dialogs.php:174 +msgid "Version:" +msgstr "גרסה" + +#: includes/admin/dialogs.php:175 +msgid "Quick Start Guide" +msgstr "מדריך התחלה מהירה" + +#: includes/admin/dialogs.php:176 +msgid "Online User Guide" +msgstr "מדריך מקוון למשתמש" + +#: includes/admin/dialogs.php:177 +msgid "FAQs" +msgstr "שאלות נפוצות" + +#: includes/admin/dialogs.php:184 +msgid "Thank you for using WP-Members" +msgstr "תודה לך על השימוש בוורדפרס-חברים" + +#: includes/admin/dialogs.php:185 +msgid "A plugin developed by" +msgstr "התוסף פותח על-ידי" + +#: includes/admin/dialogs.php:186 +msgid "Follow" +msgstr "עקוב אחרינו" + +#: includes/admin/dialogs.php:203 includes/admin/dialogs.php:207 +msgid "Latest from RocketGeek" +msgstr "פרסומים אחרונים של RocketGeek" + +#: includes/admin/dialogs.php:224 +msgid "Like WP-Members?" +msgstr "" + +#: includes/admin/dialogs.php:225 +#, php-format +msgid "" +"If you like WP-Members please give it a %s★★★★★" +"%s rating. Thanks!!" +msgstr "" + +#: includes/admin/dialogs.php:236 includes/admin/dialogs.php:249 +msgid "Latest from ButlerBlog" +msgstr "פרסומים אחרונים ב ButlerBlog" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:67 +#, php-format +msgid "See the %sUsers Guide on CAPTCHA%s." +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:74 +#: includes/admin/tabs/class-wp-members-admin-tab-dialogs.php:57 +#: includes/admin/tabs/class-wp-members-admin-tab-emails.php:109 +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:134 +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:78 +msgid "Need help?" +msgstr "צריך עזרה?" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:85 +msgid "Manage CAPTCHA Options" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:91 +msgid "CAPTCHA Type" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:96 +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:243 +msgid "reCAPTCHA v2" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:97 +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:244 +msgid "reCAPTCHA v3" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:98 +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:245 +msgid "Really Simple CAPTCHA" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:99 +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:246 +msgid "hCaptcha" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:106 +msgid "" +"CAPTCHA type was changed. Please verify and update the settings below for " +"the new CAPTCHA type." +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:117 +msgid "reCAPTCHA Keys" +msgstr "מפתחות reCAPTCHA" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:120 +#, php-format +msgid "" +"reCAPTCHA requires an API key, consisting of a \"site\" and a \"secret\" " +"key. You can sign up for a %s free reCAPTCHA key%s" +msgstr "" +"קוד אימות של reCAPTCHA דורש מפתח API, המורכב מ \"מפתח אתר\" ו \"מפתח סודי\". " +"באפשרותך להירשם לקבלת %sמפתחות reCAPTCHA ללא תשלום%s" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:122 +msgid "Site Key" +msgstr "מפתח אתר" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:123 +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:139 +msgid "Secret Key" +msgstr "מפתח סודי" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:133 +msgid "hCaptcha Keys" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:136 +#, php-format +msgid "" +"hCaptcha requires an API key. You can sign up for %s an hCaptcha API key " +"here %s" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:138 +msgid "API Key" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:170 +msgid "Characters for image" +msgstr "תווים עבור התמונה" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:174 +msgid "Number of characters" +msgstr "מספר התווים" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:178 +msgid "Image dimensions" +msgstr "גודל התמונה" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:179 +msgid "Width" +msgstr "רוחב" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:179 +msgid "Height" +msgstr "גובה" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:182 +msgid "Font color of characters" +msgstr "צבע הגופן של התווים" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:186 +msgid "Background color of image" +msgstr "צבע הרקע של התמונה" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:190 +msgid "Font size" +msgstr "גודל הגופן" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:194 +msgid "Width between characters" +msgstr "המרווח בין התווים" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:198 +msgid "Image type" +msgstr "סוג התמונה" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:213 +msgid "" +"To use Really Simple CAPTCHA, you must have the Really Simple CAPTCHA plugin " +"installed and activated." +msgstr "" +"כדי להשתמש בקוד אימות פשוט באמת, חובה להתקין ולהפעיל את התוסף Really Simple " +"CAPTCHA." + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:241 +msgid "Update CAPTCHA Settings" +msgstr "עדכון הגדרות קוד האימות" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:319 +msgid "CAPTCHA was updated for WP-Members" +msgstr "קוד האימות עבור וורדפרס-חברים עודכן" + +#: includes/admin/tabs/class-wp-members-admin-tab-dialogs.php:67 +msgid "Dialogs and Error Messages" +msgstr "הודעות דו-שיח ושגיאה" + +#: includes/admin/tabs/class-wp-members-admin-tab-dialogs.php:69 +#, php-format +msgid "" +"You can customize the text for dialogs and error messages. Simple HTML is " +"allowed %s etc." +msgstr "" +"באפשרותך להתאים אישית את הטקסט עבור תיבות דו-שיח והודעות שגיאה. אפשר להשתמש " +"ב HTML פשוט %s ועוד." + +#: includes/admin/tabs/class-wp-members-admin-tab-dialogs.php:80 +msgid "Terms of Service (TOS)" +msgstr "תנאי השימוש" + +#: includes/admin/tabs/class-wp-members-admin-tab-dialogs.php:87 +msgid "Update Dialogs" +msgstr "עדכון דו-שיח" + +#: includes/admin/tabs/class-wp-members-admin-tab-dialogs.php:124 +msgid "WP-Members dialogs were updated" +msgstr "הדו-שיח של וורדפרס-חברים עודכן" + +#: includes/admin/tabs/class-wp-members-admin-tab-dropins.php:88 +#: includes/admin/tabs/class-wp-members-dropins-table.php:180 +msgid "WP-Members Dropin settings were updated" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-dropins.php:216 +msgid "Manage Dropins" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-dropins.php:217 +msgid "Current dropin folder: " +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-dropins.php:218 +msgid "" +"You can change location of the dropin folder using the " +"wpmem_dropin_folder filter." +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-emails.php:57 +msgid "Email Messages" +msgstr "הודעות אימייל" + +#: includes/admin/tabs/class-wp-members-admin-tab-emails.php:60 +msgid "You can customize the content of the emails sent by the plugin." +msgstr "אפשר לשנות את תוכן האימיילים הנשלחים על-ידי התוסף." + +#: includes/admin/tabs/class-wp-members-admin-tab-emails.php:62 +msgid "A list of shortcodes is available here." +msgstr "להלן רשימת קיצורי הקוד הזמינים" + +#: includes/admin/tabs/class-wp-members-admin-tab-emails.php:69 +msgid "Set a custom email address" +msgstr "הגדרת כתובת אימייל" + +#: includes/admin/tabs/class-wp-members-admin-tab-emails.php:70 +#: includes/admin/tabs/class-wp-members-admin-tab-emails.php:74 +#: includes/admin/tabs/class-wp-members-admin-tab-emails.php:93 +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:163 +msgid "(optional)" +msgstr "(רשות)" + +#: includes/admin/tabs/class-wp-members-admin-tab-emails.php:73 +msgid "Set a custom email name" +msgstr "קביעת שם אימייל" + +#: includes/admin/tabs/class-wp-members-admin-tab-emails.php:77 +msgid "Send HTML email" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-emails.php:93 +msgid "Email Signature" +msgstr "חתימת האימייל" + +#: includes/admin/tabs/class-wp-members-admin-tab-emails.php:101 +msgid "Update Emails" +msgstr "עדכון האימיילים" + +#: includes/admin/tabs/class-wp-members-admin-tab-emails.php:172 +msgid "WP-Members emails were updated" +msgstr "האימיילים של וורדפרס-חברים עודכנו" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:93 +#: includes/class-wp-members-dialogs.php:65 +msgid "No fields selected for deletion" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:95 +msgid "Are you sure you want to delete the following fields?" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:122 +msgid "Fields deleted" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:136 +msgid "Field Manager Documentation" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:164 +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:315 +#: includes/class-wp-members-forms.php:1629 +#: includes/class-wp-members-forms.php:1821 +#: includes/class-wp-members-user-profile.php:181 +msgid "(required)" +msgstr "(חובה)" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:169 +msgid "Edit Field" +msgstr "עריכת השדה" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:169 +msgid "Add a Field" +msgstr "הוספת שדה" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:174 +msgid "Field Label" +msgstr "תווית השדה" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:176 +msgid "The name of the field as it will be displayed to the user." +msgstr "השם של השדה כפי שהוא יוצג בפני המשתמש." + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:179 +#: includes/admin/tabs/class-wp-members-fields-table.php:58 +msgid "Meta Key" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:185 +msgid "" +"The database meta value for the field. It must be unique and contain no " +"spaces (underscores are ok)." +msgstr "" +"ערך תיאור meta עבור השדה. הוא חייב להיות ייחודי, ללא רווחים (אפשר להשתמש " +"במקפים תחתונים)." + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:189 +#: includes/admin/tabs/class-wp-members-fields-table.php:59 +msgid "Field Type" +msgstr "סוג השדה" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:195 +msgid "text" +msgstr "טקסט" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:196 +msgid "email" +msgstr "אימייל" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:197 +msgid "textarea" +msgstr "אזור טקסט" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:198 +msgid "checkbox" +msgstr "תיבת סימון" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:199 +msgid "multiple checkbox" +msgstr "תיבות סימון מרובות" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:200 +msgid "select (dropdown)" +msgstr "בחירה מרשימה נפתחת" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:201 +msgid "multiple select" +msgstr "בחירה מרובה ברשימה נפתחת" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:202 +msgid "radio group" +msgstr "קבוצת לחצני רדיו" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:203 +msgid "password" +msgstr "סיסמה" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:204 +msgid "image" +msgstr "תמונה" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:205 +msgid "file" +msgstr "קובץ" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:206 +msgid "url" +msgstr "כתובת URL" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:207 +msgid "number" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:208 +msgid "date" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:209 +msgid "hidden" +msgstr "נסתר" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:211 +msgid "membership" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:217 +#: includes/admin/tabs/class-wp-members-fields-table.php:60 +msgid "Display?" +msgstr "להציג?" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:221 +msgid "This field is always displayed" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:226 +msgid "Required?" +msgstr "חובה?" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:230 +msgid "This field is always required" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:236 +msgid "Allow HTML?" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:243 +msgid "Placeholder" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:251 +msgid "Pattern" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:259 +msgid "Title" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:268 +msgid "Minimum Value" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:272 +msgid "Maximum Value" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:280 +msgid "Rows" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:284 +msgid "Columns" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:292 +msgid "Accepted file types:" +msgstr "סוגי הקבצים המקובלים:" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:297 +msgid "Accepted file types should be set like this: jpg|jpeg|png|gif" +msgstr "את סוגי הקבצים המקובלים יש להגדיר כך:jpg|jpeg|png|gif" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:304 +msgid "Checked by default?" +msgstr "לסמן כברירת מחדל?" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:308 +msgid "HTML label position" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:310 +msgid "Before the input tag" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:311 +msgid "After the input tag" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:312 +msgid "" +"Selecting \"after\" will generally display the label to the right of the " +"checkbox" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:315 +msgid "Stored value if checked:" +msgstr "הערך המאוחסן אם מסומi:" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:336 +msgid "Stored values delimiter:" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:345 +msgid "Values (Displayed|Stored):" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:370 +msgid "Options should be Option Name|option_value," +msgstr "האפשרויות צריכות להיות שם אפשרות | option_value," + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:374 +msgid "Visit plugin site for more information" +msgstr "נא לבקר באתר התוסף למידע נוסף" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:381 +msgid "Value" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:400 +msgid "Save Changes" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:400 +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:527 +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:528 +msgid "Add Field" +msgstr "הוספת שדה" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:402 +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:726 +msgid "Return to Fields Table" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:449 +msgid "Drag and drop to reorder fields" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:455 +msgid "Registration Date" +msgstr "תאריך ההרשמה" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:458 +msgid "Registration IP" +msgstr "כתובת ה IP בהרשמה" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:459 +msgid "Subscription Type" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:495 +msgid "Manage Fields" +msgstr "ניהול שדות" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:595 +msgid "WP-Members fields were updated" +msgstr "השדות של וורדפרס-חברים עודכנו" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:617 +msgid "Field Label is required. Nothing was updated." +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:618 +msgid "Meta Key is required. Nothing was updated." +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:620 +msgid "Meta Key must contain only letters, numbers, and underscores" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:627 +msgid "A field with that meta key already exists" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:632 +#, php-format +msgid "" +"Sorry, \"%s\" is a
    reserved term. " +"Field was not added." +msgstr "" +"מצטערים, %s הוא מונח שמור. השדה לא " +"התווסף." + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:673 +msgid "Checked value is required for checkboxes. Nothing was updated." +msgstr "ערך מסומן הוא חובה עבור תיבות סימון. שום דבר לא עודכן." + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:705 +msgid "A value is required for hidden fields. Nothing was updated." +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:712 +#, php-format +msgid "%s was added" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:725 +#, php-format +msgid "%s was updated" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:768 +msgid "Form field order updated." +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:56 +#, php-format +msgid "%sChange%s or %sFilter%s this address" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:57 +#, php-format +msgid "See the %sUsers Guide on plugin options%s." +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:90 +msgid "Manage Options" +msgstr "ניהול האפשרויות" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:94 +msgid "Content" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:105 +msgid "Content Restriction" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:109 +msgid "Do not restrict" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:123 +msgid "Show Excerpts" +msgstr "להציג תקצירים" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:124 +msgid "Show Login Form" +msgstr "להציג טופס כניסה" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:125 +msgid "Show Registration Form" +msgstr "להציג טופס הרשמה" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:126 +msgid "Auto Excerpt:" +msgstr "תקציר אוטומטי:" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:148 +msgid "Number of words in excerpt:" +msgstr "מספר המילים בתקציר:" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:149 +msgid "Custom read more link (optional):" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:163 +msgid "Time-based expiration" +msgstr "תפוגה מבוססת זמן" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:163 +msgid "Allows for access to expire" +msgstr "מאפשר לגישה לפוג" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:164 +msgid "Trial period" +msgstr "תקופת ניסיון" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:164 +msgid "Allows for a trial period" +msgstr "מאפשר תקופת ניסיון" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:166 +msgid "Subscription Settings" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:176 +msgid "New Feature Settings" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:182 +msgid "Legacy Password Reset" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:182 +#, php-format +msgid "Use legacy password reset. %s(Requires additional configuration)%s" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:184 +msgid "Legacy Login Error" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:184 +msgid "Use legacy WP-Members login error instead of WP error object." +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:187 +msgid "WooCommerce My Account" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:187 +msgid "Add WP-Members fields to WooCommerce My Account registration" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:188 +msgid "WooCommerce Checkout" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:188 +msgid "Add WP-Members fields to WooCommerce registration during checkout" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:204 +msgid "Other Settings" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:214 +msgid "Enable memberships" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:214 +#, php-format +msgid "Enables creation of different %s membership products %s" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:215 +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:223 +msgid "Clone menus" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:215 +msgid "Enables logged in menus" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:216 +msgid "Notify admin" +msgstr "להודיע למנהל" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:216 +#, php-format +msgid "Notify %s for each new registration? %s" +msgstr "להודיע ל %s מנהל על כל הרשמה חדשה? %s" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:217 +msgid "Moderate registration" +msgstr "בקרת הרשמה" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:217 +msgid "Holds new registrations for admin approval" +msgstr "עוצר הרשמת משתמשים חדשים עד לאישור מנהל" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:218 +msgid "Confirmation Link" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:218 +#, php-format +msgid "" +"Send email confirmation link on new registration. %s(Requires additional " +"configuration)%s" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:219 +msgid "Ignore warning messages" +msgstr "להתעלם מהודעות אזהרה" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:219 +msgid "Ignores WP-Members warning messages in the admin panel" +msgstr "להתעלם מהודעות אזהרה של וורדפרס-חברים בלוח הבקרה" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:233 +msgid "Attribution" +msgstr "ייחוס" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:235 +msgid "" +"Attribution is appreciated! Display \"powered by\" link on register form?" +msgstr "ייחוס תתקבל בברכה! להציג \"מופעל על ידי\" על הקישור בטופס ההרשמה?" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:238 +msgid "Enable CAPTCHA for Registration" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:253 +msgid "Login Page:" +msgstr "עמוד כניסה" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:256 +msgid "Specify a login page (optional)" +msgstr "נא לציין עמוד כניסה (רשות)" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:265 +msgid "Register Page:" +msgstr "עמוד ההרשמה" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:268 +msgid "For creating a register link in the login form" +msgstr "כדי ליצור קישור להרשמה בטופס הכניסה" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:277 +msgid "User Profile Page:" +msgstr "עמוד פרופיל המשתמש:" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:280 +msgid "For creating a forgot password link in the login form" +msgstr "כדי ליצור קישור לאיפוס סיסמה בטופס הכניסה" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:286 +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:288 +msgid "Stylesheet" +msgstr "גיליון עיצוב" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:297 +msgid "Custom Stylesheet:" +msgstr "גיליון עיצוב מותאם אישית:" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:302 +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:329 +msgid "Update Settings" +msgstr "עדכן ההגדרות" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:310 +msgid "Custom Post Types" +msgstr "סוגי פוסט" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:316 +msgid "Add to WP-Members Settings" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:332 +msgid "" +"Please keep in mind that Custom Post Types are \"custom\" and therefore, not " +"all of them will function exactly the same way. WP-Members will certainly " +"work with any post type that operate like a post or a page; but you will " +"need to review any custom post type added to determine that it functions the " +"way you expect." +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:342 +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:343 +msgid "WP-Members Settings" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:344 +msgid "" +"The following is your WP-Members settings information if needed for support." +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:378 +msgid "Click to Copy" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:458 +msgid "Custom Post Type settings were updated" +msgstr "הגדרות סוגי פוסט עודכנו" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:579 +msgid "WP-Members settings were updated" +msgstr "הגדרות וורדפרס-חברים עודכנו" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:651 +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:682 +msgid "USE CUSTOM URL BELOW" +msgstr "להשתמש בכתובת URL מותאמת אישית להלן" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:671 +msgid "Select a page" +msgstr "בחירת עמוד" + +#: includes/admin/tabs/class-wp-members-dropins-table.php:70 +msgid "Name" +msgstr "" + +#: includes/admin/tabs/class-wp-members-dropins-table.php:71 +msgid "Enabled" +msgstr "" + +#: includes/admin/tabs/class-wp-members-dropins-table.php:72 +msgid "File" +msgstr "" + +#: includes/admin/tabs/class-wp-members-dropins-table.php:73 +msgid "Version" +msgstr "" + +#: includes/admin/tabs/class-wp-members-dropins-table.php:74 +#: includes/walkers/class-wp-members-walker-nav-menu.php:186 +msgid "Description" +msgstr "" + +#: includes/admin/tabs/class-wp-members-dropins-table.php:117 +#: includes/admin/tabs/class-wp-members-fields-table.php:108 +msgid "Save Settings" +msgstr "" + +#: includes/admin/tabs/class-wp-members-fields-table.php:43 +msgid "delete" +msgstr "" + +#: includes/admin/tabs/class-wp-members-fields-table.php:57 +msgid "Display Label" +msgstr "" + +#: includes/admin/tabs/class-wp-members-fields-table.php:61 +msgid "Required" +msgstr "" + +#: includes/admin/tabs/class-wp-members-fields-table.php:63 +msgid "Users Screen" +msgstr "מסך המשתמשים" + +#: includes/admin/tabs/class-wp-members-fields-table.php:64 +msgid "Users Search" +msgstr "" + +#: includes/admin/tabs/class-wp-members-fields-table.php:66 +msgid "Sort" +msgstr "" + +#: includes/admin/tabs/class-wp-members-fields-table.php:107 +msgid "Delete Selected" +msgstr "" + +#: includes/api/api-forms.php:584 +#, php-format +msgid "%s is a required field." +msgstr "" + +#: includes/class-wp-members-captcha.php:276 includes/deprecated.php:401 +msgid "You have entered an incorrect code value. Please try again." +msgstr "הזנת ערך קוד שגוי. נא נסה שוב." + +#: includes/class-wp-members-dialogs.php:41 +msgid "First Name" +msgstr "שם" + +#: includes/class-wp-members-dialogs.php:42 +msgid "Last Name" +msgstr "שם משפחה" + +#: includes/class-wp-members-dialogs.php:43 +msgid "Address 1" +msgstr "כתובת" + +#: includes/class-wp-members-dialogs.php:44 +msgid "Address 2" +msgstr "כתובת 2" + +#: includes/class-wp-members-dialogs.php:45 +msgid "City" +msgstr "יישוב" + +#: includes/class-wp-members-dialogs.php:46 +msgid "State" +msgstr "מדינה" + +#: includes/class-wp-members-dialogs.php:47 +msgid "Zip" +msgstr "מיקוד" + +#: includes/class-wp-members-dialogs.php:48 +msgid "Country" +msgstr "ארץ" + +#: includes/class-wp-members-dialogs.php:49 +msgid "Day Phone" +msgstr "טלפון" + +#: includes/class-wp-members-dialogs.php:50 +#: includes/class-wp-members-dialogs.php:92 +msgid "Email" +msgstr "אימייל" + +#: includes/class-wp-members-dialogs.php:51 +msgid "Confirm Email" +msgstr "אישור האימייל" + +#: includes/class-wp-members-dialogs.php:52 +msgid "Website" +msgstr "אתר" + +#: includes/class-wp-members-dialogs.php:53 +msgid "Biographical Info" +msgstr "מידע ביוגרפי" + +#: includes/class-wp-members-dialogs.php:54 +#: includes/class-wp-members-dialogs.php:74 +#: includes/class-wp-members-dialogs.php:159 +msgid "Password" +msgstr "סיסמה" + +#: includes/class-wp-members-dialogs.php:55 +msgid "Confirm Password" +msgstr "אישור הסיסמה" + +#: includes/class-wp-members-dialogs.php:56 +#: includes/class-wp-members-forms.php:2165 +msgid "TOS" +msgstr "תנאי השימוש" + +#: includes/class-wp-members-dialogs.php:66 +msgid "You are not logged in." +msgstr "עוד לא נכנסת." + +#: includes/class-wp-members-dialogs.php:72 +msgid "Existing Users Log In" +msgstr "כניסת משתמשים רשומים" + +#: includes/class-wp-members-dialogs.php:73 +#: includes/class-wp-members-dialogs.php:158 +msgid "Username or Email" +msgstr "" + +#: includes/class-wp-members-dialogs.php:75 +#: includes/class-wp-members-shortcodes.php:773 +msgid "Log In" +msgstr "כניסה" + +#: includes/class-wp-members-dialogs.php:76 +msgid "Remember Me" +msgstr "זכור אותי" + +#: includes/class-wp-members-dialogs.php:77 +msgid "Forgot password?" +msgstr "לאפס את הסיסמה?" + +#: includes/class-wp-members-dialogs.php:78 +msgid "Click here to reset" +msgstr "נא ללחוץ כאן כדי לאפס" + +#: includes/class-wp-members-dialogs.php:79 +msgid "New User?" +msgstr "משתמש חדש?" + +#: includes/class-wp-members-dialogs.php:80 +msgid "Click here to register" +msgstr "נא ללחוץ כאן כדי להירשם" + +#: includes/class-wp-members-dialogs.php:83 +#: includes/class-wp-members-dialogs.php:142 +msgid "Change Password" +msgstr "החלפת סיסמה" + +#: includes/class-wp-members-dialogs.php:84 +msgid "New password" +msgstr "סיסמה חדשה" + +#: includes/class-wp-members-dialogs.php:85 +msgid "Confirm new password" +msgstr "אישור הסיסמה החדשה" + +#: includes/class-wp-members-dialogs.php:86 +msgid "Update Password" +msgstr "עדכון הסיסמה" + +#: includes/class-wp-members-dialogs.php:87 +msgid "Password successfully changed!" +msgstr "הסיסמה הוחלפה בהצלחה!" + +#: includes/class-wp-members-dialogs.php:90 +msgid "Reset Forgotten Password" +msgstr "איפוס סיסמה שנשכחה" + +#: includes/class-wp-members-dialogs.php:93 +msgid "Reset Password" +msgstr "איפוס סיסמה" + +#: includes/class-wp-members-dialogs.php:94 +msgid "Forgot username?" +msgstr "שכחת את שם המשתמש?" + +#: includes/class-wp-members-dialogs.php:95 +msgid "Click here" +msgstr "ללחוץ כאן" + +#: includes/class-wp-members-dialogs.php:98 +#: includes/class-wp-members-dialogs.php:100 +msgid "Retrieve username" +msgstr "שחזור שם המשתמש" + +#: includes/class-wp-members-dialogs.php:99 +msgid "Email Address" +msgstr "כתובת אימייל" + +#: includes/class-wp-members-dialogs.php:103 +msgid "New User Registration" +msgstr "רישום משתמש חדש" + +#: includes/class-wp-members-dialogs.php:104 +msgid "Choose a Username" +msgstr "בחירת שם משתמש" + +#: includes/class-wp-members-dialogs.php:105 +msgid "Input the code:" +msgstr "להזין את הקוד:" + +#: includes/class-wp-members-dialogs.php:106 +#: includes/class-wp-members-forms.php:2164 +#, php-format +msgid "Please indicate that you agree to the %s Terms of Service %s" +msgstr "" + +#: includes/class-wp-members-dialogs.php:107 +msgid "Reset Form" +msgstr "איפוס הטופס" + +#: includes/class-wp-members-dialogs.php:108 +#: includes/class-wp-members-dialogs.php:162 +#: includes/class-wp-members-shortcodes.php:770 +#: includes/class-wp-members-user.php:186 +msgid "Register" +msgstr "הרשמה" + +#: includes/class-wp-members-dialogs.php:110 +msgid "Required field" +msgstr "שדה חובה" + +#: includes/class-wp-members-dialogs.php:113 +msgid "Edit Your Information" +msgstr "עריכת הפרטים שלך" + +#: includes/class-wp-members-dialogs.php:115 +msgid "Update Profile" +msgstr "עדכון הפרופיל" + +#: includes/class-wp-members-dialogs.php:116 +msgid "Update this file" +msgstr "עדכון הקובץ הזה" + +#: includes/class-wp-members-dialogs.php:119 +msgid "Login Failed!" +msgstr "הכניסה נכשלה!" + +#: includes/class-wp-members-dialogs.php:120 +msgid "You entered an invalid username or password." +msgstr "הזנת שם משתמש או סיסמה שגויים." + +#: includes/class-wp-members-dialogs.php:121 +msgid "Click here to continue." +msgstr "נא ללחוץ כאן כדי להמשיך" + +#: includes/class-wp-members-dialogs.php:122 +msgid "Password fields cannot be empty" +msgstr "שדות הסיסמה הם שדות חובה" + +#: includes/class-wp-members-dialogs.php:123 +msgid "Sorry, that email address was not found." +msgstr "מצטערים, כתובת האימייל הזו איננה" + +#: includes/class-wp-members-dialogs.php:124 +#, php-format +msgid "An email was sent to %s with your username." +msgstr "אימייל עם שם המשתמש שלך נשלח ל %s" + +#: includes/class-wp-members-dialogs.php:125 +#, php-format +msgid "Sorry, %s is a required field." +msgstr "מצטערים, %s הוא שדה חובה" + +#: includes/class-wp-members-dialogs.php:126 +msgid "You must enter a valid email address." +msgstr "חובה להזין אימייל תקף" + +#: includes/class-wp-members-dialogs.php:127 +msgid "The username cannot include non-alphanumeric characters." +msgstr "שם המשתמש אינו יכול לכלול תווים שאינם אלפא-נומריים." + +#: includes/class-wp-members-dialogs.php:128 +msgid "Sorry, username is a required field" +msgstr "מצטערים, שם המשתמש הוא שדה חובה" + +#: includes/class-wp-members-dialogs.php:129 +msgid "Sorry, that username is taken, Please try another." +msgstr "" + +#: includes/class-wp-members-dialogs.php:130 +msgid "Sorry, that email address already has an account. Please try another." +msgstr "" + +#: includes/class-wp-members-dialogs.php:131 +#: includes/class-wp-members-dialogs.php:174 +msgid "Passwords did not match." +msgstr "הסיסמאות אינן תואמות" + +#: includes/class-wp-members-dialogs.php:132 +msgid "Emails did not match." +msgstr "כתובות האימייל אינן תואמות" + +#: includes/class-wp-members-dialogs.php:133 +msgid "You must complete the CAPTCHA form." +msgstr "חובה להשלים את טופס קוד האימות." + +#: includes/class-wp-members-dialogs.php:134 +msgid "CAPTCHA was not valid." +msgstr "קוד האימות אינו תקף" + +#: includes/class-wp-members-dialogs.php:135 +msgid "There was an error processing the form." +msgstr "אירעה שגיאה בעיבוד הטופס." + +#: includes/class-wp-members-dialogs.php:136 +msgid "There was an error with the CAPTCHA form." +msgstr "היתה שגיאה בטופס קוד האימות." + +#: includes/class-wp-members-dialogs.php:137 +#, php-format +msgid "" +"Sorry, you can only upload the following file types for the %s field: %s." +msgstr "" + +#: includes/class-wp-members-dialogs.php:138 +#: includes/class-wp-members-dialogs.php:171 +msgid "Your information was updated!" +msgstr "המידע שלך עודכן!" + +#: includes/class-wp-members-dialogs.php:141 +msgid "Edit My Information" +msgstr "עריכת הפרטים שלך" + +#: includes/class-wp-members-dialogs.php:143 +#: includes/class-wp-members-dialogs.php:146 +#: includes/class-wp-members-dialogs.php:148 +#: includes/class-wp-members-dialogs.php:153 +#, php-format +msgid "You are logged in as %s" +msgstr "אתה מחובר כ- %s." + +#: includes/class-wp-members-dialogs.php:144 +msgid "Log out" +msgstr "" + +#: includes/class-wp-members-dialogs.php:145 +msgid "Edit profile" +msgstr "" + +#: includes/class-wp-members-dialogs.php:145 +msgid "Begin using the site." +msgstr "אפשר להתחיל להשתמש באתר" + +#: includes/class-wp-members-dialogs.php:147 +msgid "Click to log out" +msgstr "ללחוץ כדי לצאת" + +#: includes/class-wp-members-dialogs.php:149 +msgid "click to log out" +msgstr "ללחוץ כדי לצאת" + +#: includes/class-wp-members-dialogs.php:150 +msgid "Log Out" +msgstr "" + +#: includes/class-wp-members-dialogs.php:154 +msgid "click here to log out" +msgstr "ללחוץ כאן כדי לצאת" + +#: includes/class-wp-members-dialogs.php:155 +msgid "Login Failed!
    You entered an invalid username or password." +msgstr "הכניסה נכשלה!
    הזנת שם משתמש או סיסמה שגויים." + +#: includes/class-wp-members-dialogs.php:156 +msgid "Invalid username or password." +msgstr "" + +#: includes/class-wp-members-dialogs.php:160 includes/class-wp-members.php:1745 +msgid "log in" +msgstr "כניסה" + +#: includes/class-wp-members-dialogs.php:161 +msgid "Forgot?" +msgstr "שכחת?" + +#: includes/class-wp-members-dialogs.php:165 +msgid "" +"This content is restricted to site members. If you are an existing user, " +"please log in. New users may register below." +msgstr "" +"תוכן זה מוגבל לחברי האתר. אם אתה משתמש קיים, נא להיכנס. משתמשים חדשים " +"יכולים להירשם להלן." + +#: includes/class-wp-members-dialogs.php:166 +msgid "" +"Congratulations! Your registration was successful.

    You may now " +"log in using the password that was emailed to you." +msgstr "" +"יופי! ההרשמה הצליחה

    אפשר להתחבר כעת עם הסיסמה שנשלחה אליך באימייל." + +#: includes/class-wp-members-dialogs.php:169 +msgid "Sorry, that username is taken, please try another." +msgstr "מצטערים, שם המשתמש הזה תפוס, נא לנסות שם אחר." + +#: includes/class-wp-members-dialogs.php:170 +msgid "" +"Sorry, that email address already has an account.
    Please try another." +msgstr "מצטערים, כבר יש חשבון עם האימייל הזה.
    נא לנסות אחר." + +#: includes/class-wp-members-dialogs.php:175 +msgid "Password successfully changed." +msgstr "" + +#: includes/class-wp-members-dialogs.php:176 +msgid "Invalid username or email address." +msgstr "" + +#: includes/class-wp-members-dialogs.php:177 +msgid "" +"Password successfully reset! An email containing a new password has been " +"sent to the email address on file for your account." +msgstr "" + +#: includes/class-wp-members-dialogs.php:178 +msgid "" +"Reset request received. An email with instructions to complete the password " +"reset has been sent." +msgstr "" + +#: includes/class-wp-members-dialogs.php:180 +msgid "This content requires the following membership: " +msgstr "" + +#: includes/class-wp-members-dialogs.php:181 +msgid "This content requires one of the following memberships: " +msgstr "" + +#: includes/class-wp-members-forms.php:84 +#: includes/class-wp-members-forms.php:350 +msgid "Choose membership" +msgstr "" + +#: includes/class-wp-members-forms.php:1898 +#: includes/class-wp-members-user-profile.php:510 +msgid "Activate this user?" +msgstr "לאשר את המשתמש הזה?" + +#: includes/class-wp-members-forms.php:2165 templates/tos.php:20 +msgid "Terms of Service" +msgstr "תנאי שימוש" + +#: includes/class-wp-members-menus.php:131 +msgid "Display" +msgstr "" + +#: includes/class-wp-members-menus.php:139 +msgid "Logged In Users" +msgstr "" + +#: includes/class-wp-members-menus.php:146 +msgid "Logged Out Users" +msgstr "" + +#: includes/class-wp-members-menus.php:153 +msgid "All Users" +msgstr "" + +#: includes/class-wp-members-menus.php:167 +#, php-format +msgid "%sAdd membership products%s to restrict menu to a membership" +msgstr "" + +#: includes/class-wp-members-menus.php:169 +msgid "Restrict menu item to a membership product" +msgstr "" + +#: includes/class-wp-members-products.php:342 +#, php-format +msgid "All %s" +msgstr "" + +#: includes/class-wp-members-products.php:343 +#, php-format +msgid "Add New %s" +msgstr "" + +#: includes/class-wp-members-products.php:344 +msgid "Add New" +msgstr "" + +#: includes/class-wp-members-products.php:345 +#, php-format +msgid "New %s" +msgstr "" + +#: includes/class-wp-members-products.php:346 +#, php-format +msgid "Edit %s" +msgstr "" + +#: includes/class-wp-members-products.php:347 +#, php-format +msgid "Update %s" +msgstr "" + +#: includes/class-wp-members-products.php:348 +#: includes/class-wp-members-products.php:349 +#, php-format +msgid "View %s" +msgstr "" + +#: includes/class-wp-members-products.php:350 +#, php-format +msgid "Search %s" +msgstr "" + +#: includes/class-wp-members-products.php:351 +msgid "Not found" +msgstr "" + +#: includes/class-wp-members-products.php:352 +msgid "Not found in Trash" +msgstr "" + +#: includes/class-wp-members-products.php:353 +msgid "Insert into item" +msgstr "" + +#: includes/class-wp-members-products.php:354 +#, php-format +msgid "Save %s Details" +msgstr "" + +#: includes/class-wp-members-products.php:355 +msgid "Membership Attributes" +msgstr "" + +#: includes/class-wp-members-products.php:358 +msgid "Membership Product" +msgstr "" + +#: includes/class-wp-members-products.php:359 +msgid "WP-Members Membership Products" +msgstr "" + +#: includes/class-wp-members-pwd-reset.php:35 +#: includes/class-wp-members-pwd-reset.php:36 +msgid "" +"Sorry, no password reset key was found. Please check your email and try " +"again." +msgstr "" + +#: includes/class-wp-members-pwd-reset.php:37 +msgid "Sorry, the password reset key is expired." +msgstr "" + +#: includes/class-wp-members-pwd-reset.php:167 +msgid "The passwords do not match." +msgstr "" + +#: includes/class-wp-members-shortcodes.php:134 +msgid "" +"This is a generic message to display the form message dialog in the " +"Customizer." +msgstr "" + +#: includes/class-wp-members-shortcodes.php:699 +msgid "Click here to log out." +msgstr "נא ללחוץ כאן כדי להתנתק." + +#: includes/class-wp-members-user-profile.php:58 +msgid "WP-Members Additional Fields" +msgstr "שדות נוספים של וורדפרס-חברים" + +#: includes/class-wp-members-user-profile.php:58 +msgid "Additional Information" +msgstr "מידע נוסף" + +#: includes/class-wp-members-user-profile.php:500 +msgid "Reactivate this user?" +msgstr "לאשר מחדש את המשתמש הזה?" + +#: includes/class-wp-members-user-profile.php:505 +msgid "Deactivate this user?" +msgstr "לבטל את המשתמש הזה?" + +#: includes/class-wp-members-user-profile.php:559 +msgid "IP @ registration" +msgstr "כתובת IP והרשמה" + +#: includes/class-wp-members-user.php:1171 +msgid "ERROR: User has not been activated." +msgstr "שגיאה: המשתמש אינו פעיל." + +#: includes/class-wp-members-validation-link.php:32 +msgid "Click to validate your account: " +msgstr "" + +#: includes/class-wp-members-validation-link.php:33 +msgid "Thank you for validating your account." +msgstr "" + +#: includes/class-wp-members-validation-link.php:34 +msgid "Validation key was expired or invalid" +msgstr "" + +#: includes/class-wp-members-validation-link.php:35 +msgid "Your account is now pending approval" +msgstr "" + +#: includes/class-wp-members-validation-link.php:284 +msgid "ERROR: User has not confirmed their account." +msgstr "" + +#: includes/class-wp-members-widget.php:24 +msgid "Displays the WP-Members sidebar login." +msgstr "מציג את הכניסה של וורדפרס-חברים בסרגל הצד" + +#: includes/class-wp-members-widget.php:39 +#: includes/class-wp-members-widget.php:82 +msgid "Login Status" +msgstr "מצב ההתחברות" + +#: includes/class-wp-members-widget.php:46 +msgid "Title:" +msgstr "כותרת:" + +#: includes/class-wp-members-widget.php:50 +msgid "Redirect to (optional):" +msgstr "להפנות ל (רשות):" + +#: includes/class-wp-members.php:1087 includes/class-wp-members.php:1098 +msgid "You must be logged in to view this content." +msgstr "" + +#: includes/class-wp-members.php:1104 +msgid "The page you are looking for does not exist" +msgstr "" + +#: includes/class-wp-members.php:1352 +#, php-format +msgid "" +"You have a linked page in the WP-Members page settings that corresponds to a " +"post ID that no longer exists. Please %s review and update the %s page " +"settings %s." +msgstr "" + +#: includes/class-wp-members.php:1472 +msgid "Show forms as logged out" +msgstr "" + +#: includes/class-wp-members.php:1481 +msgid "Show form message dialog" +msgstr "" + +#: includes/class-wp-members.php:1558 +msgid "(more…)" +msgstr "עוד..." + +#: includes/class-wp-members.php:1746 +msgid "log out" +msgstr "" + +#: includes/cli/class-wp-members-cli-user.php:24 +#: includes/cli/class-wp-members-cli-user.php:62 +msgid "Moderated registration is not enabled in WP-Members options." +msgstr "" + +#: includes/cli/class-wp-members-cli-user.php:35 +msgid "User activated." +msgstr "" + +#: includes/cli/class-wp-members-cli-user.php:37 +msgid "Email notification sent to user." +msgstr "" + +#: includes/cli/class-wp-members-cli-user.php:40 +msgid "User is already activated." +msgstr "" + +#: includes/cli/class-wp-members-cli-user.php:67 +msgid "User deactivated." +msgstr "" + +#: includes/cli/class-wp-members-cli-user.php:88 +msgid "Invalid user ID. Please specify a valid user. Try `wp user list`." +msgstr "" + +#: includes/cli/class-wp-members-cli-user.php:91 +msgid "No user id specified. Must specify user id as --id=123" +msgstr "" + +#: includes/cli/class-wp-members-cli-user.php:208 +#, php-format +msgid "User: %s" +msgstr "" + +#: includes/cli/class-wp-members-cli-user.php:248 +#, php-format +msgid "User role: %s" +msgstr "" + +#: includes/deprecated.php:373 +msgid "We were unable to validate the public key." +msgstr "לא הצלחנו לאמת את המפתח הציבורי." + +#: includes/deprecated.php:377 +msgid "We were unable to validate the private key." +msgstr "הצלחנו לאמת את המפתח הפרטי." + +#: includes/deprecated.php:381 +msgid "The challenge parameter of the verify script was incorrect." +msgstr "הפרמטר המאתגר של קוד האימות היה שגוי." + +#: includes/deprecated.php:385 +msgid "The CAPTCHA solution was incorrect." +msgstr "פתרון קוד האימות היה שגוי" + +#: includes/deprecated.php:389 +msgid "The parameters to verify were incorrect" +msgstr "הפרמטרים לאימות היו שגויים" + +#: includes/deprecated.php:393 +msgid "" +"reCAPTCHA API keys are tied to a specific domain name for security reasons." +msgstr "מפתחות קוד האימות של-API reCAPTCHA קשורות לדומיין ספציפי מסיבות אבטחה." + +#: includes/deprecated.php:397 +msgid "The reCAPTCHA server was not reached. Please try to resubmit." +msgstr "השרת של קוד האימות reCAPTCHA אינו נגיש. נא לנסות שוב." + +#. translators: %s: title of menu item which is invalid +#: includes/walkers/class-wp-members-walker-nav-menu.php:92 +#, php-format +msgid "%s (Invalid)" +msgstr "" + +#. translators: %s: title of menu item in draft status +#: includes/walkers/class-wp-members-walker-nav-menu.php:96 +#, php-format +msgid "%s (Pending)" +msgstr "" + +#: includes/walkers/class-wp-members-walker-nav-menu.php:123 +msgid "Move up" +msgstr "" + +#: includes/walkers/class-wp-members-walker-nav-menu.php:136 +msgid "Move down" +msgstr "" + +#: includes/walkers/class-wp-members-walker-nav-menu.php:138 +msgid "Edit Menu Item" +msgstr "" + +#: includes/walkers/class-wp-members-walker-nav-menu.php:149 +msgid "URL" +msgstr "" + +#: includes/walkers/class-wp-members-walker-nav-menu.php:156 +msgid "Navigation Label" +msgstr "" + +#: includes/walkers/class-wp-members-walker-nav-menu.php:162 +msgid "Title Attribute" +msgstr "" + +#: includes/walkers/class-wp-members-walker-nav-menu.php:169 +msgid "Open link in a new window/tab" +msgstr "" + +#: includes/walkers/class-wp-members-walker-nav-menu.php:174 +msgid "CSS Classes (optional)" +msgstr "" + +#: includes/walkers/class-wp-members-walker-nav-menu.php:180 +msgid "Link Relationship (XFN)" +msgstr "" + +#: includes/walkers/class-wp-members-walker-nav-menu.php:188 +msgid "" +"The description will be displayed in the menu if the current theme supports " +"it." +msgstr "" + +#: includes/walkers/class-wp-members-walker-nav-menu.php:210 +#, php-format +msgid "Original: %s" +msgstr "" + +#: includes/walkers/class-wp-members-walker-nav-menu.php:223 +msgid "Remove" +msgstr "" + +#: templates/tos.php:32 +#, php-format +msgid "%sclose%s" +msgstr "%sסגירה%s" + +#: templates/tos.php:34 +#, php-format +msgid "%sprint%s" +msgstr "%sספרינט%s" + +#. Plugin Name of the plugin/theme +msgid "WP-Members" +msgstr "וורדפרס-חברים" + +#. Plugin URI of the plugin/theme +msgid "https://rocketgeek.com" +msgstr "" + +#. Description of the plugin/theme +msgid "" +"WP access restriction and user registration. For more information on plugin " +"features, refer to the online Users Guide. A Quick Start Guide is also available. WP-" +"Members(tm) is a trademark of butlerblog.com." +msgstr "" + +#. Author of the plugin/theme +msgid "Chad Butler" +msgstr "Chad Butler" + +#. Author URI of the plugin/theme +msgid "https://butlerblog.com/" +msgstr "" + +#~ msgid "Unblock" +#~ msgstr "ביטול חסימה" + +#~ msgid "Block" +#~ msgstr "לחסום" + +#~ msgid "Manage reCAPTCHA Options" +#~ msgstr "ניהול אפשרויות קוד אימות של reCAPTCHA" + +#~ msgid "" +#~ "reCAPTCHA is a free, accessible CAPTCHA service that helps to digitize " +#~ "books while blocking spam on your blog." +#~ msgstr "reCAPTCHA הוא קוד אימות חינמי, לחסימת ספאם באתר שלכם." + +#, php-format +#~ msgid "" +#~ "reCAPTCHA asks commenters to retype two words scanned from a book to " +#~ "prove that they are a human. This verifies that they are not a spambot " +#~ "while also correcting the automatic scans of old books. So you get less " +#~ "spam, and the world gets accurately digitized books. Everybody wins! For " +#~ "details, visit the %s reCAPTCHA website%s" +#~ msgstr "" +#~ "reCAPTCHA מבקש להקליד שתי מילים סרוקות מספר כדי להוכיח אנושיות. זה מאמת " +#~ "שהשולח אינו רובוט ספאם בקרו ב %sreCaptcha%s" + +#, php-format +#~ msgid "" +#~ "reCAPTCHA requires an API key, consisting of a \"public\" and a \"private" +#~ "\" key. You can sign up for a %s free reCAPTCHA key%s" +#~ msgstr "" +#~ "קוד אימות של reCAPTCHA צריך מפתח API המורכב מ\"מפתח ציבורי\" ו\"מפתח פרטי" +#~ "\". אפשר להירשם לקבלת %sמפתח reCAPTCHA ללא תשלום %s" + +#~ msgid "Public Key" +#~ msgstr "מפתח ציבורי" + +#~ msgid "Private Key" +#~ msgstr "מפתח פרטי" + +#~ msgid "Choose Theme" +#~ msgstr "בחירת תבנית" + +#~ msgid "Red" +#~ msgstr "אדום" + +#~ msgid "White" +#~ msgstr "לבן" + +#~ msgid "Black Glass" +#~ msgstr "זכוכית שחורה" + +#~ msgid "Clean" +#~ msgstr "נקי" + +#~ msgid "Active" +#~ msgstr "פעיל" + +#~ msgid "Do not block" +#~ msgstr "לא לחסום" + +#~ msgid "Enable CAPTCHA" +#~ msgstr "הפעלת קוד אימות" + +#~ msgid "Passwords did not match.

    Please try again." +#~ msgstr "הסיסמאות אינן תואמות.

    נא לנסות שוב." + +#~ msgid "Either the username or email address do not exist in our records." +#~ msgstr "שם המשתמש או כתובת האימייל לא קיימים ברשומות שלנו." + +#~ msgid "" +#~ "Password successfully reset!

    An email containing a new " +#~ "password has been sent to the email address on file for your account." +#~ msgstr "" +#~ "הסיסמה אופסה בהצלחה!

    אימייל עם הסיסמה החדשה נשלח אל כתובת " +#~ "האימייל שלך." + +#~ msgid "http://butlerblog.com/" +#~ msgstr "http://butlerblog.com/" + +#~ msgid "Click to log out." +#~ msgstr "יציאה" + +#~ msgid "You have set WP-Members to turn off the registration process" +#~ msgstr "הגדרת את וורדפרס-חברים לכבות את תהליך ההרשמה" + +#~ msgid "" +#~ "but you also set to moderate and/or email admin new registrations. You " +#~ "will need to set up a registration page for users to register." +#~ msgstr "" +#~ "אבל הגדרת גם סינון ושליחת הודעה באימייל למנהל על הרשמה. צריך להגדיר עמוד " +#~ "הרשמה למשתמשים כדי להירשם." + +#~ msgid "%s are blocked by default." +#~ msgstr "ה%s מוגבלים כברירת מחדל" + +#~ msgid "Unblock this %s" +#~ msgstr "ביטול חסימת %s זה" + +#~ msgid "%s are not blocked by default." +#~ msgstr "%s אינם חסומים כברירת מחדל." + +#~ msgid "Block this %s" +#~ msgstr "חסימת %s זה" + +#~ msgid "Unblocked?" +#~ msgstr "לבטל את החסימה?" + +#~ msgid "Blocked?" +#~ msgstr "חסום?" + +#~ msgid "Field Label is required for adding a new field. Nothing was updated." +#~ msgstr "תווית השדה הכרחית כדי להוסיף שדה חדש. שום דבר לא עודכן." + +#~ msgid "Option Name is required for adding a new field. Nothing was updated." +#~ msgstr "שם האפשרות הוא חובה כדי להוסיף שדה חדש. שום דבר לא עודכן." + +#~ msgid "Option Name must contain only letters, numbers, and underscores" +#~ msgstr "שם האפשרות חייב להכיל רק אותיות, ספרות ומקף תחתון." + +#~ msgid "A field with that option name already exists" +#~ msgstr "שדה עם שם אפשרות זה כבר קיים" + +#~ msgid "field was added" +#~ msgstr "השדה נוסף" + +#~ msgid "field was updated" +#~ msgstr "השדה עודכן" + +#~ msgid "Option Name" +#~ msgstr "שם האפשרות" + +#~ msgid "Additional information for field upload fields" +#~ msgstr "פרטים נוספים עבור שדות העלאת שדה" + +#~ msgid "Additional information for checkbox fields" +#~ msgstr "מידע נוסף עבור שדות תיבת סימון" + +#~ msgid "Additional information for dropdown fields" +#~ msgstr "פרטים נוספים עבור שדות של הרשימה הנפתחת" + +#~ msgid "For dropdown, array of values:" +#~ msgstr "עבור רשימה נפתחת, מערך של ערכים:" + +#~ msgid "" +#~ "Determine which fields will display and which are required. This " +#~ "includes all fields, both native WP fields and WP-Members custom fields." +#~ msgstr "" +#~ "קביעת אילו שדות יוצגו ואילו חובה.זה כולל את כל השדות, גם שדות של וורדפרס " +#~ "וגם שדות מותאמים אישית של וורדפרס-חברים." + +#~ msgid "(Note: Email is always mandatory and cannot be changed.)" +#~ msgstr "(הערה: האימייל הוא תמיד חובה ולא ניתן לשנותו.)" + +#~ msgid "Add/Delete" +#~ msgstr "הוספה/מחיקה" + +#~ msgid "Checked?" +#~ msgstr "מסומן?" + +#~ msgid "Delete" +#~ msgstr "מחיקה" + +#~ msgid "(Email cannot be removed)" +#~ msgstr "(לא ניתן להסיר את האימייל)" + +#~ msgid "native" +#~ msgstr "מקומי" + +#~ msgid "Update Fields" +#~ msgstr "עדכון השדות" + +#~ msgid "Please indicate that you agree to the %s TOS %s" +#~ msgstr "נא להסכים ל%sתנאי השימוש%s" + +#~ msgid "http://rocketgeek.com" +#~ msgstr "http://rocketgeek.com" + +#~ msgid "" +#~ "WP access restriction and user registration. For more information on " +#~ "plugin features, refer to the online Users Guide. A Quick Start Guide is also available. WP-Members(tm) is a trademark of butlerblog.com." +#~ msgstr "" +#~ "הגבלת גישה לאתר והרשמה. למידע נוסף על תכונות התוסף, נא להתייחס למדריך המקוון. גםמדריך התחלה מהירה זמין. וורדפרס-חברים (סימן רשום) הוא סימן " +#~ "רשום של butlerblog.com." diff --git a/i18n/languages/wp-members-hi_IN.mo b/i18n/languages/wp-members-hi_IN.mo new file mode 100644 index 00000000..0b5a0244 Binary files /dev/null and b/i18n/languages/wp-members-hi_IN.mo differ diff --git a/i18n/languages/wp-members-hi_IN.po b/i18n/languages/wp-members-hi_IN.po new file mode 100644 index 00000000..72c01890 --- /dev/null +++ b/i18n/languages/wp-members-hi_IN.po @@ -0,0 +1,2815 @@ +msgid "" +msgstr "" +"Project-Id-Version: WP-Members 3.2.6\n" +"Report-Msgid-Bugs-To: http://wordpress.org/tag/wp-members\n" +"POT-Creation-Date: 2023-01-06 15:20-0500\n" +"PO-Revision-Date: 2023-01-06 15:22-0500\n" +"Last-Translator: \n" +"Language-Team: Outshine Solutions \n" +"Language: hi_IN\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Poedit-SourceCharset: UTF-8\n" +"X-Poedit-KeywordsList: __;_e;__ngettext:1,2;_n:1,2;__ngettext_noop:1,2;_n_noop:1,2;_c," +"_nc:4c,1,2;_x:1,2c;_ex:1,2c;_nx:4c,1,2;_nx_noop:4c,1,2\n" +"X-Textdomain-Support: yes\n" +"X-Poedit-Basepath: .\n" +"X-Generator: Poedit 2.4.3\n" +"X-Poedit-SearchPath-0: .\n" + +#: includes/admin/class-wp-members-admin-api.php:254 +msgid "Custom email" +msgstr "" + +# @ wp-members +#: includes/admin/class-wp-members-admin-api.php:255 +#: includes/admin/class-wp-members-admin-api.php:257 +msgid "Subject" +msgstr "विषय" + +# @ wp-members +#: includes/admin/class-wp-members-admin-api.php:258 +msgid "Body" +msgstr "शरीर" + +#: includes/admin/class-wp-members-admin-api.php:260 +msgid "Your custom email message content." +msgstr "" + +# @ wp-members +#: includes/admin/class-wp-members-admin-api.php:338 +msgid "Options" +msgstr "विकल्प" + +# @ wp-members +#: includes/admin/class-wp-members-admin-api.php:339 +msgid "Fields" +msgstr "फ़ील्ड" + +# @ wp-members +#: includes/admin/class-wp-members-admin-api.php:340 +msgid "Dialogs" +msgstr "संवाद" + +# @ wp-members +#: includes/admin/class-wp-members-admin-api.php:341 +msgid "Emails" +msgstr "ईमेल" + +# @ wp-members +#: includes/admin/class-wp-members-admin-api.php:357 +msgid "New Registration" +msgstr "नया पंजीकरण" + +#: includes/admin/class-wp-members-admin-api.php:365 +#: includes/admin/class-wp-members-admin-api.php:383 +msgid "User email validated" +msgstr "" + +# @ wp-members +#: includes/admin/class-wp-members-admin-api.php:375 +msgid "Registration is Moderated" +msgstr "पंजीकरण संचालित है" + +# @ wp-members +#: includes/admin/class-wp-members-admin-api.php:391 +msgid "Registration is Moderated, User is Approved" +msgstr "पंजीकरण संचालित है, उपयोगकर्ता स्वीकृत" + +# @ wp-members +#: includes/admin/class-wp-members-admin-api.php:399 +msgid "Password Reset" +msgstr "पासवर्ड रीसेट" + +#: includes/admin/class-wp-members-admin-api.php:406 +msgid "Retrieve Username" +msgstr "" + +# @ wp-members +#: includes/admin/class-wp-members-admin-api.php:414 +msgid "Admin Notification" +msgstr "व्यवस्थापक अधिसूचना" + +# @ wp-members +#: includes/admin/class-wp-members-admin-api.php:440 +msgid "Restricted post (or page), displays above the login/registration form" +msgstr "रतिबंधित पोस्ट, (या पृष्ठ) प्रपत्र लॉग इन / पंजीकरण ऊपर प्रदर्शित करता है" + +# @ wp-members +#: includes/admin/class-wp-members-admin-api.php:441 +msgid "Username is taken" +msgstr "उपयोगकर्ता नाम लिया है" + +# @ wp-members +#: includes/admin/class-wp-members-admin-api.php:442 +msgid "Email is registered" +msgstr "ईमेल पंजीकृत है" + +# @ wp-members +#: includes/admin/class-wp-members-admin-api.php:443 +msgid "Registration completed" +msgstr "पंजीकरण पूरा किया" + +# @ wp-members +#: includes/admin/class-wp-members-admin-api.php:444 +msgid "User update" +msgstr "नवीनीकरण उपयोगकर्ता" + +# @ wp-members +#: includes/admin/class-wp-members-admin-api.php:445 +msgid "Passwords did not match" +msgstr "कूटशब्द मेल नहीं खाता" + +# @ wp-members +#: includes/admin/class-wp-members-admin-api.php:446 +msgid "Password changes" +msgstr "पासवर्ड परिवर्तन" + +# @ wp-members +#: includes/admin/class-wp-members-admin-api.php:447 +msgid "Username or email do not exist when trying to reset forgotten password" +msgstr "उपयोगकर्ता नाम या ईमेल जब भूल पासवर्ड रीसेट करने की कोशिश मौजूद नहीं है" + +# @ wp-members +#: includes/admin/class-wp-members-admin-api.php:448 +msgid "Password reset" +msgstr "पासवर्ड रीसेट" + +#: includes/admin/class-wp-members-admin-api.php:547 +msgid "Close" +msgstr "" + +# @ default +# @ wp-members +#: includes/admin/class-wp-members-admin-api.php:596 +msgid "Settings" +msgstr "सेटिंग्स" + +#: includes/admin/class-wp-members-admin-posts.php:30 +#: includes/admin/class-wp-members-admin-posts.php:33 +msgid "Unrestrict" +msgstr "" + +#: includes/admin/class-wp-members-admin-posts.php:31 +#: includes/admin/class-wp-members-admin-posts.php:34 +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:110 +msgid "Restrict" +msgstr "" + +#: includes/admin/class-wp-members-admin-posts.php:32 +#: includes/admin/class-wp-members-admin-posts.php:35 +msgid "Hide" +msgstr "" + +#: includes/admin/class-wp-members-admin-posts.php:125 +#, php-format +msgid "%s restricted" +msgstr "" + +#: includes/admin/class-wp-members-admin-posts.php:125 +#, php-format +msgid "%s unrestricted" +msgstr "" + +#: includes/admin/class-wp-members-admin-posts.php:165 +#, php-format +msgid "%s Restriction" +msgstr "" + +#: includes/admin/class-wp-members-admin-posts.php:195 +#: includes/admin/class-wp-members-admin-posts.php:342 +#: includes/admin/class-wp-members-admin-posts.php:345 +msgid "Unrestricted" +msgstr "" + +#: includes/admin/class-wp-members-admin-posts.php:196 +#: includes/admin/class-wp-members-admin-posts.php:339 +#: includes/admin/class-wp-members-admin-posts.php:347 +msgid "Restricted" +msgstr "" + +#: includes/admin/class-wp-members-admin-posts.php:197 +#: includes/admin/class-wp-members-admin-posts.php:349 +msgid "Hidden" +msgstr "" + +#: includes/admin/class-wp-members-admin-posts.php:203 +msgid "Status:" +msgstr "" + +#: includes/admin/class-wp-members-admin-posts.php:203 +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:68 +#: includes/admin/tabs/class-wp-members-fields-table.php:65 +#: includes/walkers/class-wp-members-walker-nav-menu.php:140 +#, fuzzy +msgid "Edit" +msgstr "जानकारी संपादित करें" + +#: includes/admin/class-wp-members-admin-posts.php:218 +msgid "Ok" +msgstr "" + +#: includes/admin/class-wp-members-admin-posts.php:219 +#: includes/walkers/class-wp-members-walker-nav-menu.php:224 +msgid "Cancel" +msgstr "" + +#: includes/admin/class-wp-members-admin-posts.php:305 +msgid "Status" +msgstr "" + +#: includes/admin/class-wp-members-admin-users.php:28 +#: includes/admin/class-wp-members-admin-users.php:34 +#: includes/admin/class-wp-members-admin-users.php:79 +msgid "Activate" +msgstr "" + +#: includes/admin/class-wp-members-admin-users.php:29 +#: includes/admin/class-wp-members-admin-users.php:35 +#: includes/admin/class-wp-members-admin-users.php:82 +msgid "Deactivate" +msgstr "" + +# @ wp-members +#: includes/admin/class-wp-members-admin-users.php:31 +#: includes/admin/class-wp-members-admin-users.php:37 +msgid "Export" +msgstr "निर्यात" + +#: includes/admin/class-wp-members-admin-users.php:32 +#: includes/admin/class-wp-members-admin-users.php:38 +#, fuzzy +msgid "Export All Users" +msgstr "निर्यात" + +#: includes/admin/class-wp-members-admin-users.php:61 +msgid "Confirm" +msgstr "" + +#: includes/admin/class-wp-members-admin-users.php:64 +msgid "Unconfirm" +msgstr "" + +#: includes/admin/class-wp-members-admin-users.php:147 +#, php-format +msgid "%s users activated" +msgstr "" + +#: includes/admin/class-wp-members-admin-users.php:147 +#, php-format +msgid "%s users deactivated" +msgstr "" + +#: includes/admin/class-wp-members-admin-users.php:150 +msgid "No users selected" +msgstr "" + +#: includes/admin/class-wp-members-admin-users.php:168 +msgid "You cannot activate or deactivate yourself" +msgstr "" + +#: includes/admin/class-wp-members-admin-users.php:173 +#, php-format +msgid "%s activated" +msgstr "" + +#: includes/admin/class-wp-members-admin-users.php:178 +#, php-format +msgid "%s deactivated" +msgstr "" + +#: includes/admin/class-wp-members-admin-users.php:182 +msgid "That user is already active" +msgstr "" + +#: includes/admin/class-wp-members-admin-users.php:198 +msgid "You cannot confirm or unconfirm yourself" +msgstr "" + +#: includes/admin/class-wp-members-admin-users.php:203 +#, php-format +msgid "%s confirmed" +msgstr "" + +#: includes/admin/class-wp-members-admin-users.php:208 +#, php-format +msgid "%s unconfirmed" +msgstr "" + +#: includes/admin/class-wp-members-admin-users.php:212 +msgid "That user is already confirmed" +msgstr "" + +#: includes/admin/class-wp-members-admin-users.php:341 +msgid "Pending" +msgstr "" + +#: includes/admin/class-wp-members-admin-users.php:342 +msgid "Trial" +msgstr "" + +# @ wp-members +#: includes/admin/class-wp-members-admin-users.php:343 +#: includes/admin/class-wp-members-user-export.php:289 +msgid "Subscription" +msgstr "सदस्यता" + +#: includes/admin/class-wp-members-admin-users.php:344 +msgid "Expired" +msgstr "" + +#: includes/admin/class-wp-members-admin-users.php:347 +#: includes/admin/class-wp-members-admin-users.php:410 +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:457 +msgid "Activated" +msgstr "" + +#: includes/admin/class-wp-members-admin-users.php:348 +msgid "Pending Activation" +msgstr "" + +#: includes/admin/class-wp-members-admin-users.php:349 +msgid "Deactivated" +msgstr "" + +#: includes/admin/class-wp-members-admin-users.php:352 +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:456 +msgid "Confirmed" +msgstr "" + +#: includes/admin/class-wp-members-admin-users.php:353 +msgid "Not Confirmed" +msgstr "" + +#: includes/admin/class-wp-members-admin-users.php:355 +msgid "Not Exported" +msgstr "" + +#: includes/admin/class-wp-members-admin-users.php:475 +msgid "Not confirmed" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:67 +msgid "Slug" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:68 +#: includes/admin/class-wp-members-user-export.php:294 +msgid "Role" +msgstr "" + +# @ wp-members +#: includes/admin/class-wp-members-products-admin.php:69 +#: includes/admin/class-wp-members-products-admin.php:740 +#: includes/admin/class-wp-members-user-export.php:290 +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:460 +msgid "Expires" +msgstr "समाप्त हो" + +#: includes/admin/class-wp-members-products-admin.php:71 +msgid "Default" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:73 +msgid "Last updated" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:97 +msgid "slug:" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:100 +msgid "No role required" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:105 +msgid "Does not expire" +msgstr "" + +# @ wp-members +#: includes/admin/class-wp-members-products-admin.php:109 +#: includes/admin/class-wp-members-user-export.php:199 +msgid "Yes" +msgstr "हां" + +#: includes/admin/class-wp-members-products-admin.php:145 +msgid "Membership Product Details" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:153 +msgid "Membership Product Message (optional)" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:169 +msgid "Access by child membership" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:185 +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:62 +msgid "Posts" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:186 +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:63 +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:249 +#, fuzzy +msgid "Pages" +msgstr "डिफ़ॉल्ट रूप से ब्लॉक पन्ने" + +#: includes/admin/class-wp-members-products-admin.php:213 +#: includes/admin/class-wp-members-products-admin.php:262 +#: includes/admin/class-wp-members-products-admin.php:309 +msgid "Period" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:213 +msgid "Day" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:213 +msgid "Week" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:213 +msgid "Month" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:213 +msgid "Year" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:226 +msgid "Name (slug)" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:228 +msgid "Optional Defaults" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:231 +msgid "Assign as default at registration? (optional)" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:239 +#, php-format +msgid "Pre-selected by default for new %s" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:245 +msgid "Optional Properties" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:248 +msgid "Role Required? (optional)" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:251 +msgid "No Role" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:257 +msgid "Expires (optional)" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:259 +#: includes/admin/class-wp-members-products-admin.php:261 +#: includes/admin/class-wp-members-products-admin.php:306 +#: includes/admin/class-wp-members-products-admin.php:308 +msgid "Number" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:267 +msgid "Use \"no gap\" renewal" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:271 +msgid "Use a fixed period (such as Jan 1 - Dec 31, or Sept 1 - Aug 31)" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:288 +#: includes/admin/class-wp-members-products-admin.php:289 +msgid "Period Start (dd-mm)" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:290 +#: includes/admin/class-wp-members-products-admin.php:291 +msgid "Period End (dd-mm)" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:304 +msgid "Fixed period grace period" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:313 +msgid "" +"Grace period is the point at which expiration date is for following time period. For " +"example, if user who register August 1st would be part of the following year's Sept 1 - Aug " +"31 membership, set this at 1 Month. Leave blank for no grace period." +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:376 +msgid "Restricted Message (displays when a user does not have access to a membership)" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:502 +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:239 +#: includes/class-wp-members-forms.php:1196 includes/class-wp-members-user-profile.php:132 +msgid "None" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:517 +msgid "Restrict access by membership:" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:598 +msgid "Required Membership" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:644 +#: includes/admin/class-wp-members-products-admin.php:745 +#: includes/class-wp-members-products.php:335 +msgid "Membership" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:680 +msgid "expires:" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:709 +#: includes/class-wp-members-products.php:336 includes/class-wp-members-products.php:341 +msgid "Memberships" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:736 +msgid "Membership Access" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:744 +msgid "Action" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:746 +msgid "Enabled?" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:757 +msgid "Enable" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:758 +msgid "Disable" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:759 +msgid "Update" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:764 +msgid "Expiration date (optional)" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:795 +#, php-format +msgid "No memberships have been created. %sCreate new memberships here%s" +msgstr "" + +#: includes/admin/class-wp-members-user-export.php:199 +msgid "No" +msgstr "" + +#: includes/admin/class-wp-members-user-export.php:264 +msgid "You do not have the required user capabilities to export users." +msgstr "" + +#: includes/admin/class-wp-members-user-export.php:277 +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:461 +msgid "User ID" +msgstr "" + +#: includes/admin/class-wp-members-user-export.php:284 includes/class-wp-members-dialogs.php:91 +#: includes/class-wp-members-dialogs.php:114 +msgid "Username" +msgstr "" + +# @ wp-members +#: includes/admin/class-wp-members-user-export.php:286 +msgid "Activated?" +msgstr "सक्रिय?" + +# @ wp-members +#: includes/admin/class-wp-members-user-export.php:292 +msgid "Registered" +msgstr "पंजीकृत" + +# @ wp-members +#: includes/admin/class-wp-members-user-export.php:293 +msgid "IP" +msgstr "IP" + +# @ wp-members +#: includes/admin/dialogs.php:117 +msgid "Your WP settings allow anyone to register - this is not the recommended setting." +msgstr "आपके WP सेटिंग्स किसी को भी रजिस्टर करने के लिए अनुमति देते हैं - यह सिफारिश की सेटिंग नहीं है." + +# @ wp-members +#: includes/admin/dialogs.php:118 +#, php-format +msgid "" +"You can %s change this here %s making sure the box next to \"Anyone can register\" is " +"unchecked." +msgstr "" +"आप%s में परिवर्तन के यहां%s बनाने यकीन है कि अगले करने के लिए बॉक्स \"कोई भी रजिस्टर कर सकते हैं \" " +"अनियंत्रित है" + +# @ wp-members +#: includes/admin/dialogs.php:119 +msgid "" +"This setting allows a link on the /wp-login.php page to register using the WP native " +"registration process thus circumventing any registration you are using with WP-Members. In " +"some cases, this may suit the users wants/needs, but most users should uncheck this option. " +"If you do not change this setting, you can choose to ignore these warning messages under WP-" +"Members Settings." +msgstr "" +"यह सेटिंग / wp-login.php पृष्ठ पर एक लिंक WP देशी पंजीकरण प्रक्रिया इस प्रकार का उपयोग कर आप किसी भी " +"पंजीकरण WP-सदस्य के साथ प्रयोग कर रहे हैं धोखा रजिस्टर करने के लिए अनुमति देता है. कुछ मामलों में, यह " +"उपयोगकर्ताओं को सूट / की जरूरत है चाहता है, हो सकता है, लेकिन अधिकांश उपयोगकर्ताओं को इस विकल्प को अनचेक " +"करना चाहिए. यदि आप इस सेटिंग को बदल नहीं है, तुम WP-सदस्य सेटिंग्स के तहत इन चेतावनी संदेशों को अनदेखा करने " +"के लिए चुन सकते हैं." + +# @ wp-members +#: includes/admin/dialogs.php:123 +msgid "Your WP settings allow anyone to comment - this is not the recommended setting." +msgstr "आपके WP सेटिंग्स किसी को भी टिप्पणी करने के लिए अनुमति देते हैं - यह सिफारिश की सेटिंग नहीं है." + +# @ wp-members +#: includes/admin/dialogs.php:124 +#, php-format +msgid "" +"You can %s change this here %s by checking the box next to \"Users must be registered and " +"logged in to comment.\"" +msgstr "" +"आप%s में परिवर्तन के इस%s अगले बॉक्स की जाँच करके यहाँ कर सकते हैं \"उपयोगकर्ताओं को पंजीकृत होना चाहिए और में " +"लॉग इन टिप्पणी करने के लिए \"" + +# @ wp-members +#: includes/admin/dialogs.php:125 +msgid "" +"This setting allows any users to comment, whether or not they are registered. Depending on " +"how you are using WP-Members will determine whether you should change this setting or not. " +"If you do not change this setting, you can choose to ignore these warning messages under WP-" +"Members Settings." +msgstr "" +"यह सेटिंग किसी भी उपयोगकर्ताओं को टिप्पणी करने के लिए, चाहे या नहीं वे पंजीकृत हैं अनुमति देता है. कैसे आप WP-" +"सदस्यों का उपयोग कर रहे हैं के आधार पर निर्धारित होगा कि क्या आप इस सेटिंग को बदलने चाहिए या नहीं. यदि " +"आप इस सेटिंग को बदल नहीं है, तुम WP-सदस्य सेटिंग्स के तहत इन चेतावनी संदेशों को अनदेखा करने के लिए चुन सकते हैं." + +# @ wp-members +#: includes/admin/dialogs.php:129 +msgid "Your WP settings allow full text rss feeds - this is not the recommended setting." +msgstr "आपका WP सेटिंग्स पूर्ण पाठ आरएसएस फ़ीड की अनुमति यह सिफारिश की सेटिंग नहीं है." + +# @ wp-members +#: includes/admin/dialogs.php:130 +#, php-format +msgid "" +"You can %s change this here %s by changing \"For each article in a feed, show\" to \"Summary." +"\"" +msgstr "" +"आप बदल रहा है \"प्रत्येक लेख के लिए एक फ़ीड दिखाने के लिए, \" \"सारांश \"%s परिवर्तन यह है यहां%s कर सकते हैं" + +# @ wp-members +#: includes/admin/dialogs.php:131 +msgid "" +"Leaving this set to full text allows anyone to read your protected content in an RSS reader. " +"Changing this to Summary prevents this as your feeds will only show summary text." +msgstr "" +"पूर्ण पाठ करने के लिए इस सेट को छोड़कर किसी को भी एक आरएसएस रीडर में संरक्षित सामग्री को पढ़ने के लिए " +"अनुमति देता है. यह करने के लिए सारांश बदलने से अपने फ़ीड के रूप में इस रोकता केवल सारांश पाठ दि" + +# @ wp-members +#: includes/admin/dialogs.php:135 +msgid "You have set WP-Members to hold registrations for approval" +msgstr "आप WP-सदस्य सेट करने के लिए अनुमोदन के लिए पंजीकरण पकड़ है" + +# @ wp-members +#: includes/admin/dialogs.php:136 +msgid "" +"but you have not changed the default message for \"Registration Completed\" under \"WP-" +"Members Dialogs and Error Messages.\" You should change this message to let users know they " +"are pending approval." +msgstr "" +"लेकिन आप के लिए डिफ़ॉल्ट संदेश नहीं बदल गया है \"पंजीकरण पूर्ण \" के अंतर्गत \"WP-सदस्य संवाद और त्रुटि संदेश \" " +"आप इस संदेश को बदलने के लिए उपयोगकर्ताओं को पता है कि वे अनुमोदन के लिए लंबित कर रहे हैं " + +# @ wp-members +#: includes/admin/dialogs.php:140 +msgid "You have turned on reCAPTCHA" +msgstr "आप reCAPTCHA पर बदल गया है" + +# @ wp-members +#: includes/admin/dialogs.php:141 +msgid "" +"but you have not entered API keys. You will need both a public and private key. The " +"CAPTCHA will not display unless a valid API key is included." +msgstr "" +"लेकिन आप एपीआई कुंजी दर्ज नहीं की है. तुम दोनों सार्वजनिक और निजी कुंजी की आवश्यकता होगी. कॅप्चा है जब तक " +"एक मान्य API कुंजी शामिल है प्रदर्शित नहीं होगा." + +#: includes/admin/dialogs.php:145 +msgid "You have active settings that are not recommended." +msgstr "" + +#: includes/admin/dialogs.php:146 +msgid "" +"If you will not be changing these settings, you can turn off these warning messages by " +"checking the \"Ignore warning messages\" in the settings below." +msgstr "" + +# @ wp-members +#: includes/admin/dialogs.php:174 +msgid "Version:" +msgstr "संस्करण:" + +#: includes/admin/dialogs.php:175 +#, fuzzy +msgid "Quick Start Guide" +msgstr "नवीनीकरण उपयोगकर्ता" + +#: includes/admin/dialogs.php:176 +#, fuzzy +msgid "Online User Guide" +msgstr "नवीनीकरण उपयोगकर्ता" + +#: includes/admin/dialogs.php:177 +msgid "FAQs" +msgstr "" + +# @ wp-members +#: includes/admin/dialogs.php:184 +#, fuzzy +msgid "Thank you for using WP-Members" +msgstr "WP-सदस्य का उपयोग करने के लिए धन्यवाद! संस्मरण%s का उपयोग कर रहे हैं" + +#: includes/admin/dialogs.php:185 +msgid "A plugin developed by" +msgstr "" + +# @ wp-members +#: includes/admin/dialogs.php:186 +msgid "Follow" +msgstr "पालन करें" + +#: includes/admin/dialogs.php:203 includes/admin/dialogs.php:207 +msgid "Latest from RocketGeek" +msgstr "" + +#: includes/admin/dialogs.php:224 +msgid "Like WP-Members?" +msgstr "" + +#: includes/admin/dialogs.php:225 +#, php-format +msgid "" +"If you like WP-Members please give it a %s★★★★★%s rating. " +"Thanks!!" +msgstr "" + +#: includes/admin/dialogs.php:236 includes/admin/dialogs.php:249 +msgid "Latest from ButlerBlog" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:67 +#, php-format +msgid "See the %sUsers Guide on CAPTCHA%s." +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:74 +#: includes/admin/tabs/class-wp-members-admin-tab-dialogs.php:57 +#: includes/admin/tabs/class-wp-members-admin-tab-emails.php:109 +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:134 +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:78 +msgid "Need help?" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:85 +msgid "Manage CAPTCHA Options" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:91 +msgid "CAPTCHA Type" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:96 +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:243 +msgid "reCAPTCHA v2" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:97 +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:244 +msgid "reCAPTCHA v3" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:98 +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:245 +msgid "Really Simple CAPTCHA" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:99 +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:246 +msgid "hCaptcha" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:106 +msgid "" +"CAPTCHA type was changed. Please verify and update the settings below for the new CAPTCHA " +"type." +msgstr "" + +# @ wp-members +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:117 +msgid "reCAPTCHA Keys" +msgstr "reCAPTCHA कुंजी" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:120 +#, php-format +msgid "" +"reCAPTCHA requires an API key, consisting of a \"site\" and a \"secret\" key. You can sign " +"up for a %s free reCAPTCHA key%s" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:122 +msgid "Site Key" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:123 +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:139 +msgid "Secret Key" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:133 +msgid "hCaptcha Keys" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:136 +#, php-format +msgid "hCaptcha requires an API key. You can sign up for %s an hCaptcha API key here %s" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:138 +msgid "API Key" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:170 +#, fuzzy +msgid "Characters for image" +msgstr "फ़ील्ड प्रकार" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:174 +#, fuzzy +msgid "Number of characters" +msgstr "कुछ अंशः दिखाएँ" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:178 +#, fuzzy +msgid "Image dimensions" +msgstr "फ़ील्ड प्रकार" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:179 +msgid "Width" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:179 +msgid "Height" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:182 +msgid "Font color of characters" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:186 +#, fuzzy +msgid "Background color of image" +msgstr "फ़ील्ड प्रकार" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:190 +msgid "Font size" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:194 +msgid "Width between characters" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:198 +#, fuzzy +msgid "Image type" +msgstr "फ़ील्ड प्रकार" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:213 +msgid "" +"To use Really Simple CAPTCHA, you must have the Really Simple CAPTCHA plugin installed and " +"activated." +msgstr "" + +# @ wp-members +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:241 +msgid "Update CAPTCHA Settings" +msgstr "अपडेट करें CAPTCHA सेटिंग्स" + +# @ wp-members +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:319 +msgid "CAPTCHA was updated for WP-Members" +msgstr "CAPTCHA WP-सदस्य के लिए अपडेट किया गया था" + +# @ wp-members +#: includes/admin/tabs/class-wp-members-admin-tab-dialogs.php:67 +msgid "Dialogs and Error Messages" +msgstr "संवाद और त्रुटि संदेश" + +# @ wp-members +#: includes/admin/tabs/class-wp-members-admin-tab-dialogs.php:69 +#, php-format +msgid "" +"You can customize the text for dialogs and error messages. Simple HTML is allowed %s etc." +msgstr "आप संवाद और त्रुटि संदेश के लिए पाठ को अनुकूलित कर सकते हैं. सरल HTML%s आदि की अनुमति दी है" + +# @ wp-members +#: includes/admin/tabs/class-wp-members-admin-tab-dialogs.php:80 +msgid "Terms of Service (TOS)" +msgstr "सेवा की शर्तें (TOS)" + +# @ wp-members +#: includes/admin/tabs/class-wp-members-admin-tab-dialogs.php:87 +msgid "Update Dialogs" +msgstr "संवाद अपडेट करें" + +# @ wp-members +#: includes/admin/tabs/class-wp-members-admin-tab-dialogs.php:124 +msgid "WP-Members dialogs were updated" +msgstr "WP-सदस्य संवाद अपडेट की गई थीं" + +#: includes/admin/tabs/class-wp-members-admin-tab-dropins.php:88 +#: includes/admin/tabs/class-wp-members-dropins-table.php:180 +msgid "WP-Members Dropin settings were updated" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-dropins.php:216 +msgid "Manage Dropins" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-dropins.php:217 +msgid "Current dropin folder: " +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-dropins.php:218 +msgid "" +"You can change location of the dropin folder using the wpmem_dropin_folder " +"filter." +msgstr "" + +# @ wp-members +#: includes/admin/tabs/class-wp-members-admin-tab-emails.php:57 +msgid "Email Messages" +msgstr "ईमेल संदेश" + +# @ wp-members +#: includes/admin/tabs/class-wp-members-admin-tab-emails.php:60 +msgid "You can customize the content of the emails sent by the plugin." +msgstr "आप प्लगइन द्वारा भेजे गए ईमेल की सामग्री को अनुकूलित कर सकते हैं." + +# @ wp-members +#: includes/admin/tabs/class-wp-members-admin-tab-emails.php:62 +msgid "A list of shortcodes is available here." +msgstr "शॉर्टकोड की एक सूची यहाँ उपलब्ध है." + +# @ wp-members +#: includes/admin/tabs/class-wp-members-admin-tab-emails.php:69 +msgid "Set a custom email address" +msgstr "एक कस्टम ईमेल पता सेट करें" + +# @ wp-members +#: includes/admin/tabs/class-wp-members-admin-tab-emails.php:70 +#: includes/admin/tabs/class-wp-members-admin-tab-emails.php:74 +#: includes/admin/tabs/class-wp-members-admin-tab-emails.php:93 +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:163 +msgid "(optional)" +msgstr "(वैकल्पिक)" + +# @ wp-members +#: includes/admin/tabs/class-wp-members-admin-tab-emails.php:73 +msgid "Set a custom email name" +msgstr "एक कस्टम ईमेल का नाम सेट करें" + +#: includes/admin/tabs/class-wp-members-admin-tab-emails.php:77 +msgid "Send HTML email" +msgstr "" + +# @ wp-members +#: includes/admin/tabs/class-wp-members-admin-tab-emails.php:93 +msgid "Email Signature" +msgstr "ईमेल हस्ताक्षर" + +# @ wp-members +#: includes/admin/tabs/class-wp-members-admin-tab-emails.php:101 +msgid "Update Emails" +msgstr "ईमेल अपडेट करें" + +# @ wp-members +#: includes/admin/tabs/class-wp-members-admin-tab-emails.php:172 +msgid "WP-Members emails were updated" +msgstr "WP-सदस्य ईमेल अपडेट की गई थीं" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:93 +#: includes/class-wp-members-dialogs.php:65 +msgid "No fields selected for deletion" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:95 +msgid "Are you sure you want to delete the following fields?" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:122 +msgid "Fields deleted" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:136 +msgid "Field Manager Documentation" +msgstr "" + +# @ wp-members +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:164 +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:315 +#: includes/class-wp-members-forms.php:1629 includes/class-wp-members-forms.php:1821 +#: includes/class-wp-members-user-profile.php:181 +msgid "(required)" +msgstr "आवश्यकता है?" + +# @ wp-members +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:169 +#, fuzzy +msgid "Edit Field" +msgstr "जानकारी संपादित करें" + +# @ wp-members +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:169 +#, fuzzy +msgid "Add a Field" +msgstr "जोड़ना" + +# @ wp-members +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:174 +msgid "Field Label" +msgstr "क्षेत्र लेबल" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:176 +msgid "The name of the field as it will be displayed to the user." +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:179 +#: includes/admin/tabs/class-wp-members-fields-table.php:58 +msgid "Meta Key" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:185 +msgid "" +"The database meta value for the field. It must be unique and contain no spaces (underscores " +"are ok)." +msgstr "" + +# @ wp-members +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:189 +#: includes/admin/tabs/class-wp-members-fields-table.php:59 +msgid "Field Type" +msgstr "फ़ील्ड प्रकार" + +# @ wp-members +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:195 +msgid "text" +msgstr "पाठ" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:196 +msgid "email" +msgstr "" + +# @ wp-members +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:197 +msgid "textarea" +msgstr "textarea" + +# @ wp-members +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:198 +msgid "checkbox" +msgstr "चेकबॉक्स" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:199 +msgid "multiple checkbox" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:200 +msgid "select (dropdown)" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:201 +msgid "multiple select" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:202 +msgid "radio group" +msgstr "" + +# @ wp-members +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:203 +msgid "password" +msgstr "पासवर्ड" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:204 +msgid "image" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:205 +msgid "file" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:206 +msgid "url" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:207 +msgid "number" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:208 +msgid "date" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:209 +msgid "hidden" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:211 +msgid "membership" +msgstr "" + +# @ wp-members +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:217 +#: includes/admin/tabs/class-wp-members-fields-table.php:60 +msgid "Display?" +msgstr "प्रदर्शित करते हैं?" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:221 +msgid "This field is always displayed" +msgstr "" + +# @ wp-members +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:226 +msgid "Required?" +msgstr "आवश्यकता है?" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:230 +msgid "This field is always required" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:236 +msgid "Allow HTML?" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:243 +msgid "Placeholder" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:251 +msgid "Pattern" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:259 +msgid "Title" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:268 +msgid "Minimum Value" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:272 +msgid "Maximum Value" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:280 +msgid "Rows" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:284 +msgid "Columns" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:292 +msgid "Accepted file types:" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:297 +msgid "Accepted file types should be set like this: jpg|jpeg|png|gif" +msgstr "" + +# @ wp-members +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:304 +#, fuzzy +msgid "Checked by default?" +msgstr "जाँच की?" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:308 +msgid "HTML label position" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:310 +msgid "Before the input tag" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:311 +msgid "After the input tag" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:312 +msgid "Selecting \"after\" will generally display the label to the right of the checkbox" +msgstr "" + +# @ wp-members +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:315 +#, fuzzy +msgid "Stored value if checked:" +msgstr "चेकबॉक्स के लिए, मान संग्रहीत यदि जांचा जाता है:" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:336 +msgid "Stored values delimiter:" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:345 +msgid "Values (Displayed|Stored):" +msgstr "" + +# @ wp-members +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:370 +msgid "Options should be Option Name|option_value," +msgstr "विकल्प का नाम होना चाहिए, option_value" + +# @ wp-members +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:374 +msgid "Visit plugin site for more information" +msgstr "अधिक जानकारी के लिए प्लगइन साइट पर जाएँ" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:381 +msgid "Value" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:400 +msgid "Save Changes" +msgstr "" + +# @ wp-members +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:400 +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:527 +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:528 +#, fuzzy +msgid "Add Field" +msgstr "जोड़ना" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:402 +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:726 +msgid "Return to Fields Table" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:449 +msgid "Drag and drop to reorder fields" +msgstr "" + +# @ wp-members +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:455 +#, fuzzy +msgid "Registration Date" +msgstr "पंजीकरण पूरा किया" + +# @ wp-members +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:458 +#, fuzzy +msgid "Registration IP" +msgstr "आईपी ​​@ पंजीकरण" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:459 +msgid "Subscription Type" +msgstr "" + +# @ wp-members +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:495 +msgid "Manage Fields" +msgstr "फील्ड्स प्रबंधित" + +# @ wp-members +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:595 +msgid "WP-Members fields were updated" +msgstr "WP-सदस्य फ़ील्ड्स अपडेट की गई थीं" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:617 +msgid "Field Label is required. Nothing was updated." +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:618 +msgid "Meta Key is required. Nothing was updated." +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:620 +msgid "Meta Key must contain only letters, numbers, and underscores" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:627 +msgid "A field with that meta key already exists" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:632 +#, php-format +msgid "" +"Sorry, \"%s\" is a reserved term. Field was not added." +msgstr "" + +# @ wp-members +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:673 +#, fuzzy +msgid "Checked value is required for checkboxes. Nothing was updated." +msgstr "क्षेत्र लेबल एक नए क्षेत्र जोड़ने के लिए आवश्यक है.कुछ भी नहीं अपडेट किया गया था." + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:705 +msgid "A value is required for hidden fields. Nothing was updated." +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:712 +#, php-format +msgid "%s was added" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:725 +#, php-format +msgid "%s was updated" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:768 +msgid "Form field order updated." +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:56 +#, php-format +msgid "%sChange%s or %sFilter%s this address" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:57 +#, php-format +msgid "See the %sUsers Guide on plugin options%s." +msgstr "" + +# @ wp-members +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:90 +msgid "Manage Options" +msgstr "विकल्प प्रबंधित" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:94 +msgid "Content" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:105 +msgid "Content Restriction" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:109 +msgid "Do not restrict" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:123 +msgid "Show Excerpts" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:124 +msgid "Show Login Form" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:125 +msgid "Show Registration Form" +msgstr "" + +# @ wp-members +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:126 +#, fuzzy +msgid "Auto Excerpt:" +msgstr "कुछ अंशः दिखाएँ" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:148 +#, fuzzy +msgid "Number of words in excerpt:" +msgstr "कुछ अंशः दिखाएँ" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:149 +msgid "Custom read more link (optional):" +msgstr "" + +# @ wp-members +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:163 +msgid "Time-based expiration" +msgstr "समय - आधारित समाप्ति" + +# @ wp-members +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:163 +msgid "Allows for access to expire" +msgstr "उपयोग के लिए समाप्त करने के लिए" + +# @ wp-members +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:164 +msgid "Trial period" +msgstr "परीक्षण अवधि" + +# @ wp-members +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:164 +msgid "Allows for a trial period" +msgstr "एक परीक्षण अवधि के लिए अनुमति देता" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:166 +msgid "Subscription Settings" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:176 +msgid "New Feature Settings" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:182 +msgid "Legacy Password Reset" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:182 +#, php-format +msgid "Use legacy password reset. %s(Requires additional configuration)%s" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:184 +msgid "Legacy Login Error" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:184 +msgid "Use legacy WP-Members login error instead of WP error object." +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:187 +msgid "WooCommerce My Account" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:187 +msgid "Add WP-Members fields to WooCommerce My Account registration" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:188 +msgid "WooCommerce Checkout" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:188 +msgid "Add WP-Members fields to WooCommerce registration during checkout" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:204 +msgid "Other Settings" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:214 +msgid "Enable memberships" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:214 +#, php-format +msgid "Enables creation of different %s membership products %s" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:215 +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:223 +msgid "Clone menus" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:215 +msgid "Enables logged in menus" +msgstr "" + +# @ wp-members +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:216 +msgid "Notify admin" +msgstr "व्यवस्थापक को सूचित करें" + +# @ wp-members +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:216 +#, fuzzy, php-format +msgid "Notify %s for each new registration? %s" +msgstr "व्यवस्थापक करने के लिए प्रत्येक नए पंजीकरण के लिए ईमेल भेजता है?" + +# @ wp-members +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:217 +msgid "Moderate registration" +msgstr "मध्यम पंजीकरण" + +# @ wp-members +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:217 +msgid "Holds new registrations for admin approval" +msgstr "व्यवस्थापक अनुमोदन के लिए नए पंजीकरण धारण" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:218 +msgid "Confirmation Link" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:218 +#, php-format +msgid "" +"Send email confirmation link on new registration. %s(Requires additional configuration)%s" +msgstr "" + +# @ wp-members +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:219 +msgid "Ignore warning messages" +msgstr "चेतावनी संदेश पर ध्यान न दें" + +# @ wp-members +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:219 +msgid "Ignores WP-Members warning messages in the admin panel" +msgstr "व्यवस्थापक पैनल में WP-सदस्य चेतावनी संदेश ध्यान नहीं देता है" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:233 +msgid "Attribution" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:235 +msgid "Attribution is appreciated! Display \"powered by\" link on register form?" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:238 +msgid "Enable CAPTCHA for Registration" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:253 +msgid "Login Page:" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:256 +msgid "Specify a login page (optional)" +msgstr "" + +# @ wp-members +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:265 +#, fuzzy +msgid "Register Page:" +msgstr "रजिस्टर पृष्ठ URL:" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:268 +msgid "For creating a register link in the login form" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:277 +#, fuzzy +msgid "User Profile Page:" +msgstr "रजिस्टर पृष्ठ URL:" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:280 +msgid "For creating a forgot password link in the login form" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:286 +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:288 +msgid "Stylesheet" +msgstr "" + +# @ wp-members +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:297 +#, fuzzy +msgid "Custom Stylesheet:" +msgstr "रिवाज" + +# @ wp-members +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:302 +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:329 +msgid "Update Settings" +msgstr "सेटिंग्स अपडेट करें" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:310 +msgid "Custom Post Types" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:316 +msgid "Add to WP-Members Settings" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:332 +msgid "" +"Please keep in mind that Custom Post Types are \"custom\" and therefore, not all of them " +"will function exactly the same way. WP-Members will certainly work with any post type that " +"operate like a post or a page; but you will need to review any custom post type added to " +"determine that it functions the way you expect." +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:342 +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:343 +msgid "WP-Members Settings" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:344 +msgid "The following is your WP-Members settings information if needed for support." +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:378 +msgid "Click to Copy" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:458 +msgid "Custom Post Type settings were updated" +msgstr "" + +# @ wp-members +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:579 +msgid "WP-Members settings were updated" +msgstr "WP-सदस्य सेटिंग्स अपडेट की गई थीं" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:651 +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:682 +msgid "USE CUSTOM URL BELOW" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:671 +#, fuzzy +msgid "Select a page" +msgstr "रजिस्टर पृष्ठ URL:" + +#: includes/admin/tabs/class-wp-members-dropins-table.php:70 +msgid "Name" +msgstr "" + +#: includes/admin/tabs/class-wp-members-dropins-table.php:71 +msgid "Enabled" +msgstr "" + +#: includes/admin/tabs/class-wp-members-dropins-table.php:72 +msgid "File" +msgstr "" + +#: includes/admin/tabs/class-wp-members-dropins-table.php:73 +msgid "Version" +msgstr "" + +#: includes/admin/tabs/class-wp-members-dropins-table.php:74 +#: includes/walkers/class-wp-members-walker-nav-menu.php:186 +msgid "Description" +msgstr "" + +#: includes/admin/tabs/class-wp-members-dropins-table.php:117 +#: includes/admin/tabs/class-wp-members-fields-table.php:108 +msgid "Save Settings" +msgstr "" + +#: includes/admin/tabs/class-wp-members-fields-table.php:43 +msgid "delete" +msgstr "" + +#: includes/admin/tabs/class-wp-members-fields-table.php:57 +msgid "Display Label" +msgstr "" + +#: includes/admin/tabs/class-wp-members-fields-table.php:61 +msgid "Required" +msgstr "" + +#: includes/admin/tabs/class-wp-members-fields-table.php:63 +#, fuzzy +msgid "Users Screen" +msgstr "%d उपयोगकर्ताओं में सक्रिय थे." + +#: includes/admin/tabs/class-wp-members-fields-table.php:64 +msgid "Users Search" +msgstr "" + +#: includes/admin/tabs/class-wp-members-fields-table.php:66 +msgid "Sort" +msgstr "" + +#: includes/admin/tabs/class-wp-members-fields-table.php:107 +msgid "Delete Selected" +msgstr "" + +#: includes/api/api-forms.php:584 +#, php-format +msgid "%s is a required field." +msgstr "" + +#: includes/class-wp-members-captcha.php:276 includes/deprecated.php:401 +msgid "You have entered an incorrect code value. Please try again." +msgstr "" + +# @ wp-members +#: includes/class-wp-members-dialogs.php:41 +msgid "First Name" +msgstr "प्रथम नाम" + +# @ wp-members +#: includes/class-wp-members-dialogs.php:42 +msgid "Last Name" +msgstr "अंतिम नाम" + +# @ wp-members +#: includes/class-wp-members-dialogs.php:43 +msgid "Address 1" +msgstr "पता 1" + +# @ wp-members +#: includes/class-wp-members-dialogs.php:44 +msgid "Address 2" +msgstr "पता 2" + +# @ wp-members +#: includes/class-wp-members-dialogs.php:45 +msgid "City" +msgstr "शहर" + +# @ wp-members +#: includes/class-wp-members-dialogs.php:46 +msgid "State" +msgstr "राज्य" + +# @ wp-members +#: includes/class-wp-members-dialogs.php:47 +msgid "Zip" +msgstr "ज़िप" + +# @ wp-members +#: includes/class-wp-members-dialogs.php:48 +msgid "Country" +msgstr "देश" + +# @ wp-members +#: includes/class-wp-members-dialogs.php:49 +msgid "Day Phone" +msgstr "दिन फोन" + +#: includes/class-wp-members-dialogs.php:50 includes/class-wp-members-dialogs.php:92 +msgid "Email" +msgstr "" + +#: includes/class-wp-members-dialogs.php:51 +msgid "Confirm Email" +msgstr "" + +# @ wp-members +#: includes/class-wp-members-dialogs.php:52 +msgid "Website" +msgstr "वेबसाइट" + +# @ wp-members +#: includes/class-wp-members-dialogs.php:53 +msgid "Biographical Info" +msgstr "जीवनी जानकारी" + +#: includes/class-wp-members-dialogs.php:54 includes/class-wp-members-dialogs.php:74 +#: includes/class-wp-members-dialogs.php:159 +msgid "Password" +msgstr "" + +#: includes/class-wp-members-dialogs.php:55 +msgid "Confirm Password" +msgstr "" + +# @ wp-members +#: includes/class-wp-members-dialogs.php:56 includes/class-wp-members-forms.php:2165 +msgid "TOS" +msgstr "टीओएस" + +# @ wp-members +#: includes/class-wp-members-dialogs.php:66 +#, fuzzy +msgid "You are not logged in." +msgstr "आप%s के रूप में लॉग इन कर रहे हैं" + +# @ wp-members +#: includes/class-wp-members-dialogs.php:72 +#, fuzzy +msgid "Existing Users Log In" +msgstr "मौजूदा प्रयोक्ता लॉगिन" + +#: includes/class-wp-members-dialogs.php:73 includes/class-wp-members-dialogs.php:158 +msgid "Username or Email" +msgstr "" + +#: includes/class-wp-members-dialogs.php:75 includes/class-wp-members-shortcodes.php:773 +msgid "Log In" +msgstr "" + +#: includes/class-wp-members-dialogs.php:76 +msgid "Remember Me" +msgstr "" + +# @ wp-members +#: includes/class-wp-members-dialogs.php:77 +msgid "Forgot password?" +msgstr "पासवर्ड भूल गए?" + +# @ wp-members +#: includes/class-wp-members-dialogs.php:78 +msgid "Click here to reset" +msgstr "रीसेट करने के लिए यहाँ पर क्लिक करें" + +# @ wp-members +#: includes/class-wp-members-dialogs.php:79 +msgid "New User?" +msgstr "नये उपयोगकर्ता" + +# @ wp-members +#: includes/class-wp-members-dialogs.php:80 +msgid "Click here to register" +msgstr "पंजीकरण केलिए क्लिक करें" + +# @ wp-members +#: includes/class-wp-members-dialogs.php:83 includes/class-wp-members-dialogs.php:142 +msgid "Change Password" +msgstr "पासवर्ड बदलें" + +#: includes/class-wp-members-dialogs.php:84 +msgid "New password" +msgstr "" + +#: includes/class-wp-members-dialogs.php:85 +msgid "Confirm new password" +msgstr "" + +# @ wp-members +#: includes/class-wp-members-dialogs.php:86 +msgid "Update Password" +msgstr "पासवर्ड अद्यतन करें" + +#: includes/class-wp-members-dialogs.php:87 +msgid "Password successfully changed!" +msgstr "" + +# @ wp-members +#: includes/class-wp-members-dialogs.php:90 +msgid "Reset Forgotten Password" +msgstr "भूल गया पासवर्ड रीसेट करें" + +#: includes/class-wp-members-dialogs.php:93 +msgid "Reset Password" +msgstr "" + +#: includes/class-wp-members-dialogs.php:94 +msgid "Forgot username?" +msgstr "" + +#: includes/class-wp-members-dialogs.php:95 +msgid "Click here" +msgstr "" + +#: includes/class-wp-members-dialogs.php:98 includes/class-wp-members-dialogs.php:100 +msgid "Retrieve username" +msgstr "" + +#: includes/class-wp-members-dialogs.php:99 +msgid "Email Address" +msgstr "" + +# @ wp-members +#: includes/class-wp-members-dialogs.php:103 +#, fuzzy +msgid "New User Registration" +msgstr "नये उपयोगकर्ता" + +# @ wp-members +#: includes/class-wp-members-dialogs.php:104 +msgid "Choose a Username" +msgstr "एक उपयोगकर्ता नाम चुनें" + +#: includes/class-wp-members-dialogs.php:105 +msgid "Input the code:" +msgstr "" + +#: includes/class-wp-members-dialogs.php:106 includes/class-wp-members-forms.php:2164 +#, php-format +msgid "Please indicate that you agree to the %s Terms of Service %s" +msgstr "" + +# @ wp-members +#: includes/class-wp-members-dialogs.php:107 +#, fuzzy +msgid "Reset Form" +msgstr "स्पष्ट फार्म" + +#: includes/class-wp-members-dialogs.php:108 includes/class-wp-members-dialogs.php:162 +#: includes/class-wp-members-shortcodes.php:770 includes/class-wp-members-user.php:186 +msgid "Register" +msgstr "" + +# @ wp-members +#: includes/class-wp-members-dialogs.php:110 +msgid "Required field" +msgstr "आवश्यक फ़ील्ड" + +# @ wp-members +#: includes/class-wp-members-dialogs.php:113 +msgid "Edit Your Information" +msgstr "जानकारी संपादित करें" + +# @ wp-members +#: includes/class-wp-members-dialogs.php:115 +#, fuzzy +msgid "Update Profile" +msgstr "नवीनीकरण उपयोगकर्ता" + +#: includes/class-wp-members-dialogs.php:116 +msgid "Update this file" +msgstr "" + +# @ wp-members +#: includes/class-wp-members-dialogs.php:119 +msgid "Login Failed!" +msgstr "असफल लॉगिन!" + +# @ wp-members +#: includes/class-wp-members-dialogs.php:120 +msgid "You entered an invalid username or password." +msgstr "आप एक अवैध उपयोगकर्ता नाम या पासवर्ड में प्रवेश किया." + +# @ wp-members +#: includes/class-wp-members-dialogs.php:121 +msgid "Click here to continue." +msgstr "यहाँ क्लिक करें" + +# @ wp-members +#: includes/class-wp-members-dialogs.php:122 +msgid "Password fields cannot be empty" +msgstr "पासवर्ड फ़ील्ड रिक्त नहीं हो सकता" + +#: includes/class-wp-members-dialogs.php:123 +msgid "Sorry, that email address was not found." +msgstr "" + +#: includes/class-wp-members-dialogs.php:124 +#, php-format +msgid "An email was sent to %s with your username." +msgstr "" + +# @ wp-members +#: includes/class-wp-members-dialogs.php:125 +#, php-format +msgid "Sorry, %s is a required field." +msgstr "क्षमा करें,%s एक आवश्यक फ़ील्ड है." + +# @ wp-members +#: includes/class-wp-members-dialogs.php:126 +msgid "You must enter a valid email address." +msgstr "आपको एक मान्य ईमेल पता दर्ज करना होगा." + +# @ wp-members +#: includes/class-wp-members-dialogs.php:127 +msgid "The username cannot include non-alphanumeric characters." +msgstr "उपयोक्तानाम गैर अल्फ़ान्यूमेरिक वर्णों को शामिल नहीं कर सकते." + +# @ wp-members +#: includes/class-wp-members-dialogs.php:128 +msgid "Sorry, username is a required field" +msgstr "क्षमा करें, प्रयोक्ता नाम क्षेत्र जरूरी है" + +#: includes/class-wp-members-dialogs.php:129 +msgid "Sorry, that username is taken, Please try another." +msgstr "" + +#: includes/class-wp-members-dialogs.php:130 +msgid "Sorry, that email address already has an account. Please try another." +msgstr "" + +# @ wp-members +#: includes/class-wp-members-dialogs.php:131 includes/class-wp-members-dialogs.php:174 +#, fuzzy +msgid "Passwords did not match." +msgstr "कूटशब्द मेल नहीं खाता" + +# @ wp-members +#: includes/class-wp-members-dialogs.php:132 +#, fuzzy +msgid "Emails did not match." +msgstr "कूटशब्द मेल नहीं खाता" + +# @ default +#: includes/class-wp-members-dialogs.php:133 +msgid "You must complete the CAPTCHA form." +msgstr "कॅप्चा प्रपत्र को पूरा करना होगा." + +#: includes/class-wp-members-dialogs.php:134 +msgid "CAPTCHA was not valid." +msgstr "" + +# @ default +#: includes/class-wp-members-dialogs.php:135 +#, fuzzy +msgid "There was an error processing the form." +msgstr "कॅप्चा फार्म के साथ एक त्रुटि थी." + +# @ default +#: includes/class-wp-members-dialogs.php:136 +msgid "There was an error with the CAPTCHA form." +msgstr "कॅप्चा फार्म के साथ एक त्रुटि थी." + +#: includes/class-wp-members-dialogs.php:137 +#, php-format +msgid "Sorry, you can only upload the following file types for the %s field: %s." +msgstr "" + +# @ wp-members +#: includes/class-wp-members-dialogs.php:138 includes/class-wp-members-dialogs.php:171 +msgid "Your information was updated!" +msgstr "आपकी जानकारी को अपडेट किया गया था!" + +# @ wp-members +#: includes/class-wp-members-dialogs.php:141 +msgid "Edit My Information" +msgstr "मेरी जानकारी संपादित करें" + +# @ wp-members +#: includes/class-wp-members-dialogs.php:143 includes/class-wp-members-dialogs.php:146 +#: includes/class-wp-members-dialogs.php:148 includes/class-wp-members-dialogs.php:153 +#, php-format +msgid "You are logged in as %s" +msgstr "आप%s के रूप में लॉग इन कर रहे हैं" + +#: includes/class-wp-members-dialogs.php:144 +msgid "Log out" +msgstr "" + +#: includes/class-wp-members-dialogs.php:145 +msgid "Edit profile" +msgstr "" + +# @ wp-members +#: includes/class-wp-members-dialogs.php:145 +msgid "Begin using the site." +msgstr "साइट का उपयोग शुरू करते हैं." + +# @ wp-members +#: includes/class-wp-members-dialogs.php:147 +#, fuzzy +msgid "Click to log out" +msgstr "लॉग इन" + +# @ wp-members +#: includes/class-wp-members-dialogs.php:149 +#, fuzzy +msgid "click to log out" +msgstr "लॉग इन" + +#: includes/class-wp-members-dialogs.php:150 +msgid "Log Out" +msgstr "" + +# @ wp-members +#: includes/class-wp-members-dialogs.php:154 +msgid "click here to log out" +msgstr "यहाँ क्लिक करने के लिए लॉग आउट करें" + +# @ wp-members +#: includes/class-wp-members-dialogs.php:155 +msgid "Login Failed!
    You entered an invalid username or password." +msgstr "विफल लॉगिन !
    तुम एक अवैध उपयोगकर्ता नाम या पासवर्ड में प्रवेश किया" + +#: includes/class-wp-members-dialogs.php:156 +msgid "Invalid username or password." +msgstr "" + +#: includes/class-wp-members-dialogs.php:160 includes/class-wp-members.php:1745 +msgid "log in" +msgstr "लॉग इन" + +# @ wp-members +#: includes/class-wp-members-dialogs.php:161 +msgid "Forgot?" +msgstr "भूल गए?" + +# @ wp-members +#: includes/class-wp-members-dialogs.php:165 +#, fuzzy +msgid "" +"This content is restricted to site members. If you are an existing user, please log in. " +"New users may register below." +msgstr "" +"यह सामग्री साइट के सदस्यों के लिए प्रतिबंधित है. यदि आप एक मौजूदा उपयोगकर्ता हैं, तो प्रवेश करें. नए " +"उपयोगकर्ताओं को नीचे पंजीकृत कर सकते हैं." + +# @ wp-members +#: includes/class-wp-members-dialogs.php:166 +#, fuzzy +msgid "" +"Congratulations! Your registration was successful.

    You may now log in using the " +"password that was emailed to you." +msgstr "" +"बधाई हो!आपके पंजीकरण सफल रहा था.
    अब आप पासवर्ड है कि आप के लिए ईमेल का उपयोग कर प्रवेश कर सकते " +"हैं." + +# @ wp-members +#: includes/class-wp-members-dialogs.php:169 +msgid "Sorry, that username is taken, please try another." +msgstr "क्षमा करें, कि उपयोगकर्ता नाम लिया जाता है, एक और प्रयास करें." + +# @ wp-members +#: includes/class-wp-members-dialogs.php:170 +msgid "Sorry, that email address already has an account.
    Please try another." +msgstr "क्षमा करें, उस ईमेल पते पहले से ही एक खाता है
    कृपया एक और प्रयास करें." + +#: includes/class-wp-members-dialogs.php:175 +msgid "Password successfully changed." +msgstr "" + +#: includes/class-wp-members-dialogs.php:176 +msgid "Invalid username or email address." +msgstr "" + +#: includes/class-wp-members-dialogs.php:177 +msgid "" +"Password successfully reset! An email containing a new password has been sent to the email " +"address on file for your account." +msgstr "" + +#: includes/class-wp-members-dialogs.php:178 +msgid "" +"Reset request received. An email with instructions to complete the password reset has been " +"sent." +msgstr "" + +#: includes/class-wp-members-dialogs.php:180 +msgid "This content requires the following membership: " +msgstr "" + +#: includes/class-wp-members-dialogs.php:181 +msgid "This content requires one of the following memberships: " +msgstr "" + +#: includes/class-wp-members-forms.php:84 includes/class-wp-members-forms.php:350 +msgid "Choose membership" +msgstr "" + +# @ wp-members +#: includes/class-wp-members-forms.php:1898 includes/class-wp-members-user-profile.php:510 +msgid "Activate this user?" +msgstr "इस उपयोगकर्ता को सक्रिय करें?" + +# @ wp-members +#: includes/class-wp-members-forms.php:2165 templates/tos.php:20 +msgid "Terms of Service" +msgstr "सेवा की शर्तें" + +#: includes/class-wp-members-menus.php:131 +msgid "Display" +msgstr "" + +#: includes/class-wp-members-menus.php:139 +msgid "Logged In Users" +msgstr "" + +#: includes/class-wp-members-menus.php:146 +msgid "Logged Out Users" +msgstr "" + +#: includes/class-wp-members-menus.php:153 +msgid "All Users" +msgstr "" + +#: includes/class-wp-members-menus.php:167 +#, php-format +msgid "%sAdd membership products%s to restrict menu to a membership" +msgstr "" + +#: includes/class-wp-members-menus.php:169 +msgid "Restrict menu item to a membership product" +msgstr "" + +#: includes/class-wp-members-products.php:342 +#, php-format +msgid "All %s" +msgstr "" + +#: includes/class-wp-members-products.php:343 +#, php-format +msgid "Add New %s" +msgstr "" + +#: includes/class-wp-members-products.php:344 +msgid "Add New" +msgstr "" + +#: includes/class-wp-members-products.php:345 +#, php-format +msgid "New %s" +msgstr "" + +#: includes/class-wp-members-products.php:346 +#, php-format +msgid "Edit %s" +msgstr "" + +#: includes/class-wp-members-products.php:347 +#, php-format +msgid "Update %s" +msgstr "" + +#: includes/class-wp-members-products.php:348 includes/class-wp-members-products.php:349 +#, php-format +msgid "View %s" +msgstr "" + +#: includes/class-wp-members-products.php:350 +#, php-format +msgid "Search %s" +msgstr "" + +#: includes/class-wp-members-products.php:351 +msgid "Not found" +msgstr "" + +#: includes/class-wp-members-products.php:352 +msgid "Not found in Trash" +msgstr "" + +#: includes/class-wp-members-products.php:353 +msgid "Insert into item" +msgstr "" + +#: includes/class-wp-members-products.php:354 +#, php-format +msgid "Save %s Details" +msgstr "" + +#: includes/class-wp-members-products.php:355 +msgid "Membership Attributes" +msgstr "" + +#: includes/class-wp-members-products.php:358 +msgid "Membership Product" +msgstr "" + +#: includes/class-wp-members-products.php:359 +msgid "WP-Members Membership Products" +msgstr "" + +#: includes/class-wp-members-pwd-reset.php:35 includes/class-wp-members-pwd-reset.php:36 +msgid "Sorry, no password reset key was found. Please check your email and try again." +msgstr "" + +#: includes/class-wp-members-pwd-reset.php:37 +msgid "Sorry, the password reset key is expired." +msgstr "" + +#: includes/class-wp-members-pwd-reset.php:167 +msgid "The passwords do not match." +msgstr "" + +#: includes/class-wp-members-shortcodes.php:134 +msgid "This is a generic message to display the form message dialog in the Customizer." +msgstr "" + +#: includes/class-wp-members-shortcodes.php:699 +msgid "Click here to log out." +msgstr "" + +# @ wp-members +#: includes/class-wp-members-user-profile.php:58 +msgid "WP-Members Additional Fields" +msgstr "WP-सदस्य अतिरिक्त फ़ील्ड" + +# @ wp-members +#: includes/class-wp-members-user-profile.php:58 +#, fuzzy +msgid "Additional Information" +msgstr "अतिरिक्त जानकारी" + +# @ wp-members +#: includes/class-wp-members-user-profile.php:500 +msgid "Reactivate this user?" +msgstr "इस उपयोगकर्ता को पुन: सक्रिय?" + +# @ wp-members +#: includes/class-wp-members-user-profile.php:505 +msgid "Deactivate this user?" +msgstr "इस उपयोगकर्ता को निष्क्रिय करें?" + +# @ wp-members +#: includes/class-wp-members-user-profile.php:559 +msgid "IP @ registration" +msgstr "आईपी ​​@ पंजीकरण" + +# @ wp-members +#: includes/class-wp-members-user.php:1171 +msgid "ERROR: User has not been activated." +msgstr "ERROR: उपयोगकर्ता सक्रिय नहीं किया गया है." + +#: includes/class-wp-members-validation-link.php:32 +msgid "Click to validate your account: " +msgstr "" + +#: includes/class-wp-members-validation-link.php:33 +msgid "Thank you for validating your account." +msgstr "" + +#: includes/class-wp-members-validation-link.php:34 +msgid "Validation key was expired or invalid" +msgstr "" + +#: includes/class-wp-members-validation-link.php:35 +msgid "Your account is now pending approval" +msgstr "" + +#: includes/class-wp-members-validation-link.php:284 +msgid "ERROR: User has not confirmed their account." +msgstr "" + +#: includes/class-wp-members-widget.php:24 +msgid "Displays the WP-Members sidebar login." +msgstr "" + +# @ wp-members +#: includes/class-wp-members-widget.php:39 includes/class-wp-members-widget.php:82 +msgid "Login Status" +msgstr "स्थिति लॉगिन" + +# @ wp-members +#: includes/class-wp-members-widget.php:46 +msgid "Title:" +msgstr "शीर्षक:" + +#: includes/class-wp-members-widget.php:50 +msgid "Redirect to (optional):" +msgstr "" + +#: includes/class-wp-members.php:1087 includes/class-wp-members.php:1098 +msgid "You must be logged in to view this content." +msgstr "" + +#: includes/class-wp-members.php:1104 +msgid "The page you are looking for does not exist" +msgstr "" + +#: includes/class-wp-members.php:1352 +#, php-format +msgid "" +"You have a linked page in the WP-Members page settings that corresponds to a post ID that no " +"longer exists. Please %s review and update the %s page settings %s." +msgstr "" + +#: includes/class-wp-members.php:1472 +msgid "Show forms as logged out" +msgstr "" + +#: includes/class-wp-members.php:1481 +msgid "Show form message dialog" +msgstr "" + +#: includes/class-wp-members.php:1558 +msgid "(more…)" +msgstr "" + +#: includes/class-wp-members.php:1746 +msgid "log out" +msgstr "" + +#: includes/cli/class-wp-members-cli-user.php:24 includes/cli/class-wp-members-cli-user.php:62 +msgid "Moderated registration is not enabled in WP-Members options." +msgstr "" + +#: includes/cli/class-wp-members-cli-user.php:35 +msgid "User activated." +msgstr "" + +#: includes/cli/class-wp-members-cli-user.php:37 +msgid "Email notification sent to user." +msgstr "" + +#: includes/cli/class-wp-members-cli-user.php:40 +msgid "User is already activated." +msgstr "" + +#: includes/cli/class-wp-members-cli-user.php:67 +msgid "User deactivated." +msgstr "" + +#: includes/cli/class-wp-members-cli-user.php:88 +msgid "Invalid user ID. Please specify a valid user. Try `wp user list`." +msgstr "" + +#: includes/cli/class-wp-members-cli-user.php:91 +msgid "No user id specified. Must specify user id as --id=123" +msgstr "" + +#: includes/cli/class-wp-members-cli-user.php:208 +#, php-format +msgid "User: %s" +msgstr "" + +#: includes/cli/class-wp-members-cli-user.php:248 +#, php-format +msgid "User role: %s" +msgstr "" + +# @ wp-members +#: includes/deprecated.php:373 +msgid "We were unable to validate the public key." +msgstr "हम सार्वजनिक कुंजी को मान्य करने में असमर्थ थे." + +# @ wp-members +#: includes/deprecated.php:377 +msgid "We were unable to validate the private key." +msgstr "हम निजी कुंजी को मान्य करने में असमर्थ थे." + +# @ wp-members +#: includes/deprecated.php:381 +msgid "The challenge parameter of the verify script was incorrect." +msgstr "सत्यापित स्क्रिप्ट की चुनौती पैरामीटर गलत थी." + +# @ wp-members +#: includes/deprecated.php:385 +msgid "The CAPTCHA solution was incorrect." +msgstr "कॅप्चा समाधान गलत था" + +# @ wp-members +#: includes/deprecated.php:389 +msgid "The parameters to verify were incorrect" +msgstr "सत्यापित करने के लिए पैरामीटर गलत थे" + +# @ wp-members +#: includes/deprecated.php:393 +msgid "reCAPTCHA API keys are tied to a specific domain name for security reasons." +msgstr "reCAPTCHA एपीआई कुंजी सुरक्षा कारणों के लिए एक विशिष्ट डोमेन नाम के लिए बंधे हैं." + +# @ wp-members +#: includes/deprecated.php:397 +msgid "The reCAPTCHA server was not reached. Please try to resubmit." +msgstr "ReCAPTCHA सर्वर तक पहुँच नहीं किया गया था. पुनः भेजने के लिये प्रयास करें" + +#. translators: %s: title of menu item which is invalid +#: includes/walkers/class-wp-members-walker-nav-menu.php:92 +#, php-format +msgid "%s (Invalid)" +msgstr "" + +#. translators: %s: title of menu item in draft status +#: includes/walkers/class-wp-members-walker-nav-menu.php:96 +#, php-format +msgid "%s (Pending)" +msgstr "" + +#: includes/walkers/class-wp-members-walker-nav-menu.php:123 +msgid "Move up" +msgstr "" + +#: includes/walkers/class-wp-members-walker-nav-menu.php:136 +msgid "Move down" +msgstr "" + +#: includes/walkers/class-wp-members-walker-nav-menu.php:138 +msgid "Edit Menu Item" +msgstr "" + +#: includes/walkers/class-wp-members-walker-nav-menu.php:149 +msgid "URL" +msgstr "" + +#: includes/walkers/class-wp-members-walker-nav-menu.php:156 +msgid "Navigation Label" +msgstr "" + +#: includes/walkers/class-wp-members-walker-nav-menu.php:162 +msgid "Title Attribute" +msgstr "" + +#: includes/walkers/class-wp-members-walker-nav-menu.php:169 +msgid "Open link in a new window/tab" +msgstr "" + +#: includes/walkers/class-wp-members-walker-nav-menu.php:174 +msgid "CSS Classes (optional)" +msgstr "" + +#: includes/walkers/class-wp-members-walker-nav-menu.php:180 +msgid "Link Relationship (XFN)" +msgstr "" + +#: includes/walkers/class-wp-members-walker-nav-menu.php:188 +msgid "The description will be displayed in the menu if the current theme supports it." +msgstr "" + +#: includes/walkers/class-wp-members-walker-nav-menu.php:210 +#, php-format +msgid "Original: %s" +msgstr "" + +#: includes/walkers/class-wp-members-walker-nav-menu.php:223 +msgid "Remove" +msgstr "" + +# @ wp-members +#: templates/tos.php:32 +#, php-format +msgid "%sclose%s" +msgstr "%sclose%s" + +# @ wp-members +#: templates/tos.php:34 +#, php-format +msgid "%sprint%s" +msgstr "%sprint%s" + +# @ wp-members +#. Plugin Name of the plugin/theme +msgid "WP-Members" +msgstr "WP-सदस्य" + +#. Plugin URI of the plugin/theme +msgid "https://rocketgeek.com" +msgstr "" + +#. Description of the plugin/theme +msgid "" +"WP access restriction and user registration. For more information on plugin features, refer " +"to the online Users Guide. A " +"Quick Start Guide is also available. WP-Members(tm) is a trademark of butlerblog.com." +msgstr "" + +#. Author of the plugin/theme +msgid "Chad Butler" +msgstr "" + +#. Author URI of the plugin/theme +msgid "https://butlerblog.com/" +msgstr "" + +#, fuzzy +#~ msgid "Block" +#~ msgstr "डिफ़ॉल्ट रूप से ब्लॉक पोस्ट" + +# @ wp-members +#~ msgid "Manage reCAPTCHA Options" +#~ msgstr "ReCAPTCHA विकल्प प्रबंधित करें" + +# @ wp-members +#~ msgid "" +#~ "reCAPTCHA is a free, accessible CAPTCHA service that helps to digitize books while " +#~ "blocking spam on your blog." +#~ msgstr "" +#~ "reCAPTCHA एक मुक्त, सुलभ कॅप्चा सेवा है कि पुस्तकों को डिजिटाइज़ करने में मदद करता है जबकि अपने ब्लॉग पर " +#~ "स्पैम अवरुद्ध है." + +# @ wp-members +#, php-format +#~ msgid "" +#~ "reCAPTCHA asks commenters to retype two words scanned from a book to prove that they are " +#~ "a human. This verifies that they are not a spambot while also correcting the automatic " +#~ "scans of old books. So you get less spam, and the world gets accurately digitized books. " +#~ "Everybody wins! For details, visit the %s reCAPTCHA website%s" +#~ msgstr "" +#~ "reCAPTCHA commenters करने के लिए पूछता है दो पुस्तक से साबित होता है कि वे मानव हैं स्कैन शब्दों को पुन: " +#~ "लिखें. यह पुष्टि करता है कि वे एक spambot जबकि स्वचालित पुरानी पुस्तकों का स्कैन भी सही नहीं हैं. तो तुम " +#~ "कम स्पैम मिलता है, और दुनिया सही डिजीटल किताबें हो जाता है. हर कोई जीतता है! जानकारी के लिए,%s " +#~ "reCAPTCHA वेबसाइट%s की यात्रा" + +# @ wp-members +#, php-format +#~ msgid "" +#~ "reCAPTCHA requires an API key, consisting of a \"public\" and a \"private\" key. You can " +#~ "sign up for a %s free reCAPTCHA key%s" +#~ msgstr "" +#~ "reCAPTCHA एक एपीआई कुंजी की आवश्यकता है, \"सार्वजनिक \" और \"निजी \" कुंजी शामिल है. आप%s मुक्त " +#~ "reCAPTCHA कुंजी%s के लिए साइन अप कर सकते हैं" + +# @ wp-members +#~ msgid "Public Key" +#~ msgstr "सार्वजनिक कुंजी" + +# @ wp-members +#~ msgid "Private Key" +#~ msgstr "निजी कुंजी" + +# @ wp-members +#~ msgid "Choose Theme" +#~ msgstr "थीम चुनें" + +# @ wp-members +#~ msgid "Red" +#~ msgstr "लाल" + +# @ wp-members +#~ msgid "White" +#~ msgstr "सफ़ेद" + +# @ wp-members +#~ msgid "Black Glass" +#~ msgstr "काले ग्लास" + +# @ wp-members +#~ msgid "Clean" +#~ msgstr "स्वच्छ" + +# @ wp-members +#, fuzzy +#~ msgid "Active" +#~ msgstr "सक्रिय" + +# @ wp-members +#, fuzzy +#~ msgid "Enable CAPTCHA" +#~ msgstr "CAPTCHA का प्रयोग करें" + +# @ wp-members +#~ msgid "Passwords did not match.

    Please try again." +#~ msgstr "पासवर्डों से मेल नहीं खाती.

    कृपया पुन: प्रयास करें." + +# @ wp-members +#~ msgid "Either the username or email address do not exist in our records." +#~ msgstr "या तो उपयोगकर्ता नाम या ईमेल पता हमारे रिकॉर्ड में मौजूद नहीं है" + +# @ wp-members +#, fuzzy +#~ msgid "Click to log out." +#~ msgstr "लॉग इन" + +# @ wp-members +#~ msgid "You have set WP-Members to turn off the registration process" +#~ msgstr "WP-सदस्य पंजीकरण प्रक्रिया को बारी के लिए निर्धारित किया है" + +# @ wp-members +#~ msgid "" +#~ "but you also set to moderate and/or email admin new registrations. You will need to set " +#~ "up a registration page for users to register." +#~ msgstr "" +#~ "लेकिन आप भी और / या मध्यम ईमेल व्यवस्थापक नए पंजीकरण के लिए निर्धारित किया है. आप के लिए एक पंजीकरण " +#~ "पृष्ठ सेट के लिए उपयोगकर्ताओं को रजिस्टर करने के लिए की आवश्यकता होगी.." + +#, fuzzy +#~ msgid "Unblocked?" +#~ msgstr "नोट: पोस्ट अभी भी व्यक्तिगत रूप से अवरुद्ध या लेख के स्तर पर अनवरोधित कर हो सकता है" + +# @ wp-members +#, fuzzy +#~ msgid "Blocked?" +#~ msgstr "नोट: पोस्ट अभी भी व्यक्तिगत रूप से अवरुद्ध या लेख के स्तर पर अनवरोधित कर हो सकता है" + +# @ wp-members +#~ msgid "Field Label is required for adding a new field. Nothing was updated." +#~ msgstr "क्षेत्र लेबल एक नए क्षेत्र जोड़ने के लिए आवश्यक है.कुछ भी नहीं अपडेट किया गया था." + +# @ wp-members +#~ msgid "Option Name is required for adding a new field. Nothing was updated." +#~ msgstr "विकल्प नाम के एक नए क्षेत्र जोड़ने के लिए आवश्यक है.कुछ भी नहीं अपडेट किया गया था." + +#, fuzzy +#~ msgid "field was added" +#~ msgstr "क्षेत्र लेबल" + +# @ wp-members +#, fuzzy +#~ msgid "field was updated" +#~ msgstr "WP-सदस्य फ़ील्ड्स अपडेट की गई थीं" + +# @ wp-members +#~ msgid "Option Name" +#~ msgstr "विकल्प नाम" + +#, fuzzy +#~ msgid "Additional information for checkbox fields" +#~ msgstr "WP-सदस्य अतिरिक्त फ़ील्ड" + +#, fuzzy +#~ msgid "Additional information for dropdown fields" +#~ msgstr "WP-सदस्य अतिरिक्त फ़ील्ड" + +# @ wp-members +#~ msgid "For dropdown, array of values:" +#~ msgstr "मूल्यों की ड्रॉपडाउन सरणी, " + +# @ wp-members +#~ msgid "" +#~ "Determine which fields will display and which are required. This includes all fields, " +#~ "both native WP fields and WP-Members custom fields." +#~ msgstr "" +#~ "निर्धारित जो फ़ील्ड प्रदर्शित करने के लिए और जो आवश्यक हैं. यह सभी क्षेत्रों, दोनों देशी WP क्षेत्र और WP-" +#~ "सदस्य कस्टम फ़ील्ड्स शामिल हैं." + +# @ wp-members +#~ msgid "(Note: Email is always mandatory and cannot be changed.)" +#~ msgstr "(नोट: ईमेल हमेशा अनिवार्य है और बदला नहीं जा सकता.)" + +# @ wp-members +#~ msgid "Add/Delete" +#~ msgstr "जोड़ें /हटाएँ" + +# @ wp-members +#~ msgid "Checked?" +#~ msgstr "जाँच की?" + +# @ wp-members +#~ msgid "Delete" +#~ msgstr "हटाना" + +# @ wp-members +#~ msgid "(Email cannot be removed)" +#~ msgstr "(ईमेल हटाया नहीं जा सकता है)" + +# @ wp-members +#, fuzzy +#~ msgid "native" +#~ msgstr "WP के मूल निवासी हैं?" + +# @ wp-members +#~ msgid "Update Fields" +#~ msgstr "फ़ील्ड अपडेट करें" + +# @ wp-members +#~ msgid "Please indicate that you agree to the %s TOS %s" +#~ msgstr "संकेत मिलता है कि आप%s के TOS %s करने के लिए सहमत" + +# @ wp-members +#, fuzzy +#~ msgid "Post Restriction" +#~ msgstr "नया पंजीकरण" + +# @ wp-members +#, fuzzy +#~ msgid "Page Restriction" +#~ msgstr "रजिस्टर पृष्ठ URL:" + +# @ wp-members +#~ msgid "dropdown" +#~ msgstr "ड्रॉपडाउन" + +# @ wp-members +#~ msgid "Block Posts by default" +#~ msgstr "डिफ़ॉल्ट रूप से ब्लॉक पोस्ट" + +# @ wp-members +#~ msgid "Note: Posts can still be individually blocked or unblocked at the article level" +#~ msgstr "नोट: पोस्ट अभी भी व्यक्तिगत रूप से अवरुद्ध या लेख के स्तर पर अनवरोधित कर हो सकता है" + +# @ wp-members +#~ msgid "Block Pages by default" +#~ msgstr "डिफ़ॉल्ट रूप से ब्लॉक पन्ने" + +# @ wp-members +#~ msgid "Note: Pages can still be individually blocked or unblocked at the article level" +#~ msgstr "नोट: अभी भी पन्ने व्यक्तिगत अवरुद्ध किया जा सकता है या लेख के स्तर पर अनवरोधित" + +# @ wp-members +#~ msgid "Show excerpts" +#~ msgstr "कुछ अंशः दिखाएँ" + +# @ wp-members +#~ msgid "Shows excerpted content above the login/registration on both Posts and Pages" +#~ msgstr " दोनों पोस्ट और पृष्ठों पर लॉगिन और पंजीकरण के ऊपर सामग्री का कुछ अंश दिखाता है" + +# @ wp-members +#~ msgid "Turns on CAPTCHA for registration" +#~ msgstr "कॅप्चा पर पंजीकरण के लिए बदल जाता है" + +# @ wp-members +#, fuzzy +#~ msgid "Hide registration" +#~ msgstr "पंजीकरण पूरा किया" + +# @ wp-members +#~ msgid "Optional" +#~ msgstr "वैकल्पिक" + +#, fuzzy +#~ msgid "Automatically creates an excerpt" +#~ msgstr "कुछ अंशः दिखाएँ" + +# @ wp-members +#~ msgid "AIM" +#~ msgstr "उद्देश्य" + +# @ wp-members +#~ msgid "Yahoo IM" +#~ msgstr "याहू आईएम" + +# @ wp-members +#~ msgid "Jabber/Google Talk" +#~ msgstr "अस्पष्ट / गूगल टॉक" + +# @ wp-members +#~ msgid "" +#~ "Password successfully changed!

    You will need to re-login with your new " +#~ "password." +#~ msgstr "कूटशब्द सफलतापूर्वक बदला


    An email containing a new password has been sent " +#~ "to the email address on file for your account. You may change this random password then " +#~ "re-login with your new password." +#~ msgstr "" +#~ "पासवर्ड सफलतापूर्वक रीसेट!, />
    एक युक्त ईमेल फ़ाइल पर अपने खाते के लिए ईमेल पते के लिए एक नया " +#~ "पासवर्ड भेज दिया गया है. आप अपने नए पासवर्ड के साथ इस यादृच्छिक तो फिर से लॉगिन पासवर्ड को बदल सकते " +#~ "हैं." + +# @ wp-members +#~ msgid "Custom" +#~ msgstr "रिवाज" + +#, fuzzy +#~ msgid "edit" +#~ msgstr "जानकारी संपादित करें" diff --git a/i18n/languages/wp-members-ko_KR.mo b/i18n/languages/wp-members-ko_KR.mo new file mode 100644 index 00000000..c031b642 Binary files /dev/null and b/i18n/languages/wp-members-ko_KR.mo differ diff --git a/i18n/languages/wp-members-ko_KR.po b/i18n/languages/wp-members-ko_KR.po new file mode 100644 index 00000000..7a220c77 --- /dev/null +++ b/i18n/languages/wp-members-ko_KR.po @@ -0,0 +1,2847 @@ +msgid "" +msgstr "" +"Project-Id-Version: WP-Members v3.2.6\n" +"Report-Msgid-Bugs-To: http://wordpress.org/tag/wp-members\n" +"POT-Creation-Date: 2023-01-06 15:20-0500\n" +"PO-Revision-Date: 2023-01-06 15:23-0500\n" +"Last-Translator: \n" +"Language-Team: Venusian \n" +"Language: ko_KR\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=1; plural=0;\n" +"X-Generator: Poedit 2.4.3\n" +"X-Poedit-SourceCharset: UTF-8\n" +"X-Poedit-KeywordsList: __;_e;__ngettext:1,2;_n:1,2;__ngettext_noop:1,2;" +"_n_noop:1,2;_c,_nc:4c,1,2;_x:1,2c;_ex:1,2c;_nx:4c,1,2;_nx_noop:4c,1,2\n" +"X-Textdomain-Support: yes\n" +"X-Poedit-Basepath: ..\n" +"X-Poedit-SearchPath-0: .\n" + +#: includes/admin/class-wp-members-admin-api.php:254 +msgid "Custom email" +msgstr "" + +# @ wp-members +#: includes/admin/class-wp-members-admin-api.php:255 +#: includes/admin/class-wp-members-admin-api.php:257 +msgid "Subject" +msgstr "제목" + +# @ wp-members +#: includes/admin/class-wp-members-admin-api.php:258 +msgid "Body" +msgstr "바디" + +#: includes/admin/class-wp-members-admin-api.php:260 +msgid "Your custom email message content." +msgstr "" + +# @ wp-members +#: includes/admin/class-wp-members-admin-api.php:338 +msgid "Options" +msgstr "옵션" + +# @ wp-members +#: includes/admin/class-wp-members-admin-api.php:339 +msgid "Fields" +msgstr "필드" + +# @ wp-members +#: includes/admin/class-wp-members-admin-api.php:340 +msgid "Dialogs" +msgstr "대화" + +# @ wp-members +#: includes/admin/class-wp-members-admin-api.php:341 +msgid "Emails" +msgstr "이메일" + +# @ wp-members +#: includes/admin/class-wp-members-admin-api.php:357 +msgid "New Registration" +msgstr "새 회원가입" + +#: includes/admin/class-wp-members-admin-api.php:365 +#: includes/admin/class-wp-members-admin-api.php:383 +msgid "User email validated" +msgstr "" + +# @ wp-members +#: includes/admin/class-wp-members-admin-api.php:375 +msgid "Registration is Moderated" +msgstr "회원가입이 검토됐습니다" + +# @ wp-members +#: includes/admin/class-wp-members-admin-api.php:391 +msgid "Registration is Moderated, User is Approved" +msgstr "회원가입이 검토됐으며 사용자 승인됐습니다" + +# @ wp-members +#: includes/admin/class-wp-members-admin-api.php:399 +msgid "Password Reset" +msgstr "비밀번호 초기화" + +#: includes/admin/class-wp-members-admin-api.php:406 +msgid "Retrieve Username" +msgstr "" + +# @ wp-members +#: includes/admin/class-wp-members-admin-api.php:414 +msgid "Admin Notification" +msgstr "관리자 알림" + +# @ wp-members +#: includes/admin/class-wp-members-admin-api.php:440 +msgid "Restricted post (or page), displays above the login/registration form" +msgstr "제한된 글 (또는 페이지), 로그인/회원가입 폼 위에 표시됨" + +# @ wp-members +#: includes/admin/class-wp-members-admin-api.php:441 +msgid "Username is taken" +msgstr "아이디가 사용 중입니다." + +# @ wp-members +#: includes/admin/class-wp-members-admin-api.php:442 +msgid "Email is registered" +msgstr "이메일이 등록됐습니다" + +# @ wp-members +#: includes/admin/class-wp-members-admin-api.php:443 +msgid "Registration completed" +msgstr "회원가입 완료" + +# @ wp-members +#: includes/admin/class-wp-members-admin-api.php:444 +msgid "User update" +msgstr "사용자 업데이트" + +# @ wp-members +#: includes/admin/class-wp-members-admin-api.php:445 +msgid "Passwords did not match" +msgstr "비밀번호가 일치하지 않습니다" + +# @ wp-members +#: includes/admin/class-wp-members-admin-api.php:446 +msgid "Password changes" +msgstr "비밀번호 변경" + +# @ wp-members +#: includes/admin/class-wp-members-admin-api.php:447 +msgid "Username or email do not exist when trying to reset forgotten password" +msgstr "분실 비밀번호 초기화 시 아이디 또는 이메일이 존재하지 않습니다" + +# @ wp-members +#: includes/admin/class-wp-members-admin-api.php:448 +msgid "Password reset" +msgstr "비밀번호 초기화" + +#: includes/admin/class-wp-members-admin-api.php:547 +msgid "Close" +msgstr "" + +# @ default +# @ wp-members +#: includes/admin/class-wp-members-admin-api.php:596 +msgid "Settings" +msgstr "설정" + +#: includes/admin/class-wp-members-admin-posts.php:30 +#: includes/admin/class-wp-members-admin-posts.php:33 +msgid "Unrestrict" +msgstr "" + +#: includes/admin/class-wp-members-admin-posts.php:31 +#: includes/admin/class-wp-members-admin-posts.php:34 +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:110 +msgid "Restrict" +msgstr "" + +#: includes/admin/class-wp-members-admin-posts.php:32 +#: includes/admin/class-wp-members-admin-posts.php:35 +msgid "Hide" +msgstr "" + +#: includes/admin/class-wp-members-admin-posts.php:125 +#, php-format +msgid "%s restricted" +msgstr "" + +#: includes/admin/class-wp-members-admin-posts.php:125 +#, php-format +msgid "%s unrestricted" +msgstr "" + +#: includes/admin/class-wp-members-admin-posts.php:165 +#, php-format +msgid "%s Restriction" +msgstr "" + +#: includes/admin/class-wp-members-admin-posts.php:195 +#: includes/admin/class-wp-members-admin-posts.php:342 +#: includes/admin/class-wp-members-admin-posts.php:345 +msgid "Unrestricted" +msgstr "" + +#: includes/admin/class-wp-members-admin-posts.php:196 +#: includes/admin/class-wp-members-admin-posts.php:339 +#: includes/admin/class-wp-members-admin-posts.php:347 +msgid "Restricted" +msgstr "" + +#: includes/admin/class-wp-members-admin-posts.php:197 +#: includes/admin/class-wp-members-admin-posts.php:349 +msgid "Hidden" +msgstr "" + +#: includes/admin/class-wp-members-admin-posts.php:203 +msgid "Status:" +msgstr "" + +#: includes/admin/class-wp-members-admin-posts.php:203 +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:68 +#: includes/admin/tabs/class-wp-members-fields-table.php:65 +#: includes/walkers/class-wp-members-walker-nav-menu.php:140 +msgid "Edit" +msgstr "" + +#: includes/admin/class-wp-members-admin-posts.php:218 +msgid "Ok" +msgstr "" + +#: includes/admin/class-wp-members-admin-posts.php:219 +#: includes/walkers/class-wp-members-walker-nav-menu.php:224 +msgid "Cancel" +msgstr "" + +#: includes/admin/class-wp-members-admin-posts.php:305 +msgid "Status" +msgstr "" + +#: includes/admin/class-wp-members-admin-users.php:28 +#: includes/admin/class-wp-members-admin-users.php:34 +#: includes/admin/class-wp-members-admin-users.php:79 +msgid "Activate" +msgstr "" + +#: includes/admin/class-wp-members-admin-users.php:29 +#: includes/admin/class-wp-members-admin-users.php:35 +#: includes/admin/class-wp-members-admin-users.php:82 +msgid "Deactivate" +msgstr "" + +# @ default +#: includes/admin/class-wp-members-admin-users.php:31 +#: includes/admin/class-wp-members-admin-users.php:37 +msgid "Export" +msgstr "내보내기" + +#: includes/admin/class-wp-members-admin-users.php:32 +#: includes/admin/class-wp-members-admin-users.php:38 +msgid "Export All Users" +msgstr "모든 사용자 내보내기" + +#: includes/admin/class-wp-members-admin-users.php:61 +msgid "Confirm" +msgstr "" + +#: includes/admin/class-wp-members-admin-users.php:64 +msgid "Unconfirm" +msgstr "" + +#: includes/admin/class-wp-members-admin-users.php:147 +#, php-format +msgid "%s users activated" +msgstr "" + +#: includes/admin/class-wp-members-admin-users.php:147 +#, php-format +msgid "%s users deactivated" +msgstr "" + +#: includes/admin/class-wp-members-admin-users.php:150 +msgid "No users selected" +msgstr "" + +#: includes/admin/class-wp-members-admin-users.php:168 +msgid "You cannot activate or deactivate yourself" +msgstr "" + +#: includes/admin/class-wp-members-admin-users.php:173 +#, php-format +msgid "%s activated" +msgstr "" + +#: includes/admin/class-wp-members-admin-users.php:178 +#, php-format +msgid "%s deactivated" +msgstr "" + +#: includes/admin/class-wp-members-admin-users.php:182 +msgid "That user is already active" +msgstr "" + +#: includes/admin/class-wp-members-admin-users.php:198 +msgid "You cannot confirm or unconfirm yourself" +msgstr "" + +#: includes/admin/class-wp-members-admin-users.php:203 +#, php-format +msgid "%s confirmed" +msgstr "" + +#: includes/admin/class-wp-members-admin-users.php:208 +#, php-format +msgid "%s unconfirmed" +msgstr "" + +#: includes/admin/class-wp-members-admin-users.php:212 +msgid "That user is already confirmed" +msgstr "" + +#: includes/admin/class-wp-members-admin-users.php:341 +msgid "Pending" +msgstr "" + +#: includes/admin/class-wp-members-admin-users.php:342 +msgid "Trial" +msgstr "" + +# @ wp-members +#: includes/admin/class-wp-members-admin-users.php:343 +#: includes/admin/class-wp-members-user-export.php:289 +msgid "Subscription" +msgstr "구독" + +#: includes/admin/class-wp-members-admin-users.php:344 +msgid "Expired" +msgstr "" + +#: includes/admin/class-wp-members-admin-users.php:347 +#: includes/admin/class-wp-members-admin-users.php:410 +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:457 +msgid "Activated" +msgstr "" + +#: includes/admin/class-wp-members-admin-users.php:348 +msgid "Pending Activation" +msgstr "" + +#: includes/admin/class-wp-members-admin-users.php:349 +msgid "Deactivated" +msgstr "" + +#: includes/admin/class-wp-members-admin-users.php:352 +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:456 +msgid "Confirmed" +msgstr "" + +#: includes/admin/class-wp-members-admin-users.php:353 +msgid "Not Confirmed" +msgstr "" + +#: includes/admin/class-wp-members-admin-users.php:355 +msgid "Not Exported" +msgstr "" + +#: includes/admin/class-wp-members-admin-users.php:475 +msgid "Not confirmed" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:67 +msgid "Slug" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:68 +#: includes/admin/class-wp-members-user-export.php:294 +msgid "Role" +msgstr "" + +# @ wp-members +#: includes/admin/class-wp-members-products-admin.php:69 +#: includes/admin/class-wp-members-products-admin.php:740 +#: includes/admin/class-wp-members-user-export.php:290 +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:460 +msgid "Expires" +msgstr "만료" + +#: includes/admin/class-wp-members-products-admin.php:71 +msgid "Default" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:73 +msgid "Last updated" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:97 +msgid "slug:" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:100 +msgid "No role required" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:105 +msgid "Does not expire" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:109 +#: includes/admin/class-wp-members-user-export.php:199 +msgid "Yes" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:145 +msgid "Membership Product Details" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:153 +msgid "Membership Product Message (optional)" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:169 +msgid "Access by child membership" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:185 +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:62 +msgid "Posts" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:186 +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:63 +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:249 +msgid "Pages" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:213 +#: includes/admin/class-wp-members-products-admin.php:262 +#: includes/admin/class-wp-members-products-admin.php:309 +msgid "Period" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:213 +msgid "Day" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:213 +msgid "Week" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:213 +msgid "Month" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:213 +msgid "Year" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:226 +msgid "Name (slug)" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:228 +msgid "Optional Defaults" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:231 +msgid "Assign as default at registration? (optional)" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:239 +#, php-format +msgid "Pre-selected by default for new %s" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:245 +msgid "Optional Properties" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:248 +msgid "Role Required? (optional)" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:251 +msgid "No Role" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:257 +msgid "Expires (optional)" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:259 +#: includes/admin/class-wp-members-products-admin.php:261 +#: includes/admin/class-wp-members-products-admin.php:306 +#: includes/admin/class-wp-members-products-admin.php:308 +msgid "Number" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:267 +msgid "Use \"no gap\" renewal" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:271 +msgid "Use a fixed period (such as Jan 1 - Dec 31, or Sept 1 - Aug 31)" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:288 +#: includes/admin/class-wp-members-products-admin.php:289 +msgid "Period Start (dd-mm)" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:290 +#: includes/admin/class-wp-members-products-admin.php:291 +msgid "Period End (dd-mm)" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:304 +msgid "Fixed period grace period" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:313 +msgid "" +"Grace period is the point at which expiration date is for following time " +"period. For example, if user who register August 1st would be part of the " +"following year's Sept 1 - Aug 31 membership, set this at 1 Month. Leave " +"blank for no grace period." +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:376 +msgid "" +"Restricted Message (displays when a user does not have access to a " +"membership)" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:502 +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:239 +#: includes/class-wp-members-forms.php:1196 +#: includes/class-wp-members-user-profile.php:132 +msgid "None" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:517 +msgid "Restrict access by membership:" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:598 +msgid "Required Membership" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:644 +#: includes/admin/class-wp-members-products-admin.php:745 +#: includes/class-wp-members-products.php:335 +msgid "Membership" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:680 +msgid "expires:" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:709 +#: includes/class-wp-members-products.php:336 +#: includes/class-wp-members-products.php:341 +msgid "Memberships" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:736 +msgid "Membership Access" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:744 +msgid "Action" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:746 +msgid "Enabled?" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:757 +msgid "Enable" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:758 +msgid "Disable" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:759 +msgid "Update" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:764 +msgid "Expiration date (optional)" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:795 +#, php-format +msgid "No memberships have been created. %sCreate new memberships here%s" +msgstr "" + +#: includes/admin/class-wp-members-user-export.php:199 +msgid "No" +msgstr "" + +#: includes/admin/class-wp-members-user-export.php:264 +msgid "You do not have the required user capabilities to export users." +msgstr "" + +#: includes/admin/class-wp-members-user-export.php:277 +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:461 +msgid "User ID" +msgstr "" + +#: includes/admin/class-wp-members-user-export.php:284 +#: includes/class-wp-members-dialogs.php:91 +#: includes/class-wp-members-dialogs.php:114 +msgid "Username" +msgstr "" + +# @ wp-members +#: includes/admin/class-wp-members-user-export.php:286 +msgid "Activated?" +msgstr "활성화?" + +# @ wp-members +#: includes/admin/class-wp-members-user-export.php:292 +msgid "Registered" +msgstr "등록됨" + +# @ wp-members +#: includes/admin/class-wp-members-user-export.php:293 +msgid "IP" +msgstr "IP" + +# @ wp-members +#: includes/admin/dialogs.php:117 +msgid "" +"Your WP settings allow anyone to register - this is not the recommended " +"setting." +msgstr "" +"워드프레스 설정이 누구나 가입할 수 있도록 돼있습니다. 이 설정은 권장하지 않습" +"니다." + +# @ wp-members +#: includes/admin/dialogs.php:118 +#, php-format +msgid "" +"You can %s change this here %s making sure the box next to \"Anyone can " +"register\" is unchecked." +msgstr "" +"%s 이것을 여기서 변경%s 할 수 있습니다. \"누구나 가입할 수 있습니다\"의 체크" +"박스를 체크해제 하세요." + +# @ wp-members +#: includes/admin/dialogs.php:119 +msgid "" +"This setting allows a link on the /wp-login.php page to register using the " +"WP native registration process thus circumventing any registration you are " +"using with WP-Members. In some cases, this may suit the users wants/needs, " +"but most users should uncheck this option. If you do not change this " +"setting, you can choose to ignore these warning messages under WP-Members " +"Settings." +msgstr "" +"이 설정은 /wp-login.php에서 워드프레스 기본 회원가입을 사용해서 등록할 수 있" +"는 링크를 허용합니다. 그러면 WP-Members를 사용하는 회원가입을 무시하게 됩니" +"다. 어떤 경우는 이것이 사용자에게 어울리지만 대부분의 사용자는 이 옵션을 체크" +"해제 해야 합니다. 이 설정을 변경하지 않으려면 WP-Members 설정 탭에서 이 경고 " +"메시지 무시하기를 선택할 수 있습니다." + +# @ wp-members +#: includes/admin/dialogs.php:123 +msgid "" +"Your WP settings allow anyone to comment - this is not the recommended " +"setting." +msgstr "" +"워드프레스 설정이 누구나 댓글을 달 수 있도록 돼있습니다 - 이 설정은 권장하지 " +"않습니다." + +# @ wp-members +#: includes/admin/dialogs.php:124 +#, php-format +msgid "" +"You can %s change this here %s by checking the box next to \"Users must be " +"registered and logged in to comment.\"" +msgstr "" +"%s 여기서 설정을 변경할 수 있고 %s \"가입하여 로그인한 사용자만 댓글을 남길 " +"수 있습니다.\" 의 체크박스에 체크하세요." + +# @ wp-members +#: includes/admin/dialogs.php:125 +msgid "" +"This setting allows any users to comment, whether or not they are " +"registered. Depending on how you are using WP-Members will determine whether " +"you should change this setting or not. If you do not change this setting, " +"you can choose to ignore these warning messages under WP-Members Settings." +msgstr "" +"이 설정은 가입하거나 가입하지 않은 누구든 댓글을 달 수 있도록 허용합니다. WP-" +"Members를 사용하는 방법에 따라서 이 설정을 변경할 것인지 결정해야 합니다.이 " +"설정을 변경하지 않으려면 WP-Members 설정 탭에서 이 경고 메시지 무시하기를 선" +"택할 수 있습니다." + +# @ wp-members +#: includes/admin/dialogs.php:129 +msgid "" +"Your WP settings allow full text rss feeds - this is not the recommended " +"setting." +msgstr "" +"워드프레스 설정이 전체 글 RSS 피드를 허용합니다 - 이 설정은 권장하지 않습니" +"다." + +# @ wp-members +#: includes/admin/dialogs.php:130 +#, php-format +msgid "" +"You can %s change this here %s by changing \"For each article in a feed, show" +"\" to \"Summary.\"" +msgstr "" +"%s 여기서 변경할 수 %s있으며 \"피드 글의 보기 옵션\"에서 \"요약\"으로 변경하" +"세요." + +# @ wp-members +#: includes/admin/dialogs.php:131 +msgid "" +"Leaving this set to full text allows anyone to read your protected content " +"in an RSS reader. Changing this to Summary prevents this as your feeds will " +"only show summary text." +msgstr "" +"이 설정을 전체 글로 설정해두면 누구든 RSS 리더에서 보호된 콘텐츠를 읽을 수 있" +"습니다. 이것을 요약으로 변경하면 이를 방지할 수 있으며 피드는 요약 텍스트만 " +"보여줄 것입니다." + +# @ wp-members +#: includes/admin/dialogs.php:135 +msgid "You have set WP-Members to hold registrations for approval" +msgstr "WP-Members 설정을 회원가입은 승인이 필요한 것으로 했습니다." + +# @ wp-members +#: includes/admin/dialogs.php:136 +msgid "" +"but you have not changed the default message for \"Registration Completed\" " +"under \"WP-Members Dialogs and Error Messages.\" You should change this " +"message to let users know they are pending approval." +msgstr "" +"하지만 \"WP-Members 대화 및 에러 메시지\"에서 \"회원가입 완료됨\"의 기본 메" +"시지를 변경하지 않았습니다. 사용자가 승인이 대기 중이라는 것을 알 수 있도록 " +"메시지를 변경해야 합니다." + +# @ wp-members +#: includes/admin/dialogs.php:140 +msgid "You have turned on reCAPTCHA" +msgstr "리캡챠를 켜놓았습니다" + +# @ wp-members +#: includes/admin/dialogs.php:141 +msgid "" +"but you have not entered API keys. You will need both a public and private " +"key. The CAPTCHA will not display unless a valid API key is included." +msgstr "" +"하지만 API 키를 입력하지 않았습니다. public 키와 private 키가 필요합니다. 유" +"효한 API 키가 포함되지 않으면 캡챠는 표시되지 않습니다." + +#: includes/admin/dialogs.php:145 +msgid "You have active settings that are not recommended." +msgstr "" + +#: includes/admin/dialogs.php:146 +msgid "" +"If you will not be changing these settings, you can turn off these warning " +"messages by checking the \"Ignore warning messages\" in the settings below." +msgstr "" + +# @ wp-members +#: includes/admin/dialogs.php:174 +msgid "Version:" +msgstr "버전:" + +# @ wp-members +#: includes/admin/dialogs.php:175 +msgid "Quick Start Guide" +msgstr "빠른 시작 가이드" + +# @ wp-members +#: includes/admin/dialogs.php:176 +msgid "Online User Guide" +msgstr "온라인 사용자 가이드" + +# @ wp-members +#: includes/admin/dialogs.php:177 +msgid "FAQs" +msgstr "FAQ" + +# @ wp-members +#: includes/admin/dialogs.php:184 +msgid "Thank you for using WP-Members" +msgstr "WP-Members를 사용해주셔서 감사합니다" + +# @ wp-members +#: includes/admin/dialogs.php:185 +msgid "A plugin developed by" +msgstr "플러그인 개발자" + +# @ wp-members +#: includes/admin/dialogs.php:186 +msgid "Follow" +msgstr "팔로우" + +#: includes/admin/dialogs.php:203 includes/admin/dialogs.php:207 +msgid "Latest from RocketGeek" +msgstr "최근 RocketGeek" + +#: includes/admin/dialogs.php:224 +msgid "Like WP-Members?" +msgstr "" + +#: includes/admin/dialogs.php:225 +#, php-format +msgid "" +"If you like WP-Members please give it a %s★★★★★" +"%s rating. Thanks!!" +msgstr "" + +#: includes/admin/dialogs.php:236 includes/admin/dialogs.php:249 +msgid "Latest from ButlerBlog" +msgstr "최근 ButlerBlog" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:67 +#, php-format +msgid "See the %sUsers Guide on CAPTCHA%s." +msgstr "" + +# @ wp-members +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:74 +#: includes/admin/tabs/class-wp-members-admin-tab-dialogs.php:57 +#: includes/admin/tabs/class-wp-members-admin-tab-emails.php:109 +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:134 +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:78 +msgid "Need help?" +msgstr "도움이 필요하세요?" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:85 +msgid "Manage CAPTCHA Options" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:91 +msgid "CAPTCHA Type" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:96 +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:243 +msgid "reCAPTCHA v2" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:97 +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:244 +msgid "reCAPTCHA v3" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:98 +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:245 +msgid "Really Simple CAPTCHA" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:99 +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:246 +msgid "hCaptcha" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:106 +msgid "" +"CAPTCHA type was changed. Please verify and update the settings below for " +"the new CAPTCHA type." +msgstr "" + +# @ wp-members +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:117 +msgid "reCAPTCHA Keys" +msgstr "reCAPTCHA 키" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:120 +#, php-format +msgid "" +"reCAPTCHA requires an API key, consisting of a \"site\" and a \"secret\" " +"key. You can sign up for a %s free reCAPTCHA key%s" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:122 +msgid "Site Key" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:123 +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:139 +msgid "Secret Key" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:133 +msgid "hCaptcha Keys" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:136 +#, php-format +msgid "" +"hCaptcha requires an API key. You can sign up for %s an hCaptcha API key " +"here %s" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:138 +msgid "API Key" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:170 +msgid "Characters for image" +msgstr "이미지에 대한 글자" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:174 +msgid "Number of characters" +msgstr "글자 수" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:178 +msgid "Image dimensions" +msgstr "이미지 크기" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:179 +msgid "Width" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:179 +msgid "Height" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:182 +msgid "Font color of characters" +msgstr "글자 폰트 색상" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:186 +msgid "Background color of image" +msgstr "이미지 배경 색상" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:190 +msgid "Font size" +msgstr "폰트 사이즈" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:194 +msgid "Width between characters" +msgstr "글자간 폭" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:198 +msgid "Image type" +msgstr "이미지 타입" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:213 +msgid "" +"To use Really Simple CAPTCHA, you must have the Really Simple CAPTCHA plugin " +"installed and activated." +msgstr "" +"Really Simple CAPTCHA를 사용하려면, Really Simple CAPTCHA 플러그인을 설치하" +"고 활성화 해야 합니다." + +# @ wp-members +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:241 +msgid "Update CAPTCHA Settings" +msgstr "CAPTCHA 설정 업데이트" + +# @ wp-members +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:319 +msgid "CAPTCHA was updated for WP-Members" +msgstr "CAPTCHA가 WP-Members를 위해 업데이트 됐습니다" + +# @ wp-members +#: includes/admin/tabs/class-wp-members-admin-tab-dialogs.php:67 +msgid "Dialogs and Error Messages" +msgstr "대화 및 에러 메시지" + +# @ wp-members +#: includes/admin/tabs/class-wp-members-admin-tab-dialogs.php:69 +#, php-format +msgid "" +"You can customize the text for dialogs and error messages. Simple HTML is " +"allowed %s etc." +msgstr "" +"대화 및 에러 메시지 텍스트를 사용자 정의 할 수 있습니다. 간단한 HTML은 허용 " +"됩니다 %s 등." + +# @ wp-members +#: includes/admin/tabs/class-wp-members-admin-tab-dialogs.php:80 +msgid "Terms of Service (TOS)" +msgstr "이용약관" + +# @ wp-members +#: includes/admin/tabs/class-wp-members-admin-tab-dialogs.php:87 +msgid "Update Dialogs" +msgstr "대화 업데이트" + +# @ wp-members +#: includes/admin/tabs/class-wp-members-admin-tab-dialogs.php:124 +msgid "WP-Members dialogs were updated" +msgstr "WP-Members 대화가 업데이트 됐습니다" + +#: includes/admin/tabs/class-wp-members-admin-tab-dropins.php:88 +#: includes/admin/tabs/class-wp-members-dropins-table.php:180 +msgid "WP-Members Dropin settings were updated" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-dropins.php:216 +msgid "Manage Dropins" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-dropins.php:217 +msgid "Current dropin folder: " +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-dropins.php:218 +msgid "" +"You can change location of the dropin folder using the " +"wpmem_dropin_folder filter." +msgstr "" + +# @ wp-members +#: includes/admin/tabs/class-wp-members-admin-tab-emails.php:57 +msgid "Email Messages" +msgstr "이메일 메시지" + +# @ wp-members +#: includes/admin/tabs/class-wp-members-admin-tab-emails.php:60 +msgid "You can customize the content of the emails sent by the plugin." +msgstr "플러그인에 의해 보내지는 이메일 콘텐츠를 사용자 정의 할 수 있습니다." + +# @ wp-members +#: includes/admin/tabs/class-wp-members-admin-tab-emails.php:62 +msgid "A list of shortcodes is available here." +msgstr "단축코드 목록은 여기서 가능합니다." + +# @ wp-members +#: includes/admin/tabs/class-wp-members-admin-tab-emails.php:69 +msgid "Set a custom email address" +msgstr "사용자 정의 이메일 주소 설정" + +# @ wp-members +#: includes/admin/tabs/class-wp-members-admin-tab-emails.php:70 +#: includes/admin/tabs/class-wp-members-admin-tab-emails.php:74 +#: includes/admin/tabs/class-wp-members-admin-tab-emails.php:93 +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:163 +msgid "(optional)" +msgstr "(선택적)" + +# @ wp-members +#: includes/admin/tabs/class-wp-members-admin-tab-emails.php:73 +msgid "Set a custom email name" +msgstr "사용자 정의 이메일 이름 설정" + +#: includes/admin/tabs/class-wp-members-admin-tab-emails.php:77 +msgid "Send HTML email" +msgstr "" + +# @ wp-members +#: includes/admin/tabs/class-wp-members-admin-tab-emails.php:93 +msgid "Email Signature" +msgstr "이메일 서명" + +# @ wp-members +#: includes/admin/tabs/class-wp-members-admin-tab-emails.php:101 +msgid "Update Emails" +msgstr "이메일 업데이트" + +# @ wp-members +#: includes/admin/tabs/class-wp-members-admin-tab-emails.php:172 +msgid "WP-Members emails were updated" +msgstr "WP-Members 이메일이 업데이트 됐습니다" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:93 +#: includes/class-wp-members-dialogs.php:65 +msgid "No fields selected for deletion" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:95 +msgid "Are you sure you want to delete the following fields?" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:122 +msgid "Fields deleted" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:136 +msgid "Field Manager Documentation" +msgstr "" + +# @ wp-members +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:164 +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:315 +#: includes/class-wp-members-forms.php:1629 +#: includes/class-wp-members-forms.php:1821 +#: includes/class-wp-members-user-profile.php:181 +msgid "(required)" +msgstr "(필수)" + +# @ wp-members +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:169 +msgid "Edit Field" +msgstr "필드 편집" + +# @ wp-members +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:169 +msgid "Add a Field" +msgstr "필드 추가" + +# @ wp-members +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:174 +msgid "Field Label" +msgstr "필드 레이블" + +# @ wp-members +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:176 +msgid "The name of the field as it will be displayed to the user." +msgstr "사용자에게 표시되는 필드 이름" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:179 +#: includes/admin/tabs/class-wp-members-fields-table.php:58 +msgid "Meta Key" +msgstr "" + +# @ wp-members +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:185 +msgid "" +"The database meta value for the field. It must be unique and contain no " +"spaces (underscores are ok)." +msgstr "" +"필드의 데이터베이스 메타 값. 독특해야 하며 스페이스가 없어야 합니다 (밑줄은 " +"가능)" + +# @ wp-members +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:189 +#: includes/admin/tabs/class-wp-members-fields-table.php:59 +msgid "Field Type" +msgstr "필드 타입" + +# @ wp-members +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:195 +msgid "text" +msgstr "텍스트" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:196 +msgid "email" +msgstr "" + +# @ wp-members +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:197 +msgid "textarea" +msgstr "textarea" + +# @ wp-members +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:198 +msgid "checkbox" +msgstr "checkbox" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:199 +msgid "multiple checkbox" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:200 +msgid "select (dropdown)" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:201 +msgid "multiple select" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:202 +msgid "radio group" +msgstr "" + +# @ wp-members +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:203 +msgid "password" +msgstr "비밀번호" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:204 +msgid "image" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:205 +msgid "file" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:206 +msgid "url" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:207 +msgid "number" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:208 +msgid "date" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:209 +msgid "hidden" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:211 +msgid "membership" +msgstr "" + +# @ wp-members +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:217 +#: includes/admin/tabs/class-wp-members-fields-table.php:60 +msgid "Display?" +msgstr "표시?" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:221 +msgid "This field is always displayed" +msgstr "" + +# @ wp-members +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:226 +msgid "Required?" +msgstr "필수?" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:230 +msgid "This field is always required" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:236 +msgid "Allow HTML?" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:243 +msgid "Placeholder" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:251 +msgid "Pattern" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:259 +msgid "Title" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:268 +msgid "Minimum Value" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:272 +msgid "Maximum Value" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:280 +msgid "Rows" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:284 +msgid "Columns" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:292 +msgid "Accepted file types:" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:297 +msgid "Accepted file types should be set like this: jpg|jpeg|png|gif" +msgstr "" + +# @ wp-members +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:304 +msgid "Checked by default?" +msgstr "기본으로 체크?" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:308 +msgid "HTML label position" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:310 +msgid "Before the input tag" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:311 +msgid "After the input tag" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:312 +msgid "" +"Selecting \"after\" will generally display the label to the right of the " +"checkbox" +msgstr "" + +# @ wp-members +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:315 +msgid "Stored value if checked:" +msgstr "체크된 경우 저장된 값:" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:336 +msgid "Stored values delimiter:" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:345 +msgid "Values (Displayed|Stored):" +msgstr "" + +# @ wp-members +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:370 +msgid "Options should be Option Name|option_value," +msgstr "옵션은 Option Name|option_value이어야 합니다," + +# @ wp-members +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:374 +msgid "Visit plugin site for more information" +msgstr "더 많은 정보는 플러그인 사이트를 방문하세요" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:381 +msgid "Value" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:400 +msgid "Save Changes" +msgstr "" + +# @ wp-members +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:400 +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:527 +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:528 +msgid "Add Field" +msgstr "필드 추가" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:402 +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:726 +msgid "Return to Fields Table" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:449 +msgid "Drag and drop to reorder fields" +msgstr "" + +# @ wp-members +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:455 +msgid "Registration Date" +msgstr "회원가입 일자" + +# @ wp-members +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:458 +msgid "Registration IP" +msgstr "회원가입 IP" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:459 +msgid "Subscription Type" +msgstr "" + +# @ wp-members +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:495 +msgid "Manage Fields" +msgstr "필드 관리" + +# @ wp-members +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:595 +msgid "WP-Members fields were updated" +msgstr "WP-Members 필드가 업데이트 됐습니다" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:617 +msgid "Field Label is required. Nothing was updated." +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:618 +msgid "Meta Key is required. Nothing was updated." +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:620 +msgid "Meta Key must contain only letters, numbers, and underscores" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:627 +msgid "A field with that meta key already exists" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:632 +#, php-format +msgid "" +"Sorry, \"%s\" is a
    reserved term. " +"Field was not added." +msgstr "" + +# @ wp-members +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:673 +msgid "Checked value is required for checkboxes. Nothing was updated." +msgstr "Checked 값은 체크박스에 필수입니다. 아무것도 업데이트 되지 않았습니다." + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:705 +msgid "A value is required for hidden fields. Nothing was updated." +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:712 +#, php-format +msgid "%s was added" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:725 +#, php-format +msgid "%s was updated" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:768 +msgid "Form field order updated." +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:56 +#, php-format +msgid "%sChange%s or %sFilter%s this address" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:57 +#, php-format +msgid "See the %sUsers Guide on plugin options%s." +msgstr "" + +# @ wp-members +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:90 +msgid "Manage Options" +msgstr "옵션 관리" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:94 +msgid "Content" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:105 +msgid "Content Restriction" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:109 +msgid "Do not restrict" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:123 +msgid "Show Excerpts" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:124 +msgid "Show Login Form" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:125 +msgid "Show Registration Form" +msgstr "" + +# @ wp-members +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:126 +msgid "Auto Excerpt:" +msgstr "자동 요약:" + +# @ wp-members +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:148 +msgid "Number of words in excerpt:" +msgstr "요약에서 단어 수:" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:149 +msgid "Custom read more link (optional):" +msgstr "" + +# @ wp-members +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:163 +msgid "Time-based expiration" +msgstr "시간 기준 만료" + +# @ wp-members +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:163 +msgid "Allows for access to expire" +msgstr "만료에 접근 허용" + +# @ wp-members +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:164 +msgid "Trial period" +msgstr "시험 사용 기간" + +# @ wp-members +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:164 +msgid "Allows for a trial period" +msgstr "시험사용 기간 허요" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:166 +msgid "Subscription Settings" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:176 +msgid "New Feature Settings" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:182 +msgid "Legacy Password Reset" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:182 +#, php-format +msgid "Use legacy password reset. %s(Requires additional configuration)%s" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:184 +msgid "Legacy Login Error" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:184 +msgid "Use legacy WP-Members login error instead of WP error object." +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:187 +msgid "WooCommerce My Account" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:187 +msgid "Add WP-Members fields to WooCommerce My Account registration" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:188 +msgid "WooCommerce Checkout" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:188 +msgid "Add WP-Members fields to WooCommerce registration during checkout" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:204 +msgid "Other Settings" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:214 +msgid "Enable memberships" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:214 +#, php-format +msgid "Enables creation of different %s membership products %s" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:215 +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:223 +msgid "Clone menus" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:215 +msgid "Enables logged in menus" +msgstr "" + +# @ wp-members +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:216 +msgid "Notify admin" +msgstr "관리자에게 알림" + +# @ wp-members +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:216 +#, php-format +msgid "Notify %s for each new registration? %s" +msgstr "새로운 새로운 회원가입을 %s에 알림? %s" + +# @ wp-members +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:217 +msgid "Moderate registration" +msgstr "회원가입 검토" + +# @ wp-members +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:217 +msgid "Holds new registrations for admin approval" +msgstr "새 회원가입은 관리자 승인 필요" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:218 +msgid "Confirmation Link" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:218 +#, php-format +msgid "" +"Send email confirmation link on new registration. %s(Requires additional " +"configuration)%s" +msgstr "" + +# @ wp-members +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:219 +msgid "Ignore warning messages" +msgstr "경고 메시지 무시하기" + +# @ wp-members +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:219 +msgid "Ignores WP-Members warning messages in the admin panel" +msgstr "관리자 화면에서 WP-Members 경고 메시지 무시하기" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:233 +msgid "Attribution" +msgstr "기여" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:235 +msgid "" +"Attribution is appreciated! Display \"powered by\" link on register form?" +msgstr "" +"기여에 대해 감사드립니다! 회원가입 폼에 \"powered by\" 링크를 표시해주세요." + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:238 +msgid "Enable CAPTCHA for Registration" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:253 +msgid "Login Page:" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:256 +msgid "Specify a login page (optional)" +msgstr "" + +# @ wp-members +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:265 +msgid "Register Page:" +msgstr "회원가입 페이지:" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:268 +msgid "For creating a register link in the login form" +msgstr "로그인 폼에 회원가입 링크 생성" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:277 +msgid "User Profile Page:" +msgstr "사용자 프로필 페이지:" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:280 +msgid "For creating a forgot password link in the login form" +msgstr "로그인 폼에서 분실 비밀번호 링크 생성" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:286 +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:288 +msgid "Stylesheet" +msgstr "" + +# @ wp-members +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:297 +msgid "Custom Stylesheet:" +msgstr "사용자 정의 스타일시트:" + +# @ wp-members +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:302 +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:329 +msgid "Update Settings" +msgstr "설정 업데이트" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:310 +msgid "Custom Post Types" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:316 +msgid "Add to WP-Members Settings" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:332 +msgid "" +"Please keep in mind that Custom Post Types are \"custom\" and therefore, not " +"all of them will function exactly the same way. WP-Members will certainly " +"work with any post type that operate like a post or a page; but you will " +"need to review any custom post type added to determine that it functions the " +"way you expect." +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:342 +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:343 +msgid "WP-Members Settings" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:344 +msgid "" +"The following is your WP-Members settings information if needed for support." +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:378 +msgid "Click to Copy" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:458 +msgid "Custom Post Type settings were updated" +msgstr "" + +# @ wp-members +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:579 +msgid "WP-Members settings were updated" +msgstr "WP-Members 설정이 업데이트 됐습니다" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:651 +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:682 +msgid "USE CUSTOM URL BELOW" +msgstr "아래에서 사용자 정의 URL 사용" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:671 +msgid "Select a page" +msgstr "페이지 선택" + +#: includes/admin/tabs/class-wp-members-dropins-table.php:70 +msgid "Name" +msgstr "" + +#: includes/admin/tabs/class-wp-members-dropins-table.php:71 +msgid "Enabled" +msgstr "" + +#: includes/admin/tabs/class-wp-members-dropins-table.php:72 +msgid "File" +msgstr "" + +#: includes/admin/tabs/class-wp-members-dropins-table.php:73 +msgid "Version" +msgstr "" + +#: includes/admin/tabs/class-wp-members-dropins-table.php:74 +#: includes/walkers/class-wp-members-walker-nav-menu.php:186 +msgid "Description" +msgstr "" + +#: includes/admin/tabs/class-wp-members-dropins-table.php:117 +#: includes/admin/tabs/class-wp-members-fields-table.php:108 +msgid "Save Settings" +msgstr "" + +#: includes/admin/tabs/class-wp-members-fields-table.php:43 +msgid "delete" +msgstr "" + +#: includes/admin/tabs/class-wp-members-fields-table.php:57 +msgid "Display Label" +msgstr "" + +#: includes/admin/tabs/class-wp-members-fields-table.php:61 +msgid "Required" +msgstr "" + +#: includes/admin/tabs/class-wp-members-fields-table.php:63 +msgid "Users Screen" +msgstr "사용자 화면" + +#: includes/admin/tabs/class-wp-members-fields-table.php:64 +msgid "Users Search" +msgstr "" + +#: includes/admin/tabs/class-wp-members-fields-table.php:66 +msgid "Sort" +msgstr "" + +#: includes/admin/tabs/class-wp-members-fields-table.php:107 +msgid "Delete Selected" +msgstr "" + +#: includes/api/api-forms.php:584 +#, php-format +msgid "%s is a required field." +msgstr "" + +#: includes/class-wp-members-captcha.php:276 includes/deprecated.php:401 +msgid "You have entered an incorrect code value. Please try again." +msgstr "올바른 코드 값을 입력하지 않았습니다. 다시 해주세요." + +#: includes/class-wp-members-dialogs.php:41 +msgid "First Name" +msgstr "이름" + +# @ wp-members +#: includes/class-wp-members-dialogs.php:42 +msgid "Last Name" +msgstr "성" + +#: includes/class-wp-members-dialogs.php:43 +msgid "Address 1" +msgstr "주소1" + +#: includes/class-wp-members-dialogs.php:44 +msgid "Address 2" +msgstr "주소2" + +#: includes/class-wp-members-dialogs.php:45 +msgid "City" +msgstr "시" + +#: includes/class-wp-members-dialogs.php:46 +msgid "State" +msgstr "주" + +#: includes/class-wp-members-dialogs.php:47 +msgid "Zip" +msgstr "우편번호" + +#: includes/class-wp-members-dialogs.php:48 +msgid "Country" +msgstr "국가" + +#: includes/class-wp-members-dialogs.php:49 +msgid "Day Phone" +msgstr "전화번호" + +#: includes/class-wp-members-dialogs.php:50 +#: includes/class-wp-members-dialogs.php:92 +msgid "Email" +msgstr "" + +#: includes/class-wp-members-dialogs.php:51 +msgid "Confirm Email" +msgstr "이메일 확인" + +#: includes/class-wp-members-dialogs.php:52 +msgid "Website" +msgstr "웹사이트" + +#: includes/class-wp-members-dialogs.php:53 +msgid "Biographical Info" +msgstr "자기 소개" + +#: includes/class-wp-members-dialogs.php:54 +#: includes/class-wp-members-dialogs.php:74 +#: includes/class-wp-members-dialogs.php:159 +msgid "Password" +msgstr "비밀번호" + +#: includes/class-wp-members-dialogs.php:55 +msgid "Confirm Password" +msgstr "비밀번호 확인" + +#: includes/class-wp-members-dialogs.php:56 +#: includes/class-wp-members-forms.php:2165 +msgid "TOS" +msgstr "이용약관" + +# @ wp-members +#: includes/class-wp-members-dialogs.php:66 +msgid "You are not logged in." +msgstr "로그인하지 않았습니다." + +# @ wp-members +#: includes/class-wp-members-dialogs.php:72 +msgid "Existing Users Log In" +msgstr "기존 사용자 로그인" + +#: includes/class-wp-members-dialogs.php:73 +#: includes/class-wp-members-dialogs.php:158 +msgid "Username or Email" +msgstr "아이디 또는 이메일 " + +#: includes/class-wp-members-dialogs.php:75 +#: includes/class-wp-members-shortcodes.php:773 +msgid "Log In" +msgstr "로그인" + +#: includes/class-wp-members-dialogs.php:76 +msgid "Remember Me" +msgstr "기억하기" + +# @ wp-members +#: includes/class-wp-members-dialogs.php:77 +msgid "Forgot password?" +msgstr "비밀번호 분실" + +# @ wp-members +#: includes/class-wp-members-dialogs.php:78 +msgid "Click here to reset" +msgstr "초기화" + +# @ wp-members +#: includes/class-wp-members-dialogs.php:79 +msgid "New User?" +msgstr "신규 가입" + +# @ wp-members +#: includes/class-wp-members-dialogs.php:80 +msgid "Click here to register" +msgstr "회원가입" + +# @ wp-members +#: includes/class-wp-members-dialogs.php:83 +#: includes/class-wp-members-dialogs.php:142 +msgid "Change Password" +msgstr "비밀번호 변경" + +#: includes/class-wp-members-dialogs.php:84 +msgid "New password" +msgstr "" + +#: includes/class-wp-members-dialogs.php:85 +msgid "Confirm new password" +msgstr "새 비밀번호 확인" + +# @ wp-members +#: includes/class-wp-members-dialogs.php:86 +msgid "Update Password" +msgstr "비밀번호 업데이트" + +#: includes/class-wp-members-dialogs.php:87 +msgid "Password successfully changed!" +msgstr "" + +# @ wp-members +#: includes/class-wp-members-dialogs.php:90 +msgid "Reset Forgotten Password" +msgstr "분실 비밀번호 초기화" + +#: includes/class-wp-members-dialogs.php:93 +msgid "Reset Password" +msgstr "" + +#: includes/class-wp-members-dialogs.php:94 +msgid "Forgot username?" +msgstr "사용자 이름을 잊으셨나요?" + +#: includes/class-wp-members-dialogs.php:95 +msgid "Click here" +msgstr "" + +#: includes/class-wp-members-dialogs.php:98 +#: includes/class-wp-members-dialogs.php:100 +msgid "Retrieve username" +msgstr "" + +#: includes/class-wp-members-dialogs.php:99 +msgid "Email Address" +msgstr "" + +# @ wp-members +#: includes/class-wp-members-dialogs.php:103 +msgid "New User Registration" +msgstr "새로운 사용자 등록" + +# @ wp-members +#: includes/class-wp-members-dialogs.php:104 +msgid "Choose a Username" +msgstr "아이디" + +#: includes/class-wp-members-dialogs.php:105 +msgid "Input the code:" +msgstr "코드 삽입:" + +#: includes/class-wp-members-dialogs.php:106 +#: includes/class-wp-members-forms.php:2164 +#, php-format +msgid "Please indicate that you agree to the %s Terms of Service %s" +msgstr "" + +# @ wp-members +#: includes/class-wp-members-dialogs.php:107 +msgid "Reset Form" +msgstr "폼 초기화" + +#: includes/class-wp-members-dialogs.php:108 +#: includes/class-wp-members-dialogs.php:162 +#: includes/class-wp-members-shortcodes.php:770 +#: includes/class-wp-members-user.php:186 +msgid "Register" +msgstr "회원가입" + +# @ wp-members +#: includes/class-wp-members-dialogs.php:110 +msgid "Required field" +msgstr "필수란" + +# @ wp-members +#: includes/class-wp-members-dialogs.php:113 +msgid "Edit Your Information" +msgstr "정보 변경하기" + +# @ wp-members +#: includes/class-wp-members-dialogs.php:115 +msgid "Update Profile" +msgstr "프로필 업데이트" + +#: includes/class-wp-members-dialogs.php:116 +msgid "Update this file" +msgstr "" + +# @ wp-members +#: includes/class-wp-members-dialogs.php:119 +msgid "Login Failed!" +msgstr "로그인 실패" + +# @ wp-members +#: includes/class-wp-members-dialogs.php:120 +msgid "You entered an invalid username or password." +msgstr "유효하지 않은 아이디 또는 비밀번호입니다." + +# @ wp-members +#: includes/class-wp-members-dialogs.php:121 +msgid "Click here to continue." +msgstr "계속하기" + +# @ wp-members +#: includes/class-wp-members-dialogs.php:122 +msgid "Password fields cannot be empty" +msgstr "비밀번호는 필수입니다." + +#: includes/class-wp-members-dialogs.php:123 +msgid "Sorry, that email address was not found." +msgstr "" + +#: includes/class-wp-members-dialogs.php:124 +#, php-format +msgid "An email was sent to %s with your username." +msgstr "" + +# @ wp-members +#: includes/class-wp-members-dialogs.php:125 +#, php-format +msgid "Sorry, %s is a required field." +msgstr "죄송합니다. %s는 필수란입니다." + +# @ wp-members +#: includes/class-wp-members-dialogs.php:126 +msgid "You must enter a valid email address." +msgstr "유효한 이메일 주소를 입력해야 합니다." + +# @ wp-members +#: includes/class-wp-members-dialogs.php:127 +msgid "The username cannot include non-alphanumeric characters." +msgstr "아이디는 알파벳이나 숫자만 사용합니다." + +# @ wp-members +#: includes/class-wp-members-dialogs.php:128 +msgid "Sorry, username is a required field" +msgstr "죄송합니다. 아이디는 필수란입니다." + +#: includes/class-wp-members-dialogs.php:129 +msgid "Sorry, that username is taken, Please try another." +msgstr "" + +#: includes/class-wp-members-dialogs.php:130 +msgid "Sorry, that email address already has an account. Please try another." +msgstr "" + +# @ wp-members +#: includes/class-wp-members-dialogs.php:131 +#: includes/class-wp-members-dialogs.php:174 +msgid "Passwords did not match." +msgstr "비밀번호가 일치하지 않습니다" + +# @ wp-members +#: includes/class-wp-members-dialogs.php:132 +msgid "Emails did not match." +msgstr "이메일이 일치하지 않습니다" + +# @ wp-members +#: includes/class-wp-members-dialogs.php:133 +msgid "You must complete the CAPTCHA form." +msgstr "캡챠 폼을 완성해야 합니다." + +#: includes/class-wp-members-dialogs.php:134 +msgid "CAPTCHA was not valid." +msgstr "" + +# @ default +#: includes/class-wp-members-dialogs.php:135 +msgid "There was an error processing the form." +msgstr "폼 처리 중 에러가 있습니다." + +# @ default +#: includes/class-wp-members-dialogs.php:136 +msgid "There was an error with the CAPTCHA form." +msgstr "CAPTCHA 폼에 에러가 있습니다." + +#: includes/class-wp-members-dialogs.php:137 +#, php-format +msgid "" +"Sorry, you can only upload the following file types for the %s field: %s." +msgstr "" + +# @ wp-members +#: includes/class-wp-members-dialogs.php:138 +#: includes/class-wp-members-dialogs.php:171 +msgid "Your information was updated!" +msgstr "회원 정보가 업데이트 됐습니다!" + +# @ wp-members +#: includes/class-wp-members-dialogs.php:141 +msgid "Edit My Information" +msgstr "내 정보 수정" + +# @ wp-members +#: includes/class-wp-members-dialogs.php:143 +#: includes/class-wp-members-dialogs.php:146 +#: includes/class-wp-members-dialogs.php:148 +#: includes/class-wp-members-dialogs.php:153 +#, php-format +msgid "You are logged in as %s" +msgstr "%s으로 로그인 됨" + +#: includes/class-wp-members-dialogs.php:144 +msgid "Log out" +msgstr "" + +#: includes/class-wp-members-dialogs.php:145 +msgid "Edit profile" +msgstr "" + +# @ wp-members +#: includes/class-wp-members-dialogs.php:145 +msgid "Begin using the site." +msgstr "사이트 사용하기" + +# @ wp-members +#: includes/class-wp-members-dialogs.php:147 +msgid "Click to log out" +msgstr "로그아웃 하려면 클릭" + +# @ wp-members +#: includes/class-wp-members-dialogs.php:149 +msgid "click to log out" +msgstr "로그아웃 하려면 클릭" + +#: includes/class-wp-members-dialogs.php:150 +msgid "Log Out" +msgstr "로그아웃" + +# @ wp-members +#: includes/class-wp-members-dialogs.php:154 +msgid "click here to log out" +msgstr "로그아웃 하려면 클릭" + +# @ wp-members +#: includes/class-wp-members-dialogs.php:155 +msgid "Login Failed!
    You entered an invalid username or password." +msgstr "로그인 실패!
    유효하지 않은 아이디 또는 비밀번호를 입력했습니다." + +#: includes/class-wp-members-dialogs.php:156 +msgid "Invalid username or password." +msgstr "" + +#: includes/class-wp-members-dialogs.php:160 includes/class-wp-members.php:1745 +msgid "log in" +msgstr "로그인" + +# @ wp-members +#: includes/class-wp-members-dialogs.php:161 +msgid "Forgot?" +msgstr "비밀번호 분실" + +#: includes/class-wp-members-dialogs.php:165 +msgid "" +"This content is restricted to site members. If you are an existing user, " +"please log in. New users may register below." +msgstr "" +"이 콘텐츠는 사이트 회원 전용입니다. 기존의 사용자라면 로그인 하세요. 새 사용" +"자는 아래에서 회원가입 할 수 있습니다." + +#: includes/class-wp-members-dialogs.php:166 +msgid "" +"Congratulations! Your registration was successful.

    You may now " +"log in using the password that was emailed to you." +msgstr "" +"축하합니다! 회원가입이 성공했습니다.

    이메일로 보낸 비밀번호를 사용" +"해서 로그인 할 수 있습니다." + +#: includes/class-wp-members-dialogs.php:169 +msgid "Sorry, that username is taken, please try another." +msgstr "죄송합니다. 해당 아이디는 사용 중입니다. 다른 것으로 해주세요." + +#: includes/class-wp-members-dialogs.php:170 +msgid "" +"Sorry, that email address already has an account.
    Please try another." +msgstr "" +"죄송합니다. 해당 이메일 주소는 이미 사용 중입니다.
    다른 것으로 해주세" +"요." + +#: includes/class-wp-members-dialogs.php:175 +msgid "Password successfully changed." +msgstr "" + +#: includes/class-wp-members-dialogs.php:176 +msgid "Invalid username or email address." +msgstr "" + +#: includes/class-wp-members-dialogs.php:177 +msgid "" +"Password successfully reset! An email containing a new password has been " +"sent to the email address on file for your account." +msgstr "" + +#: includes/class-wp-members-dialogs.php:178 +msgid "" +"Reset request received. An email with instructions to complete the password " +"reset has been sent." +msgstr "" + +#: includes/class-wp-members-dialogs.php:180 +msgid "This content requires the following membership: " +msgstr "" + +#: includes/class-wp-members-dialogs.php:181 +msgid "This content requires one of the following memberships: " +msgstr "" + +#: includes/class-wp-members-forms.php:84 +#: includes/class-wp-members-forms.php:350 +msgid "Choose membership" +msgstr "" + +# @ wp-members +#: includes/class-wp-members-forms.php:1898 +#: includes/class-wp-members-user-profile.php:510 +msgid "Activate this user?" +msgstr "이 사용자 활성화?" + +# @ wp-members +#: includes/class-wp-members-forms.php:2165 templates/tos.php:20 +msgid "Terms of Service" +msgstr "이용약관" + +#: includes/class-wp-members-menus.php:131 +msgid "Display" +msgstr "" + +#: includes/class-wp-members-menus.php:139 +msgid "Logged In Users" +msgstr "" + +#: includes/class-wp-members-menus.php:146 +msgid "Logged Out Users" +msgstr "" + +#: includes/class-wp-members-menus.php:153 +msgid "All Users" +msgstr "" + +#: includes/class-wp-members-menus.php:167 +#, php-format +msgid "%sAdd membership products%s to restrict menu to a membership" +msgstr "" + +#: includes/class-wp-members-menus.php:169 +msgid "Restrict menu item to a membership product" +msgstr "" + +#: includes/class-wp-members-products.php:342 +#, php-format +msgid "All %s" +msgstr "" + +#: includes/class-wp-members-products.php:343 +#, php-format +msgid "Add New %s" +msgstr "" + +#: includes/class-wp-members-products.php:344 +msgid "Add New" +msgstr "" + +#: includes/class-wp-members-products.php:345 +#, php-format +msgid "New %s" +msgstr "" + +#: includes/class-wp-members-products.php:346 +#, php-format +msgid "Edit %s" +msgstr "" + +#: includes/class-wp-members-products.php:347 +#, php-format +msgid "Update %s" +msgstr "" + +#: includes/class-wp-members-products.php:348 +#: includes/class-wp-members-products.php:349 +#, php-format +msgid "View %s" +msgstr "" + +#: includes/class-wp-members-products.php:350 +#, php-format +msgid "Search %s" +msgstr "" + +#: includes/class-wp-members-products.php:351 +msgid "Not found" +msgstr "" + +#: includes/class-wp-members-products.php:352 +msgid "Not found in Trash" +msgstr "" + +#: includes/class-wp-members-products.php:353 +msgid "Insert into item" +msgstr "" + +#: includes/class-wp-members-products.php:354 +#, php-format +msgid "Save %s Details" +msgstr "" + +#: includes/class-wp-members-products.php:355 +msgid "Membership Attributes" +msgstr "" + +#: includes/class-wp-members-products.php:358 +msgid "Membership Product" +msgstr "" + +#: includes/class-wp-members-products.php:359 +msgid "WP-Members Membership Products" +msgstr "" + +#: includes/class-wp-members-pwd-reset.php:35 +#: includes/class-wp-members-pwd-reset.php:36 +msgid "" +"Sorry, no password reset key was found. Please check your email and try " +"again." +msgstr "" + +#: includes/class-wp-members-pwd-reset.php:37 +msgid "Sorry, the password reset key is expired." +msgstr "" + +#: includes/class-wp-members-pwd-reset.php:167 +msgid "The passwords do not match." +msgstr "" + +#: includes/class-wp-members-shortcodes.php:134 +msgid "" +"This is a generic message to display the form message dialog in the " +"Customizer." +msgstr "" + +#: includes/class-wp-members-shortcodes.php:699 +msgid "Click here to log out." +msgstr "" + +# @ wp-members +#: includes/class-wp-members-user-profile.php:58 +msgid "WP-Members Additional Fields" +msgstr "WP-Members 추가 필드" + +# @ wp-members +#: includes/class-wp-members-user-profile.php:58 +msgid "Additional Information" +msgstr "추가 정보" + +# @ wp-members +#: includes/class-wp-members-user-profile.php:500 +msgid "Reactivate this user?" +msgstr "이 사용자 재활성화?" + +# @ wp-members +#: includes/class-wp-members-user-profile.php:505 +msgid "Deactivate this user?" +msgstr "이 사용자 비활성화?" + +# @ wp-members +#: includes/class-wp-members-user-profile.php:559 +msgid "IP @ registration" +msgstr "IP @ registration" + +# @ wp-members +#: includes/class-wp-members-user.php:1171 +msgid "ERROR: User has not been activated." +msgstr "에러: 사용자가 활성화 되지 않았습니다." + +#: includes/class-wp-members-validation-link.php:32 +msgid "Click to validate your account: " +msgstr "" + +#: includes/class-wp-members-validation-link.php:33 +msgid "Thank you for validating your account." +msgstr "" + +#: includes/class-wp-members-validation-link.php:34 +msgid "Validation key was expired or invalid" +msgstr "" + +#: includes/class-wp-members-validation-link.php:35 +msgid "Your account is now pending approval" +msgstr "" + +#: includes/class-wp-members-validation-link.php:284 +msgid "ERROR: User has not confirmed their account." +msgstr "" + +#: includes/class-wp-members-widget.php:24 +msgid "Displays the WP-Members sidebar login." +msgstr "WP-Members 사이드바 로그인 표시하기." + +# @ wp-members +#: includes/class-wp-members-widget.php:39 +#: includes/class-wp-members-widget.php:82 +msgid "Login Status" +msgstr "로그인 상태" + +# @ wp-members +#: includes/class-wp-members-widget.php:46 +msgid "Title:" +msgstr "제목:" + +#: includes/class-wp-members-widget.php:50 +msgid "Redirect to (optional):" +msgstr "" + +#: includes/class-wp-members.php:1087 includes/class-wp-members.php:1098 +msgid "You must be logged in to view this content." +msgstr "" + +#: includes/class-wp-members.php:1104 +msgid "The page you are looking for does not exist" +msgstr "" + +#: includes/class-wp-members.php:1352 +#, php-format +msgid "" +"You have a linked page in the WP-Members page settings that corresponds to a " +"post ID that no longer exists. Please %s review and update the %s page " +"settings %s." +msgstr "" + +#: includes/class-wp-members.php:1472 +msgid "Show forms as logged out" +msgstr "" + +#: includes/class-wp-members.php:1481 +msgid "Show form message dialog" +msgstr "" + +#: includes/class-wp-members.php:1558 +msgid "(more…)" +msgstr "" + +#: includes/class-wp-members.php:1746 +msgid "log out" +msgstr "로그아웃" + +#: includes/cli/class-wp-members-cli-user.php:24 +#: includes/cli/class-wp-members-cli-user.php:62 +msgid "Moderated registration is not enabled in WP-Members options." +msgstr "" + +#: includes/cli/class-wp-members-cli-user.php:35 +msgid "User activated." +msgstr "" + +#: includes/cli/class-wp-members-cli-user.php:37 +msgid "Email notification sent to user." +msgstr "" + +#: includes/cli/class-wp-members-cli-user.php:40 +msgid "User is already activated." +msgstr "" + +#: includes/cli/class-wp-members-cli-user.php:67 +msgid "User deactivated." +msgstr "" + +#: includes/cli/class-wp-members-cli-user.php:88 +msgid "Invalid user ID. Please specify a valid user. Try `wp user list`." +msgstr "" + +#: includes/cli/class-wp-members-cli-user.php:91 +msgid "No user id specified. Must specify user id as --id=123" +msgstr "" + +#: includes/cli/class-wp-members-cli-user.php:208 +#, php-format +msgid "User: %s" +msgstr "" + +#: includes/cli/class-wp-members-cli-user.php:248 +#, php-format +msgid "User role: %s" +msgstr "" + +# @ wp-members +#: includes/deprecated.php:373 +msgid "We were unable to validate the public key." +msgstr "공개 키를 인증할 수 없습니다." + +# @ wp-members +#: includes/deprecated.php:377 +msgid "We were unable to validate the private key." +msgstr "비공개 키를 인증할 수 없습니다." + +# @ wp-members +#: includes/deprecated.php:381 +msgid "The challenge parameter of the verify script was incorrect." +msgstr "인증 스크립트 매개변수가 올바르지 않습니다." + +# @ wp-members +#: includes/deprecated.php:385 +msgid "The CAPTCHA solution was incorrect." +msgstr "CAPTCHA 솔루션이 올바르지 않습니다." + +# @ wp-members +#: includes/deprecated.php:389 +msgid "The parameters to verify were incorrect" +msgstr "인증할 매개변수가 올바르지 않습니다" + +# @ wp-members +#: includes/deprecated.php:393 +msgid "" +"reCAPTCHA API keys are tied to a specific domain name for security reasons." +msgstr "reCAPTCHA API 키가 보안을 이유로 특정 도메인 이름에 귀속돼있습니다." + +# @ wp-members +#: includes/deprecated.php:397 +msgid "The reCAPTCHA server was not reached. Please try to resubmit." +msgstr "reCAPTCHA 서버가 응답하지 않습니다. 다시 제출해보세요." + +#. translators: %s: title of menu item which is invalid +#: includes/walkers/class-wp-members-walker-nav-menu.php:92 +#, php-format +msgid "%s (Invalid)" +msgstr "" + +#. translators: %s: title of menu item in draft status +#: includes/walkers/class-wp-members-walker-nav-menu.php:96 +#, php-format +msgid "%s (Pending)" +msgstr "" + +#: includes/walkers/class-wp-members-walker-nav-menu.php:123 +msgid "Move up" +msgstr "" + +#: includes/walkers/class-wp-members-walker-nav-menu.php:136 +msgid "Move down" +msgstr "" + +#: includes/walkers/class-wp-members-walker-nav-menu.php:138 +msgid "Edit Menu Item" +msgstr "" + +#: includes/walkers/class-wp-members-walker-nav-menu.php:149 +msgid "URL" +msgstr "" + +#: includes/walkers/class-wp-members-walker-nav-menu.php:156 +msgid "Navigation Label" +msgstr "" + +#: includes/walkers/class-wp-members-walker-nav-menu.php:162 +msgid "Title Attribute" +msgstr "" + +#: includes/walkers/class-wp-members-walker-nav-menu.php:169 +msgid "Open link in a new window/tab" +msgstr "" + +#: includes/walkers/class-wp-members-walker-nav-menu.php:174 +msgid "CSS Classes (optional)" +msgstr "" + +#: includes/walkers/class-wp-members-walker-nav-menu.php:180 +msgid "Link Relationship (XFN)" +msgstr "" + +#: includes/walkers/class-wp-members-walker-nav-menu.php:188 +msgid "" +"The description will be displayed in the menu if the current theme supports " +"it." +msgstr "" + +#: includes/walkers/class-wp-members-walker-nav-menu.php:210 +#, php-format +msgid "Original: %s" +msgstr "" + +#: includes/walkers/class-wp-members-walker-nav-menu.php:223 +msgid "Remove" +msgstr "" + +# @ wp-members +#: templates/tos.php:32 +#, php-format +msgid "%sclose%s" +msgstr "%s닫기%s" + +# @ wp-members +#: templates/tos.php:34 +#, php-format +msgid "%sprint%s" +msgstr "%s인쇄%s" + +#. Plugin Name of the plugin/theme +msgid "WP-Members" +msgstr "" + +#. Plugin URI of the plugin/theme +msgid "https://rocketgeek.com" +msgstr "" + +#. Description of the plugin/theme +msgid "" +"WP access restriction and user registration. For more information on plugin " +"features, refer to the online Users Guide. A Quick Start Guide is also available. WP-" +"Members(tm) is a trademark of butlerblog.com." +msgstr "" + +#. Author of the plugin/theme +msgid "Chad Butler" +msgstr "" + +#. Author URI of the plugin/theme +msgid "https://butlerblog.com/" +msgstr "" + +#~ msgid "Unblock" +#~ msgstr "차단 해제" + +#~ msgid "Block" +#~ msgstr "차단" + +# @ wp-members +#~ msgid "Manage reCAPTCHA Options" +#~ msgstr "reCAPTCHA 옵션 관리" + +# @ wp-members +#~ msgid "" +#~ "reCAPTCHA is a free, accessible CAPTCHA service that helps to digitize " +#~ "books while blocking spam on your blog." +#~ msgstr "" +#~ "reCAPTCHA는 무료이며 접근 가능한 CAPTCHA 서비스로 블로그에서 스팸을 방지하" +#~ "는데 도움이 됩니다." + +# @ wp-members +#, php-format +#~ msgid "" +#~ "reCAPTCHA asks commenters to retype two words scanned from a book to " +#~ "prove that they are a human. This verifies that they are not a spambot " +#~ "while also correcting the automatic scans of old books. So you get less " +#~ "spam, and the world gets accurately digitized books. Everybody wins! For " +#~ "details, visit the %s reCAPTCHA website%s" +#~ msgstr "" +#~ "reCAPTCHA는 댓글자가 사람인지 증명하기 위해 책에서 스캔해 두 개의단어를 입" +#~ "력하도록 요구합니다. 이것은 스팸로봇이 아닌지 확인하며 많은 스팸을 방지합" +#~ "니다. 상세한 내용은 %s reCAPTCHA 웹사이트%s를 방문하세요." + +# @ wp-members +#, php-format +#~ msgid "" +#~ "reCAPTCHA requires an API key, consisting of a \"public\" and a \"private" +#~ "\" key. You can sign up for a %s free reCAPTCHA key%s" +#~ msgstr "" +#~ "reCAPTCHA는 API 키가 필요합니다. \"public\" 및 \"private\" 키로 구성됩니" +#~ "다. %s 무료 reCAPTCHA 키%s를 위해 가입하세요." + +# @ wp-members +#~ msgid "Public Key" +#~ msgstr "Public 키" + +# @ wp-members +#~ msgid "Private Key" +#~ msgstr "Private 키" + +# @ wp-members +#~ msgid "Choose Theme" +#~ msgstr "테마 선택" + +# @ wp-members +#~ msgid "Red" +#~ msgstr "Red" + +# @ wp-members +#~ msgid "White" +#~ msgstr "White" + +# @ wp-members +#~ msgid "Black Glass" +#~ msgstr "Black Glass" + +# @ wp-members +#~ msgid "Clean" +#~ msgstr "Clean" + +# @ default +#~ msgid "Active" +#~ msgstr "활성" + +# @ wp-members +#~ msgid "Enable CAPTCHA" +#~ msgstr "CAPTCHA 활성화" + +# @ wp-members +#~ msgid "Passwords did not match.

    Please try again." +#~ msgstr "비밀번호가 일치하지 않습니다.

    다시 해주세요." + +# @ wp-members +#~ msgid "Either the username or email address do not exist in our records." +#~ msgstr "사용자명 또는 이메일 주소가 데이터베이스에 존재하지 않습니다." + +# @ wp-members +#~ msgid "Click to log out." +#~ msgstr "로그아웃 하려면 클릭" + +# @ wp-members +#~ msgid "You have set WP-Members to turn off the registration process" +#~ msgstr "WP-Members 설정을 회원가입 과정을 끄도록 했습니다." + +# @ wp-members +#~ msgid "" +#~ "but you also set to moderate and/or email admin new registrations. You " +#~ "will need to set up a registration page for users to register." +#~ msgstr "" +#~ "또한 새 회원가입을 검토하거나 관리자에게 이메일을 보내도록 설정했습니다. " +#~ "사용자가 등록할 수 있도록 회원가입 페이지를 설정해야 합니다." + +#~ msgid "Unblocked?" +#~ msgstr "차단 해제?" + +# @ wp-members +#~ msgid "Blocked?" +#~ msgstr "차단?" + +# @ wp-members +#~ msgid "Field Label is required for adding a new field. Nothing was updated." +#~ msgstr "" +#~ "새 필드를 추가하려면 필드 레이블은 필수입니다. 아무것도 업데이트 되지 않았" +#~ "습니다." + +# @ wp-members +#~ msgid "Option Name is required for adding a new field. Nothing was updated." +#~ msgstr "" +#~ "옵션 이름은 새 필드를 추가하는데 필수입니다. 아무것도 업데이트 되지 않았습" +#~ "니다." + +#~ msgid "A field with that option name already exists" +#~ msgstr "해당 옵션 이름의 필드는 이미 존재합니다" + +# @ wp-members +#~ msgid "field was added" +#~ msgstr "필드가 추가됐습니다" + +# @ wp-members +#~ msgid "field was updated" +#~ msgstr "필드가 업데이트 됐습니다" + +# @ wp-members +#~ msgid "Option Name" +#~ msgstr "옵션 이름" + +# @ wp-members +#~ msgid "Additional information for checkbox fields" +#~ msgstr "체크박스 추가 정보" + +# @ wp-members +#~ msgid "Additional information for dropdown fields" +#~ msgstr "드롭다운 필드 추가 정보" + +# @ wp-members +#~ msgid "For dropdown, array of values:" +#~ msgstr "드롭다운의 경우 값 배열(array):" + +# @ wp-members +#~ msgid "" +#~ "Determine which fields will display and which are required. This " +#~ "includes all fields, both native WP fields and WP-Members custom fields." +#~ msgstr "" +#~ "표시할 필드와 필수를 결정하세요. 이것은 모든 필드를 포함하며 워드프레스 기" +#~ "본 필드와 WP-Members 사용자 정의 필드입니다." + +# @ wp-members +#~ msgid "(Note: Email is always mandatory and cannot be changed.)" +#~ msgstr "(주의: 이메일은 항상 필수이며 변경할 수 없습니다.)" + +# @ wp-members +#~ msgid "Add/Delete" +#~ msgstr "추가/삭제" + +# @ wp-members +#~ msgid "Checked?" +#~ msgstr "Checked?" + +# @ wp-members +#~ msgid "Delete" +#~ msgstr "삭제" + +# @ wp-members +#~ msgid "(Email cannot be removed)" +#~ msgstr "(이메일은 제거될 수 없습니다)" + +# @ wp-members +#~ msgid "native" +#~ msgstr "워드프레스 기본" + +# @ wp-members +#~ msgid "Update Fields" +#~ msgstr "필드 업데이트" + +# @ wp-members +#~ msgid "Please indicate that you agree to the %s TOS %s" +#~ msgstr "%s 이용약관 %s에 동의해주세요" + +#~ msgid "%s posts %sed." +#~ msgstr "%s 글 %s 됨." + +# @ wp-members +#~ msgid "Post Restriction" +#~ msgstr "글 제한" + +# @ wp-members +#~ msgid "Page Restriction" +#~ msgstr "페이지 제한" + +# @ wp-members +#~ msgid "dropdown" +#~ msgstr "드롭다운" + +# @ wp-members +#~ msgid "Block Posts by default" +#~ msgstr "기본으로 글 차단" + +# @ wp-members +#~ msgid "" +#~ "Note: Posts can still be individually blocked or unblocked at the article " +#~ "level" +#~ msgstr "주의: 글은 개별 글에서 차단하거나 차단해제 될 수 있습니다" + +# @ wp-members +#~ msgid "Block Pages by default" +#~ msgstr "기본으로 페이지 차단" + +# @ wp-members +#~ msgid "" +#~ "Note: Pages can still be individually blocked or unblocked at the article " +#~ "level" +#~ msgstr "주의: 페이지는 개별 페이지에서 차단하거나 차단해제 될 수 있습니다" + +# @ wp-members +#~ msgid "Show excerpts" +#~ msgstr "요약 보이기" + +# @ wp-members +#~ msgid "" +#~ "Shows excerpted content above the login/registration on both Posts and " +#~ "Pages" +#~ msgstr "글 및 페이지에서 로그인/회원가입 위에 요약 콘텐츠 보이기" + +# @ wp-members +#~ msgid "Turns on CAPTCHA for registration" +#~ msgstr "회원가입에 CAPTCHA 켜기" + +# @ wp-members +#~ msgid "Hide registration" +#~ msgstr "회원가입 감추기" + +#~ msgid "Removes the registration form from blocked content" +#~ msgstr "차단된 콘텐츠로부터 회원가입 폼 제거" + +# @ wp-members +#~ msgid "Optional" +#~ msgstr "선택적" + +# @ wp-members +#~ msgid "Automatically creates an excerpt" +#~ msgstr "자동으로 요약 만들기" + +# @ wp-members +#~ msgid "Select a stylesheet or specify a custom stylesheet below" +#~ msgstr "" +#~ "스타일시트를 선택하거나 아래에서 사용자 정의 스타일시트를 특정하세요" + +#~ msgid "AIM" +#~ msgstr "AIM" + +#~ msgid "Yahoo IM" +#~ msgstr "Yahoo IM" + +#~ msgid "Jabber/Google Talk" +#~ msgstr "Jabber / 구글 토크" + +#~ msgid "" +#~ "Password successfully changed!

    You will need to re-login with " +#~ "your new password." +#~ msgstr "" +#~ "비밀번호 변경이 성공했습니다!

    새 비밀번호로 재로그인 해야 합니" +#~ "다." + +#~ msgid "" +#~ "Password successfully reset!

    An email containing a new " +#~ "password has been sent to the email address on file for your account. You " +#~ "may change this random password then re-login with your new password." +#~ msgstr "" +#~ "비밀번호 초기화가 성공했습니다!

    새 비밀번호가 포함된 이메일을 " +#~ "계정 이메일 주소로 보냈습니다. 이 랜덤 비밀번호를 변경할 수 있으며 새로운 " +#~ "비밀번호로 재 로그인 하세요." diff --git a/i18n/languages/wp-members-pl_PL.mo b/i18n/languages/wp-members-pl_PL.mo new file mode 100644 index 00000000..499964b9 Binary files /dev/null and b/i18n/languages/wp-members-pl_PL.mo differ diff --git a/i18n/languages/wp-members-pl_PL.po b/i18n/languages/wp-members-pl_PL.po new file mode 100644 index 00000000..30d2f70e --- /dev/null +++ b/i18n/languages/wp-members-pl_PL.po @@ -0,0 +1,2897 @@ +# Copyright (C) 2010 WP-Members +# This file is distributed under the same license as the WP-Members package. +msgid "" +msgstr "" +"Project-Id-Version: WP-Members 3.2.6\n" +"Report-Msgid-Bugs-To: http://wordpress.org/tag/wp-members\n" +"POT-Creation-Date: 2023-01-06 15:20-0500\n" +"PO-Revision-Date: 2023-01-06 15:23-0500\n" +"Last-Translator: \n" +"Language-Team: \n" +"Language: pl_PL\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Poedit 2.4.3\n" + +#: includes/admin/class-wp-members-admin-api.php:254 +msgid "Custom email" +msgstr "" + +#: includes/admin/class-wp-members-admin-api.php:255 +#: includes/admin/class-wp-members-admin-api.php:257 +#, fuzzy +msgid "Subject" +msgstr "Wyślij" + +#: includes/admin/class-wp-members-admin-api.php:258 +msgid "Body" +msgstr "" + +#: includes/admin/class-wp-members-admin-api.php:260 +msgid "Your custom email message content." +msgstr "" + +#: includes/admin/class-wp-members-admin-api.php:338 +msgid "Options" +msgstr "Opcje" + +#: includes/admin/class-wp-members-admin-api.php:339 +msgid "Fields" +msgstr "Pola" + +#: includes/admin/class-wp-members-admin-api.php:340 +msgid "Dialogs" +msgstr "Komunikaty" + +#: includes/admin/class-wp-members-admin-api.php:341 +#, fuzzy +msgid "Emails" +msgstr "Email" + +#: includes/admin/class-wp-members-admin-api.php:357 +#, fuzzy +msgid "New Registration" +msgstr "Nowe hasło" + +#: includes/admin/class-wp-members-admin-api.php:365 +#: includes/admin/class-wp-members-admin-api.php:383 +msgid "User email validated" +msgstr "" + +#: includes/admin/class-wp-members-admin-api.php:375 +#, fuzzy +msgid "Registration is Moderated" +msgstr "Zakończona rejestracja" + +#: includes/admin/class-wp-members-admin-api.php:391 +#, fuzzy +msgid "Registration is Moderated, User is Approved" +msgstr "Twoje zgłoszenie w %s zostało zaakceptowane" + +#: includes/admin/class-wp-members-admin-api.php:399 +#, fuzzy +msgid "Password Reset" +msgstr "Resetowanie hasła" + +#: includes/admin/class-wp-members-admin-api.php:406 +msgid "Retrieve Username" +msgstr "" + +#: includes/admin/class-wp-members-admin-api.php:414 +#, fuzzy +msgid "Admin Notification" +msgstr "Powiadomienia dla admina" + +#: includes/admin/class-wp-members-admin-api.php:440 +msgid "Restricted post (or page), displays above the login/registration form" +msgstr "" +"Tekst wyświetlany we wpisie lub stronie nad formularzem do logowania / " +"rejestracji" + +#: includes/admin/class-wp-members-admin-api.php:441 +msgid "Username is taken" +msgstr "Zajęta nazwa użytkownika" + +#: includes/admin/class-wp-members-admin-api.php:442 +msgid "Email is registered" +msgstr "Zajęty adres email" + +#: includes/admin/class-wp-members-admin-api.php:443 +msgid "Registration completed" +msgstr "Zakończona rejestracja" + +#: includes/admin/class-wp-members-admin-api.php:444 +msgid "User update" +msgstr "Aktualizacja użytkownika" + +#: includes/admin/class-wp-members-admin-api.php:445 +msgid "Passwords did not match" +msgstr "Niezgadzające się hasła" + +#: includes/admin/class-wp-members-admin-api.php:446 +msgid "Password changes" +msgstr "Zmiana hasła" + +#: includes/admin/class-wp-members-admin-api.php:447 +msgid "Username or email do not exist when trying to reset forgotten password" +msgstr "" +"Nie istniejące w bazie loginy lub emaile podane przy akcji resetowania hasła" + +#: includes/admin/class-wp-members-admin-api.php:448 +msgid "Password reset" +msgstr "Resetowanie hasła" + +#: includes/admin/class-wp-members-admin-api.php:547 +msgid "Close" +msgstr "" + +#: includes/admin/class-wp-members-admin-api.php:596 +msgid "Settings" +msgstr "Ustawienia" + +#: includes/admin/class-wp-members-admin-posts.php:30 +#: includes/admin/class-wp-members-admin-posts.php:33 +msgid "Unrestrict" +msgstr "" + +#: includes/admin/class-wp-members-admin-posts.php:31 +#: includes/admin/class-wp-members-admin-posts.php:34 +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:110 +msgid "Restrict" +msgstr "" + +#: includes/admin/class-wp-members-admin-posts.php:32 +#: includes/admin/class-wp-members-admin-posts.php:35 +msgid "Hide" +msgstr "" + +#: includes/admin/class-wp-members-admin-posts.php:125 +#, php-format +msgid "%s restricted" +msgstr "" + +#: includes/admin/class-wp-members-admin-posts.php:125 +#, php-format +msgid "%s unrestricted" +msgstr "" + +#: includes/admin/class-wp-members-admin-posts.php:165 +#, php-format +msgid "%s Restriction" +msgstr "" + +#: includes/admin/class-wp-members-admin-posts.php:195 +#: includes/admin/class-wp-members-admin-posts.php:342 +#: includes/admin/class-wp-members-admin-posts.php:345 +msgid "Unrestricted" +msgstr "" + +#: includes/admin/class-wp-members-admin-posts.php:196 +#: includes/admin/class-wp-members-admin-posts.php:339 +#: includes/admin/class-wp-members-admin-posts.php:347 +msgid "Restricted" +msgstr "" + +#: includes/admin/class-wp-members-admin-posts.php:197 +#: includes/admin/class-wp-members-admin-posts.php:349 +msgid "Hidden" +msgstr "" + +#: includes/admin/class-wp-members-admin-posts.php:203 +msgid "Status:" +msgstr "" + +#: includes/admin/class-wp-members-admin-posts.php:203 +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:68 +#: includes/admin/tabs/class-wp-members-fields-table.php:65 +#: includes/walkers/class-wp-members-walker-nav-menu.php:140 +#, fuzzy +msgid "Edit" +msgstr "Edytuj swoje dane" + +#: includes/admin/class-wp-members-admin-posts.php:218 +msgid "Ok" +msgstr "" + +#: includes/admin/class-wp-members-admin-posts.php:219 +#: includes/walkers/class-wp-members-walker-nav-menu.php:224 +msgid "Cancel" +msgstr "" + +#: includes/admin/class-wp-members-admin-posts.php:305 +msgid "Status" +msgstr "" + +#: includes/admin/class-wp-members-admin-users.php:28 +#: includes/admin/class-wp-members-admin-users.php:34 +#: includes/admin/class-wp-members-admin-users.php:79 +msgid "Activate" +msgstr "Aktywuj" + +#: includes/admin/class-wp-members-admin-users.php:29 +#: includes/admin/class-wp-members-admin-users.php:35 +#: includes/admin/class-wp-members-admin-users.php:82 +msgid "Deactivate" +msgstr "" + +#: includes/admin/class-wp-members-admin-users.php:31 +#: includes/admin/class-wp-members-admin-users.php:37 +msgid "Export" +msgstr "Eksportuj" + +#: includes/admin/class-wp-members-admin-users.php:32 +#: includes/admin/class-wp-members-admin-users.php:38 +#, fuzzy +msgid "Export All Users" +msgstr "Eksportuj" + +#: includes/admin/class-wp-members-admin-users.php:61 +msgid "Confirm" +msgstr "" + +#: includes/admin/class-wp-members-admin-users.php:64 +msgid "Unconfirm" +msgstr "" + +#: includes/admin/class-wp-members-admin-users.php:147 +#, php-format +msgid "%s users activated" +msgstr "" + +#: includes/admin/class-wp-members-admin-users.php:147 +#, php-format +msgid "%s users deactivated" +msgstr "" + +#: includes/admin/class-wp-members-admin-users.php:150 +msgid "No users selected" +msgstr "" + +#: includes/admin/class-wp-members-admin-users.php:168 +msgid "You cannot activate or deactivate yourself" +msgstr "" + +#: includes/admin/class-wp-members-admin-users.php:173 +#, php-format +msgid "%s activated" +msgstr "" + +#: includes/admin/class-wp-members-admin-users.php:178 +#, php-format +msgid "%s deactivated" +msgstr "" + +#: includes/admin/class-wp-members-admin-users.php:182 +msgid "That user is already active" +msgstr "" + +#: includes/admin/class-wp-members-admin-users.php:198 +msgid "You cannot confirm or unconfirm yourself" +msgstr "" + +#: includes/admin/class-wp-members-admin-users.php:203 +#, php-format +msgid "%s confirmed" +msgstr "" + +#: includes/admin/class-wp-members-admin-users.php:208 +#, php-format +msgid "%s unconfirmed" +msgstr "" + +#: includes/admin/class-wp-members-admin-users.php:212 +msgid "That user is already confirmed" +msgstr "" + +#: includes/admin/class-wp-members-admin-users.php:341 +msgid "Pending" +msgstr "" + +#: includes/admin/class-wp-members-admin-users.php:342 +msgid "Trial" +msgstr "" + +#: includes/admin/class-wp-members-admin-users.php:343 +#: includes/admin/class-wp-members-user-export.php:289 +msgid "Subscription" +msgstr "Subskrypcja" + +#: includes/admin/class-wp-members-admin-users.php:344 +msgid "Expired" +msgstr "" + +#: includes/admin/class-wp-members-admin-users.php:347 +#: includes/admin/class-wp-members-admin-users.php:410 +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:457 +msgid "Activated" +msgstr "" + +#: includes/admin/class-wp-members-admin-users.php:348 +msgid "Pending Activation" +msgstr "" + +#: includes/admin/class-wp-members-admin-users.php:349 +msgid "Deactivated" +msgstr "" + +#: includes/admin/class-wp-members-admin-users.php:352 +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:456 +msgid "Confirmed" +msgstr "" + +#: includes/admin/class-wp-members-admin-users.php:353 +msgid "Not Confirmed" +msgstr "" + +#: includes/admin/class-wp-members-admin-users.php:355 +msgid "Not Exported" +msgstr "" + +#: includes/admin/class-wp-members-admin-users.php:475 +msgid "Not confirmed" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:67 +msgid "Slug" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:68 +#: includes/admin/class-wp-members-user-export.php:294 +msgid "Role" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:69 +#: includes/admin/class-wp-members-products-admin.php:740 +#: includes/admin/class-wp-members-user-export.php:290 +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:460 +msgid "Expires" +msgstr "Wygasa" + +#: includes/admin/class-wp-members-products-admin.php:71 +msgid "Default" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:73 +msgid "Last updated" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:97 +msgid "slug:" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:100 +msgid "No role required" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:105 +msgid "Does not expire" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:109 +#: includes/admin/class-wp-members-user-export.php:199 +msgid "Yes" +msgstr "Tak" + +#: includes/admin/class-wp-members-products-admin.php:145 +msgid "Membership Product Details" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:153 +msgid "Membership Product Message (optional)" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:169 +msgid "Access by child membership" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:185 +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:62 +msgid "Posts" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:186 +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:63 +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:249 +#, fuzzy +msgid "Pages" +msgstr "Domyślnie blokuj strony" + +#: includes/admin/class-wp-members-products-admin.php:213 +#: includes/admin/class-wp-members-products-admin.php:262 +#: includes/admin/class-wp-members-products-admin.php:309 +msgid "Period" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:213 +msgid "Day" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:213 +msgid "Week" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:213 +msgid "Month" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:213 +msgid "Year" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:226 +msgid "Name (slug)" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:228 +msgid "Optional Defaults" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:231 +msgid "Assign as default at registration? (optional)" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:239 +#, php-format +msgid "Pre-selected by default for new %s" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:245 +msgid "Optional Properties" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:248 +msgid "Role Required? (optional)" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:251 +msgid "No Role" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:257 +msgid "Expires (optional)" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:259 +#: includes/admin/class-wp-members-products-admin.php:261 +#: includes/admin/class-wp-members-products-admin.php:306 +#: includes/admin/class-wp-members-products-admin.php:308 +msgid "Number" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:267 +msgid "Use \"no gap\" renewal" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:271 +msgid "Use a fixed period (such as Jan 1 - Dec 31, or Sept 1 - Aug 31)" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:288 +#: includes/admin/class-wp-members-products-admin.php:289 +msgid "Period Start (dd-mm)" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:290 +#: includes/admin/class-wp-members-products-admin.php:291 +msgid "Period End (dd-mm)" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:304 +msgid "Fixed period grace period" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:313 +msgid "" +"Grace period is the point at which expiration date is for following time " +"period. For example, if user who register August 1st would be part of the " +"following year's Sept 1 - Aug 31 membership, set this at 1 Month. Leave " +"blank for no grace period." +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:376 +msgid "" +"Restricted Message (displays when a user does not have access to a " +"membership)" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:502 +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:239 +#: includes/class-wp-members-forms.php:1196 +#: includes/class-wp-members-user-profile.php:132 +msgid "None" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:517 +msgid "Restrict access by membership:" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:598 +msgid "Required Membership" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:644 +#: includes/admin/class-wp-members-products-admin.php:745 +#: includes/class-wp-members-products.php:335 +msgid "Membership" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:680 +msgid "expires:" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:709 +#: includes/class-wp-members-products.php:336 +#: includes/class-wp-members-products.php:341 +msgid "Memberships" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:736 +msgid "Membership Access" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:744 +msgid "Action" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:746 +msgid "Enabled?" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:757 +msgid "Enable" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:758 +msgid "Disable" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:759 +msgid "Update" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:764 +msgid "Expiration date (optional)" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:795 +#, php-format +msgid "No memberships have been created. %sCreate new memberships here%s" +msgstr "" + +#: includes/admin/class-wp-members-user-export.php:199 +msgid "No" +msgstr "Nie" + +#: includes/admin/class-wp-members-user-export.php:264 +msgid "You do not have the required user capabilities to export users." +msgstr "" + +#: includes/admin/class-wp-members-user-export.php:277 +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:461 +msgid "User ID" +msgstr "" + +#: includes/admin/class-wp-members-user-export.php:284 +#: includes/class-wp-members-dialogs.php:91 +#: includes/class-wp-members-dialogs.php:114 +msgid "Username" +msgstr "Nazwa użytkownika" + +#: includes/admin/class-wp-members-user-export.php:286 +msgid "Activated?" +msgstr "Aktywowany?" + +#: includes/admin/class-wp-members-user-export.php:292 +msgid "Registered" +msgstr "Rejestracja" + +#: includes/admin/class-wp-members-user-export.php:293 +msgid "IP" +msgstr "IP" + +#: includes/admin/dialogs.php:117 +msgid "" +"Your WP settings allow anyone to register - this is not the recommended " +"setting." +msgstr "" +"Twoje ustawienia WP pozwalają się zarejestrować dowolnej osobie - nie jest " +"to rekomendowane ustawienie." + +#: includes/admin/dialogs.php:118 +#, php-format +msgid "" +"You can %s change this here %s making sure the box next to \"Anyone can " +"register\" is unchecked." +msgstr "" +"Możesz to zmienić %s wchodząc tutaj %s i odznaczając pole \"Każdy może się " +"zarejestrować\"." + +#: includes/admin/dialogs.php:119 +msgid "" +"This setting allows a link on the /wp-login.php page to register using the " +"WP native registration process thus circumventing any registration you are " +"using with WP-Members. In some cases, this may suit the users wants/needs, " +"but most users should uncheck this option. If you do not change this " +"setting, you can choose to ignore these warning messages under WP-Members " +"Settings." +msgstr "" +"To ustawienie pozwala rejestrować się użytkownikom na stronie /wp-login.php " +"przez natywne procesy rejestracji WP. W niektórych sytuacjach może okazać " +"się to przydatne, ale w większości wypadków polecamy wyłączenie tej opcji. " +"Jeśli nie chcesz jej wyłączać, możesz wybrać ignorowanie tego komunikatu w " +"ustawieniach WP-Members." + +#: includes/admin/dialogs.php:123 +msgid "" +"Your WP settings allow anyone to comment - this is not the recommended " +"setting." +msgstr "" +"Twoje ustawienia WP pozwalają dodawać komentarze dowolnej osobie - nie jest " +"to rekomendowane ustawienie." + +#: includes/admin/dialogs.php:124 +#, fuzzy, php-format +msgid "" +"You can %s change this here %s by checking the box next to \"Users must be " +"registered and logged in to comment.\"" +msgstr "" +"Możesz to zmienić %s wchodząc tutaj %s i odznaczając pole \"Każdy może się " +"zarejestrować\"." + +#: includes/admin/dialogs.php:125 +msgid "" +"This setting allows any users to comment, whether or not they are " +"registered. Depending on how you are using WP-Members will determine whether " +"you should change this setting or not. If you do not change this setting, " +"you can choose to ignore these warning messages under WP-Members Settings." +msgstr "" +"To ustawienie pozwala dodawać komentarze nawet niezarejestrowanym " +"użytkownikom. Ustawienie to powinno się dostosować do tego jaki masz zamiar " +"wykorzystywania wtyczki WP-Members. Jeśli nie chcesz tego zmieniać, możesz " +"wybrać ignorowanie tego komunikatu w ustawieniach WP-Members." + +#: includes/admin/dialogs.php:129 +msgid "" +"Your WP settings allow full text rss feeds - this is not the recommended " +"setting." +msgstr "" +"Twoje ustawienia WP umożliwiają wyświetlanie pełnych treści wpisów poprzez " +"RSS - nie jest to rekomendowane ustawienie." + +#: includes/admin/dialogs.php:130 +#, php-format +msgid "" +"You can %s change this here %s by changing \"For each article in a feed, show" +"\" to \"Summary.\"" +msgstr "" + +#: includes/admin/dialogs.php:131 +msgid "" +"Leaving this set to full text allows anyone to read your protected content " +"in an RSS reader. Changing this to Summary prevents this as your feeds will " +"only show summary text." +msgstr "" +"Pozostawienie tego ustawienia pozwala komukolwiek na podejrzenie zawartości " +"chronionych wpisów poprzez kanał RSS. Zmiana tego ustawienia spowoduje " +"wyświetlenie w kanale RSS tylko krótkiego wstępu." + +#: includes/admin/dialogs.php:135 +msgid "You have set WP-Members to hold registrations for approval" +msgstr "" +"WP-Members jest skonfigurowane tak aby rejestracje użytkowników przechodziły " +"przez moderację admina." + +#: includes/admin/dialogs.php:136 +msgid "" +"but you have not changed the default message for \"Registration Completed\" " +"under \"WP-Members Dialogs and Error Messages.\" You should change this " +"message to let users know they are pending approval." +msgstr "" + +#: includes/admin/dialogs.php:140 +msgid "You have turned on reCAPTCHA" +msgstr "Jest włączona reCAPTCHA" + +#: includes/admin/dialogs.php:141 +msgid "" +"but you have not entered API keys. You will need both a public and private " +"key. The CAPTCHA will not display unless a valid API key is included." +msgstr "" + +#: includes/admin/dialogs.php:145 +msgid "You have active settings that are not recommended." +msgstr "" + +#: includes/admin/dialogs.php:146 +msgid "" +"If you will not be changing these settings, you can turn off these warning " +"messages by checking the \"Ignore warning messages\" in the settings below." +msgstr "" + +#: includes/admin/dialogs.php:174 +msgid "Version:" +msgstr "Wersja:" + +#: includes/admin/dialogs.php:175 +#, fuzzy +msgid "Quick Start Guide" +msgstr "Aktualizacja użytkownika" + +#: includes/admin/dialogs.php:176 +#, fuzzy +msgid "Online User Guide" +msgstr "Aktualizacja użytkownika" + +#: includes/admin/dialogs.php:177 +msgid "FAQs" +msgstr "" + +#: includes/admin/dialogs.php:184 +#, fuzzy +msgid "Thank you for using WP-Members" +msgstr "Dziękujemy za używanie WP-Members! Używasz wersji " + +#: includes/admin/dialogs.php:185 +msgid "A plugin developed by" +msgstr "" + +#: includes/admin/dialogs.php:186 +msgid "Follow" +msgstr "Obserwuj" + +#: includes/admin/dialogs.php:203 includes/admin/dialogs.php:207 +msgid "Latest from RocketGeek" +msgstr "" + +#: includes/admin/dialogs.php:224 +msgid "Like WP-Members?" +msgstr "" + +#: includes/admin/dialogs.php:225 +#, php-format +msgid "" +"If you like WP-Members please give it a %s★★★★★" +"%s rating. Thanks!!" +msgstr "" + +#: includes/admin/dialogs.php:236 includes/admin/dialogs.php:249 +msgid "Latest from ButlerBlog" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:67 +#, php-format +msgid "See the %sUsers Guide on CAPTCHA%s." +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:74 +#: includes/admin/tabs/class-wp-members-admin-tab-dialogs.php:57 +#: includes/admin/tabs/class-wp-members-admin-tab-emails.php:109 +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:134 +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:78 +msgid "Need help?" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:85 +msgid "Manage CAPTCHA Options" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:91 +msgid "CAPTCHA Type" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:96 +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:243 +msgid "reCAPTCHA v2" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:97 +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:244 +msgid "reCAPTCHA v3" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:98 +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:245 +msgid "Really Simple CAPTCHA" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:99 +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:246 +msgid "hCaptcha" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:106 +msgid "" +"CAPTCHA type was changed. Please verify and update the settings below for " +"the new CAPTCHA type." +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:117 +msgid "reCAPTCHA Keys" +msgstr "Klucze reCAPTCHA" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:120 +#, php-format +msgid "" +"reCAPTCHA requires an API key, consisting of a \"site\" and a \"secret\" " +"key. You can sign up for a %s free reCAPTCHA key%s" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:122 +msgid "Site Key" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:123 +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:139 +msgid "Secret Key" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:133 +msgid "hCaptcha Keys" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:136 +#, php-format +msgid "" +"hCaptcha requires an API key. You can sign up for %s an hCaptcha API key " +"here %s" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:138 +msgid "API Key" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:170 +msgid "Characters for image" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:174 +msgid "Number of characters" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:178 +msgid "Image dimensions" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:179 +msgid "Width" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:179 +msgid "Height" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:182 +msgid "Font color of characters" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:186 +msgid "Background color of image" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:190 +msgid "Font size" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:194 +msgid "Width between characters" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:198 +#, fuzzy +msgid "Image type" +msgstr "Typ pola" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:213 +msgid "" +"To use Really Simple CAPTCHA, you must have the Really Simple CAPTCHA plugin " +"installed and activated." +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:241 +#, fuzzy +msgid "Update CAPTCHA Settings" +msgstr "Zapisz ustawienia reCAPTCHA" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:319 +#, fuzzy +msgid "CAPTCHA was updated for WP-Members" +msgstr "Ustawienia reCAPTCHA zostały zapisane" + +#: includes/admin/tabs/class-wp-members-admin-tab-dialogs.php:67 +msgid "Dialogs and Error Messages" +msgstr "Informacje o błędach i komunikaty" + +#: includes/admin/tabs/class-wp-members-admin-tab-dialogs.php:69 +#, php-format +msgid "" +"You can customize the text for dialogs and error messages. Simple HTML is " +"allowed %s etc." +msgstr "" +"Możesz zmienić teksty dla informacji i komunikatów. Dozwolone są proste tagi " +"HTML %s" + +#: includes/admin/tabs/class-wp-members-admin-tab-dialogs.php:80 +msgid "Terms of Service (TOS)" +msgstr "Regulamin serwisu" + +#: includes/admin/tabs/class-wp-members-admin-tab-dialogs.php:87 +msgid "Update Dialogs" +msgstr "Zapisz komunikaty" + +#: includes/admin/tabs/class-wp-members-admin-tab-dialogs.php:124 +msgid "WP-Members dialogs were updated" +msgstr "Komunikaty WP-Members zostały zapisane" + +#: includes/admin/tabs/class-wp-members-admin-tab-dropins.php:88 +#: includes/admin/tabs/class-wp-members-dropins-table.php:180 +msgid "WP-Members Dropin settings were updated" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-dropins.php:216 +msgid "Manage Dropins" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-dropins.php:217 +msgid "Current dropin folder: " +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-dropins.php:218 +msgid "" +"You can change location of the dropin folder using the " +"wpmem_dropin_folder filter." +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-emails.php:57 +#, fuzzy +msgid "Email Messages" +msgstr "Email" + +#: includes/admin/tabs/class-wp-members-admin-tab-emails.php:60 +msgid "You can customize the content of the emails sent by the plugin." +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-emails.php:62 +msgid "A list of shortcodes is available here." +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-emails.php:69 +#, fuzzy +msgid "Set a custom email address" +msgstr "Podano nieprawidłową nazwę użytkownika lub hasło." + +#: includes/admin/tabs/class-wp-members-admin-tab-emails.php:70 +#: includes/admin/tabs/class-wp-members-admin-tab-emails.php:74 +#: includes/admin/tabs/class-wp-members-admin-tab-emails.php:93 +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:163 +msgid "(optional)" +msgstr "Opcjonalnie" + +#: includes/admin/tabs/class-wp-members-admin-tab-emails.php:73 +msgid "Set a custom email name" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-emails.php:77 +msgid "Send HTML email" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-emails.php:93 +#, fuzzy +msgid "Email Signature" +msgstr "Email" + +#: includes/admin/tabs/class-wp-members-admin-tab-emails.php:101 +#, fuzzy +msgid "Update Emails" +msgstr "Aktualizacja użytkownika" + +#: includes/admin/tabs/class-wp-members-admin-tab-emails.php:172 +#, fuzzy +msgid "WP-Members emails were updated" +msgstr "Ustawienia pól formularza WP-Members zostały zapisane" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:93 +#: includes/class-wp-members-dialogs.php:65 +msgid "No fields selected for deletion" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:95 +msgid "Are you sure you want to delete the following fields?" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:122 +msgid "Fields deleted" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:136 +msgid "Field Manager Documentation" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:164 +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:315 +#: includes/class-wp-members-forms.php:1629 +#: includes/class-wp-members-forms.php:1821 +#: includes/class-wp-members-user-profile.php:181 +msgid "(required)" +msgstr "Wymagane?" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:169 +#, fuzzy +msgid "Edit Field" +msgstr "Edytuj swoje dane" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:169 +#, fuzzy +msgid "Add a Field" +msgstr "Dodaj/Usuń" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:174 +msgid "Field Label" +msgstr "Opis pola" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:176 +msgid "The name of the field as it will be displayed to the user." +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:179 +#: includes/admin/tabs/class-wp-members-fields-table.php:58 +msgid "Meta Key" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:185 +msgid "" +"The database meta value for the field. It must be unique and contain no " +"spaces (underscores are ok)." +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:189 +#: includes/admin/tabs/class-wp-members-fields-table.php:59 +msgid "Field Type" +msgstr "Typ pola" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:195 +#, fuzzy +msgid "text" +msgstr "" +"Twoje ustawienia WP umożliwiają wyświetlanie pełnych treści wpisów poprzez " +"RSS - nie jest to rekomendowane ustawienie." + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:196 +msgid "email" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:197 +msgid "textarea" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:198 +#, fuzzy +msgid "checkbox" +msgstr "pole wyboru" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:199 +msgid "multiple checkbox" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:200 +msgid "select (dropdown)" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:201 +msgid "multiple select" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:202 +msgid "radio group" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:203 +#, fuzzy +msgid "password" +msgstr "Hasło" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:204 +msgid "image" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:205 +msgid "file" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:206 +msgid "url" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:207 +msgid "number" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:208 +msgid "date" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:209 +msgid "hidden" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:211 +msgid "membership" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:217 +#: includes/admin/tabs/class-wp-members-fields-table.php:60 +msgid "Display?" +msgstr "Wyświetl?" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:221 +msgid "This field is always displayed" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:226 +msgid "Required?" +msgstr "Wymagane?" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:230 +msgid "This field is always required" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:236 +msgid "Allow HTML?" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:243 +msgid "Placeholder" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:251 +msgid "Pattern" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:259 +msgid "Title" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:268 +msgid "Minimum Value" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:272 +msgid "Maximum Value" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:280 +msgid "Rows" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:284 +msgid "Columns" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:292 +msgid "Accepted file types:" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:297 +msgid "Accepted file types should be set like this: jpg|jpeg|png|gif" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:304 +#, fuzzy +msgid "Checked by default?" +msgstr "Zaznaczone?" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:308 +msgid "HTML label position" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:310 +msgid "Before the input tag" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:311 +msgid "After the input tag" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:312 +msgid "" +"Selecting \"after\" will generally display the label to the right of the " +"checkbox" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:315 +#, fuzzy +msgid "Stored value if checked:" +msgstr "Zaznaczone?" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:336 +msgid "Stored values delimiter:" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:345 +msgid "Values (Displayed|Stored):" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:370 +msgid "Options should be Option Name|option_value," +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:374 +msgid "Visit plugin site for more information" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:381 +msgid "Value" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:400 +msgid "Save Changes" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:400 +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:527 +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:528 +#, fuzzy +msgid "Add Field" +msgstr "Dodaj/Usuń" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:402 +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:726 +msgid "Return to Fields Table" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:449 +msgid "Drag and drop to reorder fields" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:455 +#, fuzzy +msgid "Registration Date" +msgstr "Zakończona rejestracja" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:458 +msgid "Registration IP" +msgstr "IP z rejestracji" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:459 +msgid "Subscription Type" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:495 +msgid "Manage Fields" +msgstr "Zarządzaj polami formularza" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:595 +msgid "WP-Members fields were updated" +msgstr "Ustawienia pól formularza WP-Members zostały zapisane" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:617 +msgid "Field Label is required. Nothing was updated." +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:618 +msgid "Meta Key is required. Nothing was updated." +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:620 +msgid "Meta Key must contain only letters, numbers, and underscores" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:627 +msgid "A field with that meta key already exists" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:632 +#, php-format +msgid "" +"Sorry, \"%s\" is a reserved term. " +"Field was not added." +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:673 +msgid "Checked value is required for checkboxes. Nothing was updated." +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:705 +msgid "A value is required for hidden fields. Nothing was updated." +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:712 +#, php-format +msgid "%s was added" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:725 +#, php-format +msgid "%s was updated" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:768 +msgid "Form field order updated." +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:56 +#, php-format +msgid "%sChange%s or %sFilter%s this address" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:57 +#, php-format +msgid "See the %sUsers Guide on plugin options%s." +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:90 +msgid "Manage Options" +msgstr "Zarządzaj ustawieniami" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:94 +msgid "Content" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:105 +msgid "Content Restriction" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:109 +msgid "Do not restrict" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:123 +msgid "Show Excerpts" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:124 +msgid "Show Login Form" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:125 +msgid "Show Registration Form" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:126 +#, fuzzy +msgid "Auto Excerpt:" +msgstr "Pokaż fragmenty" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:148 +#, fuzzy +msgid "Number of words in excerpt:" +msgstr "Pokaż fragmenty" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:149 +msgid "Custom read more link (optional):" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:163 +msgid "Time-based expiration" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:163 +msgid "Allows for access to expire" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:164 +msgid "Trial period" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:164 +msgid "Allows for a trial period" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:166 +msgid "Subscription Settings" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:176 +msgid "New Feature Settings" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:182 +msgid "Legacy Password Reset" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:182 +#, php-format +msgid "Use legacy password reset. %s(Requires additional configuration)%s" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:184 +msgid "Legacy Login Error" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:184 +msgid "Use legacy WP-Members login error instead of WP error object." +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:187 +msgid "WooCommerce My Account" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:187 +msgid "Add WP-Members fields to WooCommerce My Account registration" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:188 +msgid "WooCommerce Checkout" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:188 +msgid "Add WP-Members fields to WooCommerce registration during checkout" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:204 +msgid "Other Settings" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:214 +msgid "Enable memberships" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:214 +#, php-format +msgid "Enables creation of different %s membership products %s" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:215 +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:223 +msgid "Clone menus" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:215 +msgid "Enables logged in menus" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:216 +msgid "Notify admin" +msgstr "Powiadomienia dla admina" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:216 +#, fuzzy, php-format +msgid "Notify %s for each new registration? %s" +msgstr "Wysłać email do admina po każdej rejestracji?" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:217 +msgid "Moderate registration" +msgstr "Moderowanie rejestracji" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:217 +msgid "Holds new registrations for admin approval" +msgstr "Wstrzymaj nowych użytkowników do akceptacji admina" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:218 +msgid "Confirmation Link" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:218 +#, php-format +msgid "" +"Send email confirmation link on new registration. %s(Requires additional " +"configuration)%s" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:219 +#, fuzzy +msgid "Ignore warning messages" +msgstr "" +"To ustawienie pozwala dodawać komentarze nawet niezarejestrowanym " +"użytkownikom. Ustawienie to powinno się dostosować do tego jaki masz zamiar " +"wykorzystywania wtyczki WP-Members. Jeśli nie chcesz tego zmieniać, możesz " +"wybrać ignorowanie tego komunikatu w ustawieniach WP-Members." + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:219 +msgid "Ignores WP-Members warning messages in the admin panel" +msgstr "Ignoruj ostrzeżenia WP-Members w panelu administracyjnym" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:233 +msgid "Attribution" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:235 +msgid "" +"Attribution is appreciated! Display \"powered by\" link on register form?" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:238 +msgid "Enable CAPTCHA for Registration" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:253 +msgid "Login Page:" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:256 +msgid "Specify a login page (optional)" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:265 +#, fuzzy +msgid "Register Page:" +msgstr "Adres formularze rejestracji:" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:268 +msgid "For creating a register link in the login form" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:277 +#, fuzzy +msgid "User Profile Page:" +msgstr "Aktualizacja użytkownika" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:280 +msgid "For creating a forgot password link in the login form" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:286 +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:288 +msgid "Stylesheet" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:297 +#, fuzzy +msgid "Custom Stylesheet:" +msgstr "Dostosowany" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:302 +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:329 +msgid "Update Settings" +msgstr "Zapisz ustawienia" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:310 +msgid "Custom Post Types" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:316 +msgid "Add to WP-Members Settings" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:332 +msgid "" +"Please keep in mind that Custom Post Types are \"custom\" and therefore, not " +"all of them will function exactly the same way. WP-Members will certainly " +"work with any post type that operate like a post or a page; but you will " +"need to review any custom post type added to determine that it functions the " +"way you expect." +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:342 +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:343 +msgid "WP-Members Settings" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:344 +msgid "" +"The following is your WP-Members settings information if needed for support." +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:378 +msgid "Click to Copy" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:458 +msgid "Custom Post Type settings were updated" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:579 +msgid "WP-Members settings were updated" +msgstr "Ustawienia WP-Members zostały zapisane" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:651 +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:682 +msgid "USE CUSTOM URL BELOW" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:671 +#, fuzzy +msgid "Select a page" +msgstr "Wybierz stronę" + +#: includes/admin/tabs/class-wp-members-dropins-table.php:70 +msgid "Name" +msgstr "" + +#: includes/admin/tabs/class-wp-members-dropins-table.php:71 +msgid "Enabled" +msgstr "" + +#: includes/admin/tabs/class-wp-members-dropins-table.php:72 +msgid "File" +msgstr "" + +#: includes/admin/tabs/class-wp-members-dropins-table.php:73 +msgid "Version" +msgstr "" + +#: includes/admin/tabs/class-wp-members-dropins-table.php:74 +#: includes/walkers/class-wp-members-walker-nav-menu.php:186 +msgid "Description" +msgstr "" + +#: includes/admin/tabs/class-wp-members-dropins-table.php:117 +#: includes/admin/tabs/class-wp-members-fields-table.php:108 +msgid "Save Settings" +msgstr "" + +#: includes/admin/tabs/class-wp-members-fields-table.php:43 +msgid "delete" +msgstr "" + +#: includes/admin/tabs/class-wp-members-fields-table.php:57 +msgid "Display Label" +msgstr "" + +#: includes/admin/tabs/class-wp-members-fields-table.php:61 +msgid "Required" +msgstr "" + +#: includes/admin/tabs/class-wp-members-fields-table.php:63 +#, fuzzy +msgid "Users Screen" +msgstr "Eksportuj" + +#: includes/admin/tabs/class-wp-members-fields-table.php:64 +msgid "Users Search" +msgstr "" + +#: includes/admin/tabs/class-wp-members-fields-table.php:66 +msgid "Sort" +msgstr "" + +#: includes/admin/tabs/class-wp-members-fields-table.php:107 +msgid "Delete Selected" +msgstr "" + +#: includes/api/api-forms.php:584 +#, php-format +msgid "%s is a required field." +msgstr "" + +#: includes/class-wp-members-captcha.php:276 includes/deprecated.php:401 +msgid "You have entered an incorrect code value. Please try again." +msgstr "" + +#: includes/class-wp-members-dialogs.php:41 +msgid "First Name" +msgstr "Imię" + +#: includes/class-wp-members-dialogs.php:42 +msgid "Last Name" +msgstr "Nazwisko" + +#: includes/class-wp-members-dialogs.php:43 +msgid "Address 1" +msgstr "Adres" + +#: includes/class-wp-members-dialogs.php:44 +msgid "Address 2" +msgstr "Adres c.d." + +#: includes/class-wp-members-dialogs.php:45 +msgid "City" +msgstr "Miasto" + +#: includes/class-wp-members-dialogs.php:46 +msgid "State" +msgstr "Województwo" + +#: includes/class-wp-members-dialogs.php:47 +msgid "Zip" +msgstr "Kod pocztowy" + +#: includes/class-wp-members-dialogs.php:48 +msgid "Country" +msgstr "Państwo" + +#: includes/class-wp-members-dialogs.php:49 +msgid "Day Phone" +msgstr "Telefon" + +#: includes/class-wp-members-dialogs.php:50 +#: includes/class-wp-members-dialogs.php:92 +msgid "Email" +msgstr "Email" + +#: includes/class-wp-members-dialogs.php:51 +msgid "Confirm Email" +msgstr "" + +#: includes/class-wp-members-dialogs.php:52 +msgid "Website" +msgstr "Strona internetowa" + +#: includes/class-wp-members-dialogs.php:53 +msgid "Biographical Info" +msgstr "" + +#: includes/class-wp-members-dialogs.php:54 +#: includes/class-wp-members-dialogs.php:74 +#: includes/class-wp-members-dialogs.php:159 +msgid "Password" +msgstr "Hasło" + +#: includes/class-wp-members-dialogs.php:55 +msgid "Confirm Password" +msgstr "" + +#: includes/class-wp-members-dialogs.php:56 +#: includes/class-wp-members-forms.php:2165 +msgid "TOS" +msgstr "WU" + +#: includes/class-wp-members-dialogs.php:66 +#, fuzzy +msgid "You are not logged in." +msgstr "Jesteś zalogowany jako %s" + +#: includes/class-wp-members-dialogs.php:72 +#, fuzzy +msgid "Existing Users Log In" +msgstr "Zaloguj" + +#: includes/class-wp-members-dialogs.php:73 +#: includes/class-wp-members-dialogs.php:158 +msgid "Username or Email" +msgstr "" + +#: includes/class-wp-members-dialogs.php:75 +#: includes/class-wp-members-shortcodes.php:773 +msgid "Log In" +msgstr "Zaloguj" + +#: includes/class-wp-members-dialogs.php:76 +msgid "Remember Me" +msgstr "" + +#: includes/class-wp-members-dialogs.php:77 +msgid "Forgot password?" +msgstr "Zapomniane hasło?" + +#: includes/class-wp-members-dialogs.php:78 +msgid "Click here to reset" +msgstr "Kliknij aby zresetować hasło" + +#: includes/class-wp-members-dialogs.php:79 +#, fuzzy +msgid "New User?" +msgstr "Aktualizacja użytkownika" + +#: includes/class-wp-members-dialogs.php:80 +#, fuzzy +msgid "Click here to register" +msgstr "Kliknij aby zresetować hasło" + +#: includes/class-wp-members-dialogs.php:83 +#: includes/class-wp-members-dialogs.php:142 +msgid "Change Password" +msgstr "Zmień hasło" + +#: includes/class-wp-members-dialogs.php:84 +msgid "New password" +msgstr "" + +#: includes/class-wp-members-dialogs.php:85 +msgid "Confirm new password" +msgstr "" + +#: includes/class-wp-members-dialogs.php:86 +msgid "Update Password" +msgstr "Zmień hasło" + +#: includes/class-wp-members-dialogs.php:87 +msgid "Password successfully changed!" +msgstr "" + +#: includes/class-wp-members-dialogs.php:90 +msgid "Reset Forgotten Password" +msgstr "Przypomnienie hasła" + +#: includes/class-wp-members-dialogs.php:93 +msgid "Reset Password" +msgstr "Przypomnienie hasła" + +#: includes/class-wp-members-dialogs.php:94 +msgid "Forgot username?" +msgstr "" + +#: includes/class-wp-members-dialogs.php:95 +msgid "Click here" +msgstr "" + +#: includes/class-wp-members-dialogs.php:98 +#: includes/class-wp-members-dialogs.php:100 +msgid "Retrieve username" +msgstr "" + +#: includes/class-wp-members-dialogs.php:99 +msgid "Email Address" +msgstr "" + +#: includes/class-wp-members-dialogs.php:103 +#, fuzzy +msgid "New User Registration" +msgstr "Aktualizacja użytkownika" + +#: includes/class-wp-members-dialogs.php:104 +msgid "Choose a Username" +msgstr "Wybierz nazwę użytkownika" + +#: includes/class-wp-members-dialogs.php:105 +msgid "Input the code:" +msgstr "" + +#: includes/class-wp-members-dialogs.php:106 +#: includes/class-wp-members-forms.php:2164 +#, php-format +msgid "Please indicate that you agree to the %s Terms of Service %s" +msgstr "" + +#: includes/class-wp-members-dialogs.php:107 +#, fuzzy +msgid "Reset Form" +msgstr "Nieprawidłowy kod CAPTCHA." + +#: includes/class-wp-members-dialogs.php:108 +#: includes/class-wp-members-dialogs.php:162 +#: includes/class-wp-members-shortcodes.php:770 +#: includes/class-wp-members-user.php:186 +#, fuzzy +msgid "Register" +msgstr "" +"Twoje ustawienia WP pozwalają się zarejestrować dowolnej osobie - nie jest " +"to rekomendowane ustawienie." + +#: includes/class-wp-members-dialogs.php:110 +msgid "Required field" +msgstr "Pole wymagane" + +#: includes/class-wp-members-dialogs.php:113 +msgid "Edit Your Information" +msgstr "Edytuj swoje dane" + +#: includes/class-wp-members-dialogs.php:115 +#, fuzzy +msgid "Update Profile" +msgstr "Aktualizacja użytkownika" + +#: includes/class-wp-members-dialogs.php:116 +msgid "Update this file" +msgstr "" + +#: includes/class-wp-members-dialogs.php:119 +msgid "Login Failed!" +msgstr "Nieudane logowanie!" + +#: includes/class-wp-members-dialogs.php:120 +msgid "You entered an invalid username or password." +msgstr "Podano nieprawidłową nazwę użytkownika lub hasło." + +#: includes/class-wp-members-dialogs.php:121 +msgid "Click here to continue." +msgstr "Kliknij aby kontynuować." + +#: includes/class-wp-members-dialogs.php:122 +#, fuzzy +msgid "Password fields cannot be empty" +msgstr "Niezgadzające się hasła" + +#: includes/class-wp-members-dialogs.php:123 +msgid "Sorry, that email address was not found." +msgstr "" + +#: includes/class-wp-members-dialogs.php:124 +#, php-format +msgid "An email was sent to %s with your username." +msgstr "" + +#: includes/class-wp-members-dialogs.php:125 +#, php-format +msgid "Sorry, %s is a required field." +msgstr "Przepraszamy, ale %s jest wymaganym polem." + +#: includes/class-wp-members-dialogs.php:126 +#, fuzzy +msgid "You must enter a valid email address." +msgstr "Podano nieprawidłową nazwę użytkownika lub hasło." + +#: includes/class-wp-members-dialogs.php:127 +msgid "The username cannot include non-alphanumeric characters." +msgstr "" + +#: includes/class-wp-members-dialogs.php:128 +msgid "Sorry, username is a required field" +msgstr "Przepraszamy, nazwa użytkownika jest wymagana." + +#: includes/class-wp-members-dialogs.php:129 +msgid "Sorry, that username is taken, Please try another." +msgstr "" + +#: includes/class-wp-members-dialogs.php:130 +msgid "Sorry, that email address already has an account. Please try another." +msgstr "" + +#: includes/class-wp-members-dialogs.php:131 +#: includes/class-wp-members-dialogs.php:174 +#, fuzzy +msgid "Passwords did not match." +msgstr "Niezgadzające się hasła" + +#: includes/class-wp-members-dialogs.php:132 +#, fuzzy +msgid "Emails did not match." +msgstr "Niezgadzające się hasła" + +#: includes/class-wp-members-dialogs.php:133 +msgid "You must complete the CAPTCHA form." +msgstr "Musisz przepisać kod CAPTCHA." + +#: includes/class-wp-members-dialogs.php:134 +msgid "CAPTCHA was not valid." +msgstr "" + +#: includes/class-wp-members-dialogs.php:135 +#, fuzzy +msgid "There was an error processing the form." +msgstr "Nieprawidłowy kod CAPTCHA." + +#: includes/class-wp-members-dialogs.php:136 +msgid "There was an error with the CAPTCHA form." +msgstr "Nieprawidłowy kod CAPTCHA." + +#: includes/class-wp-members-dialogs.php:137 +#, php-format +msgid "" +"Sorry, you can only upload the following file types for the %s field: %s." +msgstr "" + +#: includes/class-wp-members-dialogs.php:138 +#: includes/class-wp-members-dialogs.php:171 +msgid "Your information was updated!" +msgstr "Zmiany w Twoich danych zostały zapisane!" + +#: includes/class-wp-members-dialogs.php:141 +msgid "Edit My Information" +msgstr "Edytuj moje informacje" + +#: includes/class-wp-members-dialogs.php:143 +#: includes/class-wp-members-dialogs.php:146 +#: includes/class-wp-members-dialogs.php:148 +#: includes/class-wp-members-dialogs.php:153 +#, php-format +msgid "You are logged in as %s" +msgstr "Jesteś zalogowany jako %s" + +#: includes/class-wp-members-dialogs.php:144 +msgid "Log out" +msgstr "" + +#: includes/class-wp-members-dialogs.php:145 +msgid "Edit profile" +msgstr "" + +#: includes/class-wp-members-dialogs.php:145 +msgid "Begin using the site." +msgstr "Zapraszamy do zapoznanania się ze stroną." + +#: includes/class-wp-members-dialogs.php:147 +#, fuzzy +msgid "Click to log out" +msgstr "Zaloguj" + +#: includes/class-wp-members-dialogs.php:149 +#, fuzzy +msgid "click to log out" +msgstr "Zaloguj" + +#: includes/class-wp-members-dialogs.php:150 +msgid "Log Out" +msgstr "" + +#: includes/class-wp-members-dialogs.php:154 +msgid "click here to log out" +msgstr "wyloguj się" + +#: includes/class-wp-members-dialogs.php:155 +msgid "Login Failed!
    You entered an invalid username or password." +msgstr "" +"Błąd logowania!
    Podano nieprawidłową nazwę użytkonwnika lub hasło." + +#: includes/class-wp-members-dialogs.php:156 +msgid "Invalid username or password." +msgstr "" + +#: includes/class-wp-members-dialogs.php:160 includes/class-wp-members.php:1745 +msgid "log in" +msgstr "zaloguj" + +#: includes/class-wp-members-dialogs.php:161 +#, fuzzy +msgid "Forgot?" +msgstr "Zapomniane hasło?" + +#: includes/class-wp-members-dialogs.php:165 +#, fuzzy +msgid "" +"This content is restricted to site members. If you are an existing user, " +"please log in. New users may register below." +msgstr "" +"Zawartość jest dostępna tylko dla zarejestrowanych osób. Jeżeli jesteś " +"zarejestrowany/a, prosimy o zalogowanie się. Nowi użytkownicy mogą się " +"zarejestrować poniżej." + +#: includes/class-wp-members-dialogs.php:166 +#, fuzzy +msgid "" +"Congratulations! Your registration was successful.

    You may now " +"log in using the password that was emailed to you." +msgstr "" +"Gratulacje! Rejestracja przebiegła pomyślnie.

    Możesz teraz się " +"zalogować używając hasła które zostało wysłane do Ciebie emailem." + +#: includes/class-wp-members-dialogs.php:169 +msgid "Sorry, that username is taken, please try another." +msgstr "" +"Przepraszamy, wybrana nazwa użytkownika jest już zajęta, spróbuj wybrać inną " +"nazwę." + +#: includes/class-wp-members-dialogs.php:170 +msgid "" +"Sorry, that email address already has an account.
    Please try another." +msgstr "" +"Przepraszamy, ten adres email jest już zarejestrowany.
    Prosimy o " +"wpisanie innego." + +#: includes/class-wp-members-dialogs.php:175 +msgid "Password successfully changed." +msgstr "" + +#: includes/class-wp-members-dialogs.php:176 +msgid "Invalid username or email address." +msgstr "" + +#: includes/class-wp-members-dialogs.php:177 +msgid "" +"Password successfully reset! An email containing a new password has been " +"sent to the email address on file for your account." +msgstr "" + +#: includes/class-wp-members-dialogs.php:178 +msgid "" +"Reset request received. An email with instructions to complete the password " +"reset has been sent." +msgstr "" + +#: includes/class-wp-members-dialogs.php:180 +msgid "This content requires the following membership: " +msgstr "" + +#: includes/class-wp-members-dialogs.php:181 +msgid "This content requires one of the following memberships: " +msgstr "" + +#: includes/class-wp-members-forms.php:84 +#: includes/class-wp-members-forms.php:350 +msgid "Choose membership" +msgstr "" + +#: includes/class-wp-members-forms.php:1898 +#: includes/class-wp-members-user-profile.php:510 +msgid "Activate this user?" +msgstr "Aktywuj użytkownika?" + +#: includes/class-wp-members-forms.php:2165 templates/tos.php:20 +#, fuzzy +msgid "Terms of Service" +msgstr "Regulamin serwisu" + +#: includes/class-wp-members-menus.php:131 +msgid "Display" +msgstr "" + +#: includes/class-wp-members-menus.php:139 +msgid "Logged In Users" +msgstr "" + +#: includes/class-wp-members-menus.php:146 +msgid "Logged Out Users" +msgstr "" + +#: includes/class-wp-members-menus.php:153 +msgid "All Users" +msgstr "" + +#: includes/class-wp-members-menus.php:167 +#, php-format +msgid "%sAdd membership products%s to restrict menu to a membership" +msgstr "" + +#: includes/class-wp-members-menus.php:169 +msgid "Restrict menu item to a membership product" +msgstr "" + +#: includes/class-wp-members-products.php:342 +#, php-format +msgid "All %s" +msgstr "" + +#: includes/class-wp-members-products.php:343 +#, php-format +msgid "Add New %s" +msgstr "" + +#: includes/class-wp-members-products.php:344 +msgid "Add New" +msgstr "Dodaj" + +#: includes/class-wp-members-products.php:345 +#, php-format +msgid "New %s" +msgstr "" + +#: includes/class-wp-members-products.php:346 +#, php-format +msgid "Edit %s" +msgstr "" + +#: includes/class-wp-members-products.php:347 +#, php-format +msgid "Update %s" +msgstr "" + +#: includes/class-wp-members-products.php:348 +#: includes/class-wp-members-products.php:349 +#, php-format +msgid "View %s" +msgstr "" + +#: includes/class-wp-members-products.php:350 +#, php-format +msgid "Search %s" +msgstr "" + +#: includes/class-wp-members-products.php:351 +msgid "Not found" +msgstr "" + +#: includes/class-wp-members-products.php:352 +msgid "Not found in Trash" +msgstr "" + +#: includes/class-wp-members-products.php:353 +msgid "Insert into item" +msgstr "" + +#: includes/class-wp-members-products.php:354 +#, php-format +msgid "Save %s Details" +msgstr "" + +#: includes/class-wp-members-products.php:355 +msgid "Membership Attributes" +msgstr "" + +#: includes/class-wp-members-products.php:358 +msgid "Membership Product" +msgstr "" + +#: includes/class-wp-members-products.php:359 +msgid "WP-Members Membership Products" +msgstr "" + +#: includes/class-wp-members-pwd-reset.php:35 +#: includes/class-wp-members-pwd-reset.php:36 +msgid "" +"Sorry, no password reset key was found. Please check your email and try " +"again." +msgstr "" + +#: includes/class-wp-members-pwd-reset.php:37 +msgid "Sorry, the password reset key is expired." +msgstr "" + +#: includes/class-wp-members-pwd-reset.php:167 +msgid "The passwords do not match." +msgstr "" + +#: includes/class-wp-members-shortcodes.php:134 +msgid "" +"This is a generic message to display the form message dialog in the " +"Customizer." +msgstr "" + +#: includes/class-wp-members-shortcodes.php:699 +msgid "Click here to log out." +msgstr "" + +#: includes/class-wp-members-user-profile.php:58 +msgid "WP-Members Additional Fields" +msgstr "WP-Member ustawienia konta" + +#: includes/class-wp-members-user-profile.php:58 +#, fuzzy +msgid "Additional Information" +msgstr "WP-Member ustawienia konta" + +#: includes/class-wp-members-user-profile.php:500 +#, fuzzy +msgid "Reactivate this user?" +msgstr "Aktualizacja użytkownika" + +#: includes/class-wp-members-user-profile.php:505 +#, fuzzy +msgid "Deactivate this user?" +msgstr "Aktualizacja użytkownika" + +#: includes/class-wp-members-user-profile.php:559 +msgid "IP @ registration" +msgstr "IP z rejestracji" + +#: includes/class-wp-members-user.php:1171 +msgid "ERROR: User has not been activated." +msgstr "" + +#: includes/class-wp-members-validation-link.php:32 +msgid "Click to validate your account: " +msgstr "" + +#: includes/class-wp-members-validation-link.php:33 +msgid "Thank you for validating your account." +msgstr "" + +#: includes/class-wp-members-validation-link.php:34 +msgid "Validation key was expired or invalid" +msgstr "" + +#: includes/class-wp-members-validation-link.php:35 +msgid "Your account is now pending approval" +msgstr "" + +#: includes/class-wp-members-validation-link.php:284 +msgid "ERROR: User has not confirmed their account." +msgstr "" + +#: includes/class-wp-members-widget.php:24 +msgid "Displays the WP-Members sidebar login." +msgstr "" + +#: includes/class-wp-members-widget.php:39 +#: includes/class-wp-members-widget.php:82 +msgid "Login Status" +msgstr "Status" + +#: includes/class-wp-members-widget.php:46 +msgid "Title:" +msgstr "Tytuł:" + +#: includes/class-wp-members-widget.php:50 +msgid "Redirect to (optional):" +msgstr "" + +#: includes/class-wp-members.php:1087 includes/class-wp-members.php:1098 +msgid "You must be logged in to view this content." +msgstr "" + +#: includes/class-wp-members.php:1104 +msgid "The page you are looking for does not exist" +msgstr "" + +#: includes/class-wp-members.php:1352 +#, php-format +msgid "" +"You have a linked page in the WP-Members page settings that corresponds to a " +"post ID that no longer exists. Please %s review and update the %s page " +"settings %s." +msgstr "" + +#: includes/class-wp-members.php:1472 +msgid "Show forms as logged out" +msgstr "" + +#: includes/class-wp-members.php:1481 +msgid "Show form message dialog" +msgstr "" + +#: includes/class-wp-members.php:1558 +msgid "(more…)" +msgstr "" + +#: includes/class-wp-members.php:1746 +msgid "log out" +msgstr "" + +#: includes/cli/class-wp-members-cli-user.php:24 +#: includes/cli/class-wp-members-cli-user.php:62 +msgid "Moderated registration is not enabled in WP-Members options." +msgstr "" + +#: includes/cli/class-wp-members-cli-user.php:35 +msgid "User activated." +msgstr "" + +#: includes/cli/class-wp-members-cli-user.php:37 +msgid "Email notification sent to user." +msgstr "" + +#: includes/cli/class-wp-members-cli-user.php:40 +msgid "User is already activated." +msgstr "" + +#: includes/cli/class-wp-members-cli-user.php:67 +msgid "User deactivated." +msgstr "" + +#: includes/cli/class-wp-members-cli-user.php:88 +msgid "Invalid user ID. Please specify a valid user. Try `wp user list`." +msgstr "" + +#: includes/cli/class-wp-members-cli-user.php:91 +msgid "No user id specified. Must specify user id as --id=123" +msgstr "" + +#: includes/cli/class-wp-members-cli-user.php:208 +#, php-format +msgid "User: %s" +msgstr "" + +#: includes/cli/class-wp-members-cli-user.php:248 +#, php-format +msgid "User role: %s" +msgstr "" + +#: includes/deprecated.php:373 +msgid "We were unable to validate the public key." +msgstr "Nie można zweryfikować klucza publicznego." + +#: includes/deprecated.php:377 +msgid "We were unable to validate the private key." +msgstr "Nie można zweryfikować klucza prywatnego." + +#: includes/deprecated.php:381 +msgid "The challenge parameter of the verify script was incorrect." +msgstr "The challenge parameter of the verify script was incorrect." + +#: includes/deprecated.php:385 +msgid "The CAPTCHA solution was incorrect." +msgstr "Wpisany kod CAPTCHA jest nieprawidłowy." + +#: includes/deprecated.php:389 +msgid "The parameters to verify were incorrect" +msgstr "Parametry do weryfikacji są niepoprawne" + +#: includes/deprecated.php:393 +msgid "" +"reCAPTCHA API keys are tied to a specific domain name for security reasons." +msgstr "" +"Ze względów bezpieczeństwa klucze API reCAPTCHA są przywiązane do konkretnej " +"domeny." + +#: includes/deprecated.php:397 +msgid "The reCAPTCHA server was not reached. Please try to resubmit." +msgstr "" +"Nie można się połączyć z serwerem reCAPTCHA. Proszę spróbować ponownie za " +"chwilę." + +#. translators: %s: title of menu item which is invalid +#: includes/walkers/class-wp-members-walker-nav-menu.php:92 +#, php-format +msgid "%s (Invalid)" +msgstr "" + +#. translators: %s: title of menu item in draft status +#: includes/walkers/class-wp-members-walker-nav-menu.php:96 +#, php-format +msgid "%s (Pending)" +msgstr "" + +#: includes/walkers/class-wp-members-walker-nav-menu.php:123 +msgid "Move up" +msgstr "" + +#: includes/walkers/class-wp-members-walker-nav-menu.php:136 +msgid "Move down" +msgstr "" + +#: includes/walkers/class-wp-members-walker-nav-menu.php:138 +msgid "Edit Menu Item" +msgstr "" + +#: includes/walkers/class-wp-members-walker-nav-menu.php:149 +msgid "URL" +msgstr "" + +#: includes/walkers/class-wp-members-walker-nav-menu.php:156 +msgid "Navigation Label" +msgstr "" + +#: includes/walkers/class-wp-members-walker-nav-menu.php:162 +msgid "Title Attribute" +msgstr "" + +#: includes/walkers/class-wp-members-walker-nav-menu.php:169 +msgid "Open link in a new window/tab" +msgstr "" + +#: includes/walkers/class-wp-members-walker-nav-menu.php:174 +msgid "CSS Classes (optional)" +msgstr "" + +#: includes/walkers/class-wp-members-walker-nav-menu.php:180 +msgid "Link Relationship (XFN)" +msgstr "" + +#: includes/walkers/class-wp-members-walker-nav-menu.php:188 +msgid "" +"The description will be displayed in the menu if the current theme supports " +"it." +msgstr "" + +#: includes/walkers/class-wp-members-walker-nav-menu.php:210 +#, php-format +msgid "Original: %s" +msgstr "" + +#: includes/walkers/class-wp-members-walker-nav-menu.php:223 +msgid "Remove" +msgstr "" + +#: templates/tos.php:32 +#, fuzzy, php-format +msgid "%sclose%s" +msgstr "Przepraszamy, ale %s jest wymaganym polem." + +#: templates/tos.php:34 +#, fuzzy, php-format +msgid "%sprint%s" +msgstr "Przepraszamy, ale %s jest wymaganym polem." + +#. Plugin Name of the plugin/theme +msgid "WP-Members" +msgstr "WP-Members" + +#. Plugin URI of the plugin/theme +msgid "https://rocketgeek.com" +msgstr "" + +#. Description of the plugin/theme +msgid "" +"WP access restriction and user registration. For more information on plugin " +"features, refer to the online Users Guide. A Quick Start Guide is also available. WP-" +"Members(tm) is a trademark of butlerblog.com." +msgstr "" + +#. Author of the plugin/theme +msgid "Chad Butler" +msgstr "Chad Butler" + +#. Author URI of the plugin/theme +msgid "https://butlerblog.com/" +msgstr "" + +#, fuzzy +#~ msgid "Block" +#~ msgstr "Domyślnie blokuj posty" + +#~ msgid "Manage reCAPTCHA Options" +#~ msgstr "Ustawienia reCAPTCHA" + +#~ msgid "" +#~ "reCAPTCHA is a free, accessible CAPTCHA service that helps to digitize " +#~ "books while blocking spam on your blog." +#~ msgstr "" +#~ "reCAPTCHA to darmowe usługi CAPTCHA, które pomagają w digitalizacji " +#~ "książek jednocześnie blokując spam na Twoim blogu." + +#, php-format +#~ msgid "" +#~ "reCAPTCHA asks commenters to retype two words scanned from a book to " +#~ "prove that they are a human. This verifies that they are not a spambot " +#~ "while also correcting the automatic scans of old books. So you get less " +#~ "spam, and the world gets accurately digitized books. Everybody wins! For " +#~ "details, visit the %s reCAPTCHA website%s" +#~ msgstr "" +#~ "reCAPTCHA wymaga przepisania dwóch słów zeskanowanych z książki aby " +#~ "zabezpieczyć formularze przed botami rozsyłającymi spam. Więc masz mniej " +#~ "spamu, a świat zyskuje coraz więcej książek w wersji cyfrowej. Każdy " +#~ "wygrywa! Szczegółowe informacje możesz znaleźć na %s stronie reCAPTCHA%s" + +#, php-format +#~ msgid "" +#~ "reCAPTCHA requires an API key, consisting of a \"public\" and a \"private" +#~ "\" key. You can sign up for a %s free reCAPTCHA key%s" +#~ msgstr "" +#~ "reCAPTCHA wymaga kluczy API, publicznego oraz prywatnego. Możesz je " +#~ "uzyskać za darmo na %s stronie reCAPTCHA%s" + +#~ msgid "Public Key" +#~ msgstr "Klucz publiczny" + +#~ msgid "Private Key" +#~ msgstr "Klucz prywatny" + +#~ msgid "Choose Theme" +#~ msgstr "Wybierz styl" + +#~ msgid "Red" +#~ msgstr "Czerwony" + +#~ msgid "White" +#~ msgstr "Biały" + +#~ msgid "Black Glass" +#~ msgstr "Czarne szkło" + +#~ msgid "Clean" +#~ msgstr "Minimalistyczny" + +#, fuzzy +#~ msgid "Active" +#~ msgstr "Aktywuj" + +#~ msgid "Enable CAPTCHA" +#~ msgstr "Użyj CAPTCHA" + +#~ msgid "Passwords did not match.

    Please try again." +#~ msgstr "Podane hasła różnią się.

    Prosimy spróbować ponownie." + +#~ msgid "Either the username or email address do not exist in our records." +#~ msgstr "Nazwa użytkownika lub email nie występuje w naszej bazie danych." + +#~ msgid "http://butlerblog.com/" +#~ msgstr "http://butlerblog.com/" + +#, fuzzy +#~ msgid "Click to log out." +#~ msgstr "Zaloguj" + +#~ msgid "You have set WP-Members to turn off the registration process" +#~ msgstr "W konfiguracji WP-Members jest wyłączona rejestracja użytkowników." + +#, fuzzy +#~ msgid "Unblocked?" +#~ msgstr "" +#~ "Info: Będzie można niezależnie dopasować to ustawienie dla indywidualnego " +#~ "wpisu" + +#, fuzzy +#~ msgid "Blocked?" +#~ msgstr "" +#~ "Info: Będzie można niezależnie dopasować to ustawienie dla indywidualnego " +#~ "wpisu" + +#, fuzzy +#~ msgid "field was added" +#~ msgstr "Opis pola" + +#, fuzzy +#~ msgid "field was updated" +#~ msgstr "Opis pola" + +#~ msgid "Option Name" +#~ msgstr "Nazwa pola" + +#, fuzzy +#~ msgid "Additional information for checkbox fields" +#~ msgstr "WP-Member ustawienia konta" + +#, fuzzy +#~ msgid "Additional information for dropdown fields" +#~ msgstr "WP-Member ustawienia konta" + +#, fuzzy +#~ msgid "For dropdown, array of values:" +#~ msgstr "WP-Member ustawienia konta" + +#~ msgid "" +#~ "Determine which fields will display and which are required. This " +#~ "includes all fields, both native WP fields and WP-Members custom fields." +#~ msgstr "" +#~ "Wskaż które pola mają być wyświetlane i które wymagane. Dotyczy " +#~ "wszystkich pól, natywnych pól WP oraz dodatkowych pól WP-Members." + +#~ msgid "(Note: Email is always mandatory and cannot be changed.)" +#~ msgstr "(Info: Email jest zawsze obowiązkowy i nie może być zmieniany.)" + +#~ msgid "Add/Delete" +#~ msgstr "Dodaj/Usuń" + +#~ msgid "Checked?" +#~ msgstr "Zaznaczone?" + +#~ msgid "Delete" +#~ msgstr "Usuń" + +#~ msgid "(Email cannot be removed)" +#~ msgstr "(Email nie może być usunięty)" + +#, fuzzy +#~ msgid "native" +#~ msgstr "" +#~ "Wskaż które pola mają być wyświetlane i które wymagane. Dotyczy " +#~ "wszystkich pól, natywnych pól WP oraz dodatkowych pól WP-Members." + +#~ msgid "Update Fields" +#~ msgstr "Zapisz pola" + +#, fuzzy +#~ msgid "Please indicate that you agree to the %s TOS %s" +#~ msgstr "Zapoznałem/am się i zgadzam się na %s Warunki użytkowania %s" + +#, fuzzy +#~ msgid "%s posts %sed." +#~ msgstr "Domyślnie blokuj posty" + +#, fuzzy +#~ msgid "Post Restriction" +#~ msgstr "Rejestracja nowego użytkownika" + +#, fuzzy +#~ msgid "Page Restriction" +#~ msgstr "Rejestracja nowego użytkownika" + +#, fuzzy +#~ msgid "dropdown" +#~ msgstr "WP-Member ustawienia konta" + +#~ msgid "Block Posts by default" +#~ msgstr "Domyślnie blokuj posty" + +#~ msgid "" +#~ "Note: Posts can still be individually blocked or unblocked at the article " +#~ "level" +#~ msgstr "" +#~ "Info: Będzie można niezależnie dopasować to ustawienie dla indywidualnego " +#~ "wpisu" + +#~ msgid "Block Pages by default" +#~ msgstr "Domyślnie blokuj strony" + +#~ msgid "" +#~ "Note: Pages can still be individually blocked or unblocked at the article " +#~ "level" +#~ msgstr "" +#~ "Info: Będzie można niezależnie dopasować to ustawienie dla indywidualnej " +#~ "strony" + +#~ msgid "Show excerpts" +#~ msgstr "Pokaż fragmenty" + +#~ msgid "" +#~ "Shows excerpted content above the login/registration on both Posts and " +#~ "Pages" +#~ msgstr "" +#~ "Pokaż fragmenty zawartości powyżej formularza logowania/rejestracji we " +#~ "wpisach i stronach" + +#~ msgid "Turns on CAPTCHA for registration" +#~ msgstr "Włącza CAPTCHA przy rejestracji" + +#, fuzzy +#~ msgid "Hide registration" +#~ msgstr "Zakończona rejestracja" + +#~ msgid "Optional" +#~ msgstr "Opcjonalnie" + +#, fuzzy +#~ msgid "Automatically creates an excerpt" +#~ msgstr "Pokaż fragmenty" + +#~ msgid "AIM" +#~ msgstr "AIM" + +#~ msgid "Yahoo IM" +#~ msgstr "Yahoo IM" + +#~ msgid "Jabber/Google Talk" +#~ msgstr "Jabber/Google Talk" + +#~ msgid "" +#~ "Password successfully changed!

    You will need to re-login with " +#~ "your new password." +#~ msgstr "" +#~ "Twoje hasło zostało zmienione!

    Musisz teraz zalogować się " +#~ "ponownie używając nowego hasła." + +#~ msgid "" +#~ "Password successfully reset!

    An email containing a new " +#~ "password has been sent to the email address on file for your account. You " +#~ "may change this random password then re-login with your new password." +#~ msgstr "" +#~ "Hasło zostało zresetowane.

    Nowe hasło zostało wysłane na adres " +#~ "email podany przy rejestracji. Po zalogowaniu możesz zmienić wygenerowane " +#~ "hasło na bardziej przyjazne." + +#~ msgid "Custom" +#~ msgstr "Dostosowany" + +#, fuzzy +#~ msgid "edit" +#~ msgstr "Edytuj swoje dane" + +#~ msgid "Use reCAPTCHA" +#~ msgstr "Użyj reCAPTCHA" + +#~ msgid "New Password" +#~ msgstr "Nowe hasło" + +#~ msgid "Repeat Password" +#~ msgstr "Powtórz hasło" + +#~ msgid "Remember me" +#~ msgstr "Zapamiętaj mnie" + +#~ msgid "Turn off registration" +#~ msgstr "Wyłączenie rejestracji" + +#~ msgid "Turns off the registration process, only allows login" +#~ msgstr "" +#~ "Wyłącz rejestrację, pozwól tylko na logowanie już zarejestrowanym " +#~ "użytkownikom." + +#~ msgid "Members Area URL:" +#~ msgstr "Adres części serwisu dla zarejestrowanych" + +#~ msgid "Add" +#~ msgstr "Dodaj" + +#~ msgid "WP-Members expiration periods were updated" +#~ msgstr "Okresy ważności WP-Members zostały zapisane" + +#~ msgid "" +#~ "Settings were saved, but you have required fields that are not set to " +#~ "display!" +#~ msgstr "" +#~ "Ustawienia zostały zapisane, ale pozostały niewidoczne pola które są " +#~ "zaznaczone jako wymagane!" + +#, fuzzy +#~ msgid "" +#~ "Note: This will not cause an error for the end user, as only displayed " +#~ "fields are validated. However, you should still check that your " +#~ "displayed and required fields match up. Mismatched fields are " +#~ "highlighted below." +#~ msgstr "" +#~ "Info: Nie spowoduje to błędu widocznego dla użytkownika, ponieważ " +#~ "walidowane są tylko wyświetlone pola - aczkolwiek powinno się sprawdzić " +#~ "czy pola określone jako wymagane są wyświetlane. Niepasujące pola są " +#~ "poniżej podświetlone." + +#~ msgid "If you find this plugin useful, please consider making a donation" +#~ msgstr "" +#~ "Jeżeli podoba Ci się tak wtyczka, prosimy o dobrowolne wsparcie finansowe" + +#~ msgid "Subscriptions" +#~ msgstr "Subskrypcja" + +#~ msgid "PayPal Settings" +#~ msgstr "Ustawienia PayPal" + +#~ msgid "If you find this plugin useful, please consider a %s donation %s" +#~ msgstr "" +#~ "Jeżeli podoba Ci się tak wtyczka, prosimy o dobrowolne %s wsparcie " +#~ "finansowe %s" + +#~ msgid "%d users were activated." +#~ msgstr "%d użytkowników zostało aktywowanych." + +#~ msgid "" +#~ "Users ready to export, %s click here %s to generate and download a CSV." +#~ msgstr "" +#~ "Lista użytkowników jest gotowa do eksportu, %s kliknij tutaj %s abu " +#~ "wygenerować i pobrać plik CSV." + +#~ msgid "WP-Members Users" +#~ msgstr "Użytkownicy WP-Members" + +#~ msgid "No users matched your criteria" +#~ msgstr "Brak użytkowników spełniających wybrane kryteria" + +#~ msgid "Bulk Actions" +#~ msgstr "Funkcje dla zaznaczonych rekordów" + +#~ msgid "Apply" +#~ msgstr "Zastosuj" + +#, fuzzy +#~ msgid "Indicates a required field" +#~ msgstr "Przepraszamy, nazwa użytkownika jest wymagana." + +#~ msgid "Login" +#~ msgstr "Zaloguj" + +#~ msgid "Clear Form" +#~ msgstr "Wyczyść formularz" + +#~ msgid "Submit" +#~ msgstr "Wyślij" + +#~ msgid "Cheatin’ uh?" +#~ msgstr "Oszukujemy, co?" + +#~ msgid "there was an error and no users were exported" +#~ msgstr "wystąpił błąd podczasu eksportu użytkowników" + +#~ msgid "You are not currently logged in." +#~ msgstr "Aktualnie nie jesteś zalogowany." + +#~ msgid "login" +#~ msgstr "zaloguj" + +#~ msgid "(The email field is mandatory and cannot be removed)" +#~ msgstr "(Email jest obowiązkowy i nie może zostać usunięty)" + +#~ msgid "Bio" +#~ msgstr "O sobie" + +#~ msgid "You may change your password here: %s" +#~ msgstr "Tutaj możesz zmienić hasło: %s" + +#~ msgid "Your registration info for %s" +#~ msgstr "Twoje dane rejestracyjne do %s" + +#~ msgid "Thank you for registering for %s" +#~ msgstr "Dziękujemy za rejestrację w %s" + +#~ msgid "Your registration information is below." +#~ msgstr "Poniżej Twoje dane rejestracyjne." + +#~ msgid "You may wish to retain a copy for your records." +#~ msgstr "Proponujemy zrobienie kopii tych danych." + +#~ msgid "username: %s" +#~ msgstr "nazwa użytkownika: %s" + +#~ msgid "password: %s" +#~ msgstr "hasło: %s" + +#~ msgid "You may login here:" +#~ msgstr "Tutaj możesz się zalogować:" + +#~ msgid "" +#~ "Thank you for registering for %s. Your registration has been received and " +#~ "is pending approval." +#~ msgstr "" +#~ "Dziękujemy za rejestrację w %s. Twoje zgłoszenie zostało odebrane i jest " +#~ "przekazane do akceptacji." + +#~ msgid "You will receive login instructions upon approval of your account" +#~ msgstr "" +#~ "Dostarczymy dane i instrukcję do logowania po akceptacji zgłoszenia." + +#~ msgid "Your registration for %s has been approved." +#~ msgstr "Twoje zgłoszenie w %s zostało zaakceptowane." + +#~ msgid "You may login at: %s" +#~ msgstr "Możesz zalogować się w: %s" + +#~ msgid "You originally registered at:" +#~ msgstr "Zarejestrowałeś/aś się do tego miejsca:" + +#~ msgid "Password reset for %s" +#~ msgstr "Resetowanie hasła dla %s" + +#~ msgid "Your password for %s has been reset" +#~ msgstr "Twoje hasło do %s zostało zresetowane" + +#~ msgid "" +#~ "Your new password is included below. You may wish to retain a copy for " +#~ "your records." +#~ msgstr "Twoje nowe hasło jest wyświetlone poniżej." + +#~ msgid "This is an automated message from %s" +#~ msgstr "Ta wiadomość jest wygenerowana automatycznie przez %s" + +#~ msgid "Please do not reply to this address" +#~ msgstr "Prosimy nie odpisywać na ten adres" + +#~ msgid "New user registration for %s" +#~ msgstr "Nowa rejestracja w %s" + +#~ msgid "The following user registered for %s" +#~ msgstr "Podany użytkownik zarejestrował się w %s" + +#~ msgid "and is pending admin approval" +#~ msgstr "i oczekuje na akceptację zgłoszenia" + +#~ msgid "http://butlerblog.com/wp-members/" +#~ msgstr "http://butlerblog.com/wp-members/" diff --git a/i18n/languages/wp-members-pt_PT.mo b/i18n/languages/wp-members-pt_PT.mo new file mode 100644 index 00000000..99bc7585 Binary files /dev/null and b/i18n/languages/wp-members-pt_PT.mo differ diff --git a/i18n/languages/wp-members-pt_PT.po b/i18n/languages/wp-members-pt_PT.po new file mode 100644 index 00000000..21ec11ad --- /dev/null +++ b/i18n/languages/wp-members-pt_PT.po @@ -0,0 +1,2816 @@ +msgid "" +msgstr "" +"Project-Id-Version: WP-Members 3.2.6\n" +"Report-Msgid-Bugs-To: http://wordpress.org/tag/wp-members\n" +"POT-Creation-Date: 2023-01-06 15:20-0500\n" +"PO-Revision-Date: \n" +"Last-Translator: \n" +"Language-Team: Brazilian-portuguese \n" +"Language: pt_PT\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Poedit-SourceCharset: UTF-8\n" +"X-Generator: Poedit 2.4.3\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: includes/admin/class-wp-members-admin-api.php:254 +msgid "Custom email" +msgstr "" + +#: includes/admin/class-wp-members-admin-api.php:255 +#: includes/admin/class-wp-members-admin-api.php:257 +msgid "Subject" +msgstr "" + +#: includes/admin/class-wp-members-admin-api.php:258 +msgid "Body" +msgstr "" + +#: includes/admin/class-wp-members-admin-api.php:260 +msgid "Your custom email message content." +msgstr "" + +#: includes/admin/class-wp-members-admin-api.php:338 +msgid "Options" +msgstr "Opções" + +#: includes/admin/class-wp-members-admin-api.php:339 +msgid "Fields" +msgstr "Campos" + +#: includes/admin/class-wp-members-admin-api.php:340 +#, fuzzy +msgid "Dialogs" +msgstr "Notificações de Atualização" + +#: includes/admin/class-wp-members-admin-api.php:341 +#, fuzzy +msgid "Emails" +msgstr "eMail" + +#: includes/admin/class-wp-members-admin-api.php:357 +msgid "New Registration" +msgstr "Moderar Registo:" + +#: includes/admin/class-wp-members-admin-api.php:365 +#: includes/admin/class-wp-members-admin-api.php:383 +msgid "User email validated" +msgstr "" + +#: includes/admin/class-wp-members-admin-api.php:375 +msgid "Registration is Moderated" +msgstr "Aviso de processo de registo completo:" + +#: includes/admin/class-wp-members-admin-api.php:391 +#, fuzzy +msgid "Registration is Moderated, User is Approved" +msgstr "Aviso de processo de registo completo:" + +#: includes/admin/class-wp-members-admin-api.php:399 +msgid "Password Reset" +msgstr "Aviso de confirmação de redefinição de password:" + +#: includes/admin/class-wp-members-admin-api.php:406 +msgid "Retrieve Username" +msgstr "" + +#: includes/admin/class-wp-members-admin-api.php:414 +#, fuzzy +msgid "Admin Notification" +msgstr "Notificar Administrador:" + +#: includes/admin/class-wp-members-admin-api.php:440 +msgid "Restricted post (or page), displays above the login/registration form" +msgstr "" +"Aviso para posts ou páginas restritos, exibido acima do formulário de login:" + +#: includes/admin/class-wp-members-admin-api.php:441 +msgid "Username is taken" +msgstr "Username já registado" + +#: includes/admin/class-wp-members-admin-api.php:442 +msgid "Email is registered" +msgstr "Email já registado" + +#: includes/admin/class-wp-members-admin-api.php:443 +msgid "Registration completed" +msgstr "Registo completo" + +#: includes/admin/class-wp-members-admin-api.php:444 +msgid "User update" +msgstr "Aviso de confirmação de atualização de dados do usuário:" + +#: includes/admin/class-wp-members-admin-api.php:445 +msgid "Passwords did not match" +msgstr "As passwords não coincidem" + +#: includes/admin/class-wp-members-admin-api.php:446 +msgid "Password changes" +msgstr "Aviso de confirmação de alteração de senha:" + +#: includes/admin/class-wp-members-admin-api.php:447 +msgid "Username or email do not exist when trying to reset forgotten password" +msgstr "" +"Aviso para nome de usuário ou email não encontrado durante tentativa de " +"reiniciar uma senha esquecida:" + +#: includes/admin/class-wp-members-admin-api.php:448 +msgid "Password reset" +msgstr "Redefinição de password" + +#: includes/admin/class-wp-members-admin-api.php:547 +msgid "Close" +msgstr "" + +#: includes/admin/class-wp-members-admin-api.php:596 +msgid "Settings" +msgstr "Configurações" + +#: includes/admin/class-wp-members-admin-posts.php:30 +#: includes/admin/class-wp-members-admin-posts.php:33 +msgid "Unrestrict" +msgstr "" + +#: includes/admin/class-wp-members-admin-posts.php:31 +#: includes/admin/class-wp-members-admin-posts.php:34 +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:110 +msgid "Restrict" +msgstr "" + +#: includes/admin/class-wp-members-admin-posts.php:32 +#: includes/admin/class-wp-members-admin-posts.php:35 +msgid "Hide" +msgstr "" + +#: includes/admin/class-wp-members-admin-posts.php:125 +#, php-format +msgid "%s restricted" +msgstr "" + +#: includes/admin/class-wp-members-admin-posts.php:125 +#, php-format +msgid "%s unrestricted" +msgstr "" + +#: includes/admin/class-wp-members-admin-posts.php:165 +#, php-format +msgid "%s Restriction" +msgstr "" + +#: includes/admin/class-wp-members-admin-posts.php:195 +#: includes/admin/class-wp-members-admin-posts.php:342 +#: includes/admin/class-wp-members-admin-posts.php:345 +msgid "Unrestricted" +msgstr "" + +#: includes/admin/class-wp-members-admin-posts.php:196 +#: includes/admin/class-wp-members-admin-posts.php:339 +#: includes/admin/class-wp-members-admin-posts.php:347 +msgid "Restricted" +msgstr "" + +#: includes/admin/class-wp-members-admin-posts.php:197 +#: includes/admin/class-wp-members-admin-posts.php:349 +msgid "Hidden" +msgstr "" + +#: includes/admin/class-wp-members-admin-posts.php:203 +msgid "Status:" +msgstr "" + +#: includes/admin/class-wp-members-admin-posts.php:203 +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:68 +#: includes/admin/tabs/class-wp-members-fields-table.php:65 +#: includes/walkers/class-wp-members-walker-nav-menu.php:140 +#, fuzzy +msgid "Edit" +msgstr "Edite suas Informações" + +#: includes/admin/class-wp-members-admin-posts.php:218 +msgid "Ok" +msgstr "" + +#: includes/admin/class-wp-members-admin-posts.php:219 +#: includes/walkers/class-wp-members-walker-nav-menu.php:224 +msgid "Cancel" +msgstr "" + +#: includes/admin/class-wp-members-admin-posts.php:305 +msgid "Status" +msgstr "" + +#: includes/admin/class-wp-members-admin-users.php:28 +#: includes/admin/class-wp-members-admin-users.php:34 +#: includes/admin/class-wp-members-admin-users.php:79 +msgid "Activate" +msgstr "Activar" + +#: includes/admin/class-wp-members-admin-users.php:29 +#: includes/admin/class-wp-members-admin-users.php:35 +#: includes/admin/class-wp-members-admin-users.php:82 +msgid "Deactivate" +msgstr "" + +#: includes/admin/class-wp-members-admin-users.php:31 +#: includes/admin/class-wp-members-admin-users.php:37 +msgid "Export" +msgstr "" + +#: includes/admin/class-wp-members-admin-users.php:32 +#: includes/admin/class-wp-members-admin-users.php:38 +#, fuzzy +msgid "Export All Users" +msgstr "Log In" + +#: includes/admin/class-wp-members-admin-users.php:61 +msgid "Confirm" +msgstr "" + +#: includes/admin/class-wp-members-admin-users.php:64 +msgid "Unconfirm" +msgstr "" + +#: includes/admin/class-wp-members-admin-users.php:147 +#, php-format +msgid "%s users activated" +msgstr "" + +#: includes/admin/class-wp-members-admin-users.php:147 +#, php-format +msgid "%s users deactivated" +msgstr "" + +#: includes/admin/class-wp-members-admin-users.php:150 +msgid "No users selected" +msgstr "" + +#: includes/admin/class-wp-members-admin-users.php:168 +msgid "You cannot activate or deactivate yourself" +msgstr "" + +#: includes/admin/class-wp-members-admin-users.php:173 +#, php-format +msgid "%s activated" +msgstr "" + +#: includes/admin/class-wp-members-admin-users.php:178 +#, php-format +msgid "%s deactivated" +msgstr "" + +#: includes/admin/class-wp-members-admin-users.php:182 +msgid "That user is already active" +msgstr "" + +#: includes/admin/class-wp-members-admin-users.php:198 +msgid "You cannot confirm or unconfirm yourself" +msgstr "" + +#: includes/admin/class-wp-members-admin-users.php:203 +#, php-format +msgid "%s confirmed" +msgstr "" + +#: includes/admin/class-wp-members-admin-users.php:208 +#, php-format +msgid "%s unconfirmed" +msgstr "" + +#: includes/admin/class-wp-members-admin-users.php:212 +msgid "That user is already confirmed" +msgstr "" + +#: includes/admin/class-wp-members-admin-users.php:341 +msgid "Pending" +msgstr "" + +#: includes/admin/class-wp-members-admin-users.php:342 +msgid "Trial" +msgstr "" + +#: includes/admin/class-wp-members-admin-users.php:343 +#: includes/admin/class-wp-members-user-export.php:289 +msgid "Subscription" +msgstr "Subscrição" + +#: includes/admin/class-wp-members-admin-users.php:344 +msgid "Expired" +msgstr "" + +#: includes/admin/class-wp-members-admin-users.php:347 +#: includes/admin/class-wp-members-admin-users.php:410 +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:457 +msgid "Activated" +msgstr "" + +#: includes/admin/class-wp-members-admin-users.php:348 +msgid "Pending Activation" +msgstr "" + +#: includes/admin/class-wp-members-admin-users.php:349 +msgid "Deactivated" +msgstr "" + +#: includes/admin/class-wp-members-admin-users.php:352 +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:456 +msgid "Confirmed" +msgstr "" + +#: includes/admin/class-wp-members-admin-users.php:353 +msgid "Not Confirmed" +msgstr "" + +#: includes/admin/class-wp-members-admin-users.php:355 +msgid "Not Exported" +msgstr "" + +#: includes/admin/class-wp-members-admin-users.php:475 +msgid "Not confirmed" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:67 +msgid "Slug" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:68 +#: includes/admin/class-wp-members-user-export.php:294 +msgid "Role" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:69 +#: includes/admin/class-wp-members-products-admin.php:740 +#: includes/admin/class-wp-members-user-export.php:290 +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:460 +msgid "Expires" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:71 +msgid "Default" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:73 +msgid "Last updated" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:97 +msgid "slug:" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:100 +msgid "No role required" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:105 +msgid "Does not expire" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:109 +#: includes/admin/class-wp-members-user-export.php:199 +msgid "Yes" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:145 +msgid "Membership Product Details" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:153 +msgid "Membership Product Message (optional)" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:169 +msgid "Access by child membership" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:185 +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:62 +msgid "Posts" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:186 +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:63 +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:249 +#, fuzzy +msgid "Pages" +msgstr "Bloquear Páginas por Padrão:" + +#: includes/admin/class-wp-members-products-admin.php:213 +#: includes/admin/class-wp-members-products-admin.php:262 +#: includes/admin/class-wp-members-products-admin.php:309 +msgid "Period" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:213 +msgid "Day" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:213 +msgid "Week" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:213 +msgid "Month" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:213 +msgid "Year" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:226 +msgid "Name (slug)" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:228 +msgid "Optional Defaults" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:231 +msgid "Assign as default at registration? (optional)" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:239 +#, php-format +msgid "Pre-selected by default for new %s" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:245 +msgid "Optional Properties" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:248 +msgid "Role Required? (optional)" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:251 +msgid "No Role" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:257 +msgid "Expires (optional)" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:259 +#: includes/admin/class-wp-members-products-admin.php:261 +#: includes/admin/class-wp-members-products-admin.php:306 +#: includes/admin/class-wp-members-products-admin.php:308 +msgid "Number" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:267 +msgid "Use \"no gap\" renewal" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:271 +msgid "Use a fixed period (such as Jan 1 - Dec 31, or Sept 1 - Aug 31)" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:288 +#: includes/admin/class-wp-members-products-admin.php:289 +msgid "Period Start (dd-mm)" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:290 +#: includes/admin/class-wp-members-products-admin.php:291 +msgid "Period End (dd-mm)" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:304 +msgid "Fixed period grace period" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:313 +msgid "" +"Grace period is the point at which expiration date is for following time " +"period. For example, if user who register August 1st would be part of the " +"following year's Sept 1 - Aug 31 membership, set this at 1 Month. Leave " +"blank for no grace period." +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:376 +msgid "" +"Restricted Message (displays when a user does not have access to a " +"membership)" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:502 +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:239 +#: includes/class-wp-members-forms.php:1196 +#: includes/class-wp-members-user-profile.php:132 +msgid "None" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:517 +msgid "Restrict access by membership:" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:598 +msgid "Required Membership" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:644 +#: includes/admin/class-wp-members-products-admin.php:745 +#: includes/class-wp-members-products.php:335 +msgid "Membership" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:680 +msgid "expires:" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:709 +#: includes/class-wp-members-products.php:336 +#: includes/class-wp-members-products.php:341 +msgid "Memberships" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:736 +msgid "Membership Access" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:744 +msgid "Action" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:746 +msgid "Enabled?" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:757 +msgid "Enable" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:758 +msgid "Disable" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:759 +msgid "Update" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:764 +msgid "Expiration date (optional)" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:795 +#, php-format +msgid "No memberships have been created. %sCreate new memberships here%s" +msgstr "" + +#: includes/admin/class-wp-members-user-export.php:199 +msgid "No" +msgstr "" + +#: includes/admin/class-wp-members-user-export.php:264 +msgid "You do not have the required user capabilities to export users." +msgstr "" + +#: includes/admin/class-wp-members-user-export.php:277 +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:461 +msgid "User ID" +msgstr "" + +#: includes/admin/class-wp-members-user-export.php:284 +#: includes/class-wp-members-dialogs.php:91 +#: includes/class-wp-members-dialogs.php:114 +msgid "Username" +msgstr "Utilizador" + +#: includes/admin/class-wp-members-user-export.php:286 +msgid "Activated?" +msgstr "Ativo?" + +#: includes/admin/class-wp-members-user-export.php:292 +msgid "Registered" +msgstr "Registado" + +#: includes/admin/class-wp-members-user-export.php:293 +#, fuzzy +msgid "IP" +msgstr "Registo completo" + +#: includes/admin/dialogs.php:117 +msgid "" +"Your WP settings allow anyone to register - this is not the recommended " +"setting." +msgstr "" +"Suas configurações do WordPress permitem que qualquer um se registre. Esta " +"não é uma configuração recomendada." + +#: includes/admin/dialogs.php:118 +#, php-format +msgid "" +"You can %s change this here %s making sure the box next to \"Anyone can " +"register\" is unchecked." +msgstr "" + +#: includes/admin/dialogs.php:119 +msgid "" +"This setting allows a link on the /wp-login.php page to register using the " +"WP native registration process thus circumventing any registration you are " +"using with WP-Members. In some cases, this may suit the users wants/needs, " +"but most users should uncheck this option. If you do not change this " +"setting, you can choose to ignore these warning messages under WP-Members " +"Settings." +msgstr "" +"Esta configuração permite o registro de usuários através de um link na " +"página /wp-login.php usando o processo nativo de registro do WordPress, " +"contornando assim qualquer registro de usuário que você esteja realizando " +"através do WP-Members. Em alguns casos, isso pode atender os usuários que " +"querem/precisam, mas a maioria dos usuários deve desmarcar essa opção. Se " +"você não quiser mudar esta configuração, pode optar por ignorar esta " +"mensagem de aviso nas Opções de Gerenciamento do WP-Membros." + +#: includes/admin/dialogs.php:123 +msgid "" +"Your WP settings allow anyone to comment - this is not the recommended " +"setting." +msgstr "" +"Suas configurações do WordPress permitem que qualquer possa comentar. Esta " +"não é uma configuração recomendada." + +#: includes/admin/dialogs.php:124 +#, php-format +msgid "" +"You can %s change this here %s by checking the box next to \"Users must be " +"registered and logged in to comment.\"" +msgstr "" + +#: includes/admin/dialogs.php:125 +msgid "" +"This setting allows any users to comment, whether or not they are " +"registered. Depending on how you are using WP-Members will determine whether " +"you should change this setting or not. If you do not change this setting, " +"you can choose to ignore these warning messages under WP-Members Settings." +msgstr "" +"Esta configuração permite a qualquer usuário comentar, independente de estar " +"registrado ou não. A forma como você está utilizando o WP-Members irá " +"determinar se você deve ou não alterar esta configuração. Se você não quiser " +"mudar esta configuração, pode optar por ignorar esta mensagem de aviso nas " +"Opções de Gerenciamento do WP-Membros." + +#: includes/admin/dialogs.php:129 +msgid "" +"Your WP settings allow full text rss feeds - this is not the recommended " +"setting." +msgstr "" +"Suas configurações do WordPress permitem feeds RSS com texto completo. Esta " +"não é uma configuração recomendada." + +#: includes/admin/dialogs.php:130 +#, php-format +msgid "" +"You can %s change this here %s by changing \"For each article in a feed, show" +"\" to \"Summary.\"" +msgstr "" + +#: includes/admin/dialogs.php:131 +msgid "" +"Leaving this set to full text allows anyone to read your protected content " +"in an RSS reader. Changing this to Summary prevents this as your feeds will " +"only show summary text." +msgstr "" +"Deixando esta configuração ajustada para texto completo, permitirá a " +"qualquer um ler seu conteúdo protegido num leitor RSS. Alterar isto para " +"\"Sumário\" assegura que seus feeds vão exibir somente um resumo." + +#: includes/admin/dialogs.php:135 +msgid "You have set WP-Members to hold registrations for approval" +msgstr "" +"Você ajustou o WP-Members para interceptar seus registros de usuário para " +"aprovação." + +#: includes/admin/dialogs.php:136 +msgid "" +"but you have not changed the default message for \"Registration Completed\" " +"under \"WP-Members Dialogs and Error Messages.\" You should change this " +"message to let users know they are pending approval." +msgstr "" + +#: includes/admin/dialogs.php:140 +msgid "You have turned on reCAPTCHA" +msgstr "" + +#: includes/admin/dialogs.php:141 +msgid "" +"but you have not entered API keys. You will need both a public and private " +"key. The CAPTCHA will not display unless a valid API key is included." +msgstr "" + +#: includes/admin/dialogs.php:145 +msgid "You have active settings that are not recommended." +msgstr "" + +#: includes/admin/dialogs.php:146 +msgid "" +"If you will not be changing these settings, you can turn off these warning " +"messages by checking the \"Ignore warning messages\" in the settings below." +msgstr "" + +#: includes/admin/dialogs.php:174 +msgid "Version:" +msgstr "Versão:" + +#: includes/admin/dialogs.php:175 +#, fuzzy +msgid "Quick Start Guide" +msgstr "" +"Restrição de acesso e registo no WordPress. Para maiores informações e para " +"baixar o \"guia de início rápido\" gratuito, visite http://butlerblog.com/wp-members. Veja uma " +"demo em http://butlerblog.com/" +"wpmembers. WP-Members(tm) é uma marca registrada de butlerblog.com." + +#: includes/admin/dialogs.php:176 +#, fuzzy +msgid "Online User Guide" +msgstr "Aviso de confirmação de atualização de dados do usuário:" + +#: includes/admin/dialogs.php:177 +msgid "FAQs" +msgstr "" + +#: includes/admin/dialogs.php:184 +#, fuzzy +msgid "Thank you for using WP-Members" +msgstr "Obrigado por usar o WP-Members! Você está a utilizar a versão" + +#: includes/admin/dialogs.php:185 +msgid "A plugin developed by" +msgstr "" + +#: includes/admin/dialogs.php:186 +msgid "Follow" +msgstr "Seguir" + +#: includes/admin/dialogs.php:203 includes/admin/dialogs.php:207 +msgid "Latest from RocketGeek" +msgstr "" + +#: includes/admin/dialogs.php:224 +msgid "Like WP-Members?" +msgstr "" + +#: includes/admin/dialogs.php:225 +#, php-format +msgid "" +"If you like WP-Members please give it a %s★★★★★" +"%s rating. Thanks!!" +msgstr "" + +#: includes/admin/dialogs.php:236 includes/admin/dialogs.php:249 +msgid "Latest from ButlerBlog" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:67 +#, php-format +msgid "See the %sUsers Guide on CAPTCHA%s." +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:74 +#: includes/admin/tabs/class-wp-members-admin-tab-dialogs.php:57 +#: includes/admin/tabs/class-wp-members-admin-tab-emails.php:109 +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:134 +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:78 +msgid "Need help?" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:85 +msgid "Manage CAPTCHA Options" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:91 +msgid "CAPTCHA Type" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:96 +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:243 +msgid "reCAPTCHA v2" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:97 +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:244 +msgid "reCAPTCHA v3" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:98 +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:245 +msgid "Really Simple CAPTCHA" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:99 +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:246 +msgid "hCaptcha" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:106 +msgid "" +"CAPTCHA type was changed. Please verify and update the settings below for " +"the new CAPTCHA type." +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:117 +msgid "reCAPTCHA Keys" +msgstr "Chaves do reCAPTCHA" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:120 +#, php-format +msgid "" +"reCAPTCHA requires an API key, consisting of a \"site\" and a \"secret\" " +"key. You can sign up for a %s free reCAPTCHA key%s" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:122 +msgid "Site Key" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:123 +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:139 +msgid "Secret Key" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:133 +msgid "hCaptcha Keys" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:136 +#, php-format +msgid "" +"hCaptcha requires an API key. You can sign up for %s an hCaptcha API key " +"here %s" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:138 +msgid "API Key" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:170 +msgid "Characters for image" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:174 +msgid "Number of characters" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:178 +msgid "Image dimensions" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:179 +msgid "Width" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:179 +msgid "Height" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:182 +msgid "Font color of characters" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:186 +msgid "Background color of image" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:190 +msgid "Font size" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:194 +msgid "Width between characters" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:198 +#, fuzzy +msgid "Image type" +msgstr "Campo" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:213 +msgid "" +"To use Really Simple CAPTCHA, you must have the Really Simple CAPTCHA plugin " +"installed and activated." +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:241 +#, fuzzy +msgid "Update CAPTCHA Settings" +msgstr "Atualizar Configuração do reCAPTCHA" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:319 +#, fuzzy +msgid "CAPTCHA was updated for WP-Members" +msgstr "WP-Members" + +#: includes/admin/tabs/class-wp-members-admin-tab-dialogs.php:67 +msgid "Dialogs and Error Messages" +msgstr "Notificações e Mensagens de Erro" + +#: includes/admin/tabs/class-wp-members-admin-tab-dialogs.php:69 +#, fuzzy, php-format +msgid "" +"You can customize the text for dialogs and error messages. Simple HTML is " +"allowed %s etc." +msgstr "Você pode customizar os textos a seguir. HTML simples é permitido." + +#: includes/admin/tabs/class-wp-members-admin-tab-dialogs.php:80 +msgid "Terms of Service (TOS)" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-dialogs.php:87 +msgid "Update Dialogs" +msgstr "Notificações de Atualização" + +#: includes/admin/tabs/class-wp-members-admin-tab-dialogs.php:124 +#, fuzzy +msgid "WP-Members dialogs were updated" +msgstr "Campos Adicionais do WP-Members" + +#: includes/admin/tabs/class-wp-members-admin-tab-dropins.php:88 +#: includes/admin/tabs/class-wp-members-dropins-table.php:180 +msgid "WP-Members Dropin settings were updated" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-dropins.php:216 +msgid "Manage Dropins" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-dropins.php:217 +msgid "Current dropin folder: " +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-dropins.php:218 +msgid "" +"You can change location of the dropin folder using the " +"wpmem_dropin_folder filter." +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-emails.php:57 +#, fuzzy +msgid "Email Messages" +msgstr "eMail" + +#: includes/admin/tabs/class-wp-members-admin-tab-emails.php:60 +msgid "You can customize the content of the emails sent by the plugin." +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-emails.php:62 +msgid "A list of shortcodes is available here." +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-emails.php:69 +#, fuzzy +msgid "Set a custom email address" +msgstr "Inseriu um username ou password inválidos." + +#: includes/admin/tabs/class-wp-members-admin-tab-emails.php:70 +#: includes/admin/tabs/class-wp-members-admin-tab-emails.php:74 +#: includes/admin/tabs/class-wp-members-admin-tab-emails.php:93 +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:163 +msgid "(optional)" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-emails.php:73 +#, fuzzy +msgid "Set a custom email name" +msgstr "Inseriu um username ou password inválidos." + +#: includes/admin/tabs/class-wp-members-admin-tab-emails.php:77 +msgid "Send HTML email" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-emails.php:93 +msgid "Email Signature" +msgstr "Aviso de email já registado:" + +#: includes/admin/tabs/class-wp-members-admin-tab-emails.php:101 +#, fuzzy +msgid "Update Emails" +msgstr "Aviso de confirmação de atualização de dados do usuário:" + +#: includes/admin/tabs/class-wp-members-admin-tab-emails.php:172 +#, fuzzy +msgid "WP-Members emails were updated" +msgstr "WP-Members possui direitos autorais" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:93 +#: includes/class-wp-members-dialogs.php:65 +msgid "No fields selected for deletion" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:95 +msgid "Are you sure you want to delete the following fields?" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:122 +msgid "Fields deleted" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:136 +msgid "Field Manager Documentation" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:164 +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:315 +#: includes/class-wp-members-forms.php:1629 +#: includes/class-wp-members-forms.php:1821 +#: includes/class-wp-members-user-profile.php:181 +msgid "(required)" +msgstr "Requerido?" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:169 +#, fuzzy +msgid "Edit Field" +msgstr "Edite suas Informações" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:169 +#, fuzzy +msgid "Add a Field" +msgstr "Campo" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:174 +msgid "Field Label" +msgstr "Campo" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:176 +msgid "The name of the field as it will be displayed to the user." +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:179 +#: includes/admin/tabs/class-wp-members-fields-table.php:58 +msgid "Meta Key" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:185 +msgid "" +"The database meta value for the field. It must be unique and contain no " +"spaces (underscores are ok)." +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:189 +#: includes/admin/tabs/class-wp-members-fields-table.php:59 +#, fuzzy +msgid "Field Type" +msgstr "Campo" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:195 +#, fuzzy +msgid "text" +msgstr "" +"Suas configurações do WordPress permitem feeds RSS com texto completo. Esta " +"não é uma configuração recomendada." + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:196 +msgid "email" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:197 +msgid "textarea" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:198 +#, fuzzy +msgid "checkbox" +msgstr "Campos Adicionais do WP-Members" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:199 +msgid "multiple checkbox" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:200 +msgid "select (dropdown)" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:201 +msgid "multiple select" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:202 +msgid "radio group" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:203 +msgid "password" +msgstr "Password" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:204 +msgid "image" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:205 +msgid "file" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:206 +msgid "url" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:207 +msgid "number" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:208 +msgid "date" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:209 +msgid "hidden" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:211 +msgid "membership" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:217 +#: includes/admin/tabs/class-wp-members-fields-table.php:60 +msgid "Display?" +msgstr "Exibir?" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:221 +msgid "This field is always displayed" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:226 +msgid "Required?" +msgstr "Requerido?" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:230 +msgid "This field is always required" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:236 +msgid "Allow HTML?" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:243 +msgid "Placeholder" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:251 +msgid "Pattern" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:259 +msgid "Title" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:268 +msgid "Minimum Value" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:272 +msgid "Maximum Value" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:280 +msgid "Rows" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:284 +msgid "Columns" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:292 +msgid "Accepted file types:" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:297 +msgid "Accepted file types should be set like this: jpg|jpeg|png|gif" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:304 +#, fuzzy +msgid "Checked by default?" +msgstr "Bloquear Posts por Padrão:" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:308 +msgid "HTML label position" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:310 +msgid "Before the input tag" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:311 +msgid "After the input tag" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:312 +msgid "" +"Selecting \"after\" will generally display the label to the right of the " +"checkbox" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:315 +#, fuzzy +msgid "Stored value if checked:" +msgstr "Bloquear Posts por Padrão:" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:336 +msgid "Stored values delimiter:" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:345 +msgid "Values (Displayed|Stored):" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:370 +msgid "Options should be Option Name|option_value," +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:374 +msgid "Visit plugin site for more information" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:381 +msgid "Value" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:400 +msgid "Save Changes" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:400 +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:527 +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:528 +#, fuzzy +msgid "Add Field" +msgstr "Campo" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:402 +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:726 +msgid "Return to Fields Table" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:449 +msgid "Drag and drop to reorder fields" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:455 +#, fuzzy +msgid "Registration Date" +msgstr "Registo completo" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:458 +#, fuzzy +msgid "Registration IP" +msgstr "Registo completo" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:459 +msgid "Subscription Type" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:495 +msgid "Manage Fields" +msgstr "Gerenciar Campos" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:595 +#, fuzzy +msgid "WP-Members fields were updated" +msgstr "Campos Adicionais do WP-Members" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:617 +msgid "Field Label is required. Nothing was updated." +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:618 +msgid "Meta Key is required. Nothing was updated." +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:620 +msgid "Meta Key must contain only letters, numbers, and underscores" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:627 +msgid "A field with that meta key already exists" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:632 +#, php-format +msgid "" +"Sorry, \"%s\" is a reserved term. " +"Field was not added." +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:673 +msgid "Checked value is required for checkboxes. Nothing was updated." +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:705 +msgid "A value is required for hidden fields. Nothing was updated." +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:712 +#, php-format +msgid "%s was added" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:725 +#, php-format +msgid "%s was updated" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:768 +msgid "Form field order updated." +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:56 +#, php-format +msgid "%sChange%s or %sFilter%s this address" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:57 +#, php-format +msgid "See the %sUsers Guide on plugin options%s." +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:90 +msgid "Manage Options" +msgstr "Opções de Gerenciamento" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:94 +msgid "Content" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:105 +msgid "Content Restriction" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:109 +msgid "Do not restrict" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:123 +msgid "Show Excerpts" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:124 +msgid "Show Login Form" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:125 +msgid "Show Registration Form" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:126 +#, fuzzy +msgid "Auto Excerpt:" +msgstr "Exibir Trechos:" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:148 +#, fuzzy +msgid "Number of words in excerpt:" +msgstr "Exibir Trechos:" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:149 +msgid "Custom read more link (optional):" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:163 +msgid "Time-based expiration" +msgstr "Expirar Acesso:" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:163 +msgid "Allows for access to expire" +msgstr "Permite que o acesso expire por tempo." + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:164 +msgid "Trial period" +msgstr "Período de Experiência:" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:164 +msgid "Allows for a trial period" +msgstr "Permite período de experiência." + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:166 +msgid "Subscription Settings" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:176 +msgid "New Feature Settings" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:182 +msgid "Legacy Password Reset" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:182 +#, php-format +msgid "Use legacy password reset. %s(Requires additional configuration)%s" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:184 +msgid "Legacy Login Error" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:184 +msgid "Use legacy WP-Members login error instead of WP error object." +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:187 +msgid "WooCommerce My Account" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:187 +msgid "Add WP-Members fields to WooCommerce My Account registration" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:188 +msgid "WooCommerce Checkout" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:188 +msgid "Add WP-Members fields to WooCommerce registration during checkout" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:204 +msgid "Other Settings" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:214 +msgid "Enable memberships" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:214 +#, php-format +msgid "Enables creation of different %s membership products %s" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:215 +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:223 +msgid "Clone menus" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:215 +msgid "Enables logged in menus" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:216 +msgid "Notify admin" +msgstr "Notificar Administrador:" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:216 +#, fuzzy, php-format +msgid "Notify %s for each new registration? %s" +msgstr "Enviar email para administrador para cada novo registro?" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:217 +msgid "Moderate registration" +msgstr "Moderar Registro:" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:217 +msgid "Holds new registrations for admin approval" +msgstr "Intercepta novos registros para aprovação do administrador." + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:218 +msgid "Confirmation Link" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:218 +#, php-format +msgid "" +"Send email confirmation link on new registration. %s(Requires additional " +"configuration)%s" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:219 +msgid "Ignore warning messages" +msgstr "Ignorar Mensagens de Advertência:" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:219 +msgid "Ignores WP-Members warning messages in the admin panel" +msgstr "" +"Ignora as mensagens de advertência do WP-Members no painel administrativo." + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:233 +msgid "Attribution" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:235 +msgid "" +"Attribution is appreciated! Display \"powered by\" link on register form?" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:238 +msgid "Enable CAPTCHA for Registration" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:253 +msgid "Login Page:" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:256 +msgid "Specify a login page (optional)" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:265 +#, fuzzy +msgid "Register Page:" +msgstr "Registar-se" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:268 +msgid "For creating a register link in the login form" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:277 +#, fuzzy +msgid "User Profile Page:" +msgstr "Aviso de confirmação de atualização de dados do usuário:" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:280 +msgid "For creating a forgot password link in the login form" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:286 +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:288 +msgid "Stylesheet" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:297 +#, fuzzy +msgid "Custom Stylesheet:" +msgstr "Customizado" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:302 +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:329 +#, fuzzy +msgid "Update Settings" +msgstr "Atualizar Configuração do reCAPTCHA" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:310 +msgid "Custom Post Types" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:316 +msgid "Add to WP-Members Settings" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:332 +msgid "" +"Please keep in mind that Custom Post Types are \"custom\" and therefore, not " +"all of them will function exactly the same way. WP-Members will certainly " +"work with any post type that operate like a post or a page; but you will " +"need to review any custom post type added to determine that it functions the " +"way you expect." +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:342 +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:343 +msgid "WP-Members Settings" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:344 +msgid "" +"The following is your WP-Members settings information if needed for support." +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:378 +msgid "Click to Copy" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:458 +msgid "Custom Post Type settings were updated" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:579 +#, fuzzy +msgid "WP-Members settings were updated" +msgstr "Campos Adicionais do WP-Members" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:651 +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:682 +msgid "USE CUSTOM URL BELOW" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:671 +#, fuzzy +msgid "Select a page" +msgstr "Moderar Registo:" + +#: includes/admin/tabs/class-wp-members-dropins-table.php:70 +msgid "Name" +msgstr "" + +#: includes/admin/tabs/class-wp-members-dropins-table.php:71 +msgid "Enabled" +msgstr "" + +#: includes/admin/tabs/class-wp-members-dropins-table.php:72 +msgid "File" +msgstr "" + +#: includes/admin/tabs/class-wp-members-dropins-table.php:73 +msgid "Version" +msgstr "" + +#: includes/admin/tabs/class-wp-members-dropins-table.php:74 +#: includes/walkers/class-wp-members-walker-nav-menu.php:186 +msgid "Description" +msgstr "" + +#: includes/admin/tabs/class-wp-members-dropins-table.php:117 +#: includes/admin/tabs/class-wp-members-fields-table.php:108 +msgid "Save Settings" +msgstr "" + +#: includes/admin/tabs/class-wp-members-fields-table.php:43 +msgid "delete" +msgstr "" + +#: includes/admin/tabs/class-wp-members-fields-table.php:57 +msgid "Display Label" +msgstr "" + +#: includes/admin/tabs/class-wp-members-fields-table.php:61 +msgid "Required" +msgstr "" + +#: includes/admin/tabs/class-wp-members-fields-table.php:63 +#, fuzzy +msgid "Users Screen" +msgstr "Log In" + +#: includes/admin/tabs/class-wp-members-fields-table.php:64 +msgid "Users Search" +msgstr "" + +#: includes/admin/tabs/class-wp-members-fields-table.php:66 +msgid "Sort" +msgstr "" + +#: includes/admin/tabs/class-wp-members-fields-table.php:107 +msgid "Delete Selected" +msgstr "" + +#: includes/api/api-forms.php:584 +#, php-format +msgid "%s is a required field." +msgstr "" + +#: includes/class-wp-members-captcha.php:276 includes/deprecated.php:401 +msgid "You have entered an incorrect code value. Please try again." +msgstr "" + +#: includes/class-wp-members-dialogs.php:41 +msgid "First Name" +msgstr "Nome" + +#: includes/class-wp-members-dialogs.php:42 +msgid "Last Name" +msgstr "Apelido" + +#: includes/class-wp-members-dialogs.php:43 +msgid "Address 1" +msgstr "Endereço" + +#: includes/class-wp-members-dialogs.php:44 +msgid "Address 2" +msgstr "Complemento" + +#: includes/class-wp-members-dialogs.php:45 +msgid "City" +msgstr "Cidade" + +#: includes/class-wp-members-dialogs.php:46 +msgid "State" +msgstr "Estado" + +#: includes/class-wp-members-dialogs.php:47 +msgid "Zip" +msgstr "Código-postal" + +#: includes/class-wp-members-dialogs.php:48 +msgid "Country" +msgstr "País" + +#: includes/class-wp-members-dialogs.php:49 +msgid "Day Phone" +msgstr "Telefone" + +#: includes/class-wp-members-dialogs.php:50 +#: includes/class-wp-members-dialogs.php:92 +msgid "Email" +msgstr "eMail" + +#: includes/class-wp-members-dialogs.php:51 +msgid "Confirm Email" +msgstr "" + +#: includes/class-wp-members-dialogs.php:52 +msgid "Website" +msgstr "Website" + +#: includes/class-wp-members-dialogs.php:53 +msgid "Biographical Info" +msgstr "" + +#: includes/class-wp-members-dialogs.php:54 +#: includes/class-wp-members-dialogs.php:74 +#: includes/class-wp-members-dialogs.php:159 +msgid "Password" +msgstr "Password" + +#: includes/class-wp-members-dialogs.php:55 +msgid "Confirm Password" +msgstr "" + +#: includes/class-wp-members-dialogs.php:56 +#: includes/class-wp-members-forms.php:2165 +msgid "TOS" +msgstr "" + +#: includes/class-wp-members-dialogs.php:66 +#, fuzzy +msgid "You are not logged in." +msgstr "Username ou password inválidos." + +#: includes/class-wp-members-dialogs.php:72 +#, fuzzy +msgid "Existing Users Log In" +msgstr "Log In" + +#: includes/class-wp-members-dialogs.php:73 +#: includes/class-wp-members-dialogs.php:158 +msgid "Username or Email" +msgstr "" + +#: includes/class-wp-members-dialogs.php:75 +#: includes/class-wp-members-shortcodes.php:773 +#, fuzzy +msgid "Log In" +msgstr "Log In" + +#: includes/class-wp-members-dialogs.php:76 +msgid "Remember Me" +msgstr "" + +#: includes/class-wp-members-dialogs.php:77 +msgid "Forgot password?" +msgstr "Esqueceu a password?" + +#: includes/class-wp-members-dialogs.php:78 +msgid "Click here to reset" +msgstr "Clique aqui para reiniciar" + +#: includes/class-wp-members-dialogs.php:79 +msgid "New User?" +msgstr "Novo utilizador?" + +#: includes/class-wp-members-dialogs.php:80 +msgid "Click here to register" +msgstr "Clique aqui para registar-se" + +#: includes/class-wp-members-dialogs.php:83 +#: includes/class-wp-members-dialogs.php:142 +msgid "Change Password" +msgstr "Alterar password" + +#: includes/class-wp-members-dialogs.php:84 +msgid "New password" +msgstr "" + +#: includes/class-wp-members-dialogs.php:85 +msgid "Confirm new password" +msgstr "" + +#: includes/class-wp-members-dialogs.php:86 +msgid "Update Password" +msgstr "Atualizar password" + +#: includes/class-wp-members-dialogs.php:87 +msgid "Password successfully changed!" +msgstr "" + +#: includes/class-wp-members-dialogs.php:90 +msgid "Reset Forgotten Password" +msgstr "Redefinir password esquecida" + +#: includes/class-wp-members-dialogs.php:93 +msgid "Reset Password" +msgstr "Definir nova senha" + +#: includes/class-wp-members-dialogs.php:94 +msgid "Forgot username?" +msgstr "" + +#: includes/class-wp-members-dialogs.php:95 +msgid "Click here" +msgstr "" + +#: includes/class-wp-members-dialogs.php:98 +#: includes/class-wp-members-dialogs.php:100 +msgid "Retrieve username" +msgstr "" + +#: includes/class-wp-members-dialogs.php:99 +msgid "Email Address" +msgstr "" + +#: includes/class-wp-members-dialogs.php:103 +#, fuzzy +msgid "New User Registration" +msgstr "Novo utilizador?" + +#: includes/class-wp-members-dialogs.php:104 +msgid "Choose a Username" +msgstr "Username" + +#: includes/class-wp-members-dialogs.php:105 +msgid "Input the code:" +msgstr "" + +#: includes/class-wp-members-dialogs.php:106 +#: includes/class-wp-members-forms.php:2164 +#, php-format +msgid "Please indicate that you agree to the %s Terms of Service %s" +msgstr "" + +#: includes/class-wp-members-dialogs.php:107 +#, fuzzy +msgid "Reset Form" +msgstr "Redefinição de password" + +#: includes/class-wp-members-dialogs.php:108 +#: includes/class-wp-members-dialogs.php:162 +#: includes/class-wp-members-shortcodes.php:770 +#: includes/class-wp-members-user.php:186 +msgid "Register" +msgstr "Registar-se" + +#: includes/class-wp-members-dialogs.php:110 +msgid "Required field" +msgstr "Campo obrigatório" + +#: includes/class-wp-members-dialogs.php:113 +msgid "Edit Your Information" +msgstr "Edite suas Informações" + +#: includes/class-wp-members-dialogs.php:115 +#, fuzzy +msgid "Update Profile" +msgstr "Aviso de confirmação de atualização de dados do usuário:" + +#: includes/class-wp-members-dialogs.php:116 +msgid "Update this file" +msgstr "" + +#: includes/class-wp-members-dialogs.php:119 +msgid "Login Failed!" +msgstr "Login falhou!" + +#: includes/class-wp-members-dialogs.php:120 +msgid "You entered an invalid username or password." +msgstr "Username ou password inválidos." + +#: includes/class-wp-members-dialogs.php:121 +msgid "Click here to continue." +msgstr "Clique aqui para continuar." + +#: includes/class-wp-members-dialogs.php:122 +#, fuzzy +msgid "Password fields cannot be empty" +msgstr "Aviso de diferença nas senhas digitadas:" + +#: includes/class-wp-members-dialogs.php:123 +msgid "Sorry, that email address was not found." +msgstr "" + +#: includes/class-wp-members-dialogs.php:124 +#, php-format +msgid "An email was sent to %s with your username." +msgstr "" + +#: includes/class-wp-members-dialogs.php:125 +#, fuzzy, php-format +msgid "Sorry, %s is a required field." +msgstr "Username é um campo obrigatório" + +#: includes/class-wp-members-dialogs.php:126 +msgid "You must enter a valid email address." +msgstr "Inseriu um username ou password inválidos." + +#: includes/class-wp-members-dialogs.php:127 +msgid "The username cannot include non-alphanumeric characters." +msgstr "" + +#: includes/class-wp-members-dialogs.php:128 +msgid "Sorry, username is a required field" +msgstr "Username é um campo obrigatório" + +#: includes/class-wp-members-dialogs.php:129 +msgid "Sorry, that username is taken, Please try another." +msgstr "" + +#: includes/class-wp-members-dialogs.php:130 +msgid "Sorry, that email address already has an account. Please try another." +msgstr "" + +#: includes/class-wp-members-dialogs.php:131 +#: includes/class-wp-members-dialogs.php:174 +#, fuzzy +msgid "Passwords did not match." +msgstr "As passwords não coincidem" + +#: includes/class-wp-members-dialogs.php:132 +#, fuzzy +msgid "Emails did not match." +msgstr "As passwords não coincidem" + +#: includes/class-wp-members-dialogs.php:133 +#, fuzzy +msgid "You must complete the CAPTCHA form." +msgstr "você precisa completar o formulário da CAPTCHA" + +#: includes/class-wp-members-dialogs.php:134 +msgid "CAPTCHA was not valid." +msgstr "" + +#: includes/class-wp-members-dialogs.php:135 +#, fuzzy +msgid "There was an error processing the form." +msgstr "Notificações e Mensagens de Erro" + +#: includes/class-wp-members-dialogs.php:136 +#, fuzzy +msgid "There was an error with the CAPTCHA form." +msgstr "Notificações e Mensagens de Erro" + +#: includes/class-wp-members-dialogs.php:137 +#, php-format +msgid "" +"Sorry, you can only upload the following file types for the %s field: %s." +msgstr "" + +#: includes/class-wp-members-dialogs.php:138 +#: includes/class-wp-members-dialogs.php:171 +msgid "Your information was updated!" +msgstr "Sua informação foi atualizada!" + +#: includes/class-wp-members-dialogs.php:141 +msgid "Edit My Information" +msgstr "Editar info pessoal" + +#: includes/class-wp-members-dialogs.php:143 +#: includes/class-wp-members-dialogs.php:146 +#: includes/class-wp-members-dialogs.php:148 +#: includes/class-wp-members-dialogs.php:153 +#, fuzzy, php-format +msgid "You are logged in as %s" +msgstr "Username ou password inválidos." + +#: includes/class-wp-members-dialogs.php:144 +msgid "Log out" +msgstr "" + +#: includes/class-wp-members-dialogs.php:145 +msgid "Edit profile" +msgstr "" + +#: includes/class-wp-members-dialogs.php:145 +#, fuzzy +msgid "Begin using the site." +msgstr "Obrigado por usar o WP-Members! Você está a utilizar a versão" + +#: includes/class-wp-members-dialogs.php:147 +#, fuzzy +msgid "Click to log out" +msgstr "Clique aqui para reiniciar" + +#: includes/class-wp-members-dialogs.php:149 +#, fuzzy +msgid "click to log out" +msgstr "Clique aqui para reiniciar" + +#: includes/class-wp-members-dialogs.php:150 +msgid "Log Out" +msgstr "" + +#: includes/class-wp-members-dialogs.php:154 +msgid "click here to log out" +msgstr "clique aqui para fazer logout" + +#: includes/class-wp-members-dialogs.php:155 +msgid "Login Failed!
    You entered an invalid username or password." +msgstr "Login falhou!
    Username ou password inválido." + +#: includes/class-wp-members-dialogs.php:156 +msgid "Invalid username or password." +msgstr "" + +#: includes/class-wp-members-dialogs.php:160 includes/class-wp-members.php:1745 +#, fuzzy +msgid "log in" +msgstr "Log In" + +#: includes/class-wp-members-dialogs.php:161 +msgid "Forgot?" +msgstr "Esqueceu a password?" + +#: includes/class-wp-members-dialogs.php:165 +#, fuzzy +msgid "" +"This content is restricted to site members. If you are an existing user, " +"please log in. New users may register below." +msgstr "" +"Este conteúdo é restrito. Se é um utilizador registado, por favor faça " +"login. " + +#: includes/class-wp-members-dialogs.php:166 +#, fuzzy +msgid "" +"Congratulations! Your registration was successful.

    You may now " +"log in using the password that was emailed to you." +msgstr "" +"Parabéns! Registo concluído com sucesso.

    Faça login com a " +"password que foi enviada para o seu email." + +#: includes/class-wp-members-dialogs.php:169 +msgid "Sorry, that username is taken, please try another." +msgstr "Desculpe, este username já está registado. Por favor, tente outro." + +#: includes/class-wp-members-dialogs.php:170 +msgid "" +"Sorry, that email address already has an account.
    Please try another." +msgstr "" +"Desculpe, já existe uma conta com este endereço de email.
    Por favor, " +"tente outro." + +#: includes/class-wp-members-dialogs.php:175 +msgid "Password successfully changed." +msgstr "" + +#: includes/class-wp-members-dialogs.php:176 +msgid "Invalid username or email address." +msgstr "" + +#: includes/class-wp-members-dialogs.php:177 +msgid "" +"Password successfully reset! An email containing a new password has been " +"sent to the email address on file for your account." +msgstr "" + +#: includes/class-wp-members-dialogs.php:178 +msgid "" +"Reset request received. An email with instructions to complete the password " +"reset has been sent." +msgstr "" + +#: includes/class-wp-members-dialogs.php:180 +msgid "This content requires the following membership: " +msgstr "" + +#: includes/class-wp-members-dialogs.php:181 +msgid "This content requires one of the following memberships: " +msgstr "" + +#: includes/class-wp-members-forms.php:84 +#: includes/class-wp-members-forms.php:350 +msgid "Choose membership" +msgstr "" + +#: includes/class-wp-members-forms.php:1898 +#: includes/class-wp-members-user-profile.php:510 +msgid "Activate this user?" +msgstr "Ativar usuário?" + +#: includes/class-wp-members-forms.php:2165 templates/tos.php:20 +msgid "Terms of Service" +msgstr "" + +#: includes/class-wp-members-menus.php:131 +msgid "Display" +msgstr "" + +#: includes/class-wp-members-menus.php:139 +msgid "Logged In Users" +msgstr "" + +#: includes/class-wp-members-menus.php:146 +msgid "Logged Out Users" +msgstr "" + +#: includes/class-wp-members-menus.php:153 +msgid "All Users" +msgstr "" + +#: includes/class-wp-members-menus.php:167 +#, php-format +msgid "%sAdd membership products%s to restrict menu to a membership" +msgstr "" + +#: includes/class-wp-members-menus.php:169 +msgid "Restrict menu item to a membership product" +msgstr "" + +#: includes/class-wp-members-products.php:342 +#, php-format +msgid "All %s" +msgstr "" + +#: includes/class-wp-members-products.php:343 +#, php-format +msgid "Add New %s" +msgstr "" + +#: includes/class-wp-members-products.php:344 +msgid "Add New" +msgstr "" + +#: includes/class-wp-members-products.php:345 +#, php-format +msgid "New %s" +msgstr "" + +#: includes/class-wp-members-products.php:346 +#, php-format +msgid "Edit %s" +msgstr "" + +#: includes/class-wp-members-products.php:347 +#, php-format +msgid "Update %s" +msgstr "" + +#: includes/class-wp-members-products.php:348 +#: includes/class-wp-members-products.php:349 +#, php-format +msgid "View %s" +msgstr "" + +#: includes/class-wp-members-products.php:350 +#, php-format +msgid "Search %s" +msgstr "" + +#: includes/class-wp-members-products.php:351 +msgid "Not found" +msgstr "" + +#: includes/class-wp-members-products.php:352 +msgid "Not found in Trash" +msgstr "" + +#: includes/class-wp-members-products.php:353 +msgid "Insert into item" +msgstr "" + +#: includes/class-wp-members-products.php:354 +#, php-format +msgid "Save %s Details" +msgstr "" + +#: includes/class-wp-members-products.php:355 +msgid "Membership Attributes" +msgstr "" + +#: includes/class-wp-members-products.php:358 +msgid "Membership Product" +msgstr "" + +#: includes/class-wp-members-products.php:359 +msgid "WP-Members Membership Products" +msgstr "" + +#: includes/class-wp-members-pwd-reset.php:35 +#: includes/class-wp-members-pwd-reset.php:36 +msgid "" +"Sorry, no password reset key was found. Please check your email and try " +"again." +msgstr "" + +#: includes/class-wp-members-pwd-reset.php:37 +msgid "Sorry, the password reset key is expired." +msgstr "" + +#: includes/class-wp-members-pwd-reset.php:167 +msgid "The passwords do not match." +msgstr "" + +#: includes/class-wp-members-shortcodes.php:134 +msgid "" +"This is a generic message to display the form message dialog in the " +"Customizer." +msgstr "" + +#: includes/class-wp-members-shortcodes.php:699 +msgid "Click here to log out." +msgstr "" + +#: includes/class-wp-members-user-profile.php:58 +msgid "WP-Members Additional Fields" +msgstr "Campos Adicionais do WP-Members" + +#: includes/class-wp-members-user-profile.php:58 +#, fuzzy +msgid "Additional Information" +msgstr "Campos Adicionais do WP-Members" + +#: includes/class-wp-members-user-profile.php:500 +msgid "Reactivate this user?" +msgstr "Re-ativar este utilizador?" + +#: includes/class-wp-members-user-profile.php:505 +msgid "Deactivate this user?" +msgstr "Desativar utilizador?" + +#: includes/class-wp-members-user-profile.php:559 +#, fuzzy +msgid "IP @ registration" +msgstr "Registo completo" + +#: includes/class-wp-members-user.php:1171 +msgid "ERROR: User has not been activated." +msgstr "" + +#: includes/class-wp-members-validation-link.php:32 +msgid "Click to validate your account: " +msgstr "" + +#: includes/class-wp-members-validation-link.php:33 +msgid "Thank you for validating your account." +msgstr "" + +#: includes/class-wp-members-validation-link.php:34 +msgid "Validation key was expired or invalid" +msgstr "" + +#: includes/class-wp-members-validation-link.php:35 +msgid "Your account is now pending approval" +msgstr "" + +#: includes/class-wp-members-validation-link.php:284 +msgid "ERROR: User has not confirmed their account." +msgstr "" + +#: includes/class-wp-members-widget.php:24 +msgid "Displays the WP-Members sidebar login." +msgstr "" + +#: includes/class-wp-members-widget.php:39 +#: includes/class-wp-members-widget.php:82 +msgid "Login Status" +msgstr "Estado do Login" + +#: includes/class-wp-members-widget.php:46 +msgid "Title:" +msgstr "Título" + +#: includes/class-wp-members-widget.php:50 +msgid "Redirect to (optional):" +msgstr "" + +#: includes/class-wp-members.php:1087 includes/class-wp-members.php:1098 +msgid "You must be logged in to view this content." +msgstr "" + +#: includes/class-wp-members.php:1104 +msgid "The page you are looking for does not exist" +msgstr "" + +#: includes/class-wp-members.php:1352 +#, php-format +msgid "" +"You have a linked page in the WP-Members page settings that corresponds to a " +"post ID that no longer exists. Please %s review and update the %s page " +"settings %s." +msgstr "" + +#: includes/class-wp-members.php:1472 +msgid "Show forms as logged out" +msgstr "" + +#: includes/class-wp-members.php:1481 +msgid "Show form message dialog" +msgstr "" + +#: includes/class-wp-members.php:1558 +msgid "(more…)" +msgstr "" + +#: includes/class-wp-members.php:1746 +msgid "log out" +msgstr "" + +#: includes/cli/class-wp-members-cli-user.php:24 +#: includes/cli/class-wp-members-cli-user.php:62 +msgid "Moderated registration is not enabled in WP-Members options." +msgstr "" + +#: includes/cli/class-wp-members-cli-user.php:35 +msgid "User activated." +msgstr "" + +#: includes/cli/class-wp-members-cli-user.php:37 +msgid "Email notification sent to user." +msgstr "" + +#: includes/cli/class-wp-members-cli-user.php:40 +msgid "User is already activated." +msgstr "" + +#: includes/cli/class-wp-members-cli-user.php:67 +msgid "User deactivated." +msgstr "" + +#: includes/cli/class-wp-members-cli-user.php:88 +msgid "Invalid user ID. Please specify a valid user. Try `wp user list`." +msgstr "" + +#: includes/cli/class-wp-members-cli-user.php:91 +msgid "No user id specified. Must specify user id as --id=123" +msgstr "" + +#: includes/cli/class-wp-members-cli-user.php:208 +#, php-format +msgid "User: %s" +msgstr "" + +#: includes/cli/class-wp-members-cli-user.php:248 +#, php-format +msgid "User role: %s" +msgstr "" + +#: includes/deprecated.php:373 +msgid "We were unable to validate the public key." +msgstr "Não foi possível validar a Chave Pública" + +#: includes/deprecated.php:377 +msgid "We were unable to validate the private key." +msgstr "Não foi possível validar a Chave Privada" + +#: includes/deprecated.php:381 +msgid "The challenge parameter of the verify script was incorrect." +msgstr "O parâmetro de desafio do script de verificação estava incorreto." + +#: includes/deprecated.php:385 +msgid "The CAPTCHA solution was incorrect." +msgstr "A solução da CAPTCHA estava incorreta." + +#: includes/deprecated.php:389 +msgid "The parameters to verify were incorrect" +msgstr "Os parâmetros de verificação estavam incorretos." + +#: includes/deprecated.php:393 +msgid "" +"reCAPTCHA API keys are tied to a specific domain name for security reasons." +msgstr "" +"As chaves API (\"API Keys\") do reCAPTCHA são atreladas a um nome " +"específico de domínio por razões de segurança." + +#: includes/deprecated.php:397 +msgid "The reCAPTCHA server was not reached. Please try to resubmit." +msgstr "O servidor reCAPTCHA não foi alcançado. Por favor, tente reenviar." + +#. translators: %s: title of menu item which is invalid +#: includes/walkers/class-wp-members-walker-nav-menu.php:92 +#, php-format +msgid "%s (Invalid)" +msgstr "" + +#. translators: %s: title of menu item in draft status +#: includes/walkers/class-wp-members-walker-nav-menu.php:96 +#, php-format +msgid "%s (Pending)" +msgstr "" + +#: includes/walkers/class-wp-members-walker-nav-menu.php:123 +msgid "Move up" +msgstr "" + +#: includes/walkers/class-wp-members-walker-nav-menu.php:136 +msgid "Move down" +msgstr "" + +#: includes/walkers/class-wp-members-walker-nav-menu.php:138 +msgid "Edit Menu Item" +msgstr "" + +#: includes/walkers/class-wp-members-walker-nav-menu.php:149 +msgid "URL" +msgstr "" + +#: includes/walkers/class-wp-members-walker-nav-menu.php:156 +msgid "Navigation Label" +msgstr "" + +#: includes/walkers/class-wp-members-walker-nav-menu.php:162 +msgid "Title Attribute" +msgstr "" + +#: includes/walkers/class-wp-members-walker-nav-menu.php:169 +msgid "Open link in a new window/tab" +msgstr "" + +#: includes/walkers/class-wp-members-walker-nav-menu.php:174 +msgid "CSS Classes (optional)" +msgstr "" + +#: includes/walkers/class-wp-members-walker-nav-menu.php:180 +msgid "Link Relationship (XFN)" +msgstr "" + +#: includes/walkers/class-wp-members-walker-nav-menu.php:188 +msgid "" +"The description will be displayed in the menu if the current theme supports " +"it." +msgstr "" + +#: includes/walkers/class-wp-members-walker-nav-menu.php:210 +#, php-format +msgid "Original: %s" +msgstr "" + +#: includes/walkers/class-wp-members-walker-nav-menu.php:223 +msgid "Remove" +msgstr "" + +#: templates/tos.php:32 +#, php-format +msgid "%sclose%s" +msgstr "" + +#: templates/tos.php:34 +#, php-format +msgid "%sprint%s" +msgstr "" + +#. Plugin Name of the plugin/theme +msgid "WP-Members" +msgstr "WP-Members" + +#. Plugin URI of the plugin/theme +msgid "https://rocketgeek.com" +msgstr "" + +#. Description of the plugin/theme +msgid "" +"WP access restriction and user registration. For more information on plugin " +"features, refer to the online Users Guide. A Quick Start Guide is also available. WP-" +"Members(tm) is a trademark of butlerblog.com." +msgstr "" + +#. Author of the plugin/theme +msgid "Chad Butler" +msgstr "Chad Butler" + +#. Author URI of the plugin/theme +msgid "https://butlerblog.com/" +msgstr "" + +#, fuzzy +#~ msgid "Block" +#~ msgstr "Bloquear Posts por Padrão:" + +#~ msgid "Manage reCAPTCHA Options" +#~ msgstr "Gerenciar Opções do reCAPTCHA" + +#~ msgid "" +#~ "reCAPTCHA is a free, accessible CAPTCHA service that helps to digitize " +#~ "books while blocking spam on your blog." +#~ msgstr "" +#~ "reCAPTCHA é um serviço de CAPTCHA gratuito e acessível que ajuda a " +#~ "digitalizar livros enquanto bloqueia spam no seu blog." + +#, fuzzy, php-format +#~ msgid "" +#~ "reCAPTCHA asks commenters to retype two words scanned from a book to " +#~ "prove that they are a human. This verifies that they are not a spambot " +#~ "while also correcting the automatic scans of old books. So you get less " +#~ "spam, and the world gets accurately digitized books. Everybody wins! For " +#~ "details, visit the %s reCAPTCHA website%s" +#~ msgstr "" +#~ "reCAPTCHA solicita aos comentaristas que redigitem duas palavras " +#~ "escaneadas de um livro para provar que eles são humanos. Isto prova que " +#~ "eles não são um \"spambot\" enquanto corrige os escaneamentos automáticos " +#~ "de velhos livros. Desda forma, você obtém menos spam e o mundo recebe " +#~ "melhores digitalizações de livros. Todo mundo ganha! Para detalhes, " +#~ "visite o" + +#, fuzzy, php-format +#~ msgid "" +#~ "reCAPTCHA requires an API key, consisting of a \"public\" and a \"private" +#~ "\" key. You can sign up for a %s free reCAPTCHA key%s" +#~ msgstr "" +#~ "reCAPTCHA exige uma Chave API (\"API Key\"), que consiste em um par de " +#~ "chaves \"pública\" e \"privada\". Você pode se registrar para uma" + +#~ msgid "Public Key" +#~ msgstr "Chave Pública" + +#~ msgid "Private Key" +#~ msgstr "Chave Privada" + +#~ msgid "Choose Theme" +#~ msgstr "Selecione o Tema" + +#~ msgid "Red" +#~ msgstr "Vermelho" + +#~ msgid "White" +#~ msgstr "Branco" + +#~ msgid "Black Glass" +#~ msgstr "Vidro Fumê" + +#~ msgid "Clean" +#~ msgstr "Limpo" + +#, fuzzy +#~ msgid "Active" +#~ msgstr "Activar" + +#, fuzzy +#~ msgid "Enable CAPTCHA" +#~ msgstr "Ativa a solicitação de CAPTCHA durante o processo de registro." + +#~ msgid "Passwords did not match.

    Please try again." +#~ msgstr "Passwords não coincidem.

    Por favor, tente novamente." + +#~ msgid "Either the username or email address do not exist in our records." +#~ msgstr "Username ou password não registado." + +#~ msgid "http://butlerblog.com/" +#~ msgstr "http://butlerblog.com/" + +#, fuzzy +#~ msgid "Click to log out." +#~ msgstr "Clique aqui para reiniciar" + +#~ msgid "You have set WP-Members to turn off the registration process" +#~ msgstr "" +#~ "Você ajustou o WP-Members para desativar o processo de registro de novos " +#~ "usuários." + +#, fuzzy +#~ msgid "Unblocked?" +#~ msgstr "" +#~ "Nota: Posts ainda podem ser bloqueados ou desbloqueados individualmente." + +#, fuzzy +#~ msgid "Blocked?" +#~ msgstr "" +#~ "Nota: Posts ainda podem ser bloqueados ou desbloqueados individualmente." + +#, fuzzy +#~ msgid "field was added" +#~ msgstr "Campo" + +#, fuzzy +#~ msgid "field was updated" +#~ msgstr "Campo" + +#, fuzzy +#~ msgid "Option Name" +#~ msgstr "Nome" + +#, fuzzy +#~ msgid "Additional information for checkbox fields" +#~ msgstr "Campos Adicionais do WP-Members" + +#, fuzzy +#~ msgid "Additional information for dropdown fields" +#~ msgstr "Campos Adicionais do WP-Members" + +#, fuzzy +#~ msgid "For dropdown, array of values:" +#~ msgstr "Campos Adicionais do WP-Members" + +#~ msgid "" +#~ "Determine which fields will display and which are required. This " +#~ "includes all fields, both native WP fields and WP-Members custom fields." +#~ msgstr "" +#~ "Determine quais campos serão exibidos e quais são obrigatórios. Isto " +#~ "inclui todos os campos, tanto os nativos do WordPress quanto os inseridos " +#~ "pelo WP-Members." + +#~ msgid "(Note: Email is always mandatory and cannot be changed.)" +#~ msgstr "" +#~ "(Nota: Campo de email é sempre obrigatório e não pode ser alterado.)" + +#, fuzzy +#~ msgid "Add/Delete" +#~ msgstr "Campo" + +#, fuzzy +#~ msgid "Checked?" +#~ msgstr "Bloquear Posts por Padrão:" + +#~ msgid "(Email cannot be removed)" +#~ msgstr "(O campo de email é obrigatório e não pode ser removido)" + +#, fuzzy +#~ msgid "native" +#~ msgstr "" +#~ "Determine quais campos serão exibidos e quais são obrigatórios. Isto " +#~ "inclui todos os campos, tanto os nativos do WordPress quanto os inseridos " +#~ "pelo WP-Members." + +#~ msgid "Update Fields" +#~ msgstr "Atualizar Campos" + +#, fuzzy +#~ msgid "" +#~ "WP access restriction and user registration. For more information on " +#~ "plugin features, refer to the online Users Guide. A Quick Start Guide is also available. WP-Members(tm) is a trademark of butlerblog.com." +#~ msgstr "" +#~ "Restrição de acesso e registo no WordPress. Para maiores informações e " +#~ "para baixar o \"guia de início rápido\" gratuito, visite http://butlerblog.com/wp-members. Veja " +#~ "uma demo em http://butlerblog." +#~ "com/wpmembers. WP-Members(tm) é uma marca registrada de butlerblog." +#~ "com." + +#, fuzzy +#~ msgid "%s posts %sed." +#~ msgstr "Bloquear Posts por Padrão:" + +#, fuzzy +#~ msgid "Post Restriction" +#~ msgstr "Moderar Registo:" + +#, fuzzy +#~ msgid "Page Restriction" +#~ msgstr "Moderar Registo:" + +#, fuzzy +#~ msgid "dropdown" +#~ msgstr "Campos Adicionais do WP-Members" + +#~ msgid "Block Posts by default" +#~ msgstr "Bloquear Posts por Padrão:" + +#~ msgid "" +#~ "Note: Posts can still be individually blocked or unblocked at the article " +#~ "level" +#~ msgstr "" +#~ "Nota: Posts ainda podem ser bloqueados ou desbloqueados individualmente." + +#~ msgid "Block Pages by default" +#~ msgstr "Bloquear Páginas por Padrão:" + +#~ msgid "" +#~ "Note: Pages can still be individually blocked or unblocked at the article " +#~ "level" +#~ msgstr "" +#~ "Nota: Páginas ainda podem ser bloqueadas e desbloqueadas individualmente." + +#~ msgid "Show excerpts" +#~ msgstr "Exibir Trechos:" + +#~ msgid "" +#~ "Shows excerpted content above the login/registration on both Posts and " +#~ "Pages" +#~ msgstr "Exibir trechos de conteúdo bloqueado em Posts e Páginas." + +#~ msgid "Turns on CAPTCHA for registration" +#~ msgstr "Ativa a solicitação de CAPTCHA durante o processo de registro." + +#, fuzzy +#~ msgid "Hide registration" +#~ msgstr "Registo completo" + +#, fuzzy +#~ msgid "Automatically creates an excerpt" +#~ msgstr "Exibir Trechos:" + +#~ msgid "AIM" +#~ msgstr "AIM" + +#~ msgid "Yahoo IM" +#~ msgstr "Yahoo IM" + +#~ msgid "Jabber/Google Talk" +#~ msgstr "Jabber/Google Talk" + +#~ msgid "" +#~ "Password successfully changed!

    You will need to re-login with " +#~ "your new password." +#~ msgstr "" +#~ "Senha alterada com sucesso!

    Você precisará logar-se novamente " +#~ "com sua nova senha." + +#~ msgid "" +#~ "Password successfully reset!

    An email containing a new " +#~ "password has been sent to the email address on file for your account. You " +#~ "may change this random password then re-login with your new password." +#~ msgstr "" +#~ "Password redefinida com sucesso!

    Um email com a nova password " +#~ "foi enviado para o endereço indicado no registo. " + +#~ msgid "Custom" +#~ msgstr "Customizado" + +#, fuzzy +#~ msgid "edit" +#~ msgstr "Edite suas Informações" + +#~ msgid "Use reCAPTCHA" +#~ msgstr "Usar reCAPTCHA" + +#~ msgid "New Password" +#~ msgstr "Nova password" + +#~ msgid "Repeat Password" +#~ msgstr "Repetir password" + +#~ msgid "Remember me" +#~ msgstr "Lembrar-me" + +#~ msgid "Turn off registration" +#~ msgstr "Desativar Registro de Usuário:" + +#~ msgid "Turns off the registration process, only allows login" +#~ msgstr "Desativa o processo de registro, permite somente logins." + +#, fuzzy +#~ msgid "" +#~ "Settings were saved, but you have required fields that are not set to " +#~ "display!" +#~ msgstr "" +#~ "Configurações foram salvas, mas existe um campo requerido que não está " +#~ "marcado para exibição." + +#, fuzzy +#~ msgid "" +#~ "Note: This will not cause an error for the end user, as only displayed " +#~ "fields are validated. However, you should still check that your " +#~ "displayed and required fields match up. Mismatched fields are " +#~ "highlighted below." +#~ msgstr "" +#~ "Nota: Isto não irá causar um erro para o usuário, uma vez que somente " +#~ "campos exibidos são validados. Entretanto, você deveria corrigir isto de " +#~ "\r\n" +#~ "\t\t\t\tforma que haja coerência nos campos marcados para exibição e " +#~ "também como obrigatórios. Os campos com problema estão listados abaixo." + +#, fuzzy +#~ msgid "If you find this plugin useful, please consider making a donation" +#~ msgstr "Se você achou este plugin útil, por favor considere fazer uma" + +#, fuzzy +#~ msgid "PayPal Settings" +#~ msgstr "Configurações" + +#, fuzzy +#~ msgid "If you find this plugin useful, please consider a %s donation %s" +#~ msgstr "Se você achou este plugin útil, por favor considere fazer uma" + +#, fuzzy +#~ msgid "WP-Members Users" +#~ msgstr "WP-Members" + +#~ msgid "Indicates a required field" +#~ msgstr "Campo obrigatório" + +#~ msgid "Login" +#~ msgstr "Login" + +#~ msgid "Clear Form" +#~ msgstr "Apagar" + +#~ msgid "Submit" +#~ msgstr "Criar" + +#, fuzzy +#~ msgid "login" +#~ msgstr "Login" + +#~ msgid "etc." +#~ msgstr "etc." + +#~ msgid "Settings saved." +#~ msgstr "Configurações salvas." + +#~ msgid "If you find this plugin useful," +#~ msgstr "Se você achou este plugin útil," + +#~ msgid "please consider making a donation" +#~ msgstr "por favor, considere fazer uma doação:" + +#~ msgid "donation" +#~ msgstr "doação" + +#~ msgid "WP-Members is a trademark of" +#~ msgstr "WP-Members é marca registrada de" + +#~ msgid "reCAPTCHA website" +#~ msgstr "site do reCAPTCHA" + +#~ msgid "free reCAPTCHA key" +#~ msgstr "chave reCAPTCHA gratuita" + +#~ msgid "Sorry," +#~ msgstr "Desculpe," + +#~ msgid "Bio" +#~ msgstr "Detalhes" + +#~ msgid "WP Members" +#~ msgstr "WP Members" + +#~ msgid "http://butlerblog.com/wp-members/" +#~ msgstr "http://butlerblog.com/wp-members/" diff --git a/i18n/languages/wp-members-sk_SK.mo b/i18n/languages/wp-members-sk_SK.mo new file mode 100644 index 00000000..b1939cc2 Binary files /dev/null and b/i18n/languages/wp-members-sk_SK.mo differ diff --git a/i18n/languages/wp-members-sk_SK.po b/i18n/languages/wp-members-sk_SK.po new file mode 100644 index 00000000..c93808e6 --- /dev/null +++ b/i18n/languages/wp-members-sk_SK.po @@ -0,0 +1,2820 @@ +# This file is distributed under the same license as the WP-Members package. +msgid "" +msgstr "" +"Project-Id-Version: WP-Members 3.2.6\n" +"Report-Msgid-Bugs-To: http://wordpress.org/tag/wp-members\n" +"POT-Creation-Date: 2023-01-06 15:20-0500\n" +"PO-Revision-Date: 2023-01-06 15:23-0500\n" +"Last-Translator: \n" +"Language-Team: Web Geeks\n" +"Language: sk\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Poedit 2.4.3\n" + +#: includes/admin/class-wp-members-admin-api.php:254 +msgid "Custom email" +msgstr "" + +#: includes/admin/class-wp-members-admin-api.php:255 +#: includes/admin/class-wp-members-admin-api.php:257 +msgid "Subject" +msgstr "Predmet" + +#: includes/admin/class-wp-members-admin-api.php:258 +msgid "Body" +msgstr "Telo" + +#: includes/admin/class-wp-members-admin-api.php:260 +msgid "Your custom email message content." +msgstr "" + +#: includes/admin/class-wp-members-admin-api.php:338 +msgid "Options" +msgstr "Možnosti" + +#: includes/admin/class-wp-members-admin-api.php:339 +msgid "Fields" +msgstr "Polia" + +#: includes/admin/class-wp-members-admin-api.php:340 +msgid "Dialogs" +msgstr "Dialógové okná" + +#: includes/admin/class-wp-members-admin-api.php:341 +msgid "Emails" +msgstr "E-mailov" + +#: includes/admin/class-wp-members-admin-api.php:357 +msgid "New Registration" +msgstr "Nový zápis" + +#: includes/admin/class-wp-members-admin-api.php:365 +#: includes/admin/class-wp-members-admin-api.php:383 +msgid "User email validated" +msgstr "" + +#: includes/admin/class-wp-members-admin-api.php:375 +msgid "Registration is Moderated" +msgstr "Registrácia je moderovaná" + +#: includes/admin/class-wp-members-admin-api.php:391 +msgid "Registration is Moderated, User is Approved" +msgstr "Registrácia je moderovaná, schválené používateľom" + +#: includes/admin/class-wp-members-admin-api.php:399 +msgid "Password Reset" +msgstr "Vynulovanie hesla" + +#: includes/admin/class-wp-members-admin-api.php:406 +msgid "Retrieve Username" +msgstr "" + +#: includes/admin/class-wp-members-admin-api.php:414 +msgid "Admin Notification" +msgstr "Admin oznámenia" + +#: includes/admin/class-wp-members-admin-api.php:440 +msgid "Restricted post (or page), displays above the login/registration form" +msgstr "" +"Vyhradené miesto (alebo stránky), zobrazí nad prihlasovacie/registračný " +"formulár" + +#: includes/admin/class-wp-members-admin-api.php:441 +msgid "Username is taken" +msgstr "Brať meno" + +#: includes/admin/class-wp-members-admin-api.php:442 +msgid "Email is registered" +msgstr "E-mail je registrovaný" + +#: includes/admin/class-wp-members-admin-api.php:443 +msgid "Registration completed" +msgstr "Registrácia dokončená" + +#: includes/admin/class-wp-members-admin-api.php:444 +msgid "User update" +msgstr "Používateľom aktualizácie" + +#: includes/admin/class-wp-members-admin-api.php:445 +msgid "Passwords did not match" +msgstr "Passwords did not match" + +#: includes/admin/class-wp-members-admin-api.php:446 +msgid "Password changes" +msgstr "Zmeny hesla" + +#: includes/admin/class-wp-members-admin-api.php:447 +msgid "Username or email do not exist when trying to reset forgotten password" +msgstr "" +"Uživateľské meno alebo e-mail neexistujú pri pokuse o obnovenie zabudnutého " +"hesla" + +#: includes/admin/class-wp-members-admin-api.php:448 +msgid "Password reset" +msgstr "Vynulovanie hesla" + +#: includes/admin/class-wp-members-admin-api.php:547 +msgid "Close" +msgstr "" + +#: includes/admin/class-wp-members-admin-api.php:596 +msgid "Settings" +msgstr "Nastavenia" + +#: includes/admin/class-wp-members-admin-posts.php:30 +#: includes/admin/class-wp-members-admin-posts.php:33 +msgid "Unrestrict" +msgstr "" + +#: includes/admin/class-wp-members-admin-posts.php:31 +#: includes/admin/class-wp-members-admin-posts.php:34 +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:110 +msgid "Restrict" +msgstr "" + +#: includes/admin/class-wp-members-admin-posts.php:32 +#: includes/admin/class-wp-members-admin-posts.php:35 +msgid "Hide" +msgstr "" + +#: includes/admin/class-wp-members-admin-posts.php:125 +#, php-format +msgid "%s restricted" +msgstr "" + +#: includes/admin/class-wp-members-admin-posts.php:125 +#, php-format +msgid "%s unrestricted" +msgstr "" + +#: includes/admin/class-wp-members-admin-posts.php:165 +#, php-format +msgid "%s Restriction" +msgstr "" + +#: includes/admin/class-wp-members-admin-posts.php:195 +#: includes/admin/class-wp-members-admin-posts.php:342 +#: includes/admin/class-wp-members-admin-posts.php:345 +msgid "Unrestricted" +msgstr "" + +#: includes/admin/class-wp-members-admin-posts.php:196 +#: includes/admin/class-wp-members-admin-posts.php:339 +#: includes/admin/class-wp-members-admin-posts.php:347 +msgid "Restricted" +msgstr "" + +#: includes/admin/class-wp-members-admin-posts.php:197 +#: includes/admin/class-wp-members-admin-posts.php:349 +msgid "Hidden" +msgstr "" + +#: includes/admin/class-wp-members-admin-posts.php:203 +msgid "Status:" +msgstr "" + +#: includes/admin/class-wp-members-admin-posts.php:203 +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:68 +#: includes/admin/tabs/class-wp-members-fields-table.php:65 +#: includes/walkers/class-wp-members-walker-nav-menu.php:140 +#, fuzzy +msgid "Edit" +msgstr "Upraviť vaše informácie" + +#: includes/admin/class-wp-members-admin-posts.php:218 +msgid "Ok" +msgstr "" + +#: includes/admin/class-wp-members-admin-posts.php:219 +#: includes/walkers/class-wp-members-walker-nav-menu.php:224 +msgid "Cancel" +msgstr "" + +#: includes/admin/class-wp-members-admin-posts.php:305 +msgid "Status" +msgstr "" + +#: includes/admin/class-wp-members-admin-users.php:28 +#: includes/admin/class-wp-members-admin-users.php:34 +#: includes/admin/class-wp-members-admin-users.php:79 +msgid "Activate" +msgstr "Aktivovať" + +#: includes/admin/class-wp-members-admin-users.php:29 +#: includes/admin/class-wp-members-admin-users.php:35 +#: includes/admin/class-wp-members-admin-users.php:82 +msgid "Deactivate" +msgstr "" + +#: includes/admin/class-wp-members-admin-users.php:31 +#: includes/admin/class-wp-members-admin-users.php:37 +msgid "Export" +msgstr "Vývoz" + +#: includes/admin/class-wp-members-admin-users.php:32 +#: includes/admin/class-wp-members-admin-users.php:38 +#, fuzzy +msgid "Export All Users" +msgstr "Vývoz" + +#: includes/admin/class-wp-members-admin-users.php:61 +msgid "Confirm" +msgstr "" + +#: includes/admin/class-wp-members-admin-users.php:64 +msgid "Unconfirm" +msgstr "" + +#: includes/admin/class-wp-members-admin-users.php:147 +#, php-format +msgid "%s users activated" +msgstr "" + +#: includes/admin/class-wp-members-admin-users.php:147 +#, php-format +msgid "%s users deactivated" +msgstr "" + +#: includes/admin/class-wp-members-admin-users.php:150 +msgid "No users selected" +msgstr "" + +#: includes/admin/class-wp-members-admin-users.php:168 +msgid "You cannot activate or deactivate yourself" +msgstr "" + +#: includes/admin/class-wp-members-admin-users.php:173 +#, php-format +msgid "%s activated" +msgstr "" + +#: includes/admin/class-wp-members-admin-users.php:178 +#, php-format +msgid "%s deactivated" +msgstr "" + +#: includes/admin/class-wp-members-admin-users.php:182 +msgid "That user is already active" +msgstr "" + +#: includes/admin/class-wp-members-admin-users.php:198 +msgid "You cannot confirm or unconfirm yourself" +msgstr "" + +#: includes/admin/class-wp-members-admin-users.php:203 +#, php-format +msgid "%s confirmed" +msgstr "" + +#: includes/admin/class-wp-members-admin-users.php:208 +#, php-format +msgid "%s unconfirmed" +msgstr "" + +#: includes/admin/class-wp-members-admin-users.php:212 +msgid "That user is already confirmed" +msgstr "" + +#: includes/admin/class-wp-members-admin-users.php:341 +msgid "Pending" +msgstr "" + +#: includes/admin/class-wp-members-admin-users.php:342 +msgid "Trial" +msgstr "" + +#: includes/admin/class-wp-members-admin-users.php:343 +#: includes/admin/class-wp-members-user-export.php:289 +msgid "Subscription" +msgstr "Predplatné" + +#: includes/admin/class-wp-members-admin-users.php:344 +msgid "Expired" +msgstr "" + +#: includes/admin/class-wp-members-admin-users.php:347 +#: includes/admin/class-wp-members-admin-users.php:410 +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:457 +msgid "Activated" +msgstr "" + +#: includes/admin/class-wp-members-admin-users.php:348 +msgid "Pending Activation" +msgstr "" + +#: includes/admin/class-wp-members-admin-users.php:349 +msgid "Deactivated" +msgstr "" + +#: includes/admin/class-wp-members-admin-users.php:352 +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:456 +msgid "Confirmed" +msgstr "" + +#: includes/admin/class-wp-members-admin-users.php:353 +msgid "Not Confirmed" +msgstr "" + +#: includes/admin/class-wp-members-admin-users.php:355 +msgid "Not Exported" +msgstr "" + +#: includes/admin/class-wp-members-admin-users.php:475 +msgid "Not confirmed" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:67 +msgid "Slug" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:68 +#: includes/admin/class-wp-members-user-export.php:294 +msgid "Role" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:69 +#: includes/admin/class-wp-members-products-admin.php:740 +#: includes/admin/class-wp-members-user-export.php:290 +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:460 +msgid "Expires" +msgstr "Uplynie" + +#: includes/admin/class-wp-members-products-admin.php:71 +msgid "Default" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:73 +msgid "Last updated" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:97 +msgid "slug:" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:100 +msgid "No role required" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:105 +msgid "Does not expire" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:109 +#: includes/admin/class-wp-members-user-export.php:199 +msgid "Yes" +msgstr "áno" + +#: includes/admin/class-wp-members-products-admin.php:145 +msgid "Membership Product Details" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:153 +msgid "Membership Product Message (optional)" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:169 +msgid "Access by child membership" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:185 +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:62 +msgid "Posts" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:186 +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:63 +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:249 +#, fuzzy +msgid "Pages" +msgstr "Blokovať stránky v predvolenom nastavení" + +#: includes/admin/class-wp-members-products-admin.php:213 +#: includes/admin/class-wp-members-products-admin.php:262 +#: includes/admin/class-wp-members-products-admin.php:309 +msgid "Period" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:213 +msgid "Day" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:213 +msgid "Week" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:213 +msgid "Month" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:213 +msgid "Year" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:226 +msgid "Name (slug)" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:228 +msgid "Optional Defaults" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:231 +msgid "Assign as default at registration? (optional)" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:239 +#, php-format +msgid "Pre-selected by default for new %s" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:245 +msgid "Optional Properties" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:248 +msgid "Role Required? (optional)" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:251 +msgid "No Role" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:257 +msgid "Expires (optional)" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:259 +#: includes/admin/class-wp-members-products-admin.php:261 +#: includes/admin/class-wp-members-products-admin.php:306 +#: includes/admin/class-wp-members-products-admin.php:308 +msgid "Number" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:267 +msgid "Use \"no gap\" renewal" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:271 +msgid "Use a fixed period (such as Jan 1 - Dec 31, or Sept 1 - Aug 31)" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:288 +#: includes/admin/class-wp-members-products-admin.php:289 +msgid "Period Start (dd-mm)" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:290 +#: includes/admin/class-wp-members-products-admin.php:291 +msgid "Period End (dd-mm)" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:304 +msgid "Fixed period grace period" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:313 +msgid "" +"Grace period is the point at which expiration date is for following time " +"period. For example, if user who register August 1st would be part of the " +"following year's Sept 1 - Aug 31 membership, set this at 1 Month. Leave " +"blank for no grace period." +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:376 +msgid "" +"Restricted Message (displays when a user does not have access to a " +"membership)" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:502 +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:239 +#: includes/class-wp-members-forms.php:1196 +#: includes/class-wp-members-user-profile.php:132 +msgid "None" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:517 +msgid "Restrict access by membership:" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:598 +msgid "Required Membership" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:644 +#: includes/admin/class-wp-members-products-admin.php:745 +#: includes/class-wp-members-products.php:335 +msgid "Membership" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:680 +msgid "expires:" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:709 +#: includes/class-wp-members-products.php:336 +#: includes/class-wp-members-products.php:341 +msgid "Memberships" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:736 +msgid "Membership Access" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:744 +msgid "Action" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:746 +msgid "Enabled?" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:757 +msgid "Enable" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:758 +msgid "Disable" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:759 +msgid "Update" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:764 +msgid "Expiration date (optional)" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:795 +#, php-format +msgid "No memberships have been created. %sCreate new memberships here%s" +msgstr "" + +#: includes/admin/class-wp-members-user-export.php:199 +msgid "No" +msgstr "nie" + +#: includes/admin/class-wp-members-user-export.php:264 +msgid "You do not have the required user capabilities to export users." +msgstr "" + +#: includes/admin/class-wp-members-user-export.php:277 +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:461 +msgid "User ID" +msgstr "" + +#: includes/admin/class-wp-members-user-export.php:284 +#: includes/class-wp-members-dialogs.php:91 +#: includes/class-wp-members-dialogs.php:114 +msgid "Username" +msgstr "Username" + +#: includes/admin/class-wp-members-user-export.php:286 +msgid "Activated?" +msgstr "Aktivovaný?" + +#: includes/admin/class-wp-members-user-export.php:292 +msgid "Registered" +msgstr "Registrované" + +#: includes/admin/class-wp-members-user-export.php:293 +msgid "IP" +msgstr "IP" + +#: includes/admin/dialogs.php:117 +msgid "" +"Your WP settings allow anyone to register - this is not the recommended " +"setting." +msgstr "" +"Vaša WP nastavenie umožňuje, aby niekto zaregistrovať - to nie je odporúčané " +"nastavenie." + +#: includes/admin/dialogs.php:118 +#, php-format +msgid "" +"You can %s change this here %s making sure the box next to \"Anyone can " +"register\" is unchecked." +msgstr "" +"Môžete% s to zmeniť tu% s to, aby políčko \"Každý sa môže zaregistrovať\" je " +"aktívny." + +#: includes/admin/dialogs.php:119 +msgid "" +"This setting allows a link on the /wp-login.php page to register using the " +"WP native registration process thus circumventing any registration you are " +"using with WP-Members. In some cases, this may suit the users wants/needs, " +"but most users should uncheck this option. If you do not change this " +"setting, you can choose to ignore these warning messages under WP-Members " +"Settings." +msgstr "" +"Toto nastavenie umožňuje odkaz na / wp-login.php stránke zaregistrovať " +"pomocou WP natívne proces registrácie a tým obísť žiadny záznam, ktorý " +"používate s WP-poslancov. V niektorých prípadoch to môže vyhovovať " +"používateľom wants/potreby, ale väčšina užívateľov by odškrtnite túto voľbu. " +"Ak nemáte toto nastavenie zmeniť, môžete zvoliť ignorovanie týchto varovných " +"správ v rámci WP-poslancov nastavenia." + +#: includes/admin/dialogs.php:123 +msgid "" +"Your WP settings allow anyone to comment - this is not the recommended " +"setting." +msgstr "" +"Vaša WP nastavenie umožňuje, aby niekto komentár - to nie je odporúčané " +"nastavenie." + +#: includes/admin/dialogs.php:124 +#, php-format +msgid "" +"You can %s change this here %s by checking the box next to \"Users must be " +"registered and logged in to comment.\"" +msgstr "" +"Môžete %s to zmeniť tu %s zaškrtnutím políčka vedľa \"Používatelia musia byť " +"registrovaný a prihlásený komentovať.\"" + +#: includes/admin/dialogs.php:125 +msgid "" +"This setting allows any users to comment, whether or not they are " +"registered. Depending on how you are using WP-Members will determine whether " +"you should change this setting or not. If you do not change this setting, " +"you can choose to ignore these warning messages under WP-Members Settings." +msgstr "" +"Toto nastavenie umožňuje používateľom akékoľvek pripomienky, či už sú alebo " +"nie sú zaregistrovaní. V závislosti od spôsobu používania WP-členov určí, či " +"by ste mali zmeniť toto nastavenie, alebo nie. Ak nemáte toto nastavenie " +"zmeniť, môžete zvoliť ignorovanie týchto varovných správ v rámci WP-" +"poslancov nastavenia." + +#: includes/admin/dialogs.php:129 +msgid "" +"Your WP settings allow full text rss feeds - this is not the recommended " +"setting." +msgstr "" +"Vaša WP nastavenie umožňuje fulltextové RSS - toto nie je odporúčané " +"nastavenie." + +#: includes/admin/dialogs.php:130 +#, php-format +msgid "" +"You can %s change this here %s by changing \"For each article in a feed, show" +"\" to \"Summary.\"" +msgstr "" +"Môžete %s to zmeniť tu %s tým, že mení \"U každého článku v krmivách, " +"ukazujú,\" na \"Celková.\"" + +#: includes/admin/dialogs.php:131 +msgid "" +"Leaving this set to full text allows anyone to read your protected content " +"in an RSS reader. Changing this to Summary prevents this as your feeds will " +"only show summary text." +msgstr "" +"Ponechanie tejto sady k úplnému zneniu umožňuje každému si prečítať " +"chráneného obsahu v RSS čítačke. Zmena na súhrn bráni to ako zdroja sa " +"zobrazí len súhrnné text." + +#: includes/admin/dialogs.php:135 +msgid "You have set WP-Members to hold registrations for approval" +msgstr "Nastavili ste WP-členovia držať zápisov na schválenie" + +#: includes/admin/dialogs.php:136 +msgid "" +"but you have not changed the default message for \"Registration Completed\" " +"under \"WP-Members Dialogs and Error Messages.\" You should change this " +"message to let users know they are pending approval." +msgstr "" +"ale vy ste nezmenili predvolené správu pre \"Registrácia dokončená\" v \"WP-" +"Členov dialógy a chybové hlásenia.\" by ste mali zmeniť túto správu dať " +"používateľom vedieť, že sa čaká na schválenie." + +#: includes/admin/dialogs.php:140 +msgid "You have turned on reCAPTCHA" +msgstr "Zapli ste reCAPTCHA" + +#: includes/admin/dialogs.php:141 +msgid "" +"but you have not entered API keys. You will need both a public and private " +"key. The CAPTCHA will not display unless a valid API key is included." +msgstr "" +"ale vy ste nezadali API kľúča. Budete potrebovať obaja verejný a súkromný " +"kľúč. CAPTCHA sa nezobrazí, ak platné API kľúč je súčasťou dodávky." + +#: includes/admin/dialogs.php:145 +msgid "You have active settings that are not recommended." +msgstr "" + +#: includes/admin/dialogs.php:146 +msgid "" +"If you will not be changing these settings, you can turn off these warning " +"messages by checking the \"Ignore warning messages\" in the settings below." +msgstr "" + +#: includes/admin/dialogs.php:174 +msgid "Version:" +msgstr "Verzia:" + +#: includes/admin/dialogs.php:175 +#, fuzzy +msgid "Quick Start Guide" +msgstr "" +"WP obmedzenie prístupu a registračné. Pre viac informácií a na stiahnutie v " +"užívateľskej príručke, nájdete " +"http://butlerblog.com/wp-members . Quick Start Guide je k " +"dispozícii tiež. WP-členov (TM) je obchodná značka butlerblog.com." + +#: includes/admin/dialogs.php:176 +#, fuzzy +msgid "Online User Guide" +msgstr "Používateľom aktualizácie" + +#: includes/admin/dialogs.php:177 +msgid "FAQs" +msgstr "" + +#: includes/admin/dialogs.php:184 +#, fuzzy +msgid "Thank you for using WP-Members" +msgstr "Ďakujeme, že používate WP členov! Používate verziu %s" + +#: includes/admin/dialogs.php:185 +msgid "A plugin developed by" +msgstr "" + +#: includes/admin/dialogs.php:186 +msgid "Follow" +msgstr "Postupujte" + +#: includes/admin/dialogs.php:203 includes/admin/dialogs.php:207 +msgid "Latest from RocketGeek" +msgstr "" + +#: includes/admin/dialogs.php:224 +msgid "Like WP-Members?" +msgstr "" + +#: includes/admin/dialogs.php:225 +#, php-format +msgid "" +"If you like WP-Members please give it a %s★★★★★" +"%s rating. Thanks!!" +msgstr "" + +#: includes/admin/dialogs.php:236 includes/admin/dialogs.php:249 +msgid "Latest from ButlerBlog" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:67 +#, php-format +msgid "See the %sUsers Guide on CAPTCHA%s." +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:74 +#: includes/admin/tabs/class-wp-members-admin-tab-dialogs.php:57 +#: includes/admin/tabs/class-wp-members-admin-tab-emails.php:109 +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:134 +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:78 +msgid "Need help?" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:85 +msgid "Manage CAPTCHA Options" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:91 +msgid "CAPTCHA Type" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:96 +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:243 +msgid "reCAPTCHA v2" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:97 +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:244 +msgid "reCAPTCHA v3" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:98 +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:245 +msgid "Really Simple CAPTCHA" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:99 +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:246 +msgid "hCaptcha" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:106 +msgid "" +"CAPTCHA type was changed. Please verify and update the settings below for " +"the new CAPTCHA type." +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:117 +msgid "reCAPTCHA Keys" +msgstr "reCAPTCHA klávesy" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:120 +#, php-format +msgid "" +"reCAPTCHA requires an API key, consisting of a \"site\" and a \"secret\" " +"key. You can sign up for a %s free reCAPTCHA key%s" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:122 +msgid "Site Key" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:123 +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:139 +msgid "Secret Key" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:133 +msgid "hCaptcha Keys" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:136 +#, php-format +msgid "" +"hCaptcha requires an API key. You can sign up for %s an hCaptcha API key " +"here %s" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:138 +msgid "API Key" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:170 +msgid "Characters for image" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:174 +msgid "Number of characters" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:178 +msgid "Image dimensions" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:179 +msgid "Width" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:179 +msgid "Height" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:182 +msgid "Font color of characters" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:186 +msgid "Background color of image" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:190 +msgid "Font size" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:194 +msgid "Width between characters" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:198 +#, fuzzy +msgid "Image type" +msgstr "Typ poľa" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:213 +msgid "" +"To use Really Simple CAPTCHA, you must have the Really Simple CAPTCHA plugin " +"installed and activated." +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:241 +#, fuzzy +msgid "Update CAPTCHA Settings" +msgstr "Aktualizovať nastavenia" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:319 +#, fuzzy +msgid "CAPTCHA was updated for WP-Members" +msgstr "reCAPTCHA bol aktualizovaný poslancov WP" + +#: includes/admin/tabs/class-wp-members-admin-tab-dialogs.php:67 +msgid "Dialogs and Error Messages" +msgstr "Dialógové okná a chybových hlásení" + +#: includes/admin/tabs/class-wp-members-admin-tab-dialogs.php:69 +#, php-format +msgid "" +"You can customize the text for dialogs and error messages. Simple HTML is " +"allowed %s etc." +msgstr "" +"Môžete upraviť text dialógov a chybové správy. Jednoduché HTML je povolené " +"%s atď" + +#: includes/admin/tabs/class-wp-members-admin-tab-dialogs.php:80 +msgid "Terms of Service (TOS)" +msgstr "Zmluvné podmienky služby (TOS)" + +#: includes/admin/tabs/class-wp-members-admin-tab-dialogs.php:87 +msgid "Update Dialogs" +msgstr "Aktualizácia Dialogs" + +#: includes/admin/tabs/class-wp-members-admin-tab-dialogs.php:124 +msgid "WP-Members dialogs were updated" +msgstr "WP-členovia dialógy boli aktualizované" + +#: includes/admin/tabs/class-wp-members-admin-tab-dropins.php:88 +#: includes/admin/tabs/class-wp-members-dropins-table.php:180 +msgid "WP-Members Dropin settings were updated" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-dropins.php:216 +msgid "Manage Dropins" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-dropins.php:217 +msgid "Current dropin folder: " +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-dropins.php:218 +msgid "" +"You can change location of the dropin folder using the " +"wpmem_dropin_folder filter." +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-emails.php:57 +msgid "Email Messages" +msgstr "E-mailové správy" + +#: includes/admin/tabs/class-wp-members-admin-tab-emails.php:60 +msgid "You can customize the content of the emails sent by the plugin." +msgstr "Môžete prispôsobiť obsah e-mailov odoslané plugin." + +#: includes/admin/tabs/class-wp-members-admin-tab-emails.php:62 +msgid "A list of shortcodes is available here." +msgstr "Tu je k dispozícii zoznam shortcodes." + +#: includes/admin/tabs/class-wp-members-admin-tab-emails.php:69 +msgid "Set a custom email address" +msgstr "Nastaviť vlastnú e-mailovú adresu" + +#: includes/admin/tabs/class-wp-members-admin-tab-emails.php:70 +#: includes/admin/tabs/class-wp-members-admin-tab-emails.php:74 +#: includes/admin/tabs/class-wp-members-admin-tab-emails.php:93 +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:163 +msgid "(optional)" +msgstr "(voliteľné)" + +#: includes/admin/tabs/class-wp-members-admin-tab-emails.php:73 +msgid "Set a custom email name" +msgstr "Nastaviť názov vlastného e-mailu" + +#: includes/admin/tabs/class-wp-members-admin-tab-emails.php:77 +msgid "Send HTML email" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-emails.php:93 +msgid "Email Signature" +msgstr "Podpis e-mailu" + +#: includes/admin/tabs/class-wp-members-admin-tab-emails.php:101 +msgid "Update Emails" +msgstr "Aktualizácia e-mailov" + +#: includes/admin/tabs/class-wp-members-admin-tab-emails.php:172 +msgid "WP-Members emails were updated" +msgstr "WP-členovia e-maily boli aktualizované" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:93 +#: includes/class-wp-members-dialogs.php:65 +msgid "No fields selected for deletion" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:95 +msgid "Are you sure you want to delete the following fields?" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:122 +msgid "Fields deleted" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:136 +msgid "Field Manager Documentation" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:164 +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:315 +#: includes/class-wp-members-forms.php:1629 +#: includes/class-wp-members-forms.php:1821 +#: includes/class-wp-members-user-profile.php:181 +msgid "(required)" +msgstr "Vyžadováno?" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:169 +#, fuzzy +msgid "Edit Field" +msgstr "Upraviť vaše informácie" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:169 +#, fuzzy +msgid "Add a Field" +msgstr "Pridať a odstrániť" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:174 +msgid "Field Label" +msgstr "Označenie poľa" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:176 +msgid "The name of the field as it will be displayed to the user." +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:179 +#: includes/admin/tabs/class-wp-members-fields-table.php:58 +msgid "Meta Key" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:185 +msgid "" +"The database meta value for the field. It must be unique and contain no " +"spaces (underscores are ok)." +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:189 +#: includes/admin/tabs/class-wp-members-fields-table.php:59 +msgid "Field Type" +msgstr "Typ poľa" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:195 +msgid "text" +msgstr "textu" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:196 +msgid "email" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:197 +msgid "textarea" +msgstr "Textarea" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:198 +msgid "checkbox" +msgstr "Checkbox" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:199 +msgid "multiple checkbox" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:200 +msgid "select (dropdown)" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:201 +msgid "multiple select" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:202 +msgid "radio group" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:203 +msgid "password" +msgstr "heslo" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:204 +msgid "image" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:205 +msgid "file" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:206 +msgid "url" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:207 +msgid "number" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:208 +msgid "date" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:209 +msgid "hidden" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:211 +msgid "membership" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:217 +#: includes/admin/tabs/class-wp-members-fields-table.php:60 +msgid "Display?" +msgstr "Zobraziť?" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:221 +msgid "This field is always displayed" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:226 +msgid "Required?" +msgstr "Vyžadováno?" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:230 +msgid "This field is always required" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:236 +msgid "Allow HTML?" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:243 +msgid "Placeholder" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:251 +msgid "Pattern" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:259 +msgid "Title" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:268 +msgid "Minimum Value" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:272 +msgid "Maximum Value" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:280 +msgid "Rows" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:284 +msgid "Columns" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:292 +msgid "Accepted file types:" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:297 +msgid "Accepted file types should be set like this: jpg|jpeg|png|gif" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:304 +#, fuzzy +msgid "Checked by default?" +msgstr "Skontrolovať?" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:308 +msgid "HTML label position" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:310 +msgid "Before the input tag" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:311 +msgid "After the input tag" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:312 +msgid "" +"Selecting \"after\" will generally display the label to the right of the " +"checkbox" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:315 +#, fuzzy +msgid "Stored value if checked:" +msgstr "Skontrolovať?" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:336 +msgid "Stored values delimiter:" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:345 +msgid "Values (Displayed|Stored):" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:370 +msgid "Options should be Option Name|option_value," +msgstr "Možnosti by mala byť možnosť Name|option_value" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:374 +msgid "Visit plugin site for more information" +msgstr "Môžete tiež navštíviť lokalitu plugin pre ďalšie informácie" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:381 +msgid "Value" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:400 +msgid "Save Changes" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:400 +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:527 +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:528 +#, fuzzy +msgid "Add Field" +msgstr "Pridať a odstrániť" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:402 +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:726 +msgid "Return to Fields Table" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:449 +msgid "Drag and drop to reorder fields" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:455 +#, fuzzy +msgid "Registration Date" +msgstr "Registrácia dokončená" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:458 +msgid "Registration IP" +msgstr "IP @ registrácie" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:459 +msgid "Subscription Type" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:495 +msgid "Manage Fields" +msgstr "Spravovať polia" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:595 +msgid "WP-Members fields were updated" +msgstr "WP-členovia polia boli aktualizované" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:617 +msgid "Field Label is required. Nothing was updated." +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:618 +msgid "Meta Key is required. Nothing was updated." +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:620 +msgid "Meta Key must contain only letters, numbers, and underscores" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:627 +msgid "A field with that meta key already exists" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:632 +#, php-format +msgid "" +"Sorry, \"%s\" is a reserved term. " +"Field was not added." +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:673 +#, fuzzy +msgid "Checked value is required for checkboxes. Nothing was updated." +msgstr "Označenie poľa je potrebné pridať nové pole. Nič bol aktualizovaný." + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:705 +msgid "A value is required for hidden fields. Nothing was updated." +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:712 +#, php-format +msgid "%s was added" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:725 +#, php-format +msgid "%s was updated" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:768 +msgid "Form field order updated." +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:56 +#, php-format +msgid "%sChange%s or %sFilter%s this address" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:57 +#, php-format +msgid "See the %sUsers Guide on plugin options%s." +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:90 +msgid "Manage Options" +msgstr "Spravovať možnosti" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:94 +msgid "Content" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:105 +msgid "Content Restriction" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:109 +msgid "Do not restrict" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:123 +msgid "Show Excerpts" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:124 +msgid "Show Login Form" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:125 +msgid "Show Registration Form" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:126 +#, fuzzy +msgid "Auto Excerpt:" +msgstr "Zobrazenie ukážky" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:148 +#, fuzzy +msgid "Number of words in excerpt:" +msgstr "Zobrazenie ukážky" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:149 +msgid "Custom read more link (optional):" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:163 +msgid "Time-based expiration" +msgstr "Skončenie časového" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:163 +msgid "Allows for access to expire" +msgstr "Umožňuje prístup k uplynie" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:164 +msgid "Trial period" +msgstr "Skúšobné obdobie" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:164 +msgid "Allows for a trial period" +msgstr "Umožňuje skúšobnú dobu" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:166 +msgid "Subscription Settings" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:176 +msgid "New Feature Settings" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:182 +msgid "Legacy Password Reset" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:182 +#, php-format +msgid "Use legacy password reset. %s(Requires additional configuration)%s" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:184 +msgid "Legacy Login Error" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:184 +msgid "Use legacy WP-Members login error instead of WP error object." +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:187 +msgid "WooCommerce My Account" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:187 +msgid "Add WP-Members fields to WooCommerce My Account registration" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:188 +msgid "WooCommerce Checkout" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:188 +msgid "Add WP-Members fields to WooCommerce registration during checkout" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:204 +msgid "Other Settings" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:214 +msgid "Enable memberships" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:214 +#, php-format +msgid "Enables creation of different %s membership products %s" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:215 +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:223 +msgid "Clone menus" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:215 +msgid "Enables logged in menus" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:216 +msgid "Notify admin" +msgstr "Oznámiť admin" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:216 +#, fuzzy, php-format +msgid "Notify %s for each new registration? %s" +msgstr "Pošle email admin pre každý nový zápis?" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:217 +msgid "Moderate registration" +msgstr "Mierny registrácie" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:217 +msgid "Holds new registrations for admin approval" +msgstr "Vlastní nových registrácií schvaľovania admin" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:218 +msgid "Confirmation Link" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:218 +#, php-format +msgid "" +"Send email confirmation link on new registration. %s(Requires additional " +"configuration)%s" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:219 +msgid "Ignore warning messages" +msgstr "Ignorovanie upozornení" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:219 +msgid "Ignores WP-Members warning messages in the admin panel" +msgstr "Ignoruje WP-členovia upozorňujúcich hlásení v admin panel" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:233 +msgid "Attribution" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:235 +msgid "" +"Attribution is appreciated! Display \"powered by\" link on register form?" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:238 +msgid "Enable CAPTCHA for Registration" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:253 +msgid "Login Page:" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:256 +msgid "Specify a login page (optional)" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:265 +#, fuzzy +msgid "Register Page:" +msgstr "URL stránky registra:" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:268 +msgid "For creating a register link in the login form" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:277 +#, fuzzy +msgid "User Profile Page:" +msgstr "Používateľom aktualizácie" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:280 +msgid "For creating a forgot password link in the login form" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:286 +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:288 +msgid "Stylesheet" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:297 +#, fuzzy +msgid "Custom Stylesheet:" +msgstr "Vlastné" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:302 +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:329 +msgid "Update Settings" +msgstr "Aktualizovať nastavenia" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:310 +msgid "Custom Post Types" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:316 +msgid "Add to WP-Members Settings" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:332 +msgid "" +"Please keep in mind that Custom Post Types are \"custom\" and therefore, not " +"all of them will function exactly the same way. WP-Members will certainly " +"work with any post type that operate like a post or a page; but you will " +"need to review any custom post type added to determine that it functions the " +"way you expect." +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:342 +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:343 +msgid "WP-Members Settings" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:344 +msgid "" +"The following is your WP-Members settings information if needed for support." +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:378 +msgid "Click to Copy" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:458 +msgid "Custom Post Type settings were updated" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:579 +msgid "WP-Members settings were updated" +msgstr "WP-členovia nastavenia boli aktualizované" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:651 +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:682 +msgid "USE CUSTOM URL BELOW" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:671 +#, fuzzy +msgid "Select a page" +msgstr "Nový zápis" + +#: includes/admin/tabs/class-wp-members-dropins-table.php:70 +msgid "Name" +msgstr "" + +#: includes/admin/tabs/class-wp-members-dropins-table.php:71 +msgid "Enabled" +msgstr "" + +#: includes/admin/tabs/class-wp-members-dropins-table.php:72 +msgid "File" +msgstr "" + +#: includes/admin/tabs/class-wp-members-dropins-table.php:73 +msgid "Version" +msgstr "" + +#: includes/admin/tabs/class-wp-members-dropins-table.php:74 +#: includes/walkers/class-wp-members-walker-nav-menu.php:186 +msgid "Description" +msgstr "" + +#: includes/admin/tabs/class-wp-members-dropins-table.php:117 +#: includes/admin/tabs/class-wp-members-fields-table.php:108 +msgid "Save Settings" +msgstr "" + +#: includes/admin/tabs/class-wp-members-fields-table.php:43 +msgid "delete" +msgstr "" + +#: includes/admin/tabs/class-wp-members-fields-table.php:57 +msgid "Display Label" +msgstr "" + +#: includes/admin/tabs/class-wp-members-fields-table.php:61 +msgid "Required" +msgstr "" + +#: includes/admin/tabs/class-wp-members-fields-table.php:63 +#, fuzzy +msgid "Users Screen" +msgstr "Vývoz" + +#: includes/admin/tabs/class-wp-members-fields-table.php:64 +msgid "Users Search" +msgstr "" + +#: includes/admin/tabs/class-wp-members-fields-table.php:66 +msgid "Sort" +msgstr "" + +#: includes/admin/tabs/class-wp-members-fields-table.php:107 +msgid "Delete Selected" +msgstr "" + +#: includes/api/api-forms.php:584 +#, php-format +msgid "%s is a required field." +msgstr "" + +#: includes/class-wp-members-captcha.php:276 includes/deprecated.php:401 +msgid "You have entered an incorrect code value. Please try again." +msgstr "" + +#: includes/class-wp-members-dialogs.php:41 +msgid "First Name" +msgstr "Krstné meno" + +#: includes/class-wp-members-dialogs.php:42 +msgid "Last Name" +msgstr "Priezvisko" + +#: includes/class-wp-members-dialogs.php:43 +msgid "Address 1" +msgstr "Adresa 1" + +#: includes/class-wp-members-dialogs.php:44 +msgid "Address 2" +msgstr "Adresa 2" + +#: includes/class-wp-members-dialogs.php:45 +msgid "City" +msgstr "Mesto" + +#: includes/class-wp-members-dialogs.php:46 +msgid "State" +msgstr "Štát" + +#: includes/class-wp-members-dialogs.php:47 +msgid "Zip" +msgstr "Zip" + +#: includes/class-wp-members-dialogs.php:48 +msgid "Country" +msgstr "Krajina" + +#: includes/class-wp-members-dialogs.php:49 +msgid "Day Phone" +msgstr "Deň telefón" + +#: includes/class-wp-members-dialogs.php:50 +#: includes/class-wp-members-dialogs.php:92 +msgid "Email" +msgstr "E-mailom" + +#: includes/class-wp-members-dialogs.php:51 +msgid "Confirm Email" +msgstr "" + +#: includes/class-wp-members-dialogs.php:52 +msgid "Website" +msgstr "Webová stránka" + +#: includes/class-wp-members-dialogs.php:53 +msgid "Biographical Info" +msgstr "Biografické Info" + +#: includes/class-wp-members-dialogs.php:54 +#: includes/class-wp-members-dialogs.php:74 +#: includes/class-wp-members-dialogs.php:159 +msgid "Password" +msgstr "Heslo" + +#: includes/class-wp-members-dialogs.php:55 +msgid "Confirm Password" +msgstr "" + +#: includes/class-wp-members-dialogs.php:56 +#: includes/class-wp-members-forms.php:2165 +msgid "TOS" +msgstr "PREVÁDZKOVATELIA V ODVETVÍ TELEKOMUNIKÁCIÍ" + +#: includes/class-wp-members-dialogs.php:66 +#, fuzzy +msgid "You are not logged in." +msgstr "Ste prihlásený ako %s" + +#: includes/class-wp-members-dialogs.php:72 +#, fuzzy +msgid "Existing Users Log In" +msgstr "Prihlásenie" + +#: includes/class-wp-members-dialogs.php:73 +#: includes/class-wp-members-dialogs.php:158 +msgid "Username or Email" +msgstr "" + +#: includes/class-wp-members-dialogs.php:75 +#: includes/class-wp-members-shortcodes.php:773 +msgid "Log In" +msgstr "Prihlásenie" + +#: includes/class-wp-members-dialogs.php:76 +msgid "Remember Me" +msgstr "" + +#: includes/class-wp-members-dialogs.php:77 +msgid "Forgot password?" +msgstr "Zabudli ste heslo?" + +#: includes/class-wp-members-dialogs.php:78 +msgid "Click here to reset" +msgstr "Kliknite sem, ak chcete obnoviť" + +#: includes/class-wp-members-dialogs.php:79 +msgid "New User?" +msgstr "Nový užívateľ?" + +#: includes/class-wp-members-dialogs.php:80 +msgid "Click here to register" +msgstr "Kliknite tu pre registráciu" + +#: includes/class-wp-members-dialogs.php:83 +#: includes/class-wp-members-dialogs.php:142 +msgid "Change Password" +msgstr "Zmena hesla" + +#: includes/class-wp-members-dialogs.php:84 +msgid "New password" +msgstr "" + +#: includes/class-wp-members-dialogs.php:85 +msgid "Confirm new password" +msgstr "" + +#: includes/class-wp-members-dialogs.php:86 +msgid "Update Password" +msgstr "Aktualizácia hesla" + +#: includes/class-wp-members-dialogs.php:87 +msgid "Password successfully changed!" +msgstr "" + +#: includes/class-wp-members-dialogs.php:90 +msgid "Reset Forgotten Password" +msgstr "Obnovenie zabudnutého hesla" + +#: includes/class-wp-members-dialogs.php:93 +msgid "Reset Password" +msgstr "Reset hesla" + +#: includes/class-wp-members-dialogs.php:94 +msgid "Forgot username?" +msgstr "" + +#: includes/class-wp-members-dialogs.php:95 +msgid "Click here" +msgstr "" + +#: includes/class-wp-members-dialogs.php:98 +#: includes/class-wp-members-dialogs.php:100 +msgid "Retrieve username" +msgstr "" + +#: includes/class-wp-members-dialogs.php:99 +msgid "Email Address" +msgstr "" + +#: includes/class-wp-members-dialogs.php:103 +#, fuzzy +msgid "New User Registration" +msgstr "Nový užívateľ?" + +#: includes/class-wp-members-dialogs.php:104 +msgid "Choose a Username" +msgstr "Vyberte meno" + +#: includes/class-wp-members-dialogs.php:105 +msgid "Input the code:" +msgstr "" + +#: includes/class-wp-members-dialogs.php:106 +#: includes/class-wp-members-forms.php:2164 +#, php-format +msgid "Please indicate that you agree to the %s Terms of Service %s" +msgstr "" + +#: includes/class-wp-members-dialogs.php:107 +#, fuzzy +msgid "Reset Form" +msgstr "Vyskytla sa chyba s CAPTCHA formou." + +#: includes/class-wp-members-dialogs.php:108 +#: includes/class-wp-members-dialogs.php:162 +#: includes/class-wp-members-shortcodes.php:770 +#: includes/class-wp-members-user.php:186 +msgid "Register" +msgstr "Zaregistrovať sa" + +#: includes/class-wp-members-dialogs.php:110 +msgid "Required field" +msgstr "Povinné pole" + +#: includes/class-wp-members-dialogs.php:113 +msgid "Edit Your Information" +msgstr "Upraviť vaše informácie" + +#: includes/class-wp-members-dialogs.php:115 +#, fuzzy +msgid "Update Profile" +msgstr "Používateľom aktualizácie" + +#: includes/class-wp-members-dialogs.php:116 +msgid "Update this file" +msgstr "" + +#: includes/class-wp-members-dialogs.php:119 +msgid "Login Failed!" +msgstr "Prihlásenie zlyhalo!" + +#: includes/class-wp-members-dialogs.php:120 +msgid "You entered an invalid username or password." +msgstr "Zadali ste neplatné meno používateľa alebo heslo." + +#: includes/class-wp-members-dialogs.php:121 +msgid "Click here to continue." +msgstr "Kliknite tu pre pokračovať." + +#: includes/class-wp-members-dialogs.php:122 +msgid "Password fields cannot be empty" +msgstr "Polia heslo nemôže byť prázdne" + +#: includes/class-wp-members-dialogs.php:123 +msgid "Sorry, that email address was not found." +msgstr "" + +#: includes/class-wp-members-dialogs.php:124 +#, php-format +msgid "An email was sent to %s with your username." +msgstr "" + +#: includes/class-wp-members-dialogs.php:125 +#, php-format +msgid "Sorry, %s is a required field." +msgstr "Je nám ľúto, ale %s je názov požadovaného poľa." + +#: includes/class-wp-members-dialogs.php:126 +msgid "You must enter a valid email address." +msgstr "Musíte zadať platnú e-mailovú adresu." + +#: includes/class-wp-members-dialogs.php:127 +msgid "The username cannot include non-alphanumeric characters." +msgstr "Užívateľské meno nemôže obsahovať iné ako alfanumerické znaky." + +#: includes/class-wp-members-dialogs.php:128 +msgid "Sorry, username is a required field" +msgstr "Je nám ľúto, ale username je názov požadovaného poľa" + +#: includes/class-wp-members-dialogs.php:129 +msgid "Sorry, that username is taken, Please try another." +msgstr "" + +#: includes/class-wp-members-dialogs.php:130 +msgid "Sorry, that email address already has an account. Please try another." +msgstr "" + +#: includes/class-wp-members-dialogs.php:131 +#: includes/class-wp-members-dialogs.php:174 +#, fuzzy +msgid "Passwords did not match." +msgstr "Passwords did not match" + +#: includes/class-wp-members-dialogs.php:132 +#, fuzzy +msgid "Emails did not match." +msgstr "Passwords did not match" + +#: includes/class-wp-members-dialogs.php:133 +msgid "You must complete the CAPTCHA form." +msgstr "Musíte vyplniť formulár CAPTCHA." + +#: includes/class-wp-members-dialogs.php:134 +msgid "CAPTCHA was not valid." +msgstr "" + +#: includes/class-wp-members-dialogs.php:135 +#, fuzzy +msgid "There was an error processing the form." +msgstr "Vyskytla sa chyba s CAPTCHA formou." + +#: includes/class-wp-members-dialogs.php:136 +msgid "There was an error with the CAPTCHA form." +msgstr "Vyskytla sa chyba s CAPTCHA formou." + +#: includes/class-wp-members-dialogs.php:137 +#, php-format +msgid "" +"Sorry, you can only upload the following file types for the %s field: %s." +msgstr "" + +#: includes/class-wp-members-dialogs.php:138 +#: includes/class-wp-members-dialogs.php:171 +msgid "Your information was updated!" +msgstr "Vaše informácie bolo aktualizované!" + +#: includes/class-wp-members-dialogs.php:141 +msgid "Edit My Information" +msgstr "Upraviť moje informácie" + +#: includes/class-wp-members-dialogs.php:143 +#: includes/class-wp-members-dialogs.php:146 +#: includes/class-wp-members-dialogs.php:148 +#: includes/class-wp-members-dialogs.php:153 +#, php-format +msgid "You are logged in as %s" +msgstr "Ste prihlásený ako %s" + +#: includes/class-wp-members-dialogs.php:144 +msgid "Log out" +msgstr "" + +#: includes/class-wp-members-dialogs.php:145 +msgid "Edit profile" +msgstr "" + +#: includes/class-wp-members-dialogs.php:145 +msgid "Begin using the site." +msgstr "Začať pomocou lokality." + +#: includes/class-wp-members-dialogs.php:147 +#, fuzzy +msgid "Click to log out" +msgstr "Prihlásenie" + +#: includes/class-wp-members-dialogs.php:149 +#, fuzzy +msgid "click to log out" +msgstr "Prihlásenie" + +#: includes/class-wp-members-dialogs.php:150 +msgid "Log Out" +msgstr "" + +#: includes/class-wp-members-dialogs.php:154 +msgid "click here to log out" +msgstr "Kliknite tu pre odhlásenie" + +#: includes/class-wp-members-dialogs.php:155 +msgid "Login Failed!
    You entered an invalid username or password." +msgstr "" +"Prihlásenie zlyhalo! < br / > zadané neplatné meno používateľa alebo heslo." + +#: includes/class-wp-members-dialogs.php:156 +msgid "Invalid username or password." +msgstr "" + +#: includes/class-wp-members-dialogs.php:160 includes/class-wp-members.php:1745 +msgid "log in" +msgstr "prihlásenie" + +#: includes/class-wp-members-dialogs.php:161 +msgid "Forgot?" +msgstr "Zabudli ste?" + +#: includes/class-wp-members-dialogs.php:165 +#, fuzzy +msgid "" +"This content is restricted to site members. If you are an existing user, " +"please log in. New users may register below." +msgstr "" +"Tento obsah je obmedzená na mieste členov. Ak ste existujúci užívateľ, " +"prihláste sa prosím. Noví užívatelia sa môžu zaregistrovať nižšie." + +#: includes/class-wp-members-dialogs.php:166 +#, fuzzy +msgid "" +"Congratulations! Your registration was successful.

    You may now " +"log in using the password that was emailed to you." +msgstr "" +"Gratulujeme! Vaša registrácia bola úspešná.

    Teraz môžete " +"prihlásiť pomocou hesla, ktoré bolo zaslané e-mailom na vás." + +#: includes/class-wp-members-dialogs.php:169 +msgid "Sorry, that username is taken, please try another." +msgstr "Je nám ľúto, tak├⌐to pou┼╛├¡vate─╛sk├⌐ meno prijaté, skúste iné." + +#: includes/class-wp-members-dialogs.php:170 +msgid "" +"Sorry, that email address already has an account.
    Please try another." +msgstr "" +"Ospravedlňujeme sa, že e-mailová adresa už účet.
    Skúste prosím iný." + +#: includes/class-wp-members-dialogs.php:175 +msgid "Password successfully changed." +msgstr "" + +#: includes/class-wp-members-dialogs.php:176 +msgid "Invalid username or email address." +msgstr "" + +#: includes/class-wp-members-dialogs.php:177 +msgid "" +"Password successfully reset! An email containing a new password has been " +"sent to the email address on file for your account." +msgstr "" + +#: includes/class-wp-members-dialogs.php:178 +msgid "" +"Reset request received. An email with instructions to complete the password " +"reset has been sent." +msgstr "" + +#: includes/class-wp-members-dialogs.php:180 +msgid "This content requires the following membership: " +msgstr "" + +#: includes/class-wp-members-dialogs.php:181 +msgid "This content requires one of the following memberships: " +msgstr "" + +#: includes/class-wp-members-forms.php:84 +#: includes/class-wp-members-forms.php:350 +msgid "Choose membership" +msgstr "" + +#: includes/class-wp-members-forms.php:1898 +#: includes/class-wp-members-user-profile.php:510 +msgid "Activate this user?" +msgstr "Aktivovať tomuto používateľovi?" + +#: includes/class-wp-members-forms.php:2165 templates/tos.php:20 +msgid "Terms of Service" +msgstr "Zmluvné podmienky služby" + +#: includes/class-wp-members-menus.php:131 +msgid "Display" +msgstr "" + +#: includes/class-wp-members-menus.php:139 +msgid "Logged In Users" +msgstr "" + +#: includes/class-wp-members-menus.php:146 +msgid "Logged Out Users" +msgstr "" + +#: includes/class-wp-members-menus.php:153 +msgid "All Users" +msgstr "" + +#: includes/class-wp-members-menus.php:167 +#, php-format +msgid "%sAdd membership products%s to restrict menu to a membership" +msgstr "" + +#: includes/class-wp-members-menus.php:169 +msgid "Restrict menu item to a membership product" +msgstr "" + +#: includes/class-wp-members-products.php:342 +#, php-format +msgid "All %s" +msgstr "" + +#: includes/class-wp-members-products.php:343 +#, php-format +msgid "Add New %s" +msgstr "" + +#: includes/class-wp-members-products.php:344 +msgid "Add New" +msgstr "Pridať nové" + +#: includes/class-wp-members-products.php:345 +#, php-format +msgid "New %s" +msgstr "" + +#: includes/class-wp-members-products.php:346 +#, php-format +msgid "Edit %s" +msgstr "" + +#: includes/class-wp-members-products.php:347 +#, php-format +msgid "Update %s" +msgstr "" + +#: includes/class-wp-members-products.php:348 +#: includes/class-wp-members-products.php:349 +#, php-format +msgid "View %s" +msgstr "" + +#: includes/class-wp-members-products.php:350 +#, php-format +msgid "Search %s" +msgstr "" + +#: includes/class-wp-members-products.php:351 +msgid "Not found" +msgstr "" + +#: includes/class-wp-members-products.php:352 +msgid "Not found in Trash" +msgstr "" + +#: includes/class-wp-members-products.php:353 +msgid "Insert into item" +msgstr "" + +#: includes/class-wp-members-products.php:354 +#, php-format +msgid "Save %s Details" +msgstr "" + +#: includes/class-wp-members-products.php:355 +msgid "Membership Attributes" +msgstr "" + +#: includes/class-wp-members-products.php:358 +msgid "Membership Product" +msgstr "" + +#: includes/class-wp-members-products.php:359 +msgid "WP-Members Membership Products" +msgstr "" + +#: includes/class-wp-members-pwd-reset.php:35 +#: includes/class-wp-members-pwd-reset.php:36 +msgid "" +"Sorry, no password reset key was found. Please check your email and try " +"again." +msgstr "" + +#: includes/class-wp-members-pwd-reset.php:37 +msgid "Sorry, the password reset key is expired." +msgstr "" + +#: includes/class-wp-members-pwd-reset.php:167 +msgid "The passwords do not match." +msgstr "" + +#: includes/class-wp-members-shortcodes.php:134 +msgid "" +"This is a generic message to display the form message dialog in the " +"Customizer." +msgstr "" + +#: includes/class-wp-members-shortcodes.php:699 +msgid "Click here to log out." +msgstr "" + +#: includes/class-wp-members-user-profile.php:58 +msgid "WP-Members Additional Fields" +msgstr "WP-členovia ďalšie polia" + +#: includes/class-wp-members-user-profile.php:58 +#, fuzzy +msgid "Additional Information" +msgstr "WP-členovia ďalšie polia" + +#: includes/class-wp-members-user-profile.php:500 +msgid "Reactivate this user?" +msgstr "Opätovná aktivácia tomuto používateľovi?" + +#: includes/class-wp-members-user-profile.php:505 +msgid "Deactivate this user?" +msgstr "Deaktivácia tomuto používateľovi?" + +#: includes/class-wp-members-user-profile.php:559 +msgid "IP @ registration" +msgstr "IP @ registrácie" + +#: includes/class-wp-members-user.php:1171 +msgid "ERROR: User has not been activated." +msgstr "" + +#: includes/class-wp-members-validation-link.php:32 +msgid "Click to validate your account: " +msgstr "" + +#: includes/class-wp-members-validation-link.php:33 +msgid "Thank you for validating your account." +msgstr "" + +#: includes/class-wp-members-validation-link.php:34 +msgid "Validation key was expired or invalid" +msgstr "" + +#: includes/class-wp-members-validation-link.php:35 +msgid "Your account is now pending approval" +msgstr "" + +#: includes/class-wp-members-validation-link.php:284 +msgid "ERROR: User has not confirmed their account." +msgstr "" + +#: includes/class-wp-members-widget.php:24 +msgid "Displays the WP-Members sidebar login." +msgstr "" + +#: includes/class-wp-members-widget.php:39 +#: includes/class-wp-members-widget.php:82 +msgid "Login Status" +msgstr "Stav prihlásenia" + +#: includes/class-wp-members-widget.php:46 +msgid "Title:" +msgstr "Názov:" + +#: includes/class-wp-members-widget.php:50 +msgid "Redirect to (optional):" +msgstr "" + +#: includes/class-wp-members.php:1087 includes/class-wp-members.php:1098 +msgid "You must be logged in to view this content." +msgstr "" + +#: includes/class-wp-members.php:1104 +msgid "The page you are looking for does not exist" +msgstr "" + +#: includes/class-wp-members.php:1352 +#, php-format +msgid "" +"You have a linked page in the WP-Members page settings that corresponds to a " +"post ID that no longer exists. Please %s review and update the %s page " +"settings %s." +msgstr "" + +#: includes/class-wp-members.php:1472 +msgid "Show forms as logged out" +msgstr "" + +#: includes/class-wp-members.php:1481 +msgid "Show form message dialog" +msgstr "" + +#: includes/class-wp-members.php:1558 +msgid "(more…)" +msgstr "" + +#: includes/class-wp-members.php:1746 +msgid "log out" +msgstr "" + +#: includes/cli/class-wp-members-cli-user.php:24 +#: includes/cli/class-wp-members-cli-user.php:62 +msgid "Moderated registration is not enabled in WP-Members options." +msgstr "" + +#: includes/cli/class-wp-members-cli-user.php:35 +msgid "User activated." +msgstr "" + +#: includes/cli/class-wp-members-cli-user.php:37 +msgid "Email notification sent to user." +msgstr "" + +#: includes/cli/class-wp-members-cli-user.php:40 +msgid "User is already activated." +msgstr "" + +#: includes/cli/class-wp-members-cli-user.php:67 +msgid "User deactivated." +msgstr "" + +#: includes/cli/class-wp-members-cli-user.php:88 +msgid "Invalid user ID. Please specify a valid user. Try `wp user list`." +msgstr "" + +#: includes/cli/class-wp-members-cli-user.php:91 +msgid "No user id specified. Must specify user id as --id=123" +msgstr "" + +#: includes/cli/class-wp-members-cli-user.php:208 +#, php-format +msgid "User: %s" +msgstr "" + +#: includes/cli/class-wp-members-cli-user.php:248 +#, php-format +msgid "User role: %s" +msgstr "" + +#: includes/deprecated.php:373 +msgid "We were unable to validate the public key." +msgstr "Boli sme schopní overiť verejným kľúčom." + +#: includes/deprecated.php:377 +msgid "We were unable to validate the private key." +msgstr "Boli sme schopní overiť súkromný kľúč." + +#: includes/deprecated.php:381 +msgid "The challenge parameter of the verify script was incorrect." +msgstr "Parameter výzva skriptu overiť bola nesprávna." + +#: includes/deprecated.php:385 +msgid "The CAPTCHA solution was incorrect." +msgstr "CAPTCHA riešenie bolo nesprávne." + +#: includes/deprecated.php:389 +msgid "The parameters to verify were incorrect" +msgstr "Parametre na overenie boli nesprávne" + +#: includes/deprecated.php:393 +msgid "" +"reCAPTCHA API keys are tied to a specific domain name for security reasons." +msgstr "" +"ReCaptcha API kľúče sú viazané na konkrétne doménové meno z bezpečnostných " +"dôvodov." + +#: includes/deprecated.php:397 +msgid "The reCAPTCHA server was not reached. Please try to resubmit." +msgstr "ReCAPTCHA servera nebol dosiahnutý. Prosím, skúste znovu." + +#. translators: %s: title of menu item which is invalid +#: includes/walkers/class-wp-members-walker-nav-menu.php:92 +#, php-format +msgid "%s (Invalid)" +msgstr "" + +#. translators: %s: title of menu item in draft status +#: includes/walkers/class-wp-members-walker-nav-menu.php:96 +#, php-format +msgid "%s (Pending)" +msgstr "" + +#: includes/walkers/class-wp-members-walker-nav-menu.php:123 +msgid "Move up" +msgstr "" + +#: includes/walkers/class-wp-members-walker-nav-menu.php:136 +msgid "Move down" +msgstr "" + +#: includes/walkers/class-wp-members-walker-nav-menu.php:138 +msgid "Edit Menu Item" +msgstr "" + +#: includes/walkers/class-wp-members-walker-nav-menu.php:149 +msgid "URL" +msgstr "" + +#: includes/walkers/class-wp-members-walker-nav-menu.php:156 +msgid "Navigation Label" +msgstr "" + +#: includes/walkers/class-wp-members-walker-nav-menu.php:162 +msgid "Title Attribute" +msgstr "" + +#: includes/walkers/class-wp-members-walker-nav-menu.php:169 +msgid "Open link in a new window/tab" +msgstr "" + +#: includes/walkers/class-wp-members-walker-nav-menu.php:174 +msgid "CSS Classes (optional)" +msgstr "" + +#: includes/walkers/class-wp-members-walker-nav-menu.php:180 +msgid "Link Relationship (XFN)" +msgstr "" + +#: includes/walkers/class-wp-members-walker-nav-menu.php:188 +msgid "" +"The description will be displayed in the menu if the current theme supports " +"it." +msgstr "" + +#: includes/walkers/class-wp-members-walker-nav-menu.php:210 +#, php-format +msgid "Original: %s" +msgstr "" + +#: includes/walkers/class-wp-members-walker-nav-menu.php:223 +msgid "Remove" +msgstr "" + +#: templates/tos.php:32 +#, php-format +msgid "%sclose%s" +msgstr "% sclose % s" + +#: templates/tos.php:34 +#, php-format +msgid "%sprint%s" +msgstr "% sprint %s" + +#. Plugin Name of the plugin/theme +msgid "WP-Members" +msgstr "WP-členovia" + +#. Plugin URI of the plugin/theme +msgid "https://rocketgeek.com" +msgstr "" + +#. Description of the plugin/theme +msgid "" +"WP access restriction and user registration. For more information on plugin " +"features, refer to the online Users Guide. A Quick Start Guide is also available. WP-" +"Members(tm) is a trademark of butlerblog.com." +msgstr "" + +#. Author of the plugin/theme +msgid "Chad Butler" +msgstr "Čad Butler" + +#. Author URI of the plugin/theme +msgid "https://butlerblog.com/" +msgstr "" + +#, fuzzy +#~ msgid "Block" +#~ msgstr "Blok miest v predvolenom nastavení" + +#~ msgid "Manage reCAPTCHA Options" +#~ msgstr "Spravovať reCAPTCHA možnosti" + +#~ msgid "" +#~ "reCAPTCHA is a free, accessible CAPTCHA service that helps to digitize " +#~ "books while blocking spam on your blog." +#~ msgstr "" +#~ "ReCaptcha je zadarmo, prístupný CAPTCHA služba, ktorá pomáha pri " +#~ "digitalizácii kníh blokovanie nevyžiadanej pošty na svojom blogu." + +#, php-format +#~ msgid "" +#~ "reCAPTCHA asks commenters to retype two words scanned from a book to " +#~ "prove that they are a human. This verifies that they are not a spambot " +#~ "while also correcting the automatic scans of old books. So you get less " +#~ "spam, and the world gets accurately digitized books. Everybody wins! For " +#~ "details, visit the %s reCAPTCHA website%s" +#~ msgstr "" +#~ "ReCaptcha žiada commenters znovu zadávať dve slová naskenované z knihy " +#~ "preukázať, že sú ľudské. To potvrdzuje, že nie sú spambotmi zároveň " +#~ "opravuje automatické skenovanie starých kníh. Takže ste si menej spamu, a " +#~ "svet sa dostane presne digitalizované knihy. Všetci víťazí! Podrobnosti " +#~ "nájdete %s ReCaptcha stránky%s" + +#, php-format +#~ msgid "" +#~ "reCAPTCHA requires an API key, consisting of a \"public\" and a \"private" +#~ "\" key. You can sign up for a %s free reCAPTCHA key%s" +#~ msgstr "" +#~ "ReCaptcha vyžaduje API kľúč, skladajúci sa z \"verejnosť\" a \"súkromný\" " +#~ "kľúč. Môžete sa zaregistrovať pre %s bez kľúča s ReCaptcha%s" + +#~ msgid "Public Key" +#~ msgstr "Verejný kľúč" + +#~ msgid "Private Key" +#~ msgstr "Súkromný kľúč" + +#~ msgid "Choose Theme" +#~ msgstr "Vybrať tému" + +#~ msgid "Red" +#~ msgstr "Red" + +#~ msgid "White" +#~ msgstr "Biela" + +#~ msgid "Black Glass" +#~ msgstr "Čierneho skla" + +#~ msgid "Clean" +#~ msgstr "Vyčistite" + +#, fuzzy +#~ msgid "Active" +#~ msgstr "Aktivovať" + +#, fuzzy +#~ msgid "Enable CAPTCHA" +#~ msgstr "Zapne CAPTCHA, registrácie" + +#~ msgid "Passwords did not match.

    Please try again." +#~ msgstr "Heslá urobil nie zápas. < br / > < br / > prosím skúste to znova." + +#~ msgid "Either the username or email address do not exist in our records." +#~ msgstr "Uživateľské meno alebo e-mail adresa v našich záznamov neexistuje." + +#~ msgid "http://butlerblog.com/" +#~ msgstr "http://butlerblog.com/" + +#, fuzzy +#~ msgid "Click to log out." +#~ msgstr "Prihlásenie" + +#~ msgid "You have set WP-Members to turn off the registration process" +#~ msgstr "Nastavili ste WP-členovia vypnúť registračný proces" + +#~ msgid "" +#~ "but you also set to moderate and/or email admin new registrations. You " +#~ "will need to set up a registration page for users to register." +#~ msgstr "" +#~ "ale tiež nastaviť až stredne závažné a/alebo e-mailovej admin nových " +#~ "registrácií. Budete musieť nastaviť registračnej stránky pre užívateľa sa " +#~ "zaregistrovať." + +#, fuzzy +#~ msgid "Unblocked?" +#~ msgstr "" +#~ "Poznámka: Príspevky môžu ešte byť individuálne blokovať alebo odblokovať " +#~ "na článok úrovni" + +#, fuzzy +#~ msgid "Blocked?" +#~ msgstr "" +#~ "Poznámka: Príspevky môžu ešte byť individuálne blokovať alebo odblokovať " +#~ "na článok úrovni" + +#~ msgid "Field Label is required for adding a new field. Nothing was updated." +#~ msgstr "Označenie poľa je potrebné pridať nové pole. Nič bol aktualizovaný." + +#~ msgid "Option Name is required for adding a new field. Nothing was updated." +#~ msgstr "" +#~ "Názov voľby sa vyžaduje pre pridáte nové pole. Nič bol aktualizovaný." + +#, fuzzy +#~ msgid "field was added" +#~ msgstr "Označenie poľa" + +#, fuzzy +#~ msgid "field was updated" +#~ msgstr "WP-členovia polia boli aktualizované" + +#~ msgid "Option Name" +#~ msgstr "Názov voľby" + +#, fuzzy +#~ msgid "Additional information for checkbox fields" +#~ msgstr "WP-členovia ďalšie polia" + +#, fuzzy +#~ msgid "Additional information for dropdown fields" +#~ msgstr "WP-členovia ďalšie polia" + +#~ msgid "For dropdown, array of values:" +#~ msgstr "Pre rozbaľovacie pole hodnôt:" + +#~ msgid "" +#~ "Determine which fields will display and which are required. This " +#~ "includes all fields, both native WP fields and WP-Members custom fields." +#~ msgstr "" +#~ "Určiť, ktoré polia budú zobrazovať a ktoré sú povinné. To zahŕňa všetky " +#~ "odbory, a to ako pôvodné WP oblasti a WP-Members vlastné pole." + +#~ msgid "(Note: Email is always mandatory and cannot be changed.)" +#~ msgstr "(Poznámka: Email je vždy povinné. a nemôžu byť zmenené.)" + +#~ msgid "Add/Delete" +#~ msgstr "Pridať a odstrániť" + +#~ msgid "Checked?" +#~ msgstr "Skontrolovať?" + +#~ msgid "Delete" +#~ msgstr "Odstrániť" + +#~ msgid "(Email cannot be removed)" +#~ msgstr "(E-mailu sa nedá odstrániť)" + +#, fuzzy +#~ msgid "native" +#~ msgstr "" +#~ "Určiť, ktoré polia budú zobrazovať a ktoré sú povinné. To zahŕňa všetky " +#~ "odbory, a to ako pôvodné WP oblasti a WP-Members vlastné pole." + +#~ msgid "Update Fields" +#~ msgstr "Aktualizácia polí" + +#~ msgid "Please indicate that you agree to the %s TOS %s" +#~ msgstr "Prosím uveďte, že súhlasíte s %s TOS %s" + +#, fuzzy +#~ msgid "" +#~ "WP access restriction and user registration. For more information on " +#~ "plugin features, refer to the online Users Guide. A Quick Start Guide is also available. WP-Members(tm) is a trademark of butlerblog.com." +#~ msgstr "" +#~ "WP obmedzenie prístupu a registračné. Pre viac informácií a na stiahnutie " +#~ "v užívateľskej príručke, nájdete http://butlerblog.com/wp-members . Quick Start " +#~ "Guide je k dispozícii tiež. WP-členov (TM) je obchodná značka " +#~ "butlerblog.com." + +#, fuzzy +#~ msgid "%s posts %sed." +#~ msgstr "Blok miest v predvolenom nastavení" + +#, fuzzy +#~ msgid "Post Restriction" +#~ msgstr "Nový zápis" + +#, fuzzy +#~ msgid "Page Restriction" +#~ msgstr "Nový zápis" + +#~ msgid "dropdown" +#~ msgstr "Rozbaľovací zoznam" + +#~ msgid "Block Posts by default" +#~ msgstr "Blok miest v predvolenom nastavení" + +#~ msgid "" +#~ "Note: Posts can still be individually blocked or unblocked at the article " +#~ "level" +#~ msgstr "" +#~ "Poznámka: Príspevky môžu ešte byť individuálne blokovať alebo odblokovať " +#~ "na článok úrovni" + +#~ msgid "Block Pages by default" +#~ msgstr "Blokovať stránky v predvolenom nastavení" + +#~ msgid "" +#~ "Note: Pages can still be individually blocked or unblocked at the article " +#~ "level" +#~ msgstr "" +#~ "Poznámka: Stránky môžu byť ešte samostatne zablokovať alebo odblokovať na " +#~ "článok úrovni" + +#~ msgid "Show excerpts" +#~ msgstr "Zobrazenie ukážky" + +#~ msgid "" +#~ "Shows excerpted content above the login/registration on both Posts and " +#~ "Pages" +#~ msgstr "" +#~ "Ukazuje výňatok obsah nad prihlásenie/registráciu na obidvoch pôšt a Pages" + +#~ msgid "Turns on CAPTCHA for registration" +#~ msgstr "Zapne CAPTCHA, registrácie" + +#, fuzzy +#~ msgid "Hide registration" +#~ msgstr "Registrácia dokončená" + +#~ msgid "Optional" +#~ msgstr "Voliteľné" + +#, fuzzy +#~ msgid "Automatically creates an excerpt" +#~ msgstr "Zobrazenie ukážky" + +#~ msgid "AIM" +#~ msgstr "CIEĽOM" + +#~ msgid "Yahoo IM" +#~ msgstr "Yahoo IM" + +#~ msgid "Jabber/Google Talk" +#~ msgstr "Jabber a Google Talk" + +#~ msgid "" +#~ "Password successfully changed!

    You will need to re-login with " +#~ "your new password." +#~ msgstr "" +#~ "Heslo bolo úspešne zmenené!

    Budete musieť znova prihlásiť " +#~ "pomocou nového hesla." + +#~ msgid "" +#~ "Password successfully reset!

    An email containing a new " +#~ "password has been sent to the email address on file for your account. You " +#~ "may change this random password then re-login with your new password." +#~ msgstr "" +#~ "Heslo bolo úspešne obnoviť!

    E-mail obsahujúci nové heslo " +#~ "bolo odoslané na e-mailovú adresu, na súbore vášho účtu. Môžete zmeniť " +#~ "toto náhodné heslo, potom re-prihlásenie s novým heslom." + +#~ msgid "Custom" +#~ msgstr "Vlastné" + +#, fuzzy +#~ msgid "edit" +#~ msgstr "Upraviť vaše informácie" + +#~ msgid "Use reCAPTCHA" +#~ msgstr "Použiť reCAPTCHA" + +#~ msgid "New Password" +#~ msgstr "Nové heslo" + +#~ msgid "Repeat Password" +#~ msgstr "Opakovanie hesla" + +#~ msgid "Remember me" +#~ msgstr "Zapamätaj si ma" + +#~ msgid "Cheatin’ uh?" +#~ msgstr "Cheatin ’ ehm?" + +#~ msgid "there was an error and no users were exported" +#~ msgstr "Vyskytla sa chyba a bol vyvezený žiadni používatelia" + +#~ msgid "Indicates a required field" +#~ msgstr "Označuje povinné pole" + +#~ msgid "login" +#~ msgstr "prihlásenie" + +#~ msgid "Login" +#~ msgstr "Prihlásenie" + +#~ msgid "Submit" +#~ msgstr "Predložiť" + +#~ msgid "Clear Form" +#~ msgstr "Vymazať formulár" + +#~ msgid "Turn off registration" +#~ msgstr "Ak chcete vypnúť registrácie" + +#~ msgid "Turns off the registration process, only allows login" +#~ msgstr "Vypne proces registrácie, len umožňuje prihlásenie" + +#~ msgid "Legacy forms" +#~ msgstr "Staršie formuláre" + +#~ msgid "" +#~ "Uses the pre-2.5.1 table-based forms (leave off to use CSS table-less " +#~ "forms)" +#~ msgstr "" +#~ "Používa pre-2.5.1 Tabuľka formuláre založené v prestať používať CSS " +#~ "stolný menej formulárov)" + +#~ msgid "Members Area URL:" +#~ msgstr "Členovia oblasti URL:" + +#~ msgid "Add" +#~ msgstr "Pridať" + +#~ msgid "WP-Members expiration periods were updated" +#~ msgstr "WP-členovia uplynutia obdobia boli aktualizované" + +#~ msgid "" +#~ "Settings were saved, but you have required fields that are not set to " +#~ "display!" +#~ msgstr "" +#~ "Nastavenie bolo uložené, ale vy ste povinná, ktoré nie sú dané na " +#~ "zobrazenie!" + +#~ msgid "" +#~ "Note: This will not cause an error for the end user, as only displayed " +#~ "fields are validated. However, you should still check that your " +#~ "displayed and required fields match up. Mismatched fields are " +#~ "highlighted below." +#~ msgstr "" +#~ "Poznámka: Táto nespôsobí chybu pre koncového užívateľa, pretože len " +#~ "zobrazené položky sú overené. Avšak, mali by ste ešte overiť, či je " +#~ "zobrazené pole a musí zhodovať. Nezhoda polia sú uvedené nižšie." + +#~ msgid "If you find this plugin useful, please consider making a donation" +#~ msgstr "Ak ste našli tento plugin užitočný, prosím zváži poskytnutie daru" + +#~ msgid "Subscriptions" +#~ msgstr "Predplatné" + +#~ msgid "PayPal Settings" +#~ msgstr "PayPal nastavenia" + +#~ msgid "If you find this plugin useful, please consider a %s donation %s" +#~ msgstr "Ak ste našli tento plugin užitočný, prosím zvážiť darovanie %s %s" + +#~ msgid "%d users were activated." +#~ msgstr "%d užívateľov bola aktivovaná." + +#~ msgid "" +#~ "Users ready to export, %s click here %s to generate and download a CSV." +#~ msgstr "Pripravený na vývoz, %s uživateľ %s generovať a stiahnuť CSV." + +#~ msgid "WP-Members Users" +#~ msgstr "WP-členov užívateľov" + +#~ msgid "No users matched your criteria" +#~ msgstr "Žiadni používatelia spárovaných vaše kritériá" + +#~ msgid "Bulk Actions" +#~ msgstr "Hromadný akcie" + +#~ msgid "Apply" +#~ msgstr "Uplatňovať" + +#~ msgid "http://butlerblog.com/wp-members/" +#~ msgstr "http://butlerblog.com/wp-Members/" diff --git a/i18n/languages/wp-members-sr_RS.mo b/i18n/languages/wp-members-sr_RS.mo new file mode 100644 index 00000000..0e39444c Binary files /dev/null and b/i18n/languages/wp-members-sr_RS.mo differ diff --git a/i18n/languages/wp-members-sr_RS.po b/i18n/languages/wp-members-sr_RS.po new file mode 100644 index 00000000..2ae73fed --- /dev/null +++ b/i18n/languages/wp-members-sr_RS.po @@ -0,0 +1,2802 @@ +# Copyright (C) 2012 WP-Members +# This file is distributed under the same license as the WP-Members package. +msgid "" +msgstr "" +"Project-Id-Version: WP-Members 3.2.6\n" +"Report-Msgid-Bugs-To: http://wordpress.org/tag/wp-members\n" +"POT-Creation-Date: 2023-01-06 15:20-0500\n" +"PO-Revision-Date: 2023-01-06 15:24-0500\n" +"Last-Translator: \n" +"Language-Team: Dmitrii Krasnov \n" +"Language: sr_RS\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Poedit-SourceCharset: UTF-8\n" +"X-Generator: Poedit 2.4.3\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" +"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" + +#: includes/admin/class-wp-members-admin-api.php:254 +msgid "Custom email" +msgstr "" + +#: includes/admin/class-wp-members-admin-api.php:255 +#: includes/admin/class-wp-members-admin-api.php:257 +msgid "Subject" +msgstr "Subject" + +#: includes/admin/class-wp-members-admin-api.php:258 +msgid "Body" +msgstr "Telo" + +#: includes/admin/class-wp-members-admin-api.php:260 +msgid "Your custom email message content." +msgstr "" + +#: includes/admin/class-wp-members-admin-api.php:338 +msgid "Options" +msgstr "Opcije" + +#: includes/admin/class-wp-members-admin-api.php:339 +msgid "Fields" +msgstr "Polja" + +#: includes/admin/class-wp-members-admin-api.php:340 +msgid "Dialogs" +msgstr "Dijalozi" + +#: includes/admin/class-wp-members-admin-api.php:341 +msgid "Emails" +msgstr "Emailovi" + +#: includes/admin/class-wp-members-admin-api.php:357 +msgid "New Registration" +msgstr "Nova registracija" + +#: includes/admin/class-wp-members-admin-api.php:365 +#: includes/admin/class-wp-members-admin-api.php:383 +msgid "User email validated" +msgstr "" + +#: includes/admin/class-wp-members-admin-api.php:375 +msgid "Registration is Moderated" +msgstr "Registracija je obavljena" + +#: includes/admin/class-wp-members-admin-api.php:391 +msgid "Registration is Moderated, User is Approved" +msgstr "Registracija je obavljena, korisnik je odobren." + +#: includes/admin/class-wp-members-admin-api.php:399 +msgid "Password Reset" +msgstr "Resetuj šifru" + +#: includes/admin/class-wp-members-admin-api.php:406 +msgid "Retrieve Username" +msgstr "" + +#: includes/admin/class-wp-members-admin-api.php:414 +msgid "Admin Notification" +msgstr "Admin notifikacije" + +#: includes/admin/class-wp-members-admin-api.php:440 +msgid "Restricted post (or page), displays above the login/registration form" +msgstr "" +"Zabranjeni post (ili stranica), prikazuje iznad login/registracijsku formu" + +#: includes/admin/class-wp-members-admin-api.php:441 +msgid "Username is taken" +msgstr "Korisničko ime je zauzeto" + +#: includes/admin/class-wp-members-admin-api.php:442 +msgid "Email is registered" +msgstr "Email je registrovan" + +#: includes/admin/class-wp-members-admin-api.php:443 +msgid "Registration completed" +msgstr "Registracija završena" + +#: includes/admin/class-wp-members-admin-api.php:444 +msgid "User update" +msgstr "Korisnik update-ovan" + +#: includes/admin/class-wp-members-admin-api.php:445 +msgid "Passwords did not match" +msgstr "Šifra se ne slaže" + +#: includes/admin/class-wp-members-admin-api.php:446 +msgid "Password changes" +msgstr "Šifra se menja" + +#: includes/admin/class-wp-members-admin-api.php:447 +msgid "Username or email do not exist when trying to reset forgotten password" +msgstr "" +"Korisničko ime ili email ne postoje kada pokušate da resetujete zaboravljenu " +"šifru" + +#: includes/admin/class-wp-members-admin-api.php:448 +msgid "Password reset" +msgstr "Resetovanje šifre" + +#: includes/admin/class-wp-members-admin-api.php:547 +msgid "Close" +msgstr "" + +#: includes/admin/class-wp-members-admin-api.php:596 +msgid "Settings" +msgstr "Postavke" + +#: includes/admin/class-wp-members-admin-posts.php:30 +#: includes/admin/class-wp-members-admin-posts.php:33 +msgid "Unrestrict" +msgstr "" + +#: includes/admin/class-wp-members-admin-posts.php:31 +#: includes/admin/class-wp-members-admin-posts.php:34 +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:110 +msgid "Restrict" +msgstr "" + +#: includes/admin/class-wp-members-admin-posts.php:32 +#: includes/admin/class-wp-members-admin-posts.php:35 +msgid "Hide" +msgstr "" + +#: includes/admin/class-wp-members-admin-posts.php:125 +#, php-format +msgid "%s restricted" +msgstr "" + +#: includes/admin/class-wp-members-admin-posts.php:125 +#, php-format +msgid "%s unrestricted" +msgstr "" + +#: includes/admin/class-wp-members-admin-posts.php:165 +#, php-format +msgid "%s Restriction" +msgstr "" + +#: includes/admin/class-wp-members-admin-posts.php:195 +#: includes/admin/class-wp-members-admin-posts.php:342 +#: includes/admin/class-wp-members-admin-posts.php:345 +msgid "Unrestricted" +msgstr "" + +#: includes/admin/class-wp-members-admin-posts.php:196 +#: includes/admin/class-wp-members-admin-posts.php:339 +#: includes/admin/class-wp-members-admin-posts.php:347 +msgid "Restricted" +msgstr "" + +#: includes/admin/class-wp-members-admin-posts.php:197 +#: includes/admin/class-wp-members-admin-posts.php:349 +msgid "Hidden" +msgstr "" + +#: includes/admin/class-wp-members-admin-posts.php:203 +msgid "Status:" +msgstr "" + +#: includes/admin/class-wp-members-admin-posts.php:203 +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:68 +#: includes/admin/tabs/class-wp-members-fields-table.php:65 +#: includes/walkers/class-wp-members-walker-nav-menu.php:140 +#, fuzzy +msgid "Edit" +msgstr "Редактирование ваших данных" + +#: includes/admin/class-wp-members-admin-posts.php:218 +msgid "Ok" +msgstr "" + +#: includes/admin/class-wp-members-admin-posts.php:219 +#: includes/walkers/class-wp-members-walker-nav-menu.php:224 +msgid "Cancel" +msgstr "" + +#: includes/admin/class-wp-members-admin-posts.php:305 +msgid "Status" +msgstr "" + +#: includes/admin/class-wp-members-admin-users.php:28 +#: includes/admin/class-wp-members-admin-users.php:34 +#: includes/admin/class-wp-members-admin-users.php:79 +msgid "Activate" +msgstr "Aktiviraj" + +#: includes/admin/class-wp-members-admin-users.php:29 +#: includes/admin/class-wp-members-admin-users.php:35 +#: includes/admin/class-wp-members-admin-users.php:82 +msgid "Deactivate" +msgstr "" + +#: includes/admin/class-wp-members-admin-users.php:31 +#: includes/admin/class-wp-members-admin-users.php:37 +msgid "Export" +msgstr "Export" + +#: includes/admin/class-wp-members-admin-users.php:32 +#: includes/admin/class-wp-members-admin-users.php:38 +#, fuzzy +msgid "Export All Users" +msgstr "Выгрузить" + +#: includes/admin/class-wp-members-admin-users.php:61 +msgid "Confirm" +msgstr "" + +#: includes/admin/class-wp-members-admin-users.php:64 +msgid "Unconfirm" +msgstr "" + +#: includes/admin/class-wp-members-admin-users.php:147 +#, php-format +msgid "%s users activated" +msgstr "" + +#: includes/admin/class-wp-members-admin-users.php:147 +#, php-format +msgid "%s users deactivated" +msgstr "" + +#: includes/admin/class-wp-members-admin-users.php:150 +msgid "No users selected" +msgstr "" + +#: includes/admin/class-wp-members-admin-users.php:168 +msgid "You cannot activate or deactivate yourself" +msgstr "" + +#: includes/admin/class-wp-members-admin-users.php:173 +#, php-format +msgid "%s activated" +msgstr "" + +#: includes/admin/class-wp-members-admin-users.php:178 +#, php-format +msgid "%s deactivated" +msgstr "" + +#: includes/admin/class-wp-members-admin-users.php:182 +msgid "That user is already active" +msgstr "" + +#: includes/admin/class-wp-members-admin-users.php:198 +msgid "You cannot confirm or unconfirm yourself" +msgstr "" + +#: includes/admin/class-wp-members-admin-users.php:203 +#, php-format +msgid "%s confirmed" +msgstr "" + +#: includes/admin/class-wp-members-admin-users.php:208 +#, php-format +msgid "%s unconfirmed" +msgstr "" + +#: includes/admin/class-wp-members-admin-users.php:212 +msgid "That user is already confirmed" +msgstr "" + +#: includes/admin/class-wp-members-admin-users.php:341 +msgid "Pending" +msgstr "" + +#: includes/admin/class-wp-members-admin-users.php:342 +msgid "Trial" +msgstr "" + +#: includes/admin/class-wp-members-admin-users.php:343 +#: includes/admin/class-wp-members-user-export.php:289 +msgid "Subscription" +msgstr "Pretplata" + +#: includes/admin/class-wp-members-admin-users.php:344 +msgid "Expired" +msgstr "" + +#: includes/admin/class-wp-members-admin-users.php:347 +#: includes/admin/class-wp-members-admin-users.php:410 +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:457 +msgid "Activated" +msgstr "" + +#: includes/admin/class-wp-members-admin-users.php:348 +msgid "Pending Activation" +msgstr "" + +#: includes/admin/class-wp-members-admin-users.php:349 +msgid "Deactivated" +msgstr "" + +#: includes/admin/class-wp-members-admin-users.php:352 +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:456 +msgid "Confirmed" +msgstr "" + +#: includes/admin/class-wp-members-admin-users.php:353 +msgid "Not Confirmed" +msgstr "" + +#: includes/admin/class-wp-members-admin-users.php:355 +msgid "Not Exported" +msgstr "" + +#: includes/admin/class-wp-members-admin-users.php:475 +msgid "Not confirmed" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:67 +msgid "Slug" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:68 +#: includes/admin/class-wp-members-user-export.php:294 +msgid "Role" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:69 +#: includes/admin/class-wp-members-products-admin.php:740 +#: includes/admin/class-wp-members-user-export.php:290 +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:460 +msgid "Expires" +msgstr "Ističe" + +#: includes/admin/class-wp-members-products-admin.php:71 +msgid "Default" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:73 +msgid "Last updated" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:97 +msgid "slug:" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:100 +msgid "No role required" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:105 +msgid "Does not expire" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:109 +#: includes/admin/class-wp-members-user-export.php:199 +msgid "Yes" +msgstr "Da" + +#: includes/admin/class-wp-members-products-admin.php:145 +msgid "Membership Product Details" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:153 +msgid "Membership Product Message (optional)" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:169 +msgid "Access by child membership" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:185 +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:62 +msgid "Posts" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:186 +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:63 +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:249 +#, fuzzy +msgid "Pages" +msgstr "Блокировать страницы по умолчанию" + +#: includes/admin/class-wp-members-products-admin.php:213 +#: includes/admin/class-wp-members-products-admin.php:262 +#: includes/admin/class-wp-members-products-admin.php:309 +msgid "Period" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:213 +msgid "Day" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:213 +msgid "Week" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:213 +msgid "Month" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:213 +msgid "Year" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:226 +msgid "Name (slug)" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:228 +msgid "Optional Defaults" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:231 +msgid "Assign as default at registration? (optional)" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:239 +#, php-format +msgid "Pre-selected by default for new %s" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:245 +msgid "Optional Properties" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:248 +msgid "Role Required? (optional)" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:251 +msgid "No Role" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:257 +msgid "Expires (optional)" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:259 +#: includes/admin/class-wp-members-products-admin.php:261 +#: includes/admin/class-wp-members-products-admin.php:306 +#: includes/admin/class-wp-members-products-admin.php:308 +msgid "Number" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:267 +msgid "Use \"no gap\" renewal" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:271 +msgid "Use a fixed period (such as Jan 1 - Dec 31, or Sept 1 - Aug 31)" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:288 +#: includes/admin/class-wp-members-products-admin.php:289 +msgid "Period Start (dd-mm)" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:290 +#: includes/admin/class-wp-members-products-admin.php:291 +msgid "Period End (dd-mm)" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:304 +msgid "Fixed period grace period" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:313 +msgid "" +"Grace period is the point at which expiration date is for following time " +"period. For example, if user who register August 1st would be part of the " +"following year's Sept 1 - Aug 31 membership, set this at 1 Month. Leave blank " +"for no grace period." +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:376 +msgid "" +"Restricted Message (displays when a user does not have access to a membership)" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:502 +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:239 +#: includes/class-wp-members-forms.php:1196 +#: includes/class-wp-members-user-profile.php:132 +msgid "None" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:517 +msgid "Restrict access by membership:" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:598 +msgid "Required Membership" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:644 +#: includes/admin/class-wp-members-products-admin.php:745 +#: includes/class-wp-members-products.php:335 +msgid "Membership" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:680 +msgid "expires:" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:709 +#: includes/class-wp-members-products.php:336 +#: includes/class-wp-members-products.php:341 +msgid "Memberships" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:736 +msgid "Membership Access" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:744 +msgid "Action" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:746 +msgid "Enabled?" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:757 +msgid "Enable" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:758 +msgid "Disable" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:759 +msgid "Update" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:764 +msgid "Expiration date (optional)" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:795 +#, php-format +msgid "No memberships have been created. %sCreate new memberships here%s" +msgstr "" + +#: includes/admin/class-wp-members-user-export.php:199 +msgid "No" +msgstr "Ne" + +#: includes/admin/class-wp-members-user-export.php:264 +msgid "You do not have the required user capabilities to export users." +msgstr "" + +#: includes/admin/class-wp-members-user-export.php:277 +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:461 +msgid "User ID" +msgstr "" + +#: includes/admin/class-wp-members-user-export.php:284 +#: includes/class-wp-members-dialogs.php:91 +#: includes/class-wp-members-dialogs.php:114 +msgid "Username" +msgstr "Korisn ičko ime" + +#: includes/admin/class-wp-members-user-export.php:286 +msgid "Activated?" +msgstr "Aktivirano?" + +#: includes/admin/class-wp-members-user-export.php:292 +msgid "Registered" +msgstr "Registrovan" + +#: includes/admin/class-wp-members-user-export.php:293 +msgid "IP" +msgstr "IP" + +#: includes/admin/dialogs.php:117 +msgid "" +"Your WP settings allow anyone to register - this is not the recommended " +"setting." +msgstr "" +"Vaša WP postavka dozvoljava svakome da se registruje - ovo nije preporučljiva " +"postavka. " + +#: includes/admin/dialogs.php:118 +#, php-format +msgid "" +"You can %s change this here %s making sure the box next to \"Anyone can " +"register\" is unchecked." +msgstr "" +"Ovo možete %s promeniti ovde %s proverite da kvadrat pored nije \"Anyone " +"can register\" čekiran." + +#: includes/admin/dialogs.php:119 +msgid "" +"This setting allows a link on the /wp-login.php page to register using the WP " +"native registration process thus circumventing any registration you are using " +"with WP-Members. In some cases, this may suit the users wants/needs, but most " +"users should uncheck this option. If you do not change this setting, you can " +"choose to ignore these warning messages under WP-Members Settings." +msgstr "" +"Ova postavka omogućava link na /wp-login.php stranuici da se registrujete " +"pomoću WP native procesom registracije tako zaobilazite bilo koje " +"registracije koji koristite sa WP-Members. U nekim slučajevima , to može " +"odgovarati korisnicima želi / treba , ali većina korisnika treba da " +"isključite ovu opciju . Ako ne promenite ovu postavku , možete izabrati da " +"ignorišete ove poruke upozorenja pod WP-Members postavkama ." + +#: includes/admin/dialogs.php:123 +msgid "" +"Your WP settings allow anyone to comment - this is not the recommended " +"setting." +msgstr "" +"Ova WP postavka dozvoljava bilo kome da komentariše-ovo nije preporučljiva " +"postavka." + +#: includes/admin/dialogs.php:124 +#, php-format +msgid "" +"You can %s change this here %s by checking the box next to \"Users must be " +"registered and logged in to comment.\"" +msgstr "" +"Možete %s promeniti ovo %s klikom na checkbox pored \"Users must be " +"registered and logged in to comment.\"" + +#: includes/admin/dialogs.php:125 +msgid "" +"This setting allows any users to comment, whether or not they are registered. " +"Depending on how you are using WP-Members will determine whether you should " +"change this setting or not. If you do not change this setting, you can choose " +"to ignore these warning messages under WP-Members Settings." +msgstr "" +"Ova postavka dozvoljava korisniku da komentariše, nezavisno od toga da li je " +"registrovan. U zavisnosti od toga kako se koriste WP-Members će utvrditi da " +"li treba da promenite ovu postavku ili ne . Ako ne promenite ovu postavku , " +"možete izabrati da ignorišete ove poruke upozorenja pod WP-Members " +"postavkama ." + +#: includes/admin/dialogs.php:129 +msgid "" +"Your WP settings allow full text rss feeds - this is not the recommended " +"setting." +msgstr "" +"Vaše WP postavke dozvoljavaju sve tekst rss feeds - ovo nije postavka kja se " +"preporučuje." + +#: includes/admin/dialogs.php:130 +#, php-format +msgid "" +"You can %s change this here %s by changing \"For each article in a feed, show" +"\" to \"Summary.\"" +msgstr "" +"Ovo možete %s promeniti ovde %s prelaskom \"For each article in a feed, show" +"\" na \"Summary.\"" + +#: includes/admin/dialogs.php:131 +msgid "" +"Leaving this set to full text allows anyone to read your protected content in " +"an RSS reader. Changing this to Summary prevents this as your feeds will only " +"show summary text." +msgstr "" +"Ostavljajući ovu postavku za ceo tekst dozvoljavate bilo kome da čita vaš " +"sadržaj zaštićen u RSS čitaču. Promena ovoga u Summary sprečava ovo da vaši " +"feedovi prikažu samo summary tekst. " + +#: includes/admin/dialogs.php:135 +msgid "You have set WP-Members to hold registrations for approval" +msgstr "Namestili ste WP-Members da sadrže registracije za odobrenje " + +#: includes/admin/dialogs.php:136 +msgid "" +"but you have not changed the default message for \"Registration Completed\" " +"under \"WP-Members Dialogs and Error Messages.\" You should change this " +"message to let users know they are pending approval." +msgstr "" +"ali niste promenili default message za \"Registration Completed\" ispod " +"\"WP-Members Dialogs and Error Messages.\" Treba da promenite poruku da " +"biste korisnika obavestili da se čeka odobrenje.." + +#: includes/admin/dialogs.php:140 +msgid "You have turned on reCAPTCHA" +msgstr "Uključili ste reCAPTCHA" + +#: includes/admin/dialogs.php:141 +msgid "" +"but you have not entered API keys. You will need both a public and private " +"key. The CAPTCHA will not display unless a valid API key is included." +msgstr "" +"ali niste uneli API ključeve. Trebaće vam i javni i privatni ključ. CAPTCHA " +"neće biti prikazana osim ako API ključ nije uključen." + +#: includes/admin/dialogs.php:145 +msgid "You have active settings that are not recommended." +msgstr "" + +#: includes/admin/dialogs.php:146 +msgid "" +"If you will not be changing these settings, you can turn off these warning " +"messages by checking the \"Ignore warning messages\" in the settings below." +msgstr "" + +#: includes/admin/dialogs.php:174 +msgid "Version:" +msgstr "Verzija:" + +#: includes/admin/dialogs.php:175 +#, fuzzy +msgid "Quick Start Guide" +msgstr "Пользователь обновлен" + +#: includes/admin/dialogs.php:176 +#, fuzzy +msgid "Online User Guide" +msgstr "Пользователь обновлен" + +#: includes/admin/dialogs.php:177 +msgid "FAQs" +msgstr "" + +#: includes/admin/dialogs.php:184 +#, fuzzy +msgid "Thank you for using WP-Members" +msgstr "Thank you for using WP-Members! You are using version " + +#: includes/admin/dialogs.php:185 +msgid "A plugin developed by" +msgstr "" + +#: includes/admin/dialogs.php:186 +msgid "Follow" +msgstr "Prati" + +#: includes/admin/dialogs.php:203 includes/admin/dialogs.php:207 +msgid "Latest from RocketGeek" +msgstr "" + +#: includes/admin/dialogs.php:224 +msgid "Like WP-Members?" +msgstr "" + +#: includes/admin/dialogs.php:225 +#, php-format +msgid "" +"If you like WP-Members please give it a %s★★★★★" +"%s rating. Thanks!!" +msgstr "" + +#: includes/admin/dialogs.php:236 includes/admin/dialogs.php:249 +msgid "Latest from ButlerBlog" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:67 +#, php-format +msgid "See the %sUsers Guide on CAPTCHA%s." +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:74 +#: includes/admin/tabs/class-wp-members-admin-tab-dialogs.php:57 +#: includes/admin/tabs/class-wp-members-admin-tab-emails.php:109 +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:134 +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:78 +msgid "Need help?" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:85 +msgid "Manage CAPTCHA Options" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:91 +msgid "CAPTCHA Type" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:96 +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:243 +msgid "reCAPTCHA v2" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:97 +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:244 +msgid "reCAPTCHA v3" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:98 +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:245 +msgid "Really Simple CAPTCHA" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:99 +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:246 +msgid "hCaptcha" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:106 +msgid "" +"CAPTCHA type was changed. Please verify and update the settings below for the " +"new CAPTCHA type." +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:117 +msgid "reCAPTCHA Keys" +msgstr "reCAPTCHA Ključevi" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:120 +#, php-format +msgid "" +"reCAPTCHA requires an API key, consisting of a \"site\" and a \"secret\" key. " +"You can sign up for a %s free reCAPTCHA key%s" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:122 +msgid "Site Key" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:123 +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:139 +msgid "Secret Key" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:133 +msgid "hCaptcha Keys" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:136 +#, php-format +msgid "" +"hCaptcha requires an API key. You can sign up for %s an hCaptcha API key here " +"%s" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:138 +msgid "API Key" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:170 +msgid "Characters for image" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:174 +msgid "Number of characters" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:178 +msgid "Image dimensions" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:179 +msgid "Width" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:179 +msgid "Height" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:182 +msgid "Font color of characters" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:186 +msgid "Background color of image" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:190 +msgid "Font size" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:194 +msgid "Width between characters" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:198 +#, fuzzy +msgid "Image type" +msgstr "Tip polja" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:213 +msgid "" +"To use Really Simple CAPTCHA, you must have the Really Simple CAPTCHA plugin " +"installed and activated." +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:241 +#, fuzzy +msgid "Update CAPTCHA Settings" +msgstr "Update postavki" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:319 +#, fuzzy +msgid "CAPTCHA was updated for WP-Members" +msgstr "reCAPTCHA je updatovano za WP-Members" + +#: includes/admin/tabs/class-wp-members-admin-tab-dialogs.php:67 +msgid "Dialogs and Error Messages" +msgstr "Diažjalozi i Error poruke" + +#: includes/admin/tabs/class-wp-members-admin-tab-dialogs.php:69 +#, php-format +msgid "" +"You can customize the text for dialogs and error messages. Simple HTML is " +"allowed %s etc." +msgstr "" +"Možete da customize-ujete text za dijaloge i error poruke. Jednostavan HTML " +"je dozvoljen %s itd." + +#: includes/admin/tabs/class-wp-members-admin-tab-dialogs.php:80 +msgid "Terms of Service (TOS)" +msgstr "Pravila (TOS)" + +#: includes/admin/tabs/class-wp-members-admin-tab-dialogs.php:87 +msgid "Update Dialogs" +msgstr "Update dijaloga" + +#: includes/admin/tabs/class-wp-members-admin-tab-dialogs.php:124 +msgid "WP-Members dialogs were updated" +msgstr "WP-Members dijaloz su updatovani" + +#: includes/admin/tabs/class-wp-members-admin-tab-dropins.php:88 +#: includes/admin/tabs/class-wp-members-dropins-table.php:180 +msgid "WP-Members Dropin settings were updated" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-dropins.php:216 +msgid "Manage Dropins" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-dropins.php:217 +msgid "Current dropin folder: " +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-dropins.php:218 +msgid "" +"You can change location of the dropin folder using the " +"wpmem_dropin_folder filter." +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-emails.php:57 +msgid "Email Messages" +msgstr "Email poruke" + +#: includes/admin/tabs/class-wp-members-admin-tab-emails.php:60 +msgid "You can customize the content of the emails sent by the plugin." +msgstr "Možete da customize-irate sadržaj emailova poslatih pluginom. " + +#: includes/admin/tabs/class-wp-members-admin-tab-emails.php:62 +msgid "A list of shortcodes is available here." +msgstr "Lista shortcode-ova dostupnih ovde. " + +#: includes/admin/tabs/class-wp-members-admin-tab-emails.php:69 +msgid "Set a custom email address" +msgstr "Podesi custom email adresu" + +#: includes/admin/tabs/class-wp-members-admin-tab-emails.php:70 +#: includes/admin/tabs/class-wp-members-admin-tab-emails.php:74 +#: includes/admin/tabs/class-wp-members-admin-tab-emails.php:93 +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:163 +msgid "(optional)" +msgstr "(opcionalno)" + +#: includes/admin/tabs/class-wp-members-admin-tab-emails.php:73 +msgid "Set a custom email name" +msgstr "Podesi custom email ie" + +#: includes/admin/tabs/class-wp-members-admin-tab-emails.php:77 +msgid "Send HTML email" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-emails.php:93 +msgid "Email Signature" +msgstr "Email potpis" + +#: includes/admin/tabs/class-wp-members-admin-tab-emails.php:101 +msgid "Update Emails" +msgstr "Updateuj mailove" + +#: includes/admin/tabs/class-wp-members-admin-tab-emails.php:172 +msgid "WP-Members emails were updated" +msgstr "WP-Members emailovi su updatovani" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:93 +#: includes/class-wp-members-dialogs.php:65 +msgid "No fields selected for deletion" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:95 +msgid "Are you sure you want to delete the following fields?" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:122 +msgid "Fields deleted" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:136 +msgid "Field Manager Documentation" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:164 +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:315 +#: includes/class-wp-members-forms.php:1629 +#: includes/class-wp-members-forms.php:1821 +#: includes/class-wp-members-user-profile.php:181 +msgid "(required)" +msgstr "Potrbno?" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:169 +#, fuzzy +msgid "Edit Field" +msgstr "Редактирование ваших данных" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:169 +#, fuzzy +msgid "Add a Field" +msgstr "Добавить/удалить" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:174 +msgid "Field Label" +msgstr "Pronadji oznaku" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:176 +msgid "The name of the field as it will be displayed to the user." +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:179 +#: includes/admin/tabs/class-wp-members-fields-table.php:58 +msgid "Meta Key" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:185 +msgid "" +"The database meta value for the field. It must be unique and contain no " +"spaces (underscores are ok)." +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:189 +#: includes/admin/tabs/class-wp-members-fields-table.php:59 +msgid "Field Type" +msgstr "Tip polja" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:195 +msgid "text" +msgstr "tekst" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:196 +msgid "email" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:197 +msgid "textarea" +msgstr "područje teksta" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:198 +msgid "checkbox" +msgstr "checkbox" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:199 +msgid "multiple checkbox" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:200 +msgid "select (dropdown)" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:201 +msgid "multiple select" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:202 +msgid "radio group" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:203 +msgid "password" +msgstr "šifra" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:204 +msgid "image" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:205 +msgid "file" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:206 +msgid "url" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:207 +msgid "number" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:208 +msgid "date" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:209 +msgid "hidden" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:211 +msgid "membership" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:217 +#: includes/admin/tabs/class-wp-members-fields-table.php:60 +msgid "Display?" +msgstr "Prikaži?" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:221 +msgid "This field is always displayed" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:226 +msgid "Required?" +msgstr "Potrbno?" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:230 +msgid "This field is always required" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:236 +msgid "Allow HTML?" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:243 +msgid "Placeholder" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:251 +msgid "Pattern" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:259 +msgid "Title" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:268 +msgid "Minimum Value" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:272 +msgid "Maximum Value" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:280 +msgid "Rows" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:284 +msgid "Columns" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:292 +msgid "Accepted file types:" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:297 +msgid "Accepted file types should be set like this: jpg|jpeg|png|gif" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:304 +#, fuzzy +msgid "Checked by default?" +msgstr "Отмечено?" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:308 +msgid "HTML label position" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:310 +msgid "Before the input tag" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:311 +msgid "After the input tag" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:312 +msgid "" +"Selecting \"after\" will generally display the label to the right of the " +"checkbox" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:315 +#, fuzzy +msgid "Stored value if checked:" +msgstr "Отмечено?" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:336 +msgid "Stored values delimiter:" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:345 +msgid "Values (Displayed|Stored):" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:370 +msgid "Options should be Option Name|option_value," +msgstr "Opcije bi treblo da budu Option Name|option_value," + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:374 +msgid "Visit plugin site for more information" +msgstr "Posetite sajt plugina za više informacija" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:381 +msgid "Value" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:400 +msgid "Save Changes" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:400 +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:527 +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:528 +#, fuzzy +msgid "Add Field" +msgstr "Добавить/удалить" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:402 +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:726 +msgid "Return to Fields Table" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:449 +msgid "Drag and drop to reorder fields" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:455 +#, fuzzy +msgid "Registration Date" +msgstr "Регистрация завершена" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:458 +#, fuzzy +msgid "Registration IP" +msgstr "IP при регистрации" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:459 +msgid "Subscription Type" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:495 +msgid "Manage Fields" +msgstr "Upravljazi poljima" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:595 +msgid "WP-Members fields were updated" +msgstr "WP-Members polja su updatovana" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:617 +msgid "Field Label is required. Nothing was updated." +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:618 +msgid "Meta Key is required. Nothing was updated." +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:620 +msgid "Meta Key must contain only letters, numbers, and underscores" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:627 +msgid "A field with that meta key already exists" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:632 +#, php-format +msgid "" +"Sorry, \"%s\" is a reserved term. Field " +"was not added." +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:673 +#, fuzzy +msgid "Checked value is required for checkboxes. Nothing was updated." +msgstr "" +"Polje oznake je potrebno za dodavanje novih polja. Ništa nije updatovano. " + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:705 +msgid "A value is required for hidden fields. Nothing was updated." +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:712 +#, php-format +msgid "%s was added" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:725 +#, php-format +msgid "%s was updated" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:768 +msgid "Form field order updated." +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:56 +#, php-format +msgid "%sChange%s or %sFilter%s this address" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:57 +#, php-format +msgid "See the %sUsers Guide on plugin options%s." +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:90 +msgid "Manage Options" +msgstr "Upravljaj opcijama" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:94 +msgid "Content" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:105 +msgid "Content Restriction" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:109 +msgid "Do not restrict" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:123 +msgid "Show Excerpts" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:124 +msgid "Show Login Form" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:125 +msgid "Show Registration Form" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:126 +#, fuzzy +msgid "Auto Excerpt:" +msgstr "Prikaži odlomke" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:148 +#, fuzzy +msgid "Number of words in excerpt:" +msgstr "Prikaži odlomke" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:149 +msgid "Custom read more link (optional):" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:163 +msgid "Time-based expiration" +msgstr "Trajanje bazirano na vremenu" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:163 +msgid "Allows for access to expire" +msgstr "Dozvoljava vam da pristupite trajanju" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:164 +msgid "Trial period" +msgstr "Trial period" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:164 +msgid "Allows for a trial period" +msgstr "Dozvoljeno za trial period" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:166 +msgid "Subscription Settings" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:176 +msgid "New Feature Settings" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:182 +msgid "Legacy Password Reset" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:182 +#, php-format +msgid "Use legacy password reset. %s(Requires additional configuration)%s" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:184 +msgid "Legacy Login Error" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:184 +msgid "Use legacy WP-Members login error instead of WP error object." +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:187 +msgid "WooCommerce My Account" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:187 +msgid "Add WP-Members fields to WooCommerce My Account registration" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:188 +msgid "WooCommerce Checkout" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:188 +msgid "Add WP-Members fields to WooCommerce registration during checkout" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:204 +msgid "Other Settings" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:214 +msgid "Enable memberships" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:214 +#, php-format +msgid "Enables creation of different %s membership products %s" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:215 +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:223 +msgid "Clone menus" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:215 +msgid "Enables logged in menus" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:216 +msgid "Notify admin" +msgstr "Obavesti admina" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:216 +#, fuzzy, php-format +msgid "Notify %s for each new registration? %s" +msgstr "Pošalji email adminu za svaku novu registraciju?" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:217 +msgid "Moderate registration" +msgstr "Upravljajte registracijom" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:217 +msgid "Holds new registrations for admin approval" +msgstr "Sadrži nove registracije za odobrenje od dmina" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:218 +msgid "Confirmation Link" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:218 +#, php-format +msgid "" +"Send email confirmation link on new registration. %s(Requires additional " +"configuration)%s" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:219 +msgid "Ignore warning messages" +msgstr "Ignorisati poruke upozorenja" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:219 +msgid "Ignores WP-Members warning messages in the admin panel" +msgstr "Ignorisati WP-Members poruke upozorenja u admin panelu" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:233 +msgid "Attribution" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:235 +msgid "" +"Attribution is appreciated! Display \"powered by\" link on register form?" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:238 +msgid "Enable CAPTCHA for Registration" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:253 +msgid "Login Page:" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:256 +msgid "Specify a login page (optional)" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:265 +#, fuzzy +msgid "Register Page:" +msgstr " URL registarske stranice:" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:268 +msgid "For creating a register link in the login form" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:277 +#, fuzzy +msgid "User Profile Page:" +msgstr "Пользователь обновлен" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:280 +msgid "For creating a forgot password link in the login form" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:286 +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:288 +msgid "Stylesheet" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:297 +#, fuzzy +msgid "Custom Stylesheet:" +msgstr "Пользовательский" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:302 +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:329 +msgid "Update Settings" +msgstr "Update postavki" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:310 +msgid "Custom Post Types" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:316 +msgid "Add to WP-Members Settings" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:332 +msgid "" +"Please keep in mind that Custom Post Types are \"custom\" and therefore, not " +"all of them will function exactly the same way. WP-Members will certainly " +"work with any post type that operate like a post or a page; but you will need " +"to review any custom post type added to determine that it functions the way " +"you expect." +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:342 +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:343 +msgid "WP-Members Settings" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:344 +msgid "" +"The following is your WP-Members settings information if needed for support." +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:378 +msgid "Click to Copy" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:458 +msgid "Custom Post Type settings were updated" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:579 +msgid "WP-Members settings were updated" +msgstr "WP-Memberspostavke su updatovane" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:651 +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:682 +msgid "USE CUSTOM URL BELOW" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:671 +#, fuzzy +msgid "Select a page" +msgstr "Nova registracija" + +#: includes/admin/tabs/class-wp-members-dropins-table.php:70 +msgid "Name" +msgstr "" + +#: includes/admin/tabs/class-wp-members-dropins-table.php:71 +msgid "Enabled" +msgstr "" + +#: includes/admin/tabs/class-wp-members-dropins-table.php:72 +msgid "File" +msgstr "" + +#: includes/admin/tabs/class-wp-members-dropins-table.php:73 +msgid "Version" +msgstr "" + +#: includes/admin/tabs/class-wp-members-dropins-table.php:74 +#: includes/walkers/class-wp-members-walker-nav-menu.php:186 +msgid "Description" +msgstr "" + +#: includes/admin/tabs/class-wp-members-dropins-table.php:117 +#: includes/admin/tabs/class-wp-members-fields-table.php:108 +msgid "Save Settings" +msgstr "" + +#: includes/admin/tabs/class-wp-members-fields-table.php:43 +msgid "delete" +msgstr "" + +#: includes/admin/tabs/class-wp-members-fields-table.php:57 +msgid "Display Label" +msgstr "" + +#: includes/admin/tabs/class-wp-members-fields-table.php:61 +msgid "Required" +msgstr "" + +#: includes/admin/tabs/class-wp-members-fields-table.php:63 +#, fuzzy +msgid "Users Screen" +msgstr "Выгрузить" + +#: includes/admin/tabs/class-wp-members-fields-table.php:64 +msgid "Users Search" +msgstr "" + +#: includes/admin/tabs/class-wp-members-fields-table.php:66 +msgid "Sort" +msgstr "" + +#: includes/admin/tabs/class-wp-members-fields-table.php:107 +msgid "Delete Selected" +msgstr "" + +#: includes/api/api-forms.php:584 +#, php-format +msgid "%s is a required field." +msgstr "" + +#: includes/class-wp-members-captcha.php:276 includes/deprecated.php:401 +msgid "You have entered an incorrect code value. Please try again." +msgstr "" + +#: includes/class-wp-members-dialogs.php:41 +msgid "First Name" +msgstr "Ime" + +#: includes/class-wp-members-dialogs.php:42 +msgid "Last Name" +msgstr "Prezime" + +#: includes/class-wp-members-dialogs.php:43 +msgid "Address 1" +msgstr "Adresa 1" + +#: includes/class-wp-members-dialogs.php:44 +msgid "Address 2" +msgstr "Adresa 2" + +#: includes/class-wp-members-dialogs.php:45 +msgid "City" +msgstr "Grad" + +#: includes/class-wp-members-dialogs.php:46 +msgid "State" +msgstr "Država" + +#: includes/class-wp-members-dialogs.php:47 +msgid "Zip" +msgstr "Poštanski broj" + +#: includes/class-wp-members-dialogs.php:48 +msgid "Country" +msgstr "Zemlja" + +#: includes/class-wp-members-dialogs.php:49 +msgid "Day Phone" +msgstr "Dnevni telefon" + +#: includes/class-wp-members-dialogs.php:50 +#: includes/class-wp-members-dialogs.php:92 +msgid "Email" +msgstr "Email" + +#: includes/class-wp-members-dialogs.php:51 +msgid "Confirm Email" +msgstr "" + +#: includes/class-wp-members-dialogs.php:52 +msgid "Website" +msgstr "Website" + +#: includes/class-wp-members-dialogs.php:53 +msgid "Biographical Info" +msgstr "Biografska info" + +#: includes/class-wp-members-dialogs.php:54 +#: includes/class-wp-members-dialogs.php:74 +#: includes/class-wp-members-dialogs.php:159 +msgid "Password" +msgstr "Šifra" + +#: includes/class-wp-members-dialogs.php:55 +msgid "Confirm Password" +msgstr "" + +#: includes/class-wp-members-dialogs.php:56 +#: includes/class-wp-members-forms.php:2165 +msgid "TOS" +msgstr "TOS" + +#: includes/class-wp-members-dialogs.php:66 +#, fuzzy +msgid "You are not logged in." +msgstr "Ulogovani ste kao %s" + +#: includes/class-wp-members-dialogs.php:72 +#, fuzzy +msgid "Existing Users Log In" +msgstr "Войти" + +#: includes/class-wp-members-dialogs.php:73 +#: includes/class-wp-members-dialogs.php:158 +msgid "Username or Email" +msgstr "" + +#: includes/class-wp-members-dialogs.php:75 +#: includes/class-wp-members-shortcodes.php:773 +#, fuzzy +msgid "Log In" +msgstr "Войти" + +#: includes/class-wp-members-dialogs.php:76 +msgid "Remember Me" +msgstr "" + +#: includes/class-wp-members-dialogs.php:77 +msgid "Forgot password?" +msgstr "Zaboravili ste šifru?" + +#: includes/class-wp-members-dialogs.php:78 +msgid "Click here to reset" +msgstr "Kliknite ovde za restart" + +#: includes/class-wp-members-dialogs.php:79 +msgid "New User?" +msgstr "Novi korisnik?" + +#: includes/class-wp-members-dialogs.php:80 +msgid "Click here to register" +msgstr "Kliknite ovde za registraciju" + +#: includes/class-wp-members-dialogs.php:83 +#: includes/class-wp-members-dialogs.php:142 +msgid "Change Password" +msgstr "Promeni šifru" + +#: includes/class-wp-members-dialogs.php:84 +msgid "New password" +msgstr "" + +#: includes/class-wp-members-dialogs.php:85 +msgid "Confirm new password" +msgstr "" + +#: includes/class-wp-members-dialogs.php:86 +msgid "Update Password" +msgstr "Update-uj čifr" + +#: includes/class-wp-members-dialogs.php:87 +msgid "Password successfully changed!" +msgstr "" + +#: includes/class-wp-members-dialogs.php:90 +msgid "Reset Forgotten Password" +msgstr "Resetuj zabranjenu šifru" + +#: includes/class-wp-members-dialogs.php:93 +msgid "Reset Password" +msgstr "Resetuj šifru" + +#: includes/class-wp-members-dialogs.php:94 +msgid "Forgot username?" +msgstr "" + +#: includes/class-wp-members-dialogs.php:95 +msgid "Click here" +msgstr "" + +#: includes/class-wp-members-dialogs.php:98 +#: includes/class-wp-members-dialogs.php:100 +msgid "Retrieve username" +msgstr "" + +#: includes/class-wp-members-dialogs.php:99 +msgid "Email Address" +msgstr "" + +#: includes/class-wp-members-dialogs.php:103 +#, fuzzy +msgid "New User Registration" +msgstr "Новый пользователь?" + +#: includes/class-wp-members-dialogs.php:104 +msgid "Choose a Username" +msgstr "Izaberite korisničko ime" + +#: includes/class-wp-members-dialogs.php:105 +msgid "Input the code:" +msgstr "" + +#: includes/class-wp-members-dialogs.php:106 +#: includes/class-wp-members-forms.php:2164 +#, php-format +msgid "Please indicate that you agree to the %s Terms of Service %s" +msgstr "" + +#: includes/class-wp-members-dialogs.php:107 +#, fuzzy +msgid "Reset Form" +msgstr "Произошла ошибка в форма CAPTCHA." + +#: includes/class-wp-members-dialogs.php:108 +#: includes/class-wp-members-dialogs.php:162 +#: includes/class-wp-members-shortcodes.php:770 +#: includes/class-wp-members-user.php:186 +msgid "Register" +msgstr "Registruj se" + +#: includes/class-wp-members-dialogs.php:110 +msgid "Required field" +msgstr "Zahtevano polje" + +#: includes/class-wp-members-dialogs.php:113 +msgid "Edit Your Information" +msgstr "Edituj svoje informcije" + +#: includes/class-wp-members-dialogs.php:115 +#, fuzzy +msgid "Update Profile" +msgstr "Пользователь обновлен" + +#: includes/class-wp-members-dialogs.php:116 +msgid "Update this file" +msgstr "" + +#: includes/class-wp-members-dialogs.php:119 +msgid "Login Failed!" +msgstr "Login nije uspeo!" + +#: includes/class-wp-members-dialogs.php:120 +msgid "You entered an invalid username or password." +msgstr "Uneli ste nepostojeće korisničko ime ili šifru.." + +#: includes/class-wp-members-dialogs.php:121 +msgid "Click here to continue." +msgstr "Klik ovde za nastavak." + +#: includes/class-wp-members-dialogs.php:122 +msgid "Password fields cannot be empty" +msgstr "Oilja sa šiframa ne mogu da budu prazna" + +#: includes/class-wp-members-dialogs.php:123 +msgid "Sorry, that email address was not found." +msgstr "" + +#: includes/class-wp-members-dialogs.php:124 +#, php-format +msgid "An email was sent to %s with your username." +msgstr "" + +#: includes/class-wp-members-dialogs.php:125 +#, php-format +msgid "Sorry, %s is a required field." +msgstr "Žao nam je, %s je m ora da bude unešeno u polje." + +#: includes/class-wp-members-dialogs.php:126 +msgid "You must enter a valid email address." +msgstr "Morate da unesete validnu email adresu." + +#: includes/class-wp-members-dialogs.php:127 +msgid "The username cannot include non-alphanumeric characters." +msgstr "Ime korisnika ne može da uključi ne alfanumeričke karaktere." + +#: includes/class-wp-members-dialogs.php:128 +msgid "Sorry, username is a required field" +msgstr "Žao nam je, korisničko ime morate da unesete u polje" + +#: includes/class-wp-members-dialogs.php:129 +msgid "Sorry, that username is taken, Please try another." +msgstr "" + +#: includes/class-wp-members-dialogs.php:130 +msgid "Sorry, that email address already has an account. Please try another." +msgstr "" + +#: includes/class-wp-members-dialogs.php:131 +#: includes/class-wp-members-dialogs.php:174 +#, fuzzy +msgid "Passwords did not match." +msgstr "Šifra se ne slaže" + +#: includes/class-wp-members-dialogs.php:132 +#, fuzzy +msgid "Emails did not match." +msgstr "Šifra se ne slaže" + +#: includes/class-wp-members-dialogs.php:133 +msgid "You must complete the CAPTCHA form." +msgstr "Morate da popunite CAPTCHA formu." + +#: includes/class-wp-members-dialogs.php:134 +msgid "CAPTCHA was not valid." +msgstr "" + +#: includes/class-wp-members-dialogs.php:135 +#, fuzzy +msgid "There was an error processing the form." +msgstr "Произошла ошибка в форма CAPTCHA." + +#: includes/class-wp-members-dialogs.php:136 +msgid "There was an error with the CAPTCHA form." +msgstr "Pojavio se error sa CAPTCHA formom." + +#: includes/class-wp-members-dialogs.php:137 +#, php-format +msgid "" +"Sorry, you can only upload the following file types for the %s field: %s." +msgstr "" + +#: includes/class-wp-members-dialogs.php:138 +#: includes/class-wp-members-dialogs.php:171 +msgid "Your information was updated!" +msgstr "Vaša informacija je updatovana!" + +#: includes/class-wp-members-dialogs.php:141 +msgid "Edit My Information" +msgstr "Editujte moje informacije" + +#: includes/class-wp-members-dialogs.php:143 +#: includes/class-wp-members-dialogs.php:146 +#: includes/class-wp-members-dialogs.php:148 +#: includes/class-wp-members-dialogs.php:153 +#, php-format +msgid "You are logged in as %s" +msgstr "Ulogovani ste kao %s" + +#: includes/class-wp-members-dialogs.php:144 +msgid "Log out" +msgstr "" + +#: includes/class-wp-members-dialogs.php:145 +msgid "Edit profile" +msgstr "" + +#: includes/class-wp-members-dialogs.php:145 +msgid "Begin using the site." +msgstr "Počnite da koristite sajt" + +#: includes/class-wp-members-dialogs.php:147 +#, fuzzy +msgid "Click to log out" +msgstr "Войти" + +#: includes/class-wp-members-dialogs.php:149 +#, fuzzy +msgid "click to log out" +msgstr "Войти" + +#: includes/class-wp-members-dialogs.php:150 +msgid "Log Out" +msgstr "" + +#: includes/class-wp-members-dialogs.php:154 +msgid "click here to log out" +msgstr "klik ovde za logout" + +#: includes/class-wp-members-dialogs.php:155 +msgid "Login Failed!
    You entered an invalid username or password." +msgstr "Login nije uspeo!
    Uneli ste nepostojeće korisničko ime i šifru." + +#: includes/class-wp-members-dialogs.php:156 +msgid "Invalid username or password." +msgstr "" + +#: includes/class-wp-members-dialogs.php:160 includes/class-wp-members.php:1745 +#, fuzzy +msgid "log in" +msgstr "Войти" + +#: includes/class-wp-members-dialogs.php:161 +msgid "Forgot?" +msgstr "Zaboravili?" + +#: includes/class-wp-members-dialogs.php:165 +#, fuzzy +msgid "" +"This content is restricted to site members. If you are an existing user, " +"please log in. New users may register below." +msgstr "" +"Ovaj sadržaj je zabranjen članovima sajta. Ako ste korisnik molim vas " +"ulogujte se. Novi korisnik se može ulogovati ispod." + +#: includes/class-wp-members-dialogs.php:166 +#, fuzzy +msgid "" +"Congratulations! Your registration was successful.

    You may now log " +"in using the password that was emailed to you." +msgstr "" +"Čestitamo! Vaša registracija je uspela.

    Sada možete da se " +"ulogujete koristeći šifru koja vam je postala mailom." + +#: includes/class-wp-members-dialogs.php:169 +msgid "Sorry, that username is taken, please try another." +msgstr "Žao nam je, ovo korisničko ime je uzeto, pokušajte drugo." + +#: includes/class-wp-members-dialogs.php:170 +msgid "" +"Sorry, that email address already has an account.
    Please try another." +msgstr "Žao nam je, ova mail adresa već ima nalog.
    Pokušajte drugu." + +#: includes/class-wp-members-dialogs.php:175 +msgid "Password successfully changed." +msgstr "" + +#: includes/class-wp-members-dialogs.php:176 +msgid "Invalid username or email address." +msgstr "" + +#: includes/class-wp-members-dialogs.php:177 +msgid "" +"Password successfully reset! An email containing a new password has been sent " +"to the email address on file for your account." +msgstr "" + +#: includes/class-wp-members-dialogs.php:178 +msgid "" +"Reset request received. An email with instructions to complete the password " +"reset has been sent." +msgstr "" + +#: includes/class-wp-members-dialogs.php:180 +msgid "This content requires the following membership: " +msgstr "" + +#: includes/class-wp-members-dialogs.php:181 +msgid "This content requires one of the following memberships: " +msgstr "" + +#: includes/class-wp-members-forms.php:84 +#: includes/class-wp-members-forms.php:350 +msgid "Choose membership" +msgstr "" + +#: includes/class-wp-members-forms.php:1898 +#: includes/class-wp-members-user-profile.php:510 +msgid "Activate this user?" +msgstr "Aktivirajte ovog korisnika?" + +#: includes/class-wp-members-forms.php:2165 templates/tos.php:20 +msgid "Terms of Service" +msgstr "Pravila" + +#: includes/class-wp-members-menus.php:131 +msgid "Display" +msgstr "" + +#: includes/class-wp-members-menus.php:139 +msgid "Logged In Users" +msgstr "" + +#: includes/class-wp-members-menus.php:146 +msgid "Logged Out Users" +msgstr "" + +#: includes/class-wp-members-menus.php:153 +msgid "All Users" +msgstr "" + +#: includes/class-wp-members-menus.php:167 +#, php-format +msgid "%sAdd membership products%s to restrict menu to a membership" +msgstr "" + +#: includes/class-wp-members-menus.php:169 +msgid "Restrict menu item to a membership product" +msgstr "" + +#: includes/class-wp-members-products.php:342 +#, php-format +msgid "All %s" +msgstr "" + +#: includes/class-wp-members-products.php:343 +#, php-format +msgid "Add New %s" +msgstr "" + +#: includes/class-wp-members-products.php:344 +msgid "Add New" +msgstr "Dodaj novi" + +#: includes/class-wp-members-products.php:345 +#, php-format +msgid "New %s" +msgstr "" + +#: includes/class-wp-members-products.php:346 +#, php-format +msgid "Edit %s" +msgstr "" + +#: includes/class-wp-members-products.php:347 +#, php-format +msgid "Update %s" +msgstr "" + +#: includes/class-wp-members-products.php:348 +#: includes/class-wp-members-products.php:349 +#, php-format +msgid "View %s" +msgstr "" + +#: includes/class-wp-members-products.php:350 +#, php-format +msgid "Search %s" +msgstr "" + +#: includes/class-wp-members-products.php:351 +msgid "Not found" +msgstr "" + +#: includes/class-wp-members-products.php:352 +msgid "Not found in Trash" +msgstr "" + +#: includes/class-wp-members-products.php:353 +msgid "Insert into item" +msgstr "" + +#: includes/class-wp-members-products.php:354 +#, php-format +msgid "Save %s Details" +msgstr "" + +#: includes/class-wp-members-products.php:355 +msgid "Membership Attributes" +msgstr "" + +#: includes/class-wp-members-products.php:358 +msgid "Membership Product" +msgstr "" + +#: includes/class-wp-members-products.php:359 +msgid "WP-Members Membership Products" +msgstr "" + +#: includes/class-wp-members-pwd-reset.php:35 +#: includes/class-wp-members-pwd-reset.php:36 +msgid "" +"Sorry, no password reset key was found. Please check your email and try again." +msgstr "" + +#: includes/class-wp-members-pwd-reset.php:37 +msgid "Sorry, the password reset key is expired." +msgstr "" + +#: includes/class-wp-members-pwd-reset.php:167 +msgid "The passwords do not match." +msgstr "" + +#: includes/class-wp-members-shortcodes.php:134 +msgid "" +"This is a generic message to display the form message dialog in the " +"Customizer." +msgstr "" + +#: includes/class-wp-members-shortcodes.php:699 +msgid "Click here to log out." +msgstr "" + +#: includes/class-wp-members-user-profile.php:58 +msgid "WP-Members Additional Fields" +msgstr "WP-Members Additional Fields" + +#: includes/class-wp-members-user-profile.php:58 +#, fuzzy +msgid "Additional Information" +msgstr "WP-Members Дополнительные поля" + +#: includes/class-wp-members-user-profile.php:500 +msgid "Reactivate this user?" +msgstr "Reaktivirajte ovog korisnika?" + +#: includes/class-wp-members-user-profile.php:505 +msgid "Deactivate this user?" +msgstr "Deaktivirajte ovog korisnika?" + +#: includes/class-wp-members-user-profile.php:559 +msgid "IP @ registration" +msgstr "IP @ registracija" + +#: includes/class-wp-members-user.php:1171 +msgid "ERROR: User has not been activated." +msgstr "ERROR : Korisnik nije aktiviran." + +#: includes/class-wp-members-validation-link.php:32 +msgid "Click to validate your account: " +msgstr "" + +#: includes/class-wp-members-validation-link.php:33 +msgid "Thank you for validating your account." +msgstr "" + +#: includes/class-wp-members-validation-link.php:34 +msgid "Validation key was expired or invalid" +msgstr "" + +#: includes/class-wp-members-validation-link.php:35 +msgid "Your account is now pending approval" +msgstr "" + +#: includes/class-wp-members-validation-link.php:284 +msgid "ERROR: User has not confirmed their account." +msgstr "" + +#: includes/class-wp-members-widget.php:24 +msgid "Displays the WP-Members sidebar login." +msgstr "" + +#: includes/class-wp-members-widget.php:39 +#: includes/class-wp-members-widget.php:82 +msgid "Login Status" +msgstr "Login Status" + +#: includes/class-wp-members-widget.php:46 +msgid "Title:" +msgstr "Naslov:" + +#: includes/class-wp-members-widget.php:50 +msgid "Redirect to (optional):" +msgstr "" + +#: includes/class-wp-members.php:1087 includes/class-wp-members.php:1098 +msgid "You must be logged in to view this content." +msgstr "" + +#: includes/class-wp-members.php:1104 +msgid "The page you are looking for does not exist" +msgstr "" + +#: includes/class-wp-members.php:1352 +#, php-format +msgid "" +"You have a linked page in the WP-Members page settings that corresponds to a " +"post ID that no longer exists. Please %s review and update the %s page " +"settings %s." +msgstr "" + +#: includes/class-wp-members.php:1472 +msgid "Show forms as logged out" +msgstr "" + +#: includes/class-wp-members.php:1481 +msgid "Show form message dialog" +msgstr "" + +#: includes/class-wp-members.php:1558 +msgid "(more…)" +msgstr "" + +#: includes/class-wp-members.php:1746 +msgid "log out" +msgstr "" + +#: includes/cli/class-wp-members-cli-user.php:24 +#: includes/cli/class-wp-members-cli-user.php:62 +msgid "Moderated registration is not enabled in WP-Members options." +msgstr "" + +#: includes/cli/class-wp-members-cli-user.php:35 +msgid "User activated." +msgstr "" + +#: includes/cli/class-wp-members-cli-user.php:37 +msgid "Email notification sent to user." +msgstr "" + +#: includes/cli/class-wp-members-cli-user.php:40 +msgid "User is already activated." +msgstr "" + +#: includes/cli/class-wp-members-cli-user.php:67 +msgid "User deactivated." +msgstr "" + +#: includes/cli/class-wp-members-cli-user.php:88 +msgid "Invalid user ID. Please specify a valid user. Try `wp user list`." +msgstr "" + +#: includes/cli/class-wp-members-cli-user.php:91 +msgid "No user id specified. Must specify user id as --id=123" +msgstr "" + +#: includes/cli/class-wp-members-cli-user.php:208 +#, php-format +msgid "User: %s" +msgstr "" + +#: includes/cli/class-wp-members-cli-user.php:248 +#, php-format +msgid "User role: %s" +msgstr "" + +#: includes/deprecated.php:373 +msgid "We were unable to validate the public key." +msgstr "Nismo mogli da validujemo javni ključ." + +#: includes/deprecated.php:377 +msgid "We were unable to validate the private key." +msgstr "Nismo mogli da validujemo privatni ključ" + +#: includes/deprecated.php:381 +msgid "The challenge parameter of the verify script was incorrect." +msgstr "Izazovni parametar verifikovanog skripta nisu tačni." + +#: includes/deprecated.php:385 +msgid "The CAPTCHA solution was incorrect." +msgstr "CAPTCHA rešenje nije tačno." + +#: includes/deprecated.php:389 +msgid "The parameters to verify were incorrect" +msgstr "Parametri za verifikaciju su netačni." + +#: includes/deprecated.php:393 +msgid "" +"reCAPTCHA API keys are tied to a specific domain name for security reasons." +msgstr "" +"reCAPTCHA API ključevi su vezani za odredjeno domain ime iz sigurnosnih " +"razloga." + +#: includes/deprecated.php:397 +msgid "The reCAPTCHA server was not reached. Please try to resubmit." +msgstr "reCAPTCHA server nije dostupan. Pokušajte ponovo." + +#. translators: %s: title of menu item which is invalid +#: includes/walkers/class-wp-members-walker-nav-menu.php:92 +#, php-format +msgid "%s (Invalid)" +msgstr "" + +#. translators: %s: title of menu item in draft status +#: includes/walkers/class-wp-members-walker-nav-menu.php:96 +#, php-format +msgid "%s (Pending)" +msgstr "" + +#: includes/walkers/class-wp-members-walker-nav-menu.php:123 +msgid "Move up" +msgstr "" + +#: includes/walkers/class-wp-members-walker-nav-menu.php:136 +msgid "Move down" +msgstr "" + +#: includes/walkers/class-wp-members-walker-nav-menu.php:138 +msgid "Edit Menu Item" +msgstr "" + +#: includes/walkers/class-wp-members-walker-nav-menu.php:149 +msgid "URL" +msgstr "" + +#: includes/walkers/class-wp-members-walker-nav-menu.php:156 +msgid "Navigation Label" +msgstr "" + +#: includes/walkers/class-wp-members-walker-nav-menu.php:162 +msgid "Title Attribute" +msgstr "" + +#: includes/walkers/class-wp-members-walker-nav-menu.php:169 +msgid "Open link in a new window/tab" +msgstr "" + +#: includes/walkers/class-wp-members-walker-nav-menu.php:174 +msgid "CSS Classes (optional)" +msgstr "" + +#: includes/walkers/class-wp-members-walker-nav-menu.php:180 +msgid "Link Relationship (XFN)" +msgstr "" + +#: includes/walkers/class-wp-members-walker-nav-menu.php:188 +msgid "" +"The description will be displayed in the menu if the current theme supports " +"it." +msgstr "" + +#: includes/walkers/class-wp-members-walker-nav-menu.php:210 +#, php-format +msgid "Original: %s" +msgstr "" + +#: includes/walkers/class-wp-members-walker-nav-menu.php:223 +msgid "Remove" +msgstr "" + +#: templates/tos.php:32 +#, php-format +msgid "%sclose%s" +msgstr "%sclose%s" + +#: templates/tos.php:34 +#, php-format +msgid "%sprint%s" +msgstr "%sprint%s" + +#. Plugin Name of the plugin/theme +msgid "WP-Members" +msgstr "WP-Members" + +#. Plugin URI of the plugin/theme +msgid "https://rocketgeek.com" +msgstr "" + +#. Description of the plugin/theme +msgid "" +"WP access restriction and user registration. For more information on plugin " +"features, refer to the online Users Guide. A Quick Start Guide is also available. WP-" +"Members(tm) is a trademark of butlerblog.com." +msgstr "" + +#. Author of the plugin/theme +msgid "Chad Butler" +msgstr "" + +#. Author URI of the plugin/theme +msgid "https://butlerblog.com/" +msgstr "" + +#, fuzzy +#~ msgid "Block" +#~ msgstr "Блокировать записи по умолчанию" + +#~ msgid "Manage reCAPTCHA Options" +#~ msgstr "Upravljajte reCAPTCHA Opcijama" + +#~ msgid "" +#~ "reCAPTCHA is a free, accessible CAPTCHA service that helps to digitize " +#~ "books while blocking spam on your blog." +#~ msgstr "" +#~ "reCAPTCHA je besplatna, primenjliva CAPTCHA usluga pomaže digitalizovanju " +#~ "knjiga dok blokira spam na vašem blogu." + +#, php-format +#~ msgid "" +#~ "reCAPTCHA asks commenters to retype two words scanned from a book to prove " +#~ "that they are a human. This verifies that they are not a spambot while " +#~ "also correcting the automatic scans of old books. So you get less spam, " +#~ "and the world gets accurately digitized books. Everybody wins! For " +#~ "details, visit the %s reCAPTCHA website%s" +#~ msgstr "" +#~ "reCAPTCHA traži da ponovo otkucate dve reči skenirane iz knjige da dokaže " +#~ "da ste čovek . Ovo potvrđuje da oni nisu spambot i istovremeno ispravlja " +#~ "automatski skenire starih knjiga . Tako dobijate manje spama , a svet " +#~ "dobija tačno digitalizovane poruke. Svi pobedjuju. Za detalje posetite %s " +#~ "reCAPTCHA websajt%s" + +#, php-format +#~ msgid "" +#~ "reCAPTCHA requires an API key, consisting of a \"public\" and a \"private" +#~ "\" key. You can sign up for a %s free reCAPTCHA key%s" +#~ msgstr "" +#~ "reCAPTCHA zahteva API ključ, ckoji se sastoji od \"public\" i \"private" +#~ "\" ključa. Možete da se upišete za %s besplatan reCAPTCHA ključ %s" + +#~ msgid "Public Key" +#~ msgstr "Javni ključ" + +#~ msgid "Private Key" +#~ msgstr "Privatni ključ" + +#~ msgid "Choose Theme" +#~ msgstr "Izaberi temu" + +#~ msgid "Red" +#~ msgstr "Crveno" + +#~ msgid "White" +#~ msgstr "Belo" + +#~ msgid "Black Glass" +#~ msgstr "Black staklo" + +#~ msgid "Clean" +#~ msgstr "Čisto" + +#, fuzzy +#~ msgid "Active" +#~ msgstr "Aktiviraj" + +#, fuzzy +#~ msgid "Enable CAPTCHA" +#~ msgstr "Uključi CAPTCHA za registraciju" + +#~ msgid "Passwords did not match.

    Please try again." +#~ msgstr "Šivra se ne poklapa.

    Pokšajte opet." + +#~ msgid "Either the username or email address do not exist in our records." +#~ msgstr "Ili korisničko ime ili email adresa ne postoje u nečim beleškama." + +#, fuzzy +#~ msgid "Click to log out." +#~ msgstr "Войти" + +#~ msgid "You have set WP-Members to turn off the registration process" +#~ msgstr "Možete podesiti WP-Members da ugase proces registacije" + +#~ msgid "" +#~ "but you also set to moderate and/or email admin new registrations. You " +#~ "will need to set up a registration page for users to register." +#~ msgstr "" +#~ "ali takodje možete da postavite da bude umereno i/ili email admin novih " +#~ "registracija. Morate namestiti stranicu registracije za korisnike da se " +#~ "registruju. " + +#, fuzzy +#~ msgid "Unblocked?" +#~ msgstr "" +#~ "Примечание: каждая запись может быть заблокирована/разблокирована отдельно " +#~ "от остальных" + +#, fuzzy +#~ msgid "Blocked?" +#~ msgstr "" +#~ "Примечание: каждая запись может быть заблокирована/разблокирована отдельно " +#~ "от остальных" + +#~ msgid "Field Label is required for adding a new field. Nothing was updated." +#~ msgstr "" +#~ "Polje oznake je potrebno za dodavanje novih polja. Ništa nije updatovano. " + +#~ msgid "Option Name is required for adding a new field. Nothing was updated." +#~ msgstr "" +#~ "Opcija IME je potrebna zadodavanje novih polja. Ništa nije updatovano. " + +#, fuzzy +#~ msgid "field was added" +#~ msgstr "Метка поля" + +#, fuzzy +#~ msgid "field was updated" +#~ msgstr "WP-Members polja su updatovana" + +#~ msgid "Option Name" +#~ msgstr "Ime opcije" + +#, fuzzy +#~ msgid "Additional information for checkbox fields" +#~ msgstr "WP-Members Дополнительные поля" + +#, fuzzy +#~ msgid "Additional information for dropdown fields" +#~ msgstr "WP-Members Дополнительные поля" + +#~ msgid "For dropdown, array of values:" +#~ msgstr "Za dropdown, array ili vrednosti:" + +#~ msgid "" +#~ "Determine which fields will display and which are required. This includes " +#~ "all fields, both native WP fields and WP-Members custom fields." +#~ msgstr "" +#~ "Odredjuje koja polja će biti prikazana i koja su neophodna. Ovo uključuje " +#~ "sva polja, i native WP polja i WP-Members custom polja." + +#~ msgid "(Note: Email is always mandatory and cannot be changed.)" +#~ msgstr "(Beleška: Email je uvek obavezan i ne može se promeniti.)" + +#~ msgid "Add/Delete" +#~ msgstr "Dodaj/Obriši" + +#~ msgid "Checked?" +#~ msgstr "Čekirano?" + +#~ msgid "Delete" +#~ msgstr "Obrisati" + +#~ msgid "(Email cannot be removed)" +#~ msgstr "(Email ne može da se ukloni)" + +#, fuzzy +#~ msgid "native" +#~ msgstr "" +#~ "Определите, какие поля следует отображать, и какие должны быть " +#~ "обязательными. Этот список содержит все поля, как WordPress`а, так и WP-" +#~ "Members" + +#~ msgid "Update Fields" +#~ msgstr "Update-uj polja" + +#~ msgid "Please indicate that you agree to the %s TOS %s" +#~ msgstr "Molimo vas budite jasni da li želite da se %s TOS %s" + +#, fuzzy +#~ msgid "%s posts %sed." +#~ msgstr "Блокировать записи по умолчанию" + +#, fuzzy +#~ msgid "Post Restriction" +#~ msgstr "Nova registracija" + +#, fuzzy +#~ msgid "Page Restriction" +#~ msgstr "Nova registracija" + +#~ msgid "dropdown" +#~ msgstr "dropdown" + +#~ msgid "Block Posts by default" +#~ msgstr "Blokiraj postove po defaultu" + +#~ msgid "" +#~ "Note: Posts can still be individually blocked or unblocked at the article " +#~ "level" +#~ msgstr "" +#~ "Beleška: Postovi mogu i dalje biti individualno blokirani ili odblokirani " +#~ "na nivou članka" + +#~ msgid "Block Pages by default" +#~ msgstr "Blokiraj stranice po defaultu" + +#~ msgid "" +#~ "Note: Pages can still be individually blocked or unblocked at the article " +#~ "level" +#~ msgstr "" +#~ "Beleška: Stranice mogu biti individualno blokirane ili deblokirane na " +#~ "nivou članka" + +#~ msgid "Show excerpts" +#~ msgstr "Prikaži odlomke" + +#~ msgid "" +#~ "Shows excerpted content above the login/registration on both Posts and " +#~ "Pages" +#~ msgstr "" +#~ "Prikaži sadržaj odlomaka iznad login/registracije na Postovima i Stranice" + +#~ msgid "Turns on CAPTCHA for registration" +#~ msgstr "Uključi CAPTCHA za registraciju" + +#, fuzzy +#~ msgid "Hide registration" +#~ msgstr "Регистрация завершена" + +#~ msgid "Optional" +#~ msgstr "Opcionalno" + +#, fuzzy +#~ msgid "Automatically creates an excerpt" +#~ msgstr "Prikaži odlomke" + +#~ msgid "AIM" +#~ msgstr "AIM" + +#~ msgid "Yahoo IM" +#~ msgstr "Yahoo IM" + +#~ msgid "Jabber/Google Talk" +#~ msgstr "Jabber/Google Talk" + +#~ msgid "" +#~ "Password successfully changed!

    You will need to re-login with " +#~ "your new password." +#~ msgstr "" +#~ "Šifra je uspešno promenjena!

    Moraćete da se ponovo ulogujete " +#~ "sa novom šifrom." + +#~ msgid "" +#~ "Password successfully reset!

    An email containing a new password " +#~ "has been sent to the email address on file for your account. You may " +#~ "change this random password then re-login with your new password." +#~ msgstr "" +#~ "Šifra je uspešno restartovana!

    Email koji sadrži novu šifru je " +#~ "poslat na mail adrese u fajlu za vaš nalog. Možete promeniti ovu " +#~ "nasumičnu šifru i potom se ponovo ulogovati sa novom šifrom." + +#~ msgid "Custom" +#~ msgstr "Custom" + +#, fuzzy +#~ msgid "edit" +#~ msgstr "Редактирование ваших данных" + +#~ msgid "Use reCAPTCHA" +#~ msgstr "Koristi reCAPTCHA" + +#~ msgid "New Password" +#~ msgstr "Nova šifra" + +#~ msgid "Repeat Password" +#~ msgstr "Ponovi šifru" + +#~ msgid "Remember me" +#~ msgstr "Zapamti" + +#~ msgid "Turn off registration" +#~ msgstr "Ugasi registraciju" + +#~ msgid "Turns off the registration process, only allows login" +#~ msgstr "Gašenje registracije je u procesu, samo može login da bude dozvoljen" + +#~ msgid "Legacy forms" +#~ msgstr "Forme nasledja" + +#~ msgid "" +#~ "Uses the pre-2.5.1 table-based forms (leave off to use CSS table-less " +#~ "forms)" +#~ msgstr "" +#~ "Koristi pre-2.5.1 forme bayirane na tabeli (ostavi radi korišćenja CSS " +#~ "forme sa manje tabela)" + +#~ msgid "Members Area URL:" +#~ msgstr "URL područja članova:" + +#~ msgid "Add" +#~ msgstr "Dodati" + +#~ msgid "WP-Members expiration periods were updated" +#~ msgstr "WP-Members period trajanja su updateovani" + +#~ msgid "" +#~ "Settings were saved, but you have required fields that are not set to " +#~ "display!" +#~ msgstr "" +#~ "Postavke su sačuvane, ali imate obavezna polja koja nisu nameštena za " +#~ "prikaz!" + +#~ msgid "" +#~ "Note: This will not cause an error for the end user, as only displayed " +#~ "fields are validated. However, you should still check that your displayed " +#~ "and required fields match up. Mismatched fields are highlighted below." +#~ msgstr "" +#~ "Napomena : Ovo neće izazvati error za krajnjeg korisnika , jer su samo " +#~ "polja proverena . Međutim , ipak bi trebalo da proverite da li se vaša " +#~ "prikazana i obavezna polja poklapaju . Jezik ispod polja su označena." + +#~ msgid "If you find this plugin useful, please consider making a donation" +#~ msgstr "" +#~ "Ako mislite da je ova plugin korisna, možete da napravite malu donaciju" + +#~ msgid "Subscriptions" +#~ msgstr "Pretplata" + +#~ msgid "PayPal Settings" +#~ msgstr "PayPal postavke" + +#~ msgid "If you find this plugin useful, please consider a %s donation %s" +#~ msgstr "" +#~ "Ako mislite da je ova plugin korisna, možete da napravite malu %s donaciju" +#~ "%s" + +#~ msgid "%d users were activated." +#~ msgstr "%d korisnici su aktivirani." + +#~ msgid "" +#~ "Users ready to export, %s click here %s to generate and download a CSV." +#~ msgstr "" +#~ "Korisnici spremni za export,%s kliknite ovde %s za generisanje i " +#~ "download CSV-a." + +#~ msgid "WP-Members Users" +#~ msgstr "WP-Members korisnici" + +#~ msgid "No users matched your criteria" +#~ msgstr "Nijedan korisnik se ne slaže sa vašim kriterijumom" + +#~ msgid "Bulk Actions" +#~ msgstr "Bulk Actions" + +#~ msgid "Apply" +#~ msgstr "Primeni" + +#~ msgid "Indicates a required field" +#~ msgstr "Ukazuje na za zahtevano polje" + +#~ msgid "Login" +#~ msgstr "Login" + +#~ msgid "Clear Form" +#~ msgstr "očisti forma" + +#~ msgid "Submit" +#~ msgstr "Podnesi" + +#~ msgid "Cheatin’ uh?" +#~ msgstr "Cheatin’ uh?" + +#~ msgid "there was an error and no users were exported" +#~ msgstr "pojavio se error i nijedan korisnik nije ekspotovan" + +#~ msgid "login" +#~ msgstr "login" diff --git a/i18n/languages/wp-members-tr_TR.mo b/i18n/languages/wp-members-tr_TR.mo new file mode 100644 index 00000000..1d872cb6 Binary files /dev/null and b/i18n/languages/wp-members-tr_TR.mo differ diff --git a/i18n/languages/wp-members-tr_TR.po b/i18n/languages/wp-members-tr_TR.po new file mode 100644 index 00000000..bd4c77b1 --- /dev/null +++ b/i18n/languages/wp-members-tr_TR.po @@ -0,0 +1,2787 @@ +# Copyright (C) 2012 WP-Members +# This file is distributed under the same license as the WP-Members package. +msgid "" +msgstr "" +"Project-Id-Version: WP-Members 3.2.6\n" +"Report-Msgid-Bugs-To: http://wordpress.org/tag/wp-members\n" +"POT-Creation-Date: 2023-01-06 15:20-0500\n" +"PO-Revision-Date: 2023-01-06 15:24-0500\n" +"Last-Translator: \n" +"Language-Team: hakaner \n" +"Language: tr\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Poedit 2.4.3\n" +"X-Poedit-SourceCharset: UTF-8\n" + +#: includes/admin/class-wp-members-admin-api.php:254 +msgid "Custom email" +msgstr "" + +#: includes/admin/class-wp-members-admin-api.php:255 +#: includes/admin/class-wp-members-admin-api.php:257 +msgid "Subject" +msgstr "Konu" + +#: includes/admin/class-wp-members-admin-api.php:258 +msgid "Body" +msgstr "Gövde" + +#: includes/admin/class-wp-members-admin-api.php:260 +msgid "Your custom email message content." +msgstr "" + +#: includes/admin/class-wp-members-admin-api.php:338 +msgid "Options" +msgstr "Seçenekler" + +#: includes/admin/class-wp-members-admin-api.php:339 +msgid "Fields" +msgstr "Bilgiler" + +#: includes/admin/class-wp-members-admin-api.php:340 +msgid "Dialogs" +msgstr "İletiler" + +#: includes/admin/class-wp-members-admin-api.php:341 +msgid "Emails" +msgstr "Epostalar" + +#: includes/admin/class-wp-members-admin-api.php:357 +msgid "New Registration" +msgstr "Yeni Kayıt" + +#: includes/admin/class-wp-members-admin-api.php:365 +#: includes/admin/class-wp-members-admin-api.php:383 +msgid "User email validated" +msgstr "" + +#: includes/admin/class-wp-members-admin-api.php:375 +msgid "Registration is Moderated" +msgstr "Kayıt Denetlendi" + +#: includes/admin/class-wp-members-admin-api.php:391 +msgid "Registration is Moderated, User is Approved" +msgstr "Kayıt Denetlendi, Kullanıcı Onaylandı" + +#: includes/admin/class-wp-members-admin-api.php:399 +msgid "Password Reset" +msgstr "Şifre Sıfırlama" + +#: includes/admin/class-wp-members-admin-api.php:406 +msgid "Retrieve Username" +msgstr "" + +#: includes/admin/class-wp-members-admin-api.php:414 +msgid "Admin Notification" +msgstr "Yönetici Bildirimi" + +#: includes/admin/class-wp-members-admin-api.php:440 +msgid "Restricted post (or page), displays above the login/registration form" +msgstr "Kısıtlı yazı (veya sayfa), giriş/kayıt formunun üstünde görüntülenir" + +#: includes/admin/class-wp-members-admin-api.php:441 +msgid "Username is taken" +msgstr "Kullanıcı Adı alınmış" + +#: includes/admin/class-wp-members-admin-api.php:442 +msgid "Email is registered" +msgstr "Eposta kayıtlıdır" + +#: includes/admin/class-wp-members-admin-api.php:443 +msgid "Registration completed" +msgstr "Kayıt tamamlandı" + +#: includes/admin/class-wp-members-admin-api.php:444 +msgid "User update" +msgstr "Kullanıcı güncelleme" + +#: includes/admin/class-wp-members-admin-api.php:445 +msgid "Passwords did not match" +msgstr "Şifreler eşleşmedi" + +#: includes/admin/class-wp-members-admin-api.php:446 +msgid "Password changes" +msgstr "Şifre değişiklikleri" + +#: includes/admin/class-wp-members-admin-api.php:447 +msgid "Username or email do not exist when trying to reset forgotten password" +msgstr "" +"Unutulan şifreyi sıfırlamayı denerken kullanıcı adı veya eposta mevcut değil" + +#: includes/admin/class-wp-members-admin-api.php:448 +msgid "Password reset" +msgstr "Şifre sıfırlama" + +#: includes/admin/class-wp-members-admin-api.php:547 +msgid "Close" +msgstr "" + +#: includes/admin/class-wp-members-admin-api.php:596 +msgid "Settings" +msgstr "Ayarlar" + +#: includes/admin/class-wp-members-admin-posts.php:30 +#: includes/admin/class-wp-members-admin-posts.php:33 +msgid "Unrestrict" +msgstr "" + +#: includes/admin/class-wp-members-admin-posts.php:31 +#: includes/admin/class-wp-members-admin-posts.php:34 +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:110 +msgid "Restrict" +msgstr "" + +#: includes/admin/class-wp-members-admin-posts.php:32 +#: includes/admin/class-wp-members-admin-posts.php:35 +msgid "Hide" +msgstr "" + +#: includes/admin/class-wp-members-admin-posts.php:125 +#, php-format +msgid "%s restricted" +msgstr "" + +#: includes/admin/class-wp-members-admin-posts.php:125 +#, php-format +msgid "%s unrestricted" +msgstr "" + +#: includes/admin/class-wp-members-admin-posts.php:165 +#, php-format +msgid "%s Restriction" +msgstr "" + +#: includes/admin/class-wp-members-admin-posts.php:195 +#: includes/admin/class-wp-members-admin-posts.php:342 +#: includes/admin/class-wp-members-admin-posts.php:345 +msgid "Unrestricted" +msgstr "" + +#: includes/admin/class-wp-members-admin-posts.php:196 +#: includes/admin/class-wp-members-admin-posts.php:339 +#: includes/admin/class-wp-members-admin-posts.php:347 +msgid "Restricted" +msgstr "" + +#: includes/admin/class-wp-members-admin-posts.php:197 +#: includes/admin/class-wp-members-admin-posts.php:349 +msgid "Hidden" +msgstr "" + +#: includes/admin/class-wp-members-admin-posts.php:203 +msgid "Status:" +msgstr "" + +#: includes/admin/class-wp-members-admin-posts.php:203 +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:68 +#: includes/admin/tabs/class-wp-members-fields-table.php:65 +#: includes/walkers/class-wp-members-walker-nav-menu.php:140 +#, fuzzy +msgid "Edit" +msgstr "Bilgi Alanını Düzenle" + +#: includes/admin/class-wp-members-admin-posts.php:218 +msgid "Ok" +msgstr "" + +#: includes/admin/class-wp-members-admin-posts.php:219 +#: includes/walkers/class-wp-members-walker-nav-menu.php:224 +msgid "Cancel" +msgstr "" + +#: includes/admin/class-wp-members-admin-posts.php:305 +msgid "Status" +msgstr "" + +#: includes/admin/class-wp-members-admin-users.php:28 +#: includes/admin/class-wp-members-admin-users.php:34 +#: includes/admin/class-wp-members-admin-users.php:79 +msgid "Activate" +msgstr "Etkinleştir" + +#: includes/admin/class-wp-members-admin-users.php:29 +#: includes/admin/class-wp-members-admin-users.php:35 +#: includes/admin/class-wp-members-admin-users.php:82 +msgid "Deactivate" +msgstr "" + +#: includes/admin/class-wp-members-admin-users.php:31 +#: includes/admin/class-wp-members-admin-users.php:37 +msgid "Export" +msgstr "Dışa aktar" + +#: includes/admin/class-wp-members-admin-users.php:32 +#: includes/admin/class-wp-members-admin-users.php:38 +#, fuzzy +msgid "Export All Users" +msgstr "Dışa aktar" + +#: includes/admin/class-wp-members-admin-users.php:61 +msgid "Confirm" +msgstr "" + +#: includes/admin/class-wp-members-admin-users.php:64 +msgid "Unconfirm" +msgstr "" + +#: includes/admin/class-wp-members-admin-users.php:147 +#, php-format +msgid "%s users activated" +msgstr "" + +#: includes/admin/class-wp-members-admin-users.php:147 +#, php-format +msgid "%s users deactivated" +msgstr "" + +#: includes/admin/class-wp-members-admin-users.php:150 +msgid "No users selected" +msgstr "" + +#: includes/admin/class-wp-members-admin-users.php:168 +msgid "You cannot activate or deactivate yourself" +msgstr "" + +#: includes/admin/class-wp-members-admin-users.php:173 +#, php-format +msgid "%s activated" +msgstr "" + +#: includes/admin/class-wp-members-admin-users.php:178 +#, php-format +msgid "%s deactivated" +msgstr "" + +#: includes/admin/class-wp-members-admin-users.php:182 +msgid "That user is already active" +msgstr "" + +#: includes/admin/class-wp-members-admin-users.php:198 +msgid "You cannot confirm or unconfirm yourself" +msgstr "" + +#: includes/admin/class-wp-members-admin-users.php:203 +#, php-format +msgid "%s confirmed" +msgstr "" + +#: includes/admin/class-wp-members-admin-users.php:208 +#, php-format +msgid "%s unconfirmed" +msgstr "" + +#: includes/admin/class-wp-members-admin-users.php:212 +msgid "That user is already confirmed" +msgstr "" + +#: includes/admin/class-wp-members-admin-users.php:341 +msgid "Pending" +msgstr "" + +#: includes/admin/class-wp-members-admin-users.php:342 +msgid "Trial" +msgstr "" + +#: includes/admin/class-wp-members-admin-users.php:343 +#: includes/admin/class-wp-members-user-export.php:289 +msgid "Subscription" +msgstr "Abonelik" + +#: includes/admin/class-wp-members-admin-users.php:344 +msgid "Expired" +msgstr "" + +#: includes/admin/class-wp-members-admin-users.php:347 +#: includes/admin/class-wp-members-admin-users.php:410 +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:457 +msgid "Activated" +msgstr "" + +#: includes/admin/class-wp-members-admin-users.php:348 +msgid "Pending Activation" +msgstr "" + +#: includes/admin/class-wp-members-admin-users.php:349 +msgid "Deactivated" +msgstr "" + +#: includes/admin/class-wp-members-admin-users.php:352 +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:456 +msgid "Confirmed" +msgstr "" + +#: includes/admin/class-wp-members-admin-users.php:353 +msgid "Not Confirmed" +msgstr "" + +#: includes/admin/class-wp-members-admin-users.php:355 +msgid "Not Exported" +msgstr "" + +#: includes/admin/class-wp-members-admin-users.php:475 +msgid "Not confirmed" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:67 +msgid "Slug" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:68 +#: includes/admin/class-wp-members-user-export.php:294 +msgid "Role" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:69 +#: includes/admin/class-wp-members-products-admin.php:740 +#: includes/admin/class-wp-members-user-export.php:290 +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:460 +msgid "Expires" +msgstr "Bitiş tarihi" + +#: includes/admin/class-wp-members-products-admin.php:71 +msgid "Default" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:73 +msgid "Last updated" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:97 +msgid "slug:" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:100 +msgid "No role required" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:105 +msgid "Does not expire" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:109 +#: includes/admin/class-wp-members-user-export.php:199 +msgid "Yes" +msgstr "Evet" + +#: includes/admin/class-wp-members-products-admin.php:145 +msgid "Membership Product Details" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:153 +msgid "Membership Product Message (optional)" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:169 +msgid "Access by child membership" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:185 +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:62 +msgid "Posts" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:186 +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:63 +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:249 +#, fuzzy +msgid "Pages" +msgstr "Varsayılan olarak Sayfaları Engelle" + +#: includes/admin/class-wp-members-products-admin.php:213 +#: includes/admin/class-wp-members-products-admin.php:262 +#: includes/admin/class-wp-members-products-admin.php:309 +msgid "Period" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:213 +msgid "Day" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:213 +msgid "Week" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:213 +msgid "Month" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:213 +msgid "Year" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:226 +msgid "Name (slug)" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:228 +msgid "Optional Defaults" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:231 +msgid "Assign as default at registration? (optional)" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:239 +#, php-format +msgid "Pre-selected by default for new %s" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:245 +msgid "Optional Properties" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:248 +msgid "Role Required? (optional)" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:251 +msgid "No Role" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:257 +msgid "Expires (optional)" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:259 +#: includes/admin/class-wp-members-products-admin.php:261 +#: includes/admin/class-wp-members-products-admin.php:306 +#: includes/admin/class-wp-members-products-admin.php:308 +msgid "Number" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:267 +msgid "Use \"no gap\" renewal" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:271 +msgid "Use a fixed period (such as Jan 1 - Dec 31, or Sept 1 - Aug 31)" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:288 +#: includes/admin/class-wp-members-products-admin.php:289 +msgid "Period Start (dd-mm)" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:290 +#: includes/admin/class-wp-members-products-admin.php:291 +msgid "Period End (dd-mm)" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:304 +msgid "Fixed period grace period" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:313 +msgid "" +"Grace period is the point at which expiration date is for following time " +"period. For example, if user who register August 1st would be part of the " +"following year's Sept 1 - Aug 31 membership, set this at 1 Month. Leave " +"blank for no grace period." +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:376 +msgid "" +"Restricted Message (displays when a user does not have access to a " +"membership)" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:502 +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:239 +#: includes/class-wp-members-forms.php:1196 +#: includes/class-wp-members-user-profile.php:132 +msgid "None" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:517 +msgid "Restrict access by membership:" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:598 +msgid "Required Membership" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:644 +#: includes/admin/class-wp-members-products-admin.php:745 +#: includes/class-wp-members-products.php:335 +msgid "Membership" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:680 +msgid "expires:" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:709 +#: includes/class-wp-members-products.php:336 +#: includes/class-wp-members-products.php:341 +msgid "Memberships" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:736 +msgid "Membership Access" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:744 +msgid "Action" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:746 +msgid "Enabled?" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:757 +msgid "Enable" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:758 +msgid "Disable" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:759 +msgid "Update" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:764 +msgid "Expiration date (optional)" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:795 +#, php-format +msgid "No memberships have been created. %sCreate new memberships here%s" +msgstr "" + +#: includes/admin/class-wp-members-user-export.php:199 +msgid "No" +msgstr "Hayır" + +#: includes/admin/class-wp-members-user-export.php:264 +msgid "You do not have the required user capabilities to export users." +msgstr "" + +#: includes/admin/class-wp-members-user-export.php:277 +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:461 +msgid "User ID" +msgstr "" + +#: includes/admin/class-wp-members-user-export.php:284 +#: includes/class-wp-members-dialogs.php:91 +#: includes/class-wp-members-dialogs.php:114 +msgid "Username" +msgstr "Kullanıcı Adı" + +#: includes/admin/class-wp-members-user-export.php:286 +msgid "Activated?" +msgstr "Aktif edildi mi?" + +#: includes/admin/class-wp-members-user-export.php:292 +msgid "Registered" +msgstr "Kayıtlı" + +#: includes/admin/class-wp-members-user-export.php:293 +msgid "IP" +msgstr "IP" + +#: includes/admin/dialogs.php:117 +msgid "" +"Your WP settings allow anyone to register - this is not the recommended " +"setting." +msgstr "" +"WP ayarlarınız herkese kayıt için izin veriyor - bu önerilen bir ayar değil." + +#: includes/admin/dialogs.php:118 +#, php-format +msgid "" +"You can %s change this here %s making sure the box next to \"Anyone can " +"register\" is unchecked." +msgstr "" +"\"İsteyen herkes kayıt olabilsin\" yanındaki kutunun işaretli olmadığından " +"emin olarak %s buradan değiştirebilirsiniz %s ." + +#: includes/admin/dialogs.php:119 +msgid "" +"This setting allows a link on the /wp-login.php page to register using the " +"WP native registration process thus circumventing any registration you are " +"using with WP-Members. In some cases, this may suit the users wants/needs, " +"but most users should uncheck this option. If you do not change this " +"setting, you can choose to ignore these warning messages under WP-Members " +"Settings." +msgstr "" +"Bu ayar /wp-login.php sayfasından bir bağlantı ile WP yerel kayıt işlemini " +"kullanarak kayıt olmayı sağlar, böylece WP-Members ile kullandığınız " +"herhangi bir kayıt işlemini atlar. Bazı durumlarda, bu, kullanıcıların " +"isteklerine/gereksinimlerine uygun olabilir fakat çoğu kullanıcının bu " +"seçeneğin işaretini kaldırması gerekir. Eğer bu ayarı değiştirmezseniz, WP-" +"Members Ayarları altındaki bu uyarı mesajlarını yok saymayı seçebilirsiniz." + +#: includes/admin/dialogs.php:123 +msgid "" +"Your WP settings allow anyone to comment - this is not the recommended " +"setting." +msgstr "" +"WP ayarlarınız herkesin yorum yapmasına izin veriyor - bu önerilen bir ayar " +"değil." + +#: includes/admin/dialogs.php:124 +#, php-format +msgid "" +"You can %s change this here %s by checking the box next to \"Users must be " +"registered and logged in to comment.\"" +msgstr "" +"\"Kullanıcılar yorum yapmak için kayıt olmalı ve giriş yapmalılar.\" " +"yanındaki kutuyu işaretleyerek %s buradan değiştirebilirsiniz %s ." + +#: includes/admin/dialogs.php:125 +msgid "" +"This setting allows any users to comment, whether or not they are " +"registered. Depending on how you are using WP-Members will determine whether " +"you should change this setting or not. If you do not change this setting, " +"you can choose to ignore these warning messages under WP-Members Settings." +msgstr "" +"Bu ayar, kayıtlı olsun veya olmasın, herhangi bir kullanıcının yorum " +"yapmasına izin verir. Bu ayarı değiştirmeniz veya değiştirmemeniz, WP-" +"Members eklentisini nasıl kullandığınıza bağlı olacaktır. Eğer bu ayarı " +"değiştirmezseniz, WP-Members Ayarları altındaki bu uyarı mesajlarını yok " +"saymayı seçebilirsiniz." + +#: includes/admin/dialogs.php:129 +msgid "" +"Your WP settings allow full text rss feeds - this is not the recommended " +"setting." +msgstr "" +"WP ayarlarınız tam yazı rss beslemelerine izin veriyor - bu önerilen bir " +"ayar değil." + +#: includes/admin/dialogs.php:130 +#, php-format +msgid "" +"You can %s change this here %s by changing \"For each article in a feed, show" +"\" to \"Summary.\"" +msgstr "" +"\"Her yazı için, göster\" seçeneğini \"Özet\" olarak %s buradan " +"değiştirebilirsiniz %s ." + +#: includes/admin/dialogs.php:131 +msgid "" +"Leaving this set to full text allows anyone to read your protected content " +"in an RSS reader. Changing this to Summary prevents this as your feeds will " +"only show summary text." +msgstr "" +"Bu ayarı tam yazı olarak bırakmak, herkesin bir RSS okuyucusunda korumalı " +"içeriğinizi okumasına olanak verir. Bunun Özet olarak değiştirilmesi, " +"beslemelerinizi yalnızca özet metin olarak göstererek sınırlar." + +#: includes/admin/dialogs.php:135 +msgid "You have set WP-Members to hold registrations for approval" +msgstr "WP-Members eklentisini kayıtların onaydan geçmesi için ayarladınız" + +#: includes/admin/dialogs.php:136 +msgid "" +"but you have not changed the default message for \"Registration Completed\" " +"under \"WP-Members Dialogs and Error Messages.\" You should change this " +"message to let users know they are pending approval." +msgstr "" +"fakat \"Kayıt Tamamlandı\" için varsayılan mesajı \"WP-Members İletiler ve " +"Hata Mesajları.\" altında değişmediniz. Kullanıcıların onay beklediklerini " +"bilmeleri için bu mesajı değiştirmelisiniz." + +#: includes/admin/dialogs.php:140 +msgid "You have turned on reCAPTCHA" +msgstr "reCAPTCHA özelliğini açtınız" + +#: includes/admin/dialogs.php:141 +msgid "" +"but you have not entered API keys. You will need both a public and private " +"key. The CAPTCHA will not display unless a valid API key is included." +msgstr "" +"fakat API anahtarlarını girmediniz. Public ve private anahtarlarına " +"ihtiyacınız olacak. Geçerli bir API anahtarı yer almadığı sürece CAPTCHA " +"göstermeyecektir." + +#: includes/admin/dialogs.php:145 +msgid "You have active settings that are not recommended." +msgstr "" + +#: includes/admin/dialogs.php:146 +msgid "" +"If you will not be changing these settings, you can turn off these warning " +"messages by checking the \"Ignore warning messages\" in the settings below." +msgstr "" + +#: includes/admin/dialogs.php:174 +msgid "Version:" +msgstr "Sürüm:" + +#: includes/admin/dialogs.php:175 +msgid "Quick Start Guide" +msgstr "Hızlı Başlangıç Kılavuzu" + +#: includes/admin/dialogs.php:176 +msgid "Online User Guide" +msgstr "Çevrimiçi Kullanıcı Kılavuzu" + +#: includes/admin/dialogs.php:177 +msgid "FAQs" +msgstr "SSS" + +#: includes/admin/dialogs.php:184 +msgid "Thank you for using WP-Members" +msgstr "WP-Members kullandığınız için teşekkürler" + +#: includes/admin/dialogs.php:185 +msgid "A plugin developed by" +msgstr "Eklenti geliştiricisi" + +#: includes/admin/dialogs.php:186 +msgid "Follow" +msgstr "Takip et" + +#: includes/admin/dialogs.php:203 includes/admin/dialogs.php:207 +msgid "Latest from RocketGeek" +msgstr "" + +#: includes/admin/dialogs.php:224 +msgid "Like WP-Members?" +msgstr "" + +#: includes/admin/dialogs.php:225 +#, php-format +msgid "" +"If you like WP-Members please give it a %s★★★★★" +"%s rating. Thanks!!" +msgstr "" + +#: includes/admin/dialogs.php:236 includes/admin/dialogs.php:249 +msgid "Latest from ButlerBlog" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:67 +#, php-format +msgid "See the %sUsers Guide on CAPTCHA%s." +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:74 +#: includes/admin/tabs/class-wp-members-admin-tab-dialogs.php:57 +#: includes/admin/tabs/class-wp-members-admin-tab-emails.php:109 +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:134 +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:78 +msgid "Need help?" +msgstr "Yardım mı lazım?" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:85 +msgid "Manage CAPTCHA Options" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:91 +msgid "CAPTCHA Type" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:96 +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:243 +msgid "reCAPTCHA v2" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:97 +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:244 +msgid "reCAPTCHA v3" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:98 +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:245 +msgid "Really Simple CAPTCHA" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:99 +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:246 +msgid "hCaptcha" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:106 +msgid "" +"CAPTCHA type was changed. Please verify and update the settings below for " +"the new CAPTCHA type." +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:117 +msgid "reCAPTCHA Keys" +msgstr "reCAPTCHA Anahtarları" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:120 +#, php-format +msgid "" +"reCAPTCHA requires an API key, consisting of a \"site\" and a \"secret\" " +"key. You can sign up for a %s free reCAPTCHA key%s" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:122 +msgid "Site Key" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:123 +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:139 +msgid "Secret Key" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:133 +msgid "hCaptcha Keys" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:136 +#, php-format +msgid "" +"hCaptcha requires an API key. You can sign up for %s an hCaptcha API key " +"here %s" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:138 +msgid "API Key" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:170 +msgid "Characters for image" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:174 +#, fuzzy +msgid "Number of characters" +msgstr "Alıntıdaki kelime sayısı:" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:178 +msgid "Image dimensions" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:179 +msgid "Width" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:179 +msgid "Height" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:182 +msgid "Font color of characters" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:186 +msgid "Background color of image" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:190 +msgid "Font size" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:194 +msgid "Width between characters" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:198 +#, fuzzy +msgid "Image type" +msgstr "Bilgi Alanı Türü" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:213 +msgid "" +"To use Really Simple CAPTCHA, you must have the Really Simple CAPTCHA plugin " +"installed and activated." +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:241 +#, fuzzy +msgid "Update CAPTCHA Settings" +msgstr "Ayarları Güncelle" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:319 +#, fuzzy +msgid "CAPTCHA was updated for WP-Members" +msgstr "reCAPTCHA WP-Members için güncellendi" + +#: includes/admin/tabs/class-wp-members-admin-tab-dialogs.php:67 +msgid "Dialogs and Error Messages" +msgstr "İletiler ve Hata Mesajları" + +#: includes/admin/tabs/class-wp-members-admin-tab-dialogs.php:69 +#, php-format +msgid "" +"You can customize the text for dialogs and error messages. Simple HTML is " +"allowed %s etc." +msgstr "" +"İletiler ve hata mesajları için metni kişiselleştirebilirsiniz. Basit HTML " +"için izin verilir %s vb." + +#: includes/admin/tabs/class-wp-members-admin-tab-dialogs.php:80 +msgid "Terms of Service (TOS)" +msgstr "Hizmet Koşulları (HK)" + +#: includes/admin/tabs/class-wp-members-admin-tab-dialogs.php:87 +msgid "Update Dialogs" +msgstr "İletileri Güncelle" + +#: includes/admin/tabs/class-wp-members-admin-tab-dialogs.php:124 +msgid "WP-Members dialogs were updated" +msgstr "WP-Members iletileri güncellendi" + +#: includes/admin/tabs/class-wp-members-admin-tab-dropins.php:88 +#: includes/admin/tabs/class-wp-members-dropins-table.php:180 +msgid "WP-Members Dropin settings were updated" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-dropins.php:216 +msgid "Manage Dropins" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-dropins.php:217 +msgid "Current dropin folder: " +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-dropins.php:218 +msgid "" +"You can change location of the dropin folder using the " +"wpmem_dropin_folder filter." +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-emails.php:57 +msgid "Email Messages" +msgstr "Eposta Mesajları" + +#: includes/admin/tabs/class-wp-members-admin-tab-emails.php:60 +msgid "You can customize the content of the emails sent by the plugin." +msgstr "" +"Eklenti tarafından gönderilen epostaların içeriğini kişiselleştirebilirsiniz." + +#: includes/admin/tabs/class-wp-members-admin-tab-emails.php:62 +msgid "A list of shortcodes is available here." +msgstr "Kısa kodların listesi burada mevcuttur." + +#: includes/admin/tabs/class-wp-members-admin-tab-emails.php:69 +msgid "Set a custom email address" +msgstr "Kişisel bir eposta adresi ayarla" + +#: includes/admin/tabs/class-wp-members-admin-tab-emails.php:70 +#: includes/admin/tabs/class-wp-members-admin-tab-emails.php:74 +#: includes/admin/tabs/class-wp-members-admin-tab-emails.php:93 +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:163 +msgid "(optional)" +msgstr "(isteğe bağlı)" + +#: includes/admin/tabs/class-wp-members-admin-tab-emails.php:73 +msgid "Set a custom email name" +msgstr "Kişisel bir eposta adı ayarla" + +#: includes/admin/tabs/class-wp-members-admin-tab-emails.php:77 +msgid "Send HTML email" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-emails.php:93 +msgid "Email Signature" +msgstr "Eposta İmzası" + +#: includes/admin/tabs/class-wp-members-admin-tab-emails.php:101 +msgid "Update Emails" +msgstr "Epostaları Güncelle" + +#: includes/admin/tabs/class-wp-members-admin-tab-emails.php:172 +msgid "WP-Members emails were updated" +msgstr "WP-Members epostaları güncellendi" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:93 +#: includes/class-wp-members-dialogs.php:65 +msgid "No fields selected for deletion" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:95 +msgid "Are you sure you want to delete the following fields?" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:122 +msgid "Fields deleted" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:136 +msgid "Field Manager Documentation" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:164 +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:315 +#: includes/class-wp-members-forms.php:1629 +#: includes/class-wp-members-forms.php:1821 +#: includes/class-wp-members-user-profile.php:181 +msgid "(required)" +msgstr "Gerekli?" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:169 +msgid "Edit Field" +msgstr "Bilgi Alanını Düzenle" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:169 +msgid "Add a Field" +msgstr "Bir Bilgi Alanı Ekle" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:174 +msgid "Field Label" +msgstr "Bilgi Alanı Etiketi" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:176 +msgid "The name of the field as it will be displayed to the user." +msgstr "Kullanıcıya gösterilecek bilgi alanı adı." + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:179 +#: includes/admin/tabs/class-wp-members-fields-table.php:58 +msgid "Meta Key" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:185 +msgid "" +"The database meta value for the field. It must be unique and contain no " +"spaces (underscores are ok)." +msgstr "" +"Bilgi alanı için veritabanı meta değeri. Bu benzersiz olmalı ve boşluk " +"içermemelidir (alt çizgiler olabilir)." + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:189 +#: includes/admin/tabs/class-wp-members-fields-table.php:59 +msgid "Field Type" +msgstr "Bilgi Alanı Türü" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:195 +msgid "text" +msgstr "metin" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:196 +msgid "email" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:197 +msgid "textarea" +msgstr "metin alanı" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:198 +msgid "checkbox" +msgstr "onay kutusu" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:199 +msgid "multiple checkbox" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:200 +msgid "select (dropdown)" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:201 +msgid "multiple select" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:202 +msgid "radio group" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:203 +msgid "password" +msgstr "şifre" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:204 +msgid "image" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:205 +msgid "file" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:206 +msgid "url" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:207 +msgid "number" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:208 +msgid "date" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:209 +msgid "hidden" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:211 +msgid "membership" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:217 +#: includes/admin/tabs/class-wp-members-fields-table.php:60 +msgid "Display?" +msgstr "Görüntülensin?" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:221 +msgid "This field is always displayed" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:226 +msgid "Required?" +msgstr "Gerekli?" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:230 +msgid "This field is always required" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:236 +msgid "Allow HTML?" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:243 +msgid "Placeholder" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:251 +msgid "Pattern" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:259 +msgid "Title" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:268 +msgid "Minimum Value" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:272 +msgid "Maximum Value" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:280 +msgid "Rows" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:284 +msgid "Columns" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:292 +msgid "Accepted file types:" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:297 +msgid "Accepted file types should be set like this: jpg|jpeg|png|gif" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:304 +msgid "Checked by default?" +msgstr "Varsayılan olarak İşaretli?" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:308 +msgid "HTML label position" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:310 +msgid "Before the input tag" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:311 +msgid "After the input tag" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:312 +msgid "" +"Selecting \"after\" will generally display the label to the right of the " +"checkbox" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:315 +msgid "Stored value if checked:" +msgstr "İşaretlendiğinde depolanan değer:" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:336 +msgid "Stored values delimiter:" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:345 +msgid "Values (Displayed|Stored):" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:370 +msgid "Options should be Option Name|option_value," +msgstr "Seçenekler Seçenek Adı|seçenek_değeri şeklinde olmalıdır," + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:374 +msgid "Visit plugin site for more information" +msgstr "Daha fazla bilgi için eklenti sitesini ziyaret edin" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:381 +msgid "Value" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:400 +msgid "Save Changes" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:400 +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:527 +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:528 +msgid "Add Field" +msgstr "Alan ekle" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:402 +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:726 +msgid "Return to Fields Table" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:449 +msgid "Drag and drop to reorder fields" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:455 +#, fuzzy +msgid "Registration Date" +msgstr "Kayıt tamamlandı" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:458 +msgid "Registration IP" +msgstr "IP @ kaydı" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:459 +msgid "Subscription Type" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:495 +msgid "Manage Fields" +msgstr "Alanları Yönet" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:595 +msgid "WP-Members fields were updated" +msgstr "WP-Members bilgi alanları güncellendi" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:617 +msgid "Field Label is required. Nothing was updated." +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:618 +msgid "Meta Key is required. Nothing was updated." +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:620 +msgid "Meta Key must contain only letters, numbers, and underscores" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:627 +msgid "A field with that meta key already exists" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:632 +#, php-format +msgid "" +"Sorry, \"%s\" is a reserved term. " +"Field was not added." +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:673 +msgid "Checked value is required for checkboxes. Nothing was updated." +msgstr "" +"İşaretli seçim değeri onay kutularını gerektirir. Hiçbir şey güncellenmedi." + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:705 +msgid "A value is required for hidden fields. Nothing was updated." +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:712 +#, php-format +msgid "%s was added" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:725 +#, php-format +msgid "%s was updated" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:768 +msgid "Form field order updated." +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:56 +#, php-format +msgid "%sChange%s or %sFilter%s this address" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:57 +#, php-format +msgid "See the %sUsers Guide on plugin options%s." +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:90 +msgid "Manage Options" +msgstr "Seçenekler Yönet" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:94 +msgid "Content" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:105 +msgid "Content Restriction" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:109 +msgid "Do not restrict" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:123 +msgid "Show Excerpts" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:124 +msgid "Show Login Form" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:125 +msgid "Show Registration Form" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:126 +msgid "Auto Excerpt:" +msgstr "Otomatik Alıntı:" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:148 +msgid "Number of words in excerpt:" +msgstr "Alıntıdaki kelime sayısı:" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:149 +msgid "Custom read more link (optional):" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:163 +msgid "Time-based expiration" +msgstr "Zaman-tabanlı sona erme" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:163 +msgid "Allows for access to expire" +msgstr "Erişim süresinin dolmasına izin verir" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:164 +msgid "Trial period" +msgstr "Deneme süresi" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:164 +msgid "Allows for a trial period" +msgstr "Bir deneme süresi için izin verir" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:166 +msgid "Subscription Settings" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:176 +msgid "New Feature Settings" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:182 +msgid "Legacy Password Reset" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:182 +#, php-format +msgid "Use legacy password reset. %s(Requires additional configuration)%s" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:184 +msgid "Legacy Login Error" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:184 +msgid "Use legacy WP-Members login error instead of WP error object." +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:187 +msgid "WooCommerce My Account" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:187 +msgid "Add WP-Members fields to WooCommerce My Account registration" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:188 +msgid "WooCommerce Checkout" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:188 +msgid "Add WP-Members fields to WooCommerce registration during checkout" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:204 +msgid "Other Settings" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:214 +msgid "Enable memberships" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:214 +#, php-format +msgid "Enables creation of different %s membership products %s" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:215 +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:223 +msgid "Clone menus" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:215 +msgid "Enables logged in menus" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:216 +msgid "Notify admin" +msgstr "Yöneticiye bildir" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:216 +#, fuzzy, php-format +msgid "Notify %s for each new registration? %s" +msgstr "Her yeni kayıt için yöneticiye eposta gönderilsin mi?" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:217 +msgid "Moderate registration" +msgstr "Kaydı Denetle" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:217 +msgid "Holds new registrations for admin approval" +msgstr "Yeni kayıtları yönetici onayı için bekletir" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:218 +msgid "Confirmation Link" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:218 +#, php-format +msgid "" +"Send email confirmation link on new registration. %s(Requires additional " +"configuration)%s" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:219 +msgid "Ignore warning messages" +msgstr "Uyarı mesajlarını yoksay" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:219 +msgid "Ignores WP-Members warning messages in the admin panel" +msgstr "Yönetici panelinde WP-Members uyarı mesajlarını yoksayar" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:233 +msgid "Attribution" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:235 +msgid "" +"Attribution is appreciated! Display \"powered by\" link on register form?" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:238 +msgid "Enable CAPTCHA for Registration" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:253 +msgid "Login Page:" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:256 +msgid "Specify a login page (optional)" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:265 +#, fuzzy +msgid "Register Page:" +msgstr "Kayıt Sayfa URL:" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:268 +msgid "For creating a register link in the login form" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:277 +#, fuzzy +msgid "User Profile Page:" +msgstr "Kullanıcı güncelleme" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:280 +msgid "For creating a forgot password link in the login form" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:286 +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:288 +#, fuzzy +msgid "Stylesheet" +msgstr "Stil Sayfası" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:297 +msgid "Custom Stylesheet:" +msgstr "Kişisel Stil Sayfası:" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:302 +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:329 +msgid "Update Settings" +msgstr "Ayarları Güncelle" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:310 +msgid "Custom Post Types" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:316 +msgid "Add to WP-Members Settings" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:332 +msgid "" +"Please keep in mind that Custom Post Types are \"custom\" and therefore, not " +"all of them will function exactly the same way. WP-Members will certainly " +"work with any post type that operate like a post or a page; but you will " +"need to review any custom post type added to determine that it functions the " +"way you expect." +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:342 +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:343 +msgid "WP-Members Settings" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:344 +msgid "" +"The following is your WP-Members settings information if needed for support." +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:378 +msgid "Click to Copy" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:458 +msgid "Custom Post Type settings were updated" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:579 +msgid "WP-Members settings were updated" +msgstr "WP-Members ayarları güncellendi" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:651 +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:682 +#, fuzzy +msgid "USE CUSTOM URL BELOW" +msgstr "Bir stil sayfası seçin veya aşağıda kişisel bir stil sayfası belirtin" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:671 +msgid "Select a page" +msgstr "" + +#: includes/admin/tabs/class-wp-members-dropins-table.php:70 +msgid "Name" +msgstr "" + +#: includes/admin/tabs/class-wp-members-dropins-table.php:71 +msgid "Enabled" +msgstr "" + +#: includes/admin/tabs/class-wp-members-dropins-table.php:72 +msgid "File" +msgstr "" + +#: includes/admin/tabs/class-wp-members-dropins-table.php:73 +msgid "Version" +msgstr "" + +#: includes/admin/tabs/class-wp-members-dropins-table.php:74 +#: includes/walkers/class-wp-members-walker-nav-menu.php:186 +msgid "Description" +msgstr "" + +#: includes/admin/tabs/class-wp-members-dropins-table.php:117 +#: includes/admin/tabs/class-wp-members-fields-table.php:108 +msgid "Save Settings" +msgstr "" + +#: includes/admin/tabs/class-wp-members-fields-table.php:43 +msgid "delete" +msgstr "" + +#: includes/admin/tabs/class-wp-members-fields-table.php:57 +msgid "Display Label" +msgstr "" + +#: includes/admin/tabs/class-wp-members-fields-table.php:61 +msgid "Required" +msgstr "" + +#: includes/admin/tabs/class-wp-members-fields-table.php:63 +#, fuzzy +msgid "Users Screen" +msgstr "Dışa aktar" + +#: includes/admin/tabs/class-wp-members-fields-table.php:64 +msgid "Users Search" +msgstr "" + +#: includes/admin/tabs/class-wp-members-fields-table.php:66 +msgid "Sort" +msgstr "" + +#: includes/admin/tabs/class-wp-members-fields-table.php:107 +msgid "Delete Selected" +msgstr "" + +#: includes/api/api-forms.php:584 +#, php-format +msgid "%s is a required field." +msgstr "" + +#: includes/class-wp-members-captcha.php:276 includes/deprecated.php:401 +msgid "You have entered an incorrect code value. Please try again." +msgstr "" + +#: includes/class-wp-members-dialogs.php:41 +msgid "First Name" +msgstr "Ad" + +#: includes/class-wp-members-dialogs.php:42 +msgid "Last Name" +msgstr "Soyad" + +#: includes/class-wp-members-dialogs.php:43 +msgid "Address 1" +msgstr "Adres 1" + +#: includes/class-wp-members-dialogs.php:44 +msgid "Address 2" +msgstr "Adres 2" + +#: includes/class-wp-members-dialogs.php:45 +msgid "City" +msgstr "Şehir" + +#: includes/class-wp-members-dialogs.php:46 +msgid "State" +msgstr "Eyalet" + +#: includes/class-wp-members-dialogs.php:47 +msgid "Zip" +msgstr "Posta Kodu" + +#: includes/class-wp-members-dialogs.php:48 +msgid "Country" +msgstr "Ülke" + +#: includes/class-wp-members-dialogs.php:49 +msgid "Day Phone" +msgstr "Telefon" + +#: includes/class-wp-members-dialogs.php:50 +#: includes/class-wp-members-dialogs.php:92 +msgid "Email" +msgstr "Eposta" + +#: includes/class-wp-members-dialogs.php:51 +msgid "Confirm Email" +msgstr "" + +#: includes/class-wp-members-dialogs.php:52 +msgid "Website" +msgstr "Web site" + +#: includes/class-wp-members-dialogs.php:53 +msgid "Biographical Info" +msgstr "Biyografik Bilgi" + +#: includes/class-wp-members-dialogs.php:54 +#: includes/class-wp-members-dialogs.php:74 +#: includes/class-wp-members-dialogs.php:159 +msgid "Password" +msgstr "Şifre" + +#: includes/class-wp-members-dialogs.php:55 +msgid "Confirm Password" +msgstr "" + +#: includes/class-wp-members-dialogs.php:56 +#: includes/class-wp-members-forms.php:2165 +msgid "TOS" +msgstr "HK" + +#: includes/class-wp-members-dialogs.php:66 +#, fuzzy +msgid "You are not logged in." +msgstr "%s olarak oturum açtınız" + +#: includes/class-wp-members-dialogs.php:72 +#, fuzzy +msgid "Existing Users Log In" +msgstr "Giriş" + +#: includes/class-wp-members-dialogs.php:73 +#: includes/class-wp-members-dialogs.php:158 +msgid "Username or Email" +msgstr "" + +#: includes/class-wp-members-dialogs.php:75 +#: includes/class-wp-members-shortcodes.php:773 +msgid "Log In" +msgstr "Giriş" + +#: includes/class-wp-members-dialogs.php:76 +msgid "Remember Me" +msgstr "" + +#: includes/class-wp-members-dialogs.php:77 +msgid "Forgot password?" +msgstr "Şifreni mi unuttun?" + +#: includes/class-wp-members-dialogs.php:78 +msgid "Click here to reset" +msgstr "Sıfırlamak için buraya tıkla" + +#: includes/class-wp-members-dialogs.php:79 +msgid "New User?" +msgstr "Yeni Kullanıcı?" + +#: includes/class-wp-members-dialogs.php:80 +msgid "Click here to register" +msgstr "Kayıt olmak için tıklayın" + +#: includes/class-wp-members-dialogs.php:83 +#: includes/class-wp-members-dialogs.php:142 +msgid "Change Password" +msgstr "Şifreyi Değiştir" + +#: includes/class-wp-members-dialogs.php:84 +msgid "New password" +msgstr "" + +#: includes/class-wp-members-dialogs.php:85 +msgid "Confirm new password" +msgstr "" + +#: includes/class-wp-members-dialogs.php:86 +msgid "Update Password" +msgstr "Şifreyi Güncelle" + +#: includes/class-wp-members-dialogs.php:87 +msgid "Password successfully changed!" +msgstr "" + +#: includes/class-wp-members-dialogs.php:90 +msgid "Reset Forgotten Password" +msgstr "Unutulan Şifreyi Sıfırla" + +#: includes/class-wp-members-dialogs.php:93 +msgid "Reset Password" +msgstr "Şifreyi Sıfırla" + +#: includes/class-wp-members-dialogs.php:94 +msgid "Forgot username?" +msgstr "" + +#: includes/class-wp-members-dialogs.php:95 +msgid "Click here" +msgstr "" + +#: includes/class-wp-members-dialogs.php:98 +#: includes/class-wp-members-dialogs.php:100 +msgid "Retrieve username" +msgstr "" + +#: includes/class-wp-members-dialogs.php:99 +msgid "Email Address" +msgstr "" + +#: includes/class-wp-members-dialogs.php:103 +#, fuzzy +msgid "New User Registration" +msgstr "Yeni Kullanıcı?" + +#: includes/class-wp-members-dialogs.php:104 +msgid "Choose a Username" +msgstr "Bir Kullanıcı Adı Seçin" + +#: includes/class-wp-members-dialogs.php:105 +msgid "Input the code:" +msgstr "" + +#: includes/class-wp-members-dialogs.php:106 +#: includes/class-wp-members-forms.php:2164 +#, php-format +msgid "Please indicate that you agree to the %s Terms of Service %s" +msgstr "" + +#: includes/class-wp-members-dialogs.php:107 +#, fuzzy +msgid "Reset Form" +msgstr "CAPTCHA formu ile ilgili bir hata oluştu." + +#: includes/class-wp-members-dialogs.php:108 +#: includes/class-wp-members-dialogs.php:162 +#: includes/class-wp-members-shortcodes.php:770 +#: includes/class-wp-members-user.php:186 +msgid "Register" +msgstr "Kaydol" + +#: includes/class-wp-members-dialogs.php:110 +msgid "Required field" +msgstr "Gerekli alan" + +#: includes/class-wp-members-dialogs.php:113 +msgid "Edit Your Information" +msgstr "Bilgilerini Düzenle" + +#: includes/class-wp-members-dialogs.php:115 +#, fuzzy +msgid "Update Profile" +msgstr "Kullanıcı güncelleme" + +#: includes/class-wp-members-dialogs.php:116 +msgid "Update this file" +msgstr "" + +#: includes/class-wp-members-dialogs.php:119 +msgid "Login Failed!" +msgstr "Giriş Başarısız!" + +#: includes/class-wp-members-dialogs.php:120 +msgid "You entered an invalid username or password." +msgstr "Geçersiz bir kullanıcı adı veya şifre girdiniz." + +#: includes/class-wp-members-dialogs.php:121 +msgid "Click here to continue." +msgstr "Devam etmek için tıklayın." + +#: includes/class-wp-members-dialogs.php:122 +msgid "Password fields cannot be empty" +msgstr "Şifre alanları boş bırakılamaz" + +#: includes/class-wp-members-dialogs.php:123 +msgid "Sorry, that email address was not found." +msgstr "" + +#: includes/class-wp-members-dialogs.php:124 +#, php-format +msgid "An email was sent to %s with your username." +msgstr "" + +#: includes/class-wp-members-dialogs.php:125 +#, php-format +msgid "Sorry, %s is a required field." +msgstr "Üzgünüz, %s gerekli bir alandır." + +#: includes/class-wp-members-dialogs.php:126 +msgid "You must enter a valid email address." +msgstr "Geçerli bir eposta adresi girmelisiniz." + +#: includes/class-wp-members-dialogs.php:127 +msgid "The username cannot include non-alphanumeric characters." +msgstr "Kullanıcı adı alfasayısal olmayan karakterler içeremez." + +#: includes/class-wp-members-dialogs.php:128 +msgid "Sorry, username is a required field" +msgstr "Üzgünüz, kullanıcı adı gerekli bir alandır" + +#: includes/class-wp-members-dialogs.php:129 +msgid "Sorry, that username is taken, Please try another." +msgstr "" + +#: includes/class-wp-members-dialogs.php:130 +msgid "Sorry, that email address already has an account. Please try another." +msgstr "" + +#: includes/class-wp-members-dialogs.php:131 +#: includes/class-wp-members-dialogs.php:174 +#, fuzzy +msgid "Passwords did not match." +msgstr "Şifreler eşleşmedi" + +#: includes/class-wp-members-dialogs.php:132 +#, fuzzy +msgid "Emails did not match." +msgstr "Şifreler eşleşmedi" + +#: includes/class-wp-members-dialogs.php:133 +msgid "You must complete the CAPTCHA form." +msgstr "CAPTCHA formunu doldurmalısınız." + +#: includes/class-wp-members-dialogs.php:134 +msgid "CAPTCHA was not valid." +msgstr "" + +#: includes/class-wp-members-dialogs.php:135 +#, fuzzy +msgid "There was an error processing the form." +msgstr "CAPTCHA formu ile ilgili bir hata oluştu." + +#: includes/class-wp-members-dialogs.php:136 +msgid "There was an error with the CAPTCHA form." +msgstr "CAPTCHA formu ile ilgili bir hata oluştu." + +#: includes/class-wp-members-dialogs.php:137 +#, php-format +msgid "" +"Sorry, you can only upload the following file types for the %s field: %s." +msgstr "" + +#: includes/class-wp-members-dialogs.php:138 +#: includes/class-wp-members-dialogs.php:171 +msgid "Your information was updated!" +msgstr "Bilgileriniz güncellendi!" + +#: includes/class-wp-members-dialogs.php:141 +msgid "Edit My Information" +msgstr "Bilgilerimi Düzenle" + +#: includes/class-wp-members-dialogs.php:143 +#: includes/class-wp-members-dialogs.php:146 +#: includes/class-wp-members-dialogs.php:148 +#: includes/class-wp-members-dialogs.php:153 +#, php-format +msgid "You are logged in as %s" +msgstr "%s olarak oturum açtınız" + +#: includes/class-wp-members-dialogs.php:144 +msgid "Log out" +msgstr "" + +#: includes/class-wp-members-dialogs.php:145 +msgid "Edit profile" +msgstr "" + +#: includes/class-wp-members-dialogs.php:145 +msgid "Begin using the site." +msgstr "Siteyi kullanmaya başlayın." + +#: includes/class-wp-members-dialogs.php:147 +#, fuzzy +msgid "Click to log out" +msgstr "Giriş" + +#: includes/class-wp-members-dialogs.php:149 +#, fuzzy +msgid "click to log out" +msgstr "Giriş" + +#: includes/class-wp-members-dialogs.php:150 +msgid "Log Out" +msgstr "" + +#: includes/class-wp-members-dialogs.php:154 +msgid "click here to log out" +msgstr "Çıkış için buraya tıklayın" + +#: includes/class-wp-members-dialogs.php:155 +msgid "Login Failed!
    You entered an invalid username or password." +msgstr "Giriş Başarısız!
    Geçersiz bir kullanıcı adı veya şifre girdiniz." + +#: includes/class-wp-members-dialogs.php:156 +msgid "Invalid username or password." +msgstr "" + +#: includes/class-wp-members-dialogs.php:160 includes/class-wp-members.php:1745 +msgid "log in" +msgstr "giriş" + +#: includes/class-wp-members-dialogs.php:161 +msgid "Forgot?" +msgstr "Unuttun mu?" + +#: includes/class-wp-members-dialogs.php:165 +#, fuzzy +msgid "" +"This content is restricted to site members. If you are an existing user, " +"please log in. New users may register below." +msgstr "" +"Bu içerik site üyeleri ile sınırlıdır. Eğer mevcut bir kullanıcı iseniz, " +"giriş yapınız. Yeni kullanıcılar aşağıdan kayıt olabilir." + +#: includes/class-wp-members-dialogs.php:166 +#, fuzzy +msgid "" +"Congratulations! Your registration was successful.

    You may now " +"log in using the password that was emailed to you." +msgstr "" +"Tebrikler! Başarıyla kaydoldunuz.

    Şimdi size gönderilen " +"epostadaki şifreyi kullanarak giriş yapabilirsiniz." + +#: includes/class-wp-members-dialogs.php:169 +msgid "Sorry, that username is taken, please try another." +msgstr "Üzgünüz, bu kullanıcı adı alınmış, lütfen başka birini deneyin." + +#: includes/class-wp-members-dialogs.php:170 +msgid "" +"Sorry, that email address already has an account.
    Please try another." +msgstr "" +"Üzgünüz, bu eposta adresinin zaten bir hesabı var.
    Lütfen başka birini " +"deneyin." + +#: includes/class-wp-members-dialogs.php:175 +msgid "Password successfully changed." +msgstr "" + +#: includes/class-wp-members-dialogs.php:176 +msgid "Invalid username or email address." +msgstr "" + +#: includes/class-wp-members-dialogs.php:177 +msgid "" +"Password successfully reset! An email containing a new password has been " +"sent to the email address on file for your account." +msgstr "" + +#: includes/class-wp-members-dialogs.php:178 +msgid "" +"Reset request received. An email with instructions to complete the password " +"reset has been sent." +msgstr "" + +#: includes/class-wp-members-dialogs.php:180 +msgid "This content requires the following membership: " +msgstr "" + +#: includes/class-wp-members-dialogs.php:181 +msgid "This content requires one of the following memberships: " +msgstr "" + +#: includes/class-wp-members-forms.php:84 +#: includes/class-wp-members-forms.php:350 +msgid "Choose membership" +msgstr "" + +#: includes/class-wp-members-forms.php:1898 +#: includes/class-wp-members-user-profile.php:510 +msgid "Activate this user?" +msgstr "Bu kullanıcıyı etkinleştir?" + +#: includes/class-wp-members-forms.php:2165 templates/tos.php:20 +msgid "Terms of Service" +msgstr "Hizmet Koşulları" + +#: includes/class-wp-members-menus.php:131 +msgid "Display" +msgstr "" + +#: includes/class-wp-members-menus.php:139 +msgid "Logged In Users" +msgstr "" + +#: includes/class-wp-members-menus.php:146 +msgid "Logged Out Users" +msgstr "" + +#: includes/class-wp-members-menus.php:153 +msgid "All Users" +msgstr "" + +#: includes/class-wp-members-menus.php:167 +#, php-format +msgid "%sAdd membership products%s to restrict menu to a membership" +msgstr "" + +#: includes/class-wp-members-menus.php:169 +msgid "Restrict menu item to a membership product" +msgstr "" + +#: includes/class-wp-members-products.php:342 +#, php-format +msgid "All %s" +msgstr "" + +#: includes/class-wp-members-products.php:343 +#, php-format +msgid "Add New %s" +msgstr "" + +#: includes/class-wp-members-products.php:344 +msgid "Add New" +msgstr "Yeni Ekle" + +#: includes/class-wp-members-products.php:345 +#, php-format +msgid "New %s" +msgstr "" + +#: includes/class-wp-members-products.php:346 +#, php-format +msgid "Edit %s" +msgstr "" + +#: includes/class-wp-members-products.php:347 +#, php-format +msgid "Update %s" +msgstr "" + +#: includes/class-wp-members-products.php:348 +#: includes/class-wp-members-products.php:349 +#, php-format +msgid "View %s" +msgstr "" + +#: includes/class-wp-members-products.php:350 +#, php-format +msgid "Search %s" +msgstr "" + +#: includes/class-wp-members-products.php:351 +msgid "Not found" +msgstr "" + +#: includes/class-wp-members-products.php:352 +msgid "Not found in Trash" +msgstr "" + +#: includes/class-wp-members-products.php:353 +msgid "Insert into item" +msgstr "" + +#: includes/class-wp-members-products.php:354 +#, php-format +msgid "Save %s Details" +msgstr "" + +#: includes/class-wp-members-products.php:355 +msgid "Membership Attributes" +msgstr "" + +#: includes/class-wp-members-products.php:358 +msgid "Membership Product" +msgstr "" + +#: includes/class-wp-members-products.php:359 +msgid "WP-Members Membership Products" +msgstr "" + +#: includes/class-wp-members-pwd-reset.php:35 +#: includes/class-wp-members-pwd-reset.php:36 +msgid "" +"Sorry, no password reset key was found. Please check your email and try " +"again." +msgstr "" + +#: includes/class-wp-members-pwd-reset.php:37 +msgid "Sorry, the password reset key is expired." +msgstr "" + +#: includes/class-wp-members-pwd-reset.php:167 +msgid "The passwords do not match." +msgstr "" + +#: includes/class-wp-members-shortcodes.php:134 +msgid "" +"This is a generic message to display the form message dialog in the " +"Customizer." +msgstr "" + +#: includes/class-wp-members-shortcodes.php:699 +msgid "Click here to log out." +msgstr "" + +#: includes/class-wp-members-user-profile.php:58 +msgid "WP-Members Additional Fields" +msgstr "WP-Members Ek Bilgi Alanları" + +#: includes/class-wp-members-user-profile.php:58 +#, fuzzy +msgid "Additional Information" +msgstr "Onay kutusu alanları için ek bilgiler" + +#: includes/class-wp-members-user-profile.php:500 +msgid "Reactivate this user?" +msgstr "Bu kullanıcıyı yeniden etkinleştir?" + +#: includes/class-wp-members-user-profile.php:505 +msgid "Deactivate this user?" +msgstr "Bu kullanıcıyı devre dışı bırak?" + +#: includes/class-wp-members-user-profile.php:559 +msgid "IP @ registration" +msgstr "IP @ kaydı" + +#: includes/class-wp-members-user.php:1171 +msgid "ERROR: User has not been activated." +msgstr "HATA: Kullanıcı etkinleştirilmedi." + +#: includes/class-wp-members-validation-link.php:32 +msgid "Click to validate your account: " +msgstr "" + +#: includes/class-wp-members-validation-link.php:33 +msgid "Thank you for validating your account." +msgstr "" + +#: includes/class-wp-members-validation-link.php:34 +msgid "Validation key was expired or invalid" +msgstr "" + +#: includes/class-wp-members-validation-link.php:35 +msgid "Your account is now pending approval" +msgstr "" + +#: includes/class-wp-members-validation-link.php:284 +msgid "ERROR: User has not confirmed their account." +msgstr "" + +#: includes/class-wp-members-widget.php:24 +msgid "Displays the WP-Members sidebar login." +msgstr "" + +#: includes/class-wp-members-widget.php:39 +#: includes/class-wp-members-widget.php:82 +msgid "Login Status" +msgstr "Giriş Durumu" + +#: includes/class-wp-members-widget.php:46 +msgid "Title:" +msgstr "Başlık:" + +#: includes/class-wp-members-widget.php:50 +msgid "Redirect to (optional):" +msgstr "" + +#: includes/class-wp-members.php:1087 includes/class-wp-members.php:1098 +msgid "You must be logged in to view this content." +msgstr "" + +#: includes/class-wp-members.php:1104 +msgid "The page you are looking for does not exist" +msgstr "" + +#: includes/class-wp-members.php:1352 +#, php-format +msgid "" +"You have a linked page in the WP-Members page settings that corresponds to a " +"post ID that no longer exists. Please %s review and update the %s page " +"settings %s." +msgstr "" + +#: includes/class-wp-members.php:1472 +msgid "Show forms as logged out" +msgstr "" + +#: includes/class-wp-members.php:1481 +msgid "Show form message dialog" +msgstr "" + +#: includes/class-wp-members.php:1558 +msgid "(more…)" +msgstr "" + +#: includes/class-wp-members.php:1746 +msgid "log out" +msgstr "" + +#: includes/cli/class-wp-members-cli-user.php:24 +#: includes/cli/class-wp-members-cli-user.php:62 +msgid "Moderated registration is not enabled in WP-Members options." +msgstr "" + +#: includes/cli/class-wp-members-cli-user.php:35 +msgid "User activated." +msgstr "" + +#: includes/cli/class-wp-members-cli-user.php:37 +msgid "Email notification sent to user." +msgstr "" + +#: includes/cli/class-wp-members-cli-user.php:40 +msgid "User is already activated." +msgstr "" + +#: includes/cli/class-wp-members-cli-user.php:67 +msgid "User deactivated." +msgstr "" + +#: includes/cli/class-wp-members-cli-user.php:88 +msgid "Invalid user ID. Please specify a valid user. Try `wp user list`." +msgstr "" + +#: includes/cli/class-wp-members-cli-user.php:91 +msgid "No user id specified. Must specify user id as --id=123" +msgstr "" + +#: includes/cli/class-wp-members-cli-user.php:208 +#, php-format +msgid "User: %s" +msgstr "" + +#: includes/cli/class-wp-members-cli-user.php:248 +#, php-format +msgid "User role: %s" +msgstr "" + +#: includes/deprecated.php:373 +msgid "We were unable to validate the public key." +msgstr "Public anahtarını doğrulayamadık." + +#: includes/deprecated.php:377 +msgid "We were unable to validate the private key." +msgstr "Private anahtarını doğrulayamadık." + +#: includes/deprecated.php:381 +msgid "The challenge parameter of the verify script was incorrect." +msgstr "Komut doğrulama soru parametresi yanlış." + +#: includes/deprecated.php:385 +msgid "The CAPTCHA solution was incorrect." +msgstr "CAPTCHA çözümü yanlış." + +#: includes/deprecated.php:389 +msgid "The parameters to verify were incorrect" +msgstr "Doğrulanacak parametreler hatalı" + +#: includes/deprecated.php:393 +msgid "" +"reCAPTCHA API keys are tied to a specific domain name for security reasons." +msgstr "" +"reCAPTCHA API anahtarları güvenlik nedenleriyle belirli bir etki alanı adına " +"bağlıdır." + +#: includes/deprecated.php:397 +msgid "The reCAPTCHA server was not reached. Please try to resubmit." +msgstr "reCAPTCHA sunucusuna ulaşılamadı. Lütfen yeniden göndermeyi deneyin." + +#. translators: %s: title of menu item which is invalid +#: includes/walkers/class-wp-members-walker-nav-menu.php:92 +#, php-format +msgid "%s (Invalid)" +msgstr "" + +#. translators: %s: title of menu item in draft status +#: includes/walkers/class-wp-members-walker-nav-menu.php:96 +#, php-format +msgid "%s (Pending)" +msgstr "" + +#: includes/walkers/class-wp-members-walker-nav-menu.php:123 +msgid "Move up" +msgstr "" + +#: includes/walkers/class-wp-members-walker-nav-menu.php:136 +msgid "Move down" +msgstr "" + +#: includes/walkers/class-wp-members-walker-nav-menu.php:138 +msgid "Edit Menu Item" +msgstr "" + +#: includes/walkers/class-wp-members-walker-nav-menu.php:149 +msgid "URL" +msgstr "" + +#: includes/walkers/class-wp-members-walker-nav-menu.php:156 +msgid "Navigation Label" +msgstr "" + +#: includes/walkers/class-wp-members-walker-nav-menu.php:162 +msgid "Title Attribute" +msgstr "" + +#: includes/walkers/class-wp-members-walker-nav-menu.php:169 +msgid "Open link in a new window/tab" +msgstr "" + +#: includes/walkers/class-wp-members-walker-nav-menu.php:174 +msgid "CSS Classes (optional)" +msgstr "" + +#: includes/walkers/class-wp-members-walker-nav-menu.php:180 +msgid "Link Relationship (XFN)" +msgstr "" + +#: includes/walkers/class-wp-members-walker-nav-menu.php:188 +msgid "" +"The description will be displayed in the menu if the current theme supports " +"it." +msgstr "" + +#: includes/walkers/class-wp-members-walker-nav-menu.php:210 +#, php-format +msgid "Original: %s" +msgstr "" + +#: includes/walkers/class-wp-members-walker-nav-menu.php:223 +msgid "Remove" +msgstr "" + +#: templates/tos.php:32 +#, php-format +msgid "%sclose%s" +msgstr "%skapat%s" + +#: templates/tos.php:34 +#, php-format +msgid "%sprint%s" +msgstr "%syazdır%s" + +#. Plugin Name of the plugin/theme +msgid "WP-Members" +msgstr "WP-Members" + +#. Plugin URI of the plugin/theme +msgid "https://rocketgeek.com" +msgstr "" + +#. Description of the plugin/theme +msgid "" +"WP access restriction and user registration. For more information on plugin " +"features, refer to the online Users Guide. A Quick Start Guide is also available. WP-" +"Members(tm) is a trademark of butlerblog.com." +msgstr "" + +#. Author of the plugin/theme +msgid "Chad Butler" +msgstr "Chad Butler" + +#. Author URI of the plugin/theme +msgid "https://butlerblog.com/" +msgstr "" + +#, fuzzy +#~ msgid "Block" +#~ msgstr "Varsayılan olarak Yazıları Engelle" + +#~ msgid "Manage reCAPTCHA Options" +#~ msgstr "reCAPTCHA Seçeneklerini yönet" + +#~ msgid "" +#~ "reCAPTCHA is a free, accessible CAPTCHA service that helps to digitize " +#~ "books while blocking spam on your blog." +#~ msgstr "" +#~ "reCAPTCHA blogunuzda spamı bloke ederken kitapları dijital ortama " +#~ "aktarmayla yardımcı olan ücretsiz, ulaşılabilir CAPTCHA hizmetidir." + +#, php-format +#~ msgid "" +#~ "reCAPTCHA asks commenters to retype two words scanned from a book to " +#~ "prove that they are a human. This verifies that they are not a spambot " +#~ "while also correcting the automatic scans of old books. So you get less " +#~ "spam, and the world gets accurately digitized books. Everybody wins! For " +#~ "details, visit the %s reCAPTCHA website%s" +#~ msgstr "" +#~ "reCAPTCHA, onların insan olduğunu kanıtlamak için bir kitaptan taranmış " +#~ "iki kelimeyi yorumcuların yeniden yazmasnı ister. Bu aynı zamanda, eski " +#~ "kitapların otomatik taramasını düzeltirken onların bir spambot olmadığını " +#~ "doğrular. Böylece, siz daha az spam alırsınız ve dünya ise doğru olarak " +#~ "dijitalleştirilmiş kitapları alır. Herkes kazanır! Ayrıntılar için, %s " +#~ "reCAPTCHA web sitesini%s ziyaret edin." + +#, fuzzy, php-format +#~ msgid "" +#~ "reCAPTCHA requires an API key, consisting of a \"public\" and a \"private" +#~ "\" key. You can sign up for a %s free reCAPTCHA key%s" +#~ msgstr "" +#~ "reCAPTCHA, bir \"public\" ve bir \"private\"anahtarından oluşan bir API " +#~ "anahtarı gerektirir. %s Ücretsiz bir reCAPTCHA anahtarı\" için kayıt " +#~ "olabilirsiniz." + +#~ msgid "Public Key" +#~ msgstr "Public Anahtar" + +#~ msgid "Private Key" +#~ msgstr "Private Anahtar" + +#~ msgid "Choose Theme" +#~ msgstr "Tema Seç" + +#~ msgid "Red" +#~ msgstr "Kırmızı" + +#~ msgid "White" +#~ msgstr "Beyaz" + +#~ msgid "Black Glass" +#~ msgstr "Siyah Cam" + +#~ msgid "Clean" +#~ msgstr "Temiz" + +#, fuzzy +#~ msgid "Active" +#~ msgstr "Etkinleştir" + +#, fuzzy +#~ msgid "Enable CAPTCHA" +#~ msgstr "Kayıt için CAPTCHA özelliğini açar" + +#~ msgid "Passwords did not match.

    Please try again." +#~ msgstr "Şifreler eşleşmedi.

    Lütfen tekrar deneyin." + +#~ msgid "Either the username or email address do not exist in our records." +#~ msgstr "" +#~ "Kullanıcı adı veya eposta adresinin her ikisi de kayıtlarımızda yok." + +#~ msgid "http://butlerblog.com/" +#~ msgstr "http://butlerblog.com/" + +#, fuzzy +#~ msgid "Click to log out." +#~ msgstr "Giriş" + +#~ msgid "You have set WP-Members to turn off the registration process" +#~ msgstr "WP-Members eklentisini kayıt işlemini kapatmak için ayarladınız" + +#~ msgid "" +#~ "but you also set to moderate and/or email admin new registrations. You " +#~ "will need to set up a registration page for users to register." +#~ msgstr "" +#~ "fakat ayrıca yöneticinin yeni kayıtları denetlemesi ve/veya eposta ile " +#~ "bilgilendirilmesi olarak ayarladınız. Kullanıcıların kaydolması için bir " +#~ "kayıt sayfası oluşturmanız gerekir." + +#, fuzzy +#~ msgid "Unblocked?" +#~ msgstr "" +#~ "Not: Yazılar hala tekil engellenmiş veya makale düzeyinde engellenmemiş " +#~ "olabilir" + +#, fuzzy +#~ msgid "Blocked?" +#~ msgstr "" +#~ "Not: Yazılar hala tekil engellenmiş veya makale düzeyinde engellenmemiş " +#~ "olabilir" + +#~ msgid "Field Label is required for adding a new field. Nothing was updated." +#~ msgstr "" +#~ "Alan Etiketi yeni bir bilgi alanı eklenmesini gerektirir. Hiçbir şey " +#~ "güncellenmedi." + +#~ msgid "Option Name is required for adding a new field. Nothing was updated." +#~ msgstr "" +#~ "Seçenek Adı yeni bir bilgi alanı eklenmesini gerektirir. Hiçbir şey " +#~ "güncellenmedi." + +#~ msgid "field was added" +#~ msgstr "bilgi alanı eklendi" + +#~ msgid "field was updated" +#~ msgstr "bilgi alanı güncellendi" + +#~ msgid "Option Name" +#~ msgstr "Seçenek Adı" + +#~ msgid "Additional information for checkbox fields" +#~ msgstr "Onay kutusu alanları için ek bilgiler" + +#~ msgid "Additional information for dropdown fields" +#~ msgstr "Açılır menü alanları için ek bilgiler" + +#~ msgid "For dropdown, array of values:" +#~ msgstr "Açılır menü için değerlerin sıralaması:" + +#~ msgid "" +#~ "Determine which fields will display and which are required. This " +#~ "includes all fields, both native WP fields and WP-Members custom fields." +#~ msgstr "" +#~ "Hangi alanların gösterileceğini ve gerekli olduğunu belirleyin. Bu, yerel " +#~ "WP ve WP-Members kişisel alnları dahil tüm alanları içerir." + +#~ msgid "(Note: Email is always mandatory and cannot be changed.)" +#~ msgstr "(Not: Eposta her zaman zorunludur ve değiştirilemez.)" + +#~ msgid "Add/Delete" +#~ msgstr "Ekle/Sil" + +#~ msgid "Checked?" +#~ msgstr "İşaretli?" + +#~ msgid "Delete" +#~ msgstr "Sil" + +#~ msgid "(Email cannot be removed)" +#~ msgstr "(Eposta kaldırılamaz)" + +#, fuzzy +#~ msgid "native" +#~ msgstr "" +#~ "Hangi alanların gösterileceğini ve gerekli olduğunu belirleyin. Bu, yerel " +#~ "WP ve WP-Members kişisel alnları dahil tüm alanları içerir." + +#~ msgid "Update Fields" +#~ msgstr "Alanları Güncelle" + +#~ msgid "Please indicate that you agree to the %s TOS %s" +#~ msgstr "Lütfen %s HK %s kabul ettiğinizi belirtin" + +#~ msgid "http://rocketgeek.com" +#~ msgstr "http://rocketgeek.com" + +#~ msgid "" +#~ "WP access restriction and user registration. For more information on " +#~ "plugin features, refer to the online Users Guide. A Quick Start Guide is also available. WP-Members(tm) is a trademark of butlerblog.com." +#~ msgstr "" +#~ "WP erişim kısıtlaması ve kullanıcı kaydı. Eklenti özellikleri hakkında " +#~ "daha fazla bilgi için, çevrimiçi Kullanıcı Kılavuzuna bakın. Ayrıca bir Hızlı Başlangıç Kılavuzu da mevcuttur. WP-Members(tm) bir " +#~ "butlerblog.com ticari markasıdır." + +#, fuzzy +#~ msgid "%s posts %sed." +#~ msgstr "Varsayılan olarak Yazıları Engelle" + +#, fuzzy +#~ msgid "Post Restriction" +#~ msgstr "Yeni Kayıt" + +#, fuzzy +#~ msgid "Page Restriction" +#~ msgstr "Yeni Kayıt" + +#~ msgid "dropdown" +#~ msgstr "açılır menü" + +#~ msgid "Block Posts by default" +#~ msgstr "Varsayılan olarak Yazıları Engelle" + +#~ msgid "" +#~ "Note: Posts can still be individually blocked or unblocked at the article " +#~ "level" +#~ msgstr "" +#~ "Not: Yazılar hala tekil engellenmiş veya makale düzeyinde engellenmemiş " +#~ "olabilir" + +#~ msgid "Block Pages by default" +#~ msgstr "Varsayılan olarak Sayfaları Engelle" + +#~ msgid "" +#~ "Note: Pages can still be individually blocked or unblocked at the article " +#~ "level" +#~ msgstr "" +#~ "Not: Sayfalar hala tekil engellenmiş veya makale düzeyinde engellenmemiş " +#~ "olabilir" + +#~ msgid "Show excerpts" +#~ msgstr "Alıntıları göster" + +#~ msgid "" +#~ "Shows excerpted content above the login/registration on both Posts and " +#~ "Pages" +#~ msgstr "" +#~ "Yazı ve Sayfalarda alıntılanmış içeriği giriş/kayıt üstünde gösterir" + +#~ msgid "Turns on CAPTCHA for registration" +#~ msgstr "Kayıt için CAPTCHA özelliğini açar" + +#, fuzzy +#~ msgid "Hide registration" +#~ msgstr "Kayıt tamamlandı" + +#~ msgid "Optional" +#~ msgstr "İsteğe bağlı" + +#~ msgid "Automatically creates an excerpt" +#~ msgstr "Otomatik olarak bir alıntı oluşturur" + +#~ msgid "Select a stylesheet or specify a custom stylesheet below" +#~ msgstr "" +#~ "Bir stil sayfası seçin veya aşağıda kişisel bir stil sayfası belirtin" + +#~ msgid "AIM" +#~ msgstr "AIM" + +#~ msgid "Yahoo IM" +#~ msgstr "Yahoo IM" + +#~ msgid "Jabber/Google Talk" +#~ msgstr "Jabber/Google Talk" + +#~ msgid "" +#~ "Password successfully changed!

    You will need to re-login with " +#~ "your new password." +#~ msgstr "" +#~ "Şifre başarıyla değiştirildi!

    Yeni şifrenizle tekrar giriş " +#~ "yapmanız gerekir." + +#~ msgid "" +#~ "Password successfully reset!

    An email containing a new " +#~ "password has been sent to the email address on file for your account. You " +#~ "may change this random password then re-login with your new password." +#~ msgstr "" +#~ "Şifre başarıyla sıfırlandı!

    Yeni bir şifre içeren bir eposta, " +#~ "hesabınız için dosyada eposta adresine gönderildi. Yeni şifreniz ile " +#~ "tekrar giriş yaptıktan sonra bu rastgele şifreyi değişebilirsiniz." + +#~ msgid "Custom" +#~ msgstr "Kişisel" + +#, fuzzy +#~ msgid "edit" +#~ msgstr "Bilgi Alanını Düzenle" + +#~ msgid "Stylesheet:" +#~ msgstr "Stil Sayfası" + +#~ msgid "New Password" +#~ msgstr "Yeni Şifre" + +#~ msgid "Repeat Password" +#~ msgstr "Şifreyi Tekrarla" + +#~ msgid "Remember me" +#~ msgstr "Beni hatırla" + +#~ msgid "" +#~ "Find out how to get access to WP-Members private members forum, premium " +#~ "code snippets, tutorials, and more!" +#~ msgstr "" +#~ "WP-Members özel üye forumu, premium kod parçacıkları, eğitimler ve daha " +#~ "fazlasına nasıl erişim sağlayacağınızı öğrenin!" + +#~ msgid "Cheatin’ uh?" +#~ msgstr "Aldatma ha?" + +#~ msgid "there was an error and no users were exported" +#~ msgstr "bir hata oluştu ve hiçbir kullanıcı dışa aktarılamadı" + +#~ msgid "Turn off registration" +#~ msgstr "Kaydı kapat" + +#~ msgid "Turns off the registration process, only allows login" +#~ msgstr "Kayıt işlemini kapatır, sadece giriş için izin verir" + +#~ msgid "Legacy forms" +#~ msgstr "Eski formlar" + +#~ msgid "" +#~ "Uses the pre-2.5.1 table-based forms (leave off to use CSS table-less " +#~ "forms)" +#~ msgstr "" +#~ "Ön-2.5.1 tablo-bazlı formları kullanır (tablosuz CSS formlarını kullanmak " +#~ "için kapalı bırakın)" + +#~ msgid "Members Area URL:" +#~ msgstr "Üye Alanı URL:" + +#~ msgid "%d users were activated." +#~ msgstr "%d kullanıcı aktif edildi." + +#~ msgid "" +#~ "Users ready to export, %s click here %s to generate and download a CSV." +#~ msgstr "" +#~ "Kullanıcılar dışa aktarmaya hazır, bir CSV oluşturmak ve indirmek için %s " +#~ "buraya tıklayın. %s" + +#~ msgid "WP-Members Users" +#~ msgstr "WP-Members Kullanıcıları" + +#~ msgid "No users matched your criteria" +#~ msgstr "Kriterlerinize hiçbir üye uygun değil" + +#~ msgid "Bulk Actions" +#~ msgstr "Toplu İşlemler" + +#~ msgid "Apply" +#~ msgstr "Uygula" + +#~ msgid "Indicates a required field" +#~ msgstr "Alanın zorunlu olduğunu gösterir" + +#~ msgid "Submit" +#~ msgstr "Gönder" + +#~ msgid "Clear Form" +#~ msgstr "Formu Temizle" + +#~ msgid "login" +#~ msgstr "giriş" + +#~ msgid "Login" +#~ msgstr "Giriş" diff --git a/i18n/languages/wp-members.pot b/i18n/languages/wp-members.pot new file mode 100644 index 00000000..2129293c --- /dev/null +++ b/i18n/languages/wp-members.pot @@ -0,0 +1,2364 @@ +#, fuzzy +msgid "" +msgstr "" +"Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n" +"Project-Id-Version: WP-Members\n" +"POT-Creation-Date: 2023-01-06 15:20-0500\n" +"PO-Revision-Date: 2020-05-22 17:48-0400\n" +"Last-Translator: \n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Poedit 2.4.3\n" +"X-Poedit-Basepath: ../..\n" +"X-Poedit-Flags-xgettext: --add-comments=translators:\n" +"X-Poedit-WPHeader: wp-members.php\n" +"X-Poedit-SourceCharset: UTF-8\n" +"X-Poedit-KeywordsList: __;_e;_n:1,2;_x:1,2c;_ex:1,2c;_nx:4c,1,2;esc_attr__;" +"esc_attr_e;esc_attr_x:1,2c;esc_html__;esc_html_e;esc_html_x:1,2c;_n_noop:1,2;" +"_nx_noop:3c,1,2;__ngettext_noop:1,2\n" +"X-Poedit-SearchPath-0: .\n" +"X-Poedit-SearchPathExcluded-0: *.min.js\n" + +#: includes/admin/class-wp-members-admin-api.php:254 +msgid "Custom email" +msgstr "" + +#: includes/admin/class-wp-members-admin-api.php:255 +#: includes/admin/class-wp-members-admin-api.php:257 +msgid "Subject" +msgstr "" + +#: includes/admin/class-wp-members-admin-api.php:258 +msgid "Body" +msgstr "" + +#: includes/admin/class-wp-members-admin-api.php:260 +msgid "Your custom email message content." +msgstr "" + +#: includes/admin/class-wp-members-admin-api.php:338 +msgid "Options" +msgstr "" + +#: includes/admin/class-wp-members-admin-api.php:339 +msgid "Fields" +msgstr "" + +#: includes/admin/class-wp-members-admin-api.php:340 +msgid "Dialogs" +msgstr "" + +#: includes/admin/class-wp-members-admin-api.php:341 +msgid "Emails" +msgstr "" + +#: includes/admin/class-wp-members-admin-api.php:357 +msgid "New Registration" +msgstr "" + +#: includes/admin/class-wp-members-admin-api.php:365 +#: includes/admin/class-wp-members-admin-api.php:383 +msgid "User email validated" +msgstr "" + +#: includes/admin/class-wp-members-admin-api.php:375 +msgid "Registration is Moderated" +msgstr "" + +#: includes/admin/class-wp-members-admin-api.php:391 +msgid "Registration is Moderated, User is Approved" +msgstr "" + +#: includes/admin/class-wp-members-admin-api.php:399 +msgid "Password Reset" +msgstr "" + +#: includes/admin/class-wp-members-admin-api.php:406 +msgid "Retrieve Username" +msgstr "" + +#: includes/admin/class-wp-members-admin-api.php:414 +msgid "Admin Notification" +msgstr "" + +#: includes/admin/class-wp-members-admin-api.php:440 +msgid "Restricted post (or page), displays above the login/registration form" +msgstr "" + +#: includes/admin/class-wp-members-admin-api.php:441 +msgid "Username is taken" +msgstr "" + +#: includes/admin/class-wp-members-admin-api.php:442 +msgid "Email is registered" +msgstr "" + +#: includes/admin/class-wp-members-admin-api.php:443 +msgid "Registration completed" +msgstr "" + +#: includes/admin/class-wp-members-admin-api.php:444 +msgid "User update" +msgstr "" + +#: includes/admin/class-wp-members-admin-api.php:445 +msgid "Passwords did not match" +msgstr "" + +#: includes/admin/class-wp-members-admin-api.php:446 +msgid "Password changes" +msgstr "" + +#: includes/admin/class-wp-members-admin-api.php:447 +msgid "Username or email do not exist when trying to reset forgotten password" +msgstr "" + +#: includes/admin/class-wp-members-admin-api.php:448 +msgid "Password reset" +msgstr "" + +#: includes/admin/class-wp-members-admin-api.php:547 +msgid "Close" +msgstr "" + +#: includes/admin/class-wp-members-admin-api.php:596 +msgid "Settings" +msgstr "" + +#: includes/admin/class-wp-members-admin-posts.php:30 +#: includes/admin/class-wp-members-admin-posts.php:33 +msgid "Unrestrict" +msgstr "" + +#: includes/admin/class-wp-members-admin-posts.php:31 +#: includes/admin/class-wp-members-admin-posts.php:34 +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:110 +msgid "Restrict" +msgstr "" + +#: includes/admin/class-wp-members-admin-posts.php:32 +#: includes/admin/class-wp-members-admin-posts.php:35 +msgid "Hide" +msgstr "" + +#: includes/admin/class-wp-members-admin-posts.php:125 +#, php-format +msgid "%s restricted" +msgstr "" + +#: includes/admin/class-wp-members-admin-posts.php:125 +#, php-format +msgid "%s unrestricted" +msgstr "" + +#: includes/admin/class-wp-members-admin-posts.php:165 +#, php-format +msgid "%s Restriction" +msgstr "" + +#: includes/admin/class-wp-members-admin-posts.php:195 +#: includes/admin/class-wp-members-admin-posts.php:342 +#: includes/admin/class-wp-members-admin-posts.php:345 +msgid "Unrestricted" +msgstr "" + +#: includes/admin/class-wp-members-admin-posts.php:196 +#: includes/admin/class-wp-members-admin-posts.php:339 +#: includes/admin/class-wp-members-admin-posts.php:347 +msgid "Restricted" +msgstr "" + +#: includes/admin/class-wp-members-admin-posts.php:197 +#: includes/admin/class-wp-members-admin-posts.php:349 +msgid "Hidden" +msgstr "" + +#: includes/admin/class-wp-members-admin-posts.php:203 +msgid "Status:" +msgstr "" + +#: includes/admin/class-wp-members-admin-posts.php:203 +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:68 +#: includes/admin/tabs/class-wp-members-fields-table.php:65 +#: includes/walkers/class-wp-members-walker-nav-menu.php:140 +msgid "Edit" +msgstr "" + +#: includes/admin/class-wp-members-admin-posts.php:218 +msgid "Ok" +msgstr "" + +#: includes/admin/class-wp-members-admin-posts.php:219 +#: includes/walkers/class-wp-members-walker-nav-menu.php:224 +msgid "Cancel" +msgstr "" + +#: includes/admin/class-wp-members-admin-posts.php:305 +msgid "Status" +msgstr "" + +#: includes/admin/class-wp-members-admin-users.php:28 +#: includes/admin/class-wp-members-admin-users.php:34 +#: includes/admin/class-wp-members-admin-users.php:79 +msgid "Activate" +msgstr "" + +#: includes/admin/class-wp-members-admin-users.php:29 +#: includes/admin/class-wp-members-admin-users.php:35 +#: includes/admin/class-wp-members-admin-users.php:82 +msgid "Deactivate" +msgstr "" + +#: includes/admin/class-wp-members-admin-users.php:31 +#: includes/admin/class-wp-members-admin-users.php:37 +msgid "Export" +msgstr "" + +#: includes/admin/class-wp-members-admin-users.php:32 +#: includes/admin/class-wp-members-admin-users.php:38 +msgid "Export All Users" +msgstr "" + +#: includes/admin/class-wp-members-admin-users.php:61 +msgid "Confirm" +msgstr "" + +#: includes/admin/class-wp-members-admin-users.php:64 +msgid "Unconfirm" +msgstr "" + +#: includes/admin/class-wp-members-admin-users.php:147 +#, php-format +msgid "%s users activated" +msgstr "" + +#: includes/admin/class-wp-members-admin-users.php:147 +#, php-format +msgid "%s users deactivated" +msgstr "" + +#: includes/admin/class-wp-members-admin-users.php:150 +msgid "No users selected" +msgstr "" + +#: includes/admin/class-wp-members-admin-users.php:168 +msgid "You cannot activate or deactivate yourself" +msgstr "" + +#: includes/admin/class-wp-members-admin-users.php:173 +#, php-format +msgid "%s activated" +msgstr "" + +#: includes/admin/class-wp-members-admin-users.php:178 +#, php-format +msgid "%s deactivated" +msgstr "" + +#: includes/admin/class-wp-members-admin-users.php:182 +msgid "That user is already active" +msgstr "" + +#: includes/admin/class-wp-members-admin-users.php:198 +msgid "You cannot confirm or unconfirm yourself" +msgstr "" + +#: includes/admin/class-wp-members-admin-users.php:203 +#, php-format +msgid "%s confirmed" +msgstr "" + +#: includes/admin/class-wp-members-admin-users.php:208 +#, php-format +msgid "%s unconfirmed" +msgstr "" + +#: includes/admin/class-wp-members-admin-users.php:212 +msgid "That user is already confirmed" +msgstr "" + +#: includes/admin/class-wp-members-admin-users.php:341 +msgid "Pending" +msgstr "" + +#: includes/admin/class-wp-members-admin-users.php:342 +msgid "Trial" +msgstr "" + +#: includes/admin/class-wp-members-admin-users.php:343 +#: includes/admin/class-wp-members-user-export.php:289 +msgid "Subscription" +msgstr "" + +#: includes/admin/class-wp-members-admin-users.php:344 +msgid "Expired" +msgstr "" + +#: includes/admin/class-wp-members-admin-users.php:347 +#: includes/admin/class-wp-members-admin-users.php:410 +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:457 +msgid "Activated" +msgstr "" + +#: includes/admin/class-wp-members-admin-users.php:348 +msgid "Pending Activation" +msgstr "" + +#: includes/admin/class-wp-members-admin-users.php:349 +msgid "Deactivated" +msgstr "" + +#: includes/admin/class-wp-members-admin-users.php:352 +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:456 +msgid "Confirmed" +msgstr "" + +#: includes/admin/class-wp-members-admin-users.php:353 +msgid "Not Confirmed" +msgstr "" + +#: includes/admin/class-wp-members-admin-users.php:355 +msgid "Not Exported" +msgstr "" + +#: includes/admin/class-wp-members-admin-users.php:475 +msgid "Not confirmed" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:67 +msgid "Slug" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:68 +#: includes/admin/class-wp-members-user-export.php:294 +msgid "Role" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:69 +#: includes/admin/class-wp-members-products-admin.php:740 +#: includes/admin/class-wp-members-user-export.php:290 +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:460 +msgid "Expires" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:71 +msgid "Default" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:73 +msgid "Last updated" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:97 +msgid "slug:" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:100 +msgid "No role required" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:105 +msgid "Does not expire" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:109 +#: includes/admin/class-wp-members-user-export.php:199 +msgid "Yes" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:145 +msgid "Membership Product Details" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:153 +msgid "Membership Product Message (optional)" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:169 +msgid "Access by child membership" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:185 +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:62 +msgid "Posts" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:186 +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:63 +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:249 +msgid "Pages" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:213 +#: includes/admin/class-wp-members-products-admin.php:262 +#: includes/admin/class-wp-members-products-admin.php:309 +msgid "Period" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:213 +msgid "Day" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:213 +msgid "Week" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:213 +msgid "Month" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:213 +msgid "Year" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:226 +msgid "Name (slug)" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:228 +msgid "Optional Defaults" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:231 +msgid "Assign as default at registration? (optional)" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:239 +#, php-format +msgid "Pre-selected by default for new %s" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:245 +msgid "Optional Properties" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:248 +msgid "Role Required? (optional)" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:251 +msgid "No Role" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:257 +msgid "Expires (optional)" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:259 +#: includes/admin/class-wp-members-products-admin.php:261 +#: includes/admin/class-wp-members-products-admin.php:306 +#: includes/admin/class-wp-members-products-admin.php:308 +msgid "Number" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:267 +msgid "Use \"no gap\" renewal" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:271 +msgid "Use a fixed period (such as Jan 1 - Dec 31, or Sept 1 - Aug 31)" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:288 +#: includes/admin/class-wp-members-products-admin.php:289 +msgid "Period Start (dd-mm)" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:290 +#: includes/admin/class-wp-members-products-admin.php:291 +msgid "Period End (dd-mm)" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:304 +msgid "Fixed period grace period" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:313 +msgid "" +"Grace period is the point at which expiration date is for following time " +"period. For example, if user who register August 1st would be part of the " +"following year's Sept 1 - Aug 31 membership, set this at 1 Month. Leave " +"blank for no grace period." +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:376 +msgid "" +"Restricted Message (displays when a user does not have access to a " +"membership)" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:502 +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:239 +#: includes/class-wp-members-forms.php:1196 +#: includes/class-wp-members-user-profile.php:132 +msgid "None" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:517 +msgid "Restrict access by membership:" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:598 +msgid "Required Membership" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:644 +#: includes/admin/class-wp-members-products-admin.php:745 +#: includes/class-wp-members-products.php:335 +msgid "Membership" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:680 +msgid "expires:" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:709 +#: includes/class-wp-members-products.php:336 +#: includes/class-wp-members-products.php:341 +msgid "Memberships" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:736 +msgid "Membership Access" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:744 +msgid "Action" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:746 +msgid "Enabled?" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:757 +msgid "Enable" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:758 +msgid "Disable" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:759 +msgid "Update" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:764 +msgid "Expiration date (optional)" +msgstr "" + +#: includes/admin/class-wp-members-products-admin.php:795 +#, php-format +msgid "No memberships have been created. %sCreate new memberships here%s" +msgstr "" + +#: includes/admin/class-wp-members-user-export.php:199 +msgid "No" +msgstr "" + +#: includes/admin/class-wp-members-user-export.php:264 +msgid "You do not have the required user capabilities to export users." +msgstr "" + +#: includes/admin/class-wp-members-user-export.php:277 +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:461 +msgid "User ID" +msgstr "" + +#: includes/admin/class-wp-members-user-export.php:284 +#: includes/class-wp-members-dialogs.php:91 +#: includes/class-wp-members-dialogs.php:114 +msgid "Username" +msgstr "" + +#: includes/admin/class-wp-members-user-export.php:286 +msgid "Activated?" +msgstr "" + +#: includes/admin/class-wp-members-user-export.php:292 +msgid "Registered" +msgstr "" + +#: includes/admin/class-wp-members-user-export.php:293 +msgid "IP" +msgstr "" + +#: includes/admin/dialogs.php:117 +msgid "" +"Your WP settings allow anyone to register - this is not the recommended " +"setting." +msgstr "" + +#: includes/admin/dialogs.php:118 +#, php-format +msgid "" +"You can %s change this here %s making sure the box next to \"Anyone can " +"register\" is unchecked." +msgstr "" + +#: includes/admin/dialogs.php:119 +msgid "" +"This setting allows a link on the /wp-login.php page to register using the " +"WP native registration process thus circumventing any registration you are " +"using with WP-Members. In some cases, this may suit the users wants/needs, " +"but most users should uncheck this option. If you do not change this " +"setting, you can choose to ignore these warning messages under WP-Members " +"Settings." +msgstr "" + +#: includes/admin/dialogs.php:123 +msgid "" +"Your WP settings allow anyone to comment - this is not the recommended " +"setting." +msgstr "" + +#: includes/admin/dialogs.php:124 +#, php-format +msgid "" +"You can %s change this here %s by checking the box next to \"Users must be " +"registered and logged in to comment.\"" +msgstr "" + +#: includes/admin/dialogs.php:125 +msgid "" +"This setting allows any users to comment, whether or not they are " +"registered. Depending on how you are using WP-Members will determine whether " +"you should change this setting or not. If you do not change this setting, " +"you can choose to ignore these warning messages under WP-Members Settings." +msgstr "" + +#: includes/admin/dialogs.php:129 +msgid "" +"Your WP settings allow full text rss feeds - this is not the recommended " +"setting." +msgstr "" + +#: includes/admin/dialogs.php:130 +#, php-format +msgid "" +"You can %s change this here %s by changing \"For each article in a feed, show" +"\" to \"Summary.\"" +msgstr "" + +#: includes/admin/dialogs.php:131 +msgid "" +"Leaving this set to full text allows anyone to read your protected content " +"in an RSS reader. Changing this to Summary prevents this as your feeds will " +"only show summary text." +msgstr "" + +#: includes/admin/dialogs.php:135 +msgid "You have set WP-Members to hold registrations for approval" +msgstr "" + +#: includes/admin/dialogs.php:136 +msgid "" +"but you have not changed the default message for \"Registration Completed\" " +"under \"WP-Members Dialogs and Error Messages.\" You should change this " +"message to let users know they are pending approval." +msgstr "" + +#: includes/admin/dialogs.php:140 +msgid "You have turned on reCAPTCHA" +msgstr "" + +#: includes/admin/dialogs.php:141 +msgid "" +"but you have not entered API keys. You will need both a public and private " +"key. The CAPTCHA will not display unless a valid API key is included." +msgstr "" + +#: includes/admin/dialogs.php:145 +msgid "You have active settings that are not recommended." +msgstr "" + +#: includes/admin/dialogs.php:146 +msgid "" +"If you will not be changing these settings, you can turn off these warning " +"messages by checking the \"Ignore warning messages\" in the settings below." +msgstr "" + +#: includes/admin/dialogs.php:174 +msgid "Version:" +msgstr "" + +#: includes/admin/dialogs.php:175 +msgid "Quick Start Guide" +msgstr "" + +#: includes/admin/dialogs.php:176 +msgid "Online User Guide" +msgstr "" + +#: includes/admin/dialogs.php:177 +msgid "FAQs" +msgstr "" + +#: includes/admin/dialogs.php:184 +msgid "Thank you for using WP-Members" +msgstr "" + +#: includes/admin/dialogs.php:185 +msgid "A plugin developed by" +msgstr "" + +#: includes/admin/dialogs.php:186 +msgid "Follow" +msgstr "" + +#: includes/admin/dialogs.php:203 includes/admin/dialogs.php:207 +msgid "Latest from RocketGeek" +msgstr "" + +#: includes/admin/dialogs.php:224 +msgid "Like WP-Members?" +msgstr "" + +#: includes/admin/dialogs.php:225 +#, php-format +msgid "" +"If you like WP-Members please give it a %s★★★★★" +"%s rating. Thanks!!" +msgstr "" + +#: includes/admin/dialogs.php:236 includes/admin/dialogs.php:249 +msgid "Latest from ButlerBlog" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:67 +#, php-format +msgid "See the %sUsers Guide on CAPTCHA%s." +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:74 +#: includes/admin/tabs/class-wp-members-admin-tab-dialogs.php:57 +#: includes/admin/tabs/class-wp-members-admin-tab-emails.php:109 +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:134 +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:78 +msgid "Need help?" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:85 +msgid "Manage CAPTCHA Options" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:91 +msgid "CAPTCHA Type" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:96 +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:243 +msgid "reCAPTCHA v2" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:97 +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:244 +msgid "reCAPTCHA v3" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:98 +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:245 +msgid "Really Simple CAPTCHA" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:99 +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:246 +msgid "hCaptcha" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:106 +msgid "" +"CAPTCHA type was changed. Please verify and update the settings below for " +"the new CAPTCHA type." +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:117 +msgid "reCAPTCHA Keys" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:120 +#, php-format +msgid "" +"reCAPTCHA requires an API key, consisting of a \"site\" and a \"secret\" " +"key. You can sign up for a %s free reCAPTCHA key%s" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:122 +msgid "Site Key" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:123 +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:139 +msgid "Secret Key" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:133 +msgid "hCaptcha Keys" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:136 +#, php-format +msgid "" +"hCaptcha requires an API key. You can sign up for %s an hCaptcha API key " +"here %s" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:138 +msgid "API Key" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:170 +msgid "Characters for image" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:174 +msgid "Number of characters" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:178 +msgid "Image dimensions" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:179 +msgid "Width" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:179 +msgid "Height" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:182 +msgid "Font color of characters" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:186 +msgid "Background color of image" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:190 +msgid "Font size" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:194 +msgid "Width between characters" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:198 +msgid "Image type" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:213 +msgid "" +"To use Really Simple CAPTCHA, you must have the Really Simple CAPTCHA plugin " +"installed and activated." +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:241 +msgid "Update CAPTCHA Settings" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-captcha.php:319 +msgid "CAPTCHA was updated for WP-Members" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-dialogs.php:67 +msgid "Dialogs and Error Messages" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-dialogs.php:69 +#, php-format +msgid "" +"You can customize the text for dialogs and error messages. Simple HTML is " +"allowed %s etc." +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-dialogs.php:80 +msgid "Terms of Service (TOS)" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-dialogs.php:87 +msgid "Update Dialogs" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-dialogs.php:124 +msgid "WP-Members dialogs were updated" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-dropins.php:88 +#: includes/admin/tabs/class-wp-members-dropins-table.php:180 +msgid "WP-Members Dropin settings were updated" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-dropins.php:216 +msgid "Manage Dropins" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-dropins.php:217 +msgid "Current dropin folder: " +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-dropins.php:218 +msgid "" +"You can change location of the dropin folder using the " +"wpmem_dropin_folder filter." +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-emails.php:57 +msgid "Email Messages" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-emails.php:60 +msgid "You can customize the content of the emails sent by the plugin." +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-emails.php:62 +msgid "A list of shortcodes is available here." +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-emails.php:69 +msgid "Set a custom email address" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-emails.php:70 +#: includes/admin/tabs/class-wp-members-admin-tab-emails.php:74 +#: includes/admin/tabs/class-wp-members-admin-tab-emails.php:93 +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:163 +msgid "(optional)" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-emails.php:73 +msgid "Set a custom email name" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-emails.php:77 +msgid "Send HTML email" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-emails.php:93 +msgid "Email Signature" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-emails.php:101 +msgid "Update Emails" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-emails.php:172 +msgid "WP-Members emails were updated" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:93 +#: includes/class-wp-members-dialogs.php:65 +msgid "No fields selected for deletion" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:95 +msgid "Are you sure you want to delete the following fields?" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:122 +msgid "Fields deleted" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:136 +msgid "Field Manager Documentation" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:164 +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:315 +#: includes/class-wp-members-forms.php:1629 +#: includes/class-wp-members-forms.php:1821 +#: includes/class-wp-members-user-profile.php:181 +msgid "(required)" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:169 +msgid "Edit Field" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:169 +msgid "Add a Field" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:174 +msgid "Field Label" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:176 +msgid "The name of the field as it will be displayed to the user." +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:179 +#: includes/admin/tabs/class-wp-members-fields-table.php:58 +msgid "Meta Key" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:185 +msgid "" +"The database meta value for the field. It must be unique and contain no " +"spaces (underscores are ok)." +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:189 +#: includes/admin/tabs/class-wp-members-fields-table.php:59 +msgid "Field Type" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:195 +msgid "text" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:196 +msgid "email" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:197 +msgid "textarea" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:198 +msgid "checkbox" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:199 +msgid "multiple checkbox" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:200 +msgid "select (dropdown)" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:201 +msgid "multiple select" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:202 +msgid "radio group" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:203 +msgid "password" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:204 +msgid "image" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:205 +msgid "file" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:206 +msgid "url" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:207 +msgid "number" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:208 +msgid "date" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:209 +msgid "hidden" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:211 +msgid "membership" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:217 +#: includes/admin/tabs/class-wp-members-fields-table.php:60 +msgid "Display?" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:221 +msgid "This field is always displayed" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:226 +msgid "Required?" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:230 +msgid "This field is always required" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:236 +msgid "Allow HTML?" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:243 +msgid "Placeholder" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:251 +msgid "Pattern" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:259 +msgid "Title" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:268 +msgid "Minimum Value" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:272 +msgid "Maximum Value" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:280 +msgid "Rows" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:284 +msgid "Columns" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:292 +msgid "Accepted file types:" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:297 +msgid "Accepted file types should be set like this: jpg|jpeg|png|gif" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:304 +msgid "Checked by default?" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:308 +msgid "HTML label position" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:310 +msgid "Before the input tag" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:311 +msgid "After the input tag" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:312 +msgid "" +"Selecting \"after\" will generally display the label to the right of the " +"checkbox" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:315 +msgid "Stored value if checked:" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:336 +msgid "Stored values delimiter:" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:345 +msgid "Values (Displayed|Stored):" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:370 +msgid "Options should be Option Name|option_value," +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:374 +msgid "Visit plugin site for more information" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:381 +msgid "Value" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:400 +msgid "Save Changes" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:400 +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:527 +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:528 +msgid "Add Field" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:402 +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:726 +msgid "Return to Fields Table" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:449 +msgid "Drag and drop to reorder fields" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:455 +msgid "Registration Date" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:458 +msgid "Registration IP" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:459 +msgid "Subscription Type" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:495 +msgid "Manage Fields" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:595 +msgid "WP-Members fields were updated" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:617 +msgid "Field Label is required. Nothing was updated." +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:618 +msgid "Meta Key is required. Nothing was updated." +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:620 +msgid "Meta Key must contain only letters, numbers, and underscores" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:627 +msgid "A field with that meta key already exists" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:632 +#, php-format +msgid "" +"Sorry, \"%s\" is a reserved term. " +"Field was not added." +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:673 +msgid "Checked value is required for checkboxes. Nothing was updated." +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:705 +msgid "A value is required for hidden fields. Nothing was updated." +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:712 +#, php-format +msgid "%s was added" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:725 +#, php-format +msgid "%s was updated" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-fields.php:768 +msgid "Form field order updated." +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:56 +#, php-format +msgid "%sChange%s or %sFilter%s this address" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:57 +#, php-format +msgid "See the %sUsers Guide on plugin options%s." +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:90 +msgid "Manage Options" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:94 +msgid "Content" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:105 +msgid "Content Restriction" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:109 +msgid "Do not restrict" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:123 +msgid "Show Excerpts" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:124 +msgid "Show Login Form" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:125 +msgid "Show Registration Form" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:126 +msgid "Auto Excerpt:" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:148 +msgid "Number of words in excerpt:" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:149 +msgid "Custom read more link (optional):" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:163 +msgid "Time-based expiration" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:163 +msgid "Allows for access to expire" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:164 +msgid "Trial period" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:164 +msgid "Allows for a trial period" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:166 +msgid "Subscription Settings" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:176 +msgid "New Feature Settings" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:182 +msgid "Legacy Password Reset" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:182 +#, php-format +msgid "Use legacy password reset. %s(Requires additional configuration)%s" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:184 +msgid "Legacy Login Error" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:184 +msgid "Use legacy WP-Members login error instead of WP error object." +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:187 +msgid "WooCommerce My Account" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:187 +msgid "Add WP-Members fields to WooCommerce My Account registration" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:188 +msgid "WooCommerce Checkout" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:188 +msgid "Add WP-Members fields to WooCommerce registration during checkout" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:204 +msgid "Other Settings" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:214 +msgid "Enable memberships" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:214 +#, php-format +msgid "Enables creation of different %s membership products %s" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:215 +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:223 +msgid "Clone menus" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:215 +msgid "Enables logged in menus" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:216 +msgid "Notify admin" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:216 +#, php-format +msgid "Notify %s for each new registration? %s" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:217 +msgid "Moderate registration" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:217 +msgid "Holds new registrations for admin approval" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:218 +msgid "Confirmation Link" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:218 +#, php-format +msgid "" +"Send email confirmation link on new registration. %s(Requires additional " +"configuration)%s" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:219 +msgid "Ignore warning messages" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:219 +msgid "Ignores WP-Members warning messages in the admin panel" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:233 +msgid "Attribution" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:235 +msgid "" +"Attribution is appreciated! Display \"powered by\" link on register form?" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:238 +msgid "Enable CAPTCHA for Registration" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:253 +msgid "Login Page:" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:256 +msgid "Specify a login page (optional)" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:265 +msgid "Register Page:" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:268 +msgid "For creating a register link in the login form" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:277 +msgid "User Profile Page:" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:280 +msgid "For creating a forgot password link in the login form" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:286 +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:288 +msgid "Stylesheet" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:297 +msgid "Custom Stylesheet:" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:302 +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:329 +msgid "Update Settings" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:310 +msgid "Custom Post Types" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:316 +msgid "Add to WP-Members Settings" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:332 +msgid "" +"Please keep in mind that Custom Post Types are \"custom\" and therefore, not " +"all of them will function exactly the same way. WP-Members will certainly " +"work with any post type that operate like a post or a page; but you will " +"need to review any custom post type added to determine that it functions the " +"way you expect." +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:342 +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:343 +msgid "WP-Members Settings" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:344 +msgid "" +"The following is your WP-Members settings information if needed for support." +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:378 +msgid "Click to Copy" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:458 +msgid "Custom Post Type settings were updated" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:579 +msgid "WP-Members settings were updated" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:651 +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:682 +msgid "USE CUSTOM URL BELOW" +msgstr "" + +#: includes/admin/tabs/class-wp-members-admin-tab-options.php:671 +msgid "Select a page" +msgstr "" + +#: includes/admin/tabs/class-wp-members-dropins-table.php:70 +msgid "Name" +msgstr "" + +#: includes/admin/tabs/class-wp-members-dropins-table.php:71 +msgid "Enabled" +msgstr "" + +#: includes/admin/tabs/class-wp-members-dropins-table.php:72 +msgid "File" +msgstr "" + +#: includes/admin/tabs/class-wp-members-dropins-table.php:73 +msgid "Version" +msgstr "" + +#: includes/admin/tabs/class-wp-members-dropins-table.php:74 +#: includes/walkers/class-wp-members-walker-nav-menu.php:186 +msgid "Description" +msgstr "" + +#: includes/admin/tabs/class-wp-members-dropins-table.php:117 +#: includes/admin/tabs/class-wp-members-fields-table.php:108 +msgid "Save Settings" +msgstr "" + +#: includes/admin/tabs/class-wp-members-fields-table.php:43 +msgid "delete" +msgstr "" + +#: includes/admin/tabs/class-wp-members-fields-table.php:57 +msgid "Display Label" +msgstr "" + +#: includes/admin/tabs/class-wp-members-fields-table.php:61 +msgid "Required" +msgstr "" + +#: includes/admin/tabs/class-wp-members-fields-table.php:63 +msgid "Users Screen" +msgstr "" + +#: includes/admin/tabs/class-wp-members-fields-table.php:64 +msgid "Users Search" +msgstr "" + +#: includes/admin/tabs/class-wp-members-fields-table.php:66 +msgid "Sort" +msgstr "" + +#: includes/admin/tabs/class-wp-members-fields-table.php:107 +msgid "Delete Selected" +msgstr "" + +#: includes/api/api-forms.php:584 +#, php-format +msgid "%s is a required field." +msgstr "" + +#: includes/class-wp-members-captcha.php:276 includes/deprecated.php:401 +msgid "You have entered an incorrect code value. Please try again." +msgstr "" + +#: includes/class-wp-members-dialogs.php:41 +msgid "First Name" +msgstr "" + +#: includes/class-wp-members-dialogs.php:42 +msgid "Last Name" +msgstr "" + +#: includes/class-wp-members-dialogs.php:43 +msgid "Address 1" +msgstr "" + +#: includes/class-wp-members-dialogs.php:44 +msgid "Address 2" +msgstr "" + +#: includes/class-wp-members-dialogs.php:45 +msgid "City" +msgstr "" + +#: includes/class-wp-members-dialogs.php:46 +msgid "State" +msgstr "" + +#: includes/class-wp-members-dialogs.php:47 +msgid "Zip" +msgstr "" + +#: includes/class-wp-members-dialogs.php:48 +msgid "Country" +msgstr "" + +#: includes/class-wp-members-dialogs.php:49 +msgid "Day Phone" +msgstr "" + +#: includes/class-wp-members-dialogs.php:50 +#: includes/class-wp-members-dialogs.php:92 +msgid "Email" +msgstr "" + +#: includes/class-wp-members-dialogs.php:51 +msgid "Confirm Email" +msgstr "" + +#: includes/class-wp-members-dialogs.php:52 +msgid "Website" +msgstr "" + +#: includes/class-wp-members-dialogs.php:53 +msgid "Biographical Info" +msgstr "" + +#: includes/class-wp-members-dialogs.php:54 +#: includes/class-wp-members-dialogs.php:74 +#: includes/class-wp-members-dialogs.php:159 +msgid "Password" +msgstr "" + +#: includes/class-wp-members-dialogs.php:55 +msgid "Confirm Password" +msgstr "" + +#: includes/class-wp-members-dialogs.php:56 +#: includes/class-wp-members-forms.php:2165 +msgid "TOS" +msgstr "" + +#: includes/class-wp-members-dialogs.php:66 +msgid "You are not logged in." +msgstr "" + +#: includes/class-wp-members-dialogs.php:72 +msgid "Existing Users Log In" +msgstr "" + +#: includes/class-wp-members-dialogs.php:73 +#: includes/class-wp-members-dialogs.php:158 +msgid "Username or Email" +msgstr "" + +#: includes/class-wp-members-dialogs.php:75 +#: includes/class-wp-members-shortcodes.php:773 +msgid "Log In" +msgstr "" + +#: includes/class-wp-members-dialogs.php:76 +msgid "Remember Me" +msgstr "" + +#: includes/class-wp-members-dialogs.php:77 +msgid "Forgot password?" +msgstr "" + +#: includes/class-wp-members-dialogs.php:78 +msgid "Click here to reset" +msgstr "" + +#: includes/class-wp-members-dialogs.php:79 +msgid "New User?" +msgstr "" + +#: includes/class-wp-members-dialogs.php:80 +msgid "Click here to register" +msgstr "" + +#: includes/class-wp-members-dialogs.php:83 +#: includes/class-wp-members-dialogs.php:142 +msgid "Change Password" +msgstr "" + +#: includes/class-wp-members-dialogs.php:84 +msgid "New password" +msgstr "" + +#: includes/class-wp-members-dialogs.php:85 +msgid "Confirm new password" +msgstr "" + +#: includes/class-wp-members-dialogs.php:86 +msgid "Update Password" +msgstr "" + +#: includes/class-wp-members-dialogs.php:87 +msgid "Password successfully changed!" +msgstr "" + +#: includes/class-wp-members-dialogs.php:90 +msgid "Reset Forgotten Password" +msgstr "" + +#: includes/class-wp-members-dialogs.php:93 +msgid "Reset Password" +msgstr "" + +#: includes/class-wp-members-dialogs.php:94 +msgid "Forgot username?" +msgstr "" + +#: includes/class-wp-members-dialogs.php:95 +msgid "Click here" +msgstr "" + +#: includes/class-wp-members-dialogs.php:98 +#: includes/class-wp-members-dialogs.php:100 +msgid "Retrieve username" +msgstr "" + +#: includes/class-wp-members-dialogs.php:99 +msgid "Email Address" +msgstr "" + +#: includes/class-wp-members-dialogs.php:103 +msgid "New User Registration" +msgstr "" + +#: includes/class-wp-members-dialogs.php:104 +msgid "Choose a Username" +msgstr "" + +#: includes/class-wp-members-dialogs.php:105 +msgid "Input the code:" +msgstr "" + +#: includes/class-wp-members-dialogs.php:106 +#: includes/class-wp-members-forms.php:2164 +#, php-format +msgid "Please indicate that you agree to the %s Terms of Service %s" +msgstr "" + +#: includes/class-wp-members-dialogs.php:107 +msgid "Reset Form" +msgstr "" + +#: includes/class-wp-members-dialogs.php:108 +#: includes/class-wp-members-dialogs.php:162 +#: includes/class-wp-members-shortcodes.php:770 +#: includes/class-wp-members-user.php:186 +msgid "Register" +msgstr "" + +#: includes/class-wp-members-dialogs.php:110 +msgid "Required field" +msgstr "" + +#: includes/class-wp-members-dialogs.php:113 +msgid "Edit Your Information" +msgstr "" + +#: includes/class-wp-members-dialogs.php:115 +msgid "Update Profile" +msgstr "" + +#: includes/class-wp-members-dialogs.php:116 +msgid "Update this file" +msgstr "" + +#: includes/class-wp-members-dialogs.php:119 +msgid "Login Failed!" +msgstr "" + +#: includes/class-wp-members-dialogs.php:120 +msgid "You entered an invalid username or password." +msgstr "" + +#: includes/class-wp-members-dialogs.php:121 +msgid "Click here to continue." +msgstr "" + +#: includes/class-wp-members-dialogs.php:122 +msgid "Password fields cannot be empty" +msgstr "" + +#: includes/class-wp-members-dialogs.php:123 +msgid "Sorry, that email address was not found." +msgstr "" + +#: includes/class-wp-members-dialogs.php:124 +#, php-format +msgid "An email was sent to %s with your username." +msgstr "" + +#: includes/class-wp-members-dialogs.php:125 +#, php-format +msgid "Sorry, %s is a required field." +msgstr "" + +#: includes/class-wp-members-dialogs.php:126 +msgid "You must enter a valid email address." +msgstr "" + +#: includes/class-wp-members-dialogs.php:127 +msgid "The username cannot include non-alphanumeric characters." +msgstr "" + +#: includes/class-wp-members-dialogs.php:128 +msgid "Sorry, username is a required field" +msgstr "" + +#: includes/class-wp-members-dialogs.php:129 +msgid "Sorry, that username is taken, Please try another." +msgstr "" + +#: includes/class-wp-members-dialogs.php:130 +msgid "Sorry, that email address already has an account. Please try another." +msgstr "" + +#: includes/class-wp-members-dialogs.php:131 +#: includes/class-wp-members-dialogs.php:174 +msgid "Passwords did not match." +msgstr "" + +#: includes/class-wp-members-dialogs.php:132 +msgid "Emails did not match." +msgstr "" + +#: includes/class-wp-members-dialogs.php:133 +msgid "You must complete the CAPTCHA form." +msgstr "" + +#: includes/class-wp-members-dialogs.php:134 +msgid "CAPTCHA was not valid." +msgstr "" + +#: includes/class-wp-members-dialogs.php:135 +msgid "There was an error processing the form." +msgstr "" + +#: includes/class-wp-members-dialogs.php:136 +msgid "There was an error with the CAPTCHA form." +msgstr "" + +#: includes/class-wp-members-dialogs.php:137 +#, php-format +msgid "" +"Sorry, you can only upload the following file types for the %s field: %s." +msgstr "" + +#: includes/class-wp-members-dialogs.php:138 +#: includes/class-wp-members-dialogs.php:171 +msgid "Your information was updated!" +msgstr "" + +#: includes/class-wp-members-dialogs.php:141 +msgid "Edit My Information" +msgstr "" + +#: includes/class-wp-members-dialogs.php:143 +#: includes/class-wp-members-dialogs.php:146 +#: includes/class-wp-members-dialogs.php:148 +#: includes/class-wp-members-dialogs.php:153 +#, php-format +msgid "You are logged in as %s" +msgstr "" + +#: includes/class-wp-members-dialogs.php:144 +msgid "Log out" +msgstr "" + +#: includes/class-wp-members-dialogs.php:145 +msgid "Edit profile" +msgstr "" + +#: includes/class-wp-members-dialogs.php:145 +msgid "Begin using the site." +msgstr "" + +#: includes/class-wp-members-dialogs.php:147 +msgid "Click to log out" +msgstr "" + +#: includes/class-wp-members-dialogs.php:149 +msgid "click to log out" +msgstr "" + +#: includes/class-wp-members-dialogs.php:150 +msgid "Log Out" +msgstr "" + +#: includes/class-wp-members-dialogs.php:154 +msgid "click here to log out" +msgstr "" + +#: includes/class-wp-members-dialogs.php:155 +msgid "Login Failed!
    You entered an invalid username or password." +msgstr "" + +#: includes/class-wp-members-dialogs.php:156 +msgid "Invalid username or password." +msgstr "" + +#: includes/class-wp-members-dialogs.php:160 includes/class-wp-members.php:1745 +msgid "log in" +msgstr "" + +#: includes/class-wp-members-dialogs.php:161 +msgid "Forgot?" +msgstr "" + +#: includes/class-wp-members-dialogs.php:165 +msgid "" +"This content is restricted to site members. If you are an existing user, " +"please log in. New users may register below." +msgstr "" + +#: includes/class-wp-members-dialogs.php:166 +msgid "" +"Congratulations! Your registration was successful.

    You may now " +"log in using the password that was emailed to you." +msgstr "" + +#: includes/class-wp-members-dialogs.php:169 +msgid "Sorry, that username is taken, please try another." +msgstr "" + +#: includes/class-wp-members-dialogs.php:170 +msgid "" +"Sorry, that email address already has an account.
    Please try another." +msgstr "" + +#: includes/class-wp-members-dialogs.php:175 +msgid "Password successfully changed." +msgstr "" + +#: includes/class-wp-members-dialogs.php:176 +msgid "Invalid username or email address." +msgstr "" + +#: includes/class-wp-members-dialogs.php:177 +msgid "" +"Password successfully reset! An email containing a new password has been " +"sent to the email address on file for your account." +msgstr "" + +#: includes/class-wp-members-dialogs.php:178 +msgid "" +"Reset request received. An email with instructions to complete the password " +"reset has been sent." +msgstr "" + +#: includes/class-wp-members-dialogs.php:180 +msgid "This content requires the following membership: " +msgstr "" + +#: includes/class-wp-members-dialogs.php:181 +msgid "This content requires one of the following memberships: " +msgstr "" + +#: includes/class-wp-members-forms.php:84 +#: includes/class-wp-members-forms.php:350 +msgid "Choose membership" +msgstr "" + +#: includes/class-wp-members-forms.php:1898 +#: includes/class-wp-members-user-profile.php:510 +msgid "Activate this user?" +msgstr "" + +#: includes/class-wp-members-forms.php:2165 templates/tos.php:20 +msgid "Terms of Service" +msgstr "" + +#: includes/class-wp-members-menus.php:131 +msgid "Display" +msgstr "" + +#: includes/class-wp-members-menus.php:139 +msgid "Logged In Users" +msgstr "" + +#: includes/class-wp-members-menus.php:146 +msgid "Logged Out Users" +msgstr "" + +#: includes/class-wp-members-menus.php:153 +msgid "All Users" +msgstr "" + +#: includes/class-wp-members-menus.php:167 +#, php-format +msgid "%sAdd membership products%s to restrict menu to a membership" +msgstr "" + +#: includes/class-wp-members-menus.php:169 +msgid "Restrict menu item to a membership product" +msgstr "" + +#: includes/class-wp-members-products.php:342 +#, php-format +msgid "All %s" +msgstr "" + +#: includes/class-wp-members-products.php:343 +#, php-format +msgid "Add New %s" +msgstr "" + +#: includes/class-wp-members-products.php:344 +msgid "Add New" +msgstr "" + +#: includes/class-wp-members-products.php:345 +#, php-format +msgid "New %s" +msgstr "" + +#: includes/class-wp-members-products.php:346 +#, php-format +msgid "Edit %s" +msgstr "" + +#: includes/class-wp-members-products.php:347 +#, php-format +msgid "Update %s" +msgstr "" + +#: includes/class-wp-members-products.php:348 +#: includes/class-wp-members-products.php:349 +#, php-format +msgid "View %s" +msgstr "" + +#: includes/class-wp-members-products.php:350 +#, php-format +msgid "Search %s" +msgstr "" + +#: includes/class-wp-members-products.php:351 +msgid "Not found" +msgstr "" + +#: includes/class-wp-members-products.php:352 +msgid "Not found in Trash" +msgstr "" + +#: includes/class-wp-members-products.php:353 +msgid "Insert into item" +msgstr "" + +#: includes/class-wp-members-products.php:354 +#, php-format +msgid "Save %s Details" +msgstr "" + +#: includes/class-wp-members-products.php:355 +msgid "Membership Attributes" +msgstr "" + +#: includes/class-wp-members-products.php:358 +msgid "Membership Product" +msgstr "" + +#: includes/class-wp-members-products.php:359 +msgid "WP-Members Membership Products" +msgstr "" + +#: includes/class-wp-members-pwd-reset.php:35 +#: includes/class-wp-members-pwd-reset.php:36 +msgid "" +"Sorry, no password reset key was found. Please check your email and try " +"again." +msgstr "" + +#: includes/class-wp-members-pwd-reset.php:37 +msgid "Sorry, the password reset key is expired." +msgstr "" + +#: includes/class-wp-members-pwd-reset.php:167 +msgid "The passwords do not match." +msgstr "" + +#: includes/class-wp-members-shortcodes.php:134 +msgid "" +"This is a generic message to display the form message dialog in the " +"Customizer." +msgstr "" + +#: includes/class-wp-members-shortcodes.php:699 +msgid "Click here to log out." +msgstr "" + +#: includes/class-wp-members-user-profile.php:58 +msgid "WP-Members Additional Fields" +msgstr "" + +#: includes/class-wp-members-user-profile.php:58 +msgid "Additional Information" +msgstr "" + +#: includes/class-wp-members-user-profile.php:500 +msgid "Reactivate this user?" +msgstr "" + +#: includes/class-wp-members-user-profile.php:505 +msgid "Deactivate this user?" +msgstr "" + +#: includes/class-wp-members-user-profile.php:559 +msgid "IP @ registration" +msgstr "" + +#: includes/class-wp-members-user.php:1171 +msgid "ERROR: User has not been activated." +msgstr "" + +#: includes/class-wp-members-validation-link.php:32 +msgid "Click to validate your account: " +msgstr "" + +#: includes/class-wp-members-validation-link.php:33 +msgid "Thank you for validating your account." +msgstr "" + +#: includes/class-wp-members-validation-link.php:34 +msgid "Validation key was expired or invalid" +msgstr "" + +#: includes/class-wp-members-validation-link.php:35 +msgid "Your account is now pending approval" +msgstr "" + +#: includes/class-wp-members-validation-link.php:284 +msgid "ERROR: User has not confirmed their account." +msgstr "" + +#: includes/class-wp-members-widget.php:24 +msgid "Displays the WP-Members sidebar login." +msgstr "" + +#: includes/class-wp-members-widget.php:39 +#: includes/class-wp-members-widget.php:82 +msgid "Login Status" +msgstr "" + +#: includes/class-wp-members-widget.php:46 +msgid "Title:" +msgstr "" + +#: includes/class-wp-members-widget.php:50 +msgid "Redirect to (optional):" +msgstr "" + +#: includes/class-wp-members.php:1087 includes/class-wp-members.php:1098 +msgid "You must be logged in to view this content." +msgstr "" + +#: includes/class-wp-members.php:1104 +msgid "The page you are looking for does not exist" +msgstr "" + +#: includes/class-wp-members.php:1352 +#, php-format +msgid "" +"You have a linked page in the WP-Members page settings that corresponds to a " +"post ID that no longer exists. Please %s review and update the %s page " +"settings %s." +msgstr "" + +#: includes/class-wp-members.php:1472 +msgid "Show forms as logged out" +msgstr "" + +#: includes/class-wp-members.php:1481 +msgid "Show form message dialog" +msgstr "" + +#: includes/class-wp-members.php:1558 +msgid "(more…)" +msgstr "" + +#: includes/class-wp-members.php:1746 +msgid "log out" +msgstr "" + +#: includes/cli/class-wp-members-cli-user.php:24 +#: includes/cli/class-wp-members-cli-user.php:62 +msgid "Moderated registration is not enabled in WP-Members options." +msgstr "" + +#: includes/cli/class-wp-members-cli-user.php:35 +msgid "User activated." +msgstr "" + +#: includes/cli/class-wp-members-cli-user.php:37 +msgid "Email notification sent to user." +msgstr "" + +#: includes/cli/class-wp-members-cli-user.php:40 +msgid "User is already activated." +msgstr "" + +#: includes/cli/class-wp-members-cli-user.php:67 +msgid "User deactivated." +msgstr "" + +#: includes/cli/class-wp-members-cli-user.php:88 +msgid "Invalid user ID. Please specify a valid user. Try `wp user list`." +msgstr "" + +#: includes/cli/class-wp-members-cli-user.php:91 +msgid "No user id specified. Must specify user id as --id=123" +msgstr "" + +#: includes/cli/class-wp-members-cli-user.php:208 +#, php-format +msgid "User: %s" +msgstr "" + +#: includes/cli/class-wp-members-cli-user.php:248 +#, php-format +msgid "User role: %s" +msgstr "" + +#: includes/deprecated.php:373 +msgid "We were unable to validate the public key." +msgstr "" + +#: includes/deprecated.php:377 +msgid "We were unable to validate the private key." +msgstr "" + +#: includes/deprecated.php:381 +msgid "The challenge parameter of the verify script was incorrect." +msgstr "" + +#: includes/deprecated.php:385 +msgid "The CAPTCHA solution was incorrect." +msgstr "" + +#: includes/deprecated.php:389 +msgid "The parameters to verify were incorrect" +msgstr "" + +#: includes/deprecated.php:393 +msgid "" +"reCAPTCHA API keys are tied to a specific domain name for security reasons." +msgstr "" + +#: includes/deprecated.php:397 +msgid "The reCAPTCHA server was not reached. Please try to resubmit." +msgstr "" + +#. translators: %s: title of menu item which is invalid +#: includes/walkers/class-wp-members-walker-nav-menu.php:92 +#, php-format +msgid "%s (Invalid)" +msgstr "" + +#. translators: %s: title of menu item in draft status +#: includes/walkers/class-wp-members-walker-nav-menu.php:96 +#, php-format +msgid "%s (Pending)" +msgstr "" + +#: includes/walkers/class-wp-members-walker-nav-menu.php:123 +msgid "Move up" +msgstr "" + +#: includes/walkers/class-wp-members-walker-nav-menu.php:136 +msgid "Move down" +msgstr "" + +#: includes/walkers/class-wp-members-walker-nav-menu.php:138 +msgid "Edit Menu Item" +msgstr "" + +#: includes/walkers/class-wp-members-walker-nav-menu.php:149 +msgid "URL" +msgstr "" + +#: includes/walkers/class-wp-members-walker-nav-menu.php:156 +msgid "Navigation Label" +msgstr "" + +#: includes/walkers/class-wp-members-walker-nav-menu.php:162 +msgid "Title Attribute" +msgstr "" + +#: includes/walkers/class-wp-members-walker-nav-menu.php:169 +msgid "Open link in a new window/tab" +msgstr "" + +#: includes/walkers/class-wp-members-walker-nav-menu.php:174 +msgid "CSS Classes (optional)" +msgstr "" + +#: includes/walkers/class-wp-members-walker-nav-menu.php:180 +msgid "Link Relationship (XFN)" +msgstr "" + +#: includes/walkers/class-wp-members-walker-nav-menu.php:188 +msgid "" +"The description will be displayed in the menu if the current theme supports " +"it." +msgstr "" + +#: includes/walkers/class-wp-members-walker-nav-menu.php:210 +#, php-format +msgid "Original: %s" +msgstr "" + +#: includes/walkers/class-wp-members-walker-nav-menu.php:223 +msgid "Remove" +msgstr "" + +#: templates/tos.php:32 +#, php-format +msgid "%sclose%s" +msgstr "" + +#: templates/tos.php:34 +#, php-format +msgid "%sprint%s" +msgstr "" + +#. Plugin Name of the plugin/theme +msgid "WP-Members" +msgstr "" + +#. Plugin URI of the plugin/theme +msgid "https://rocketgeek.com" +msgstr "" + +#. Description of the plugin/theme +msgid "" +"WP access restriction and user registration. For more information on plugin " +"features, refer to the online Users Guide. A Quick Start Guide is also available. WP-" +"Members(tm) is a trademark of butlerblog.com." +msgstr "" + +#. Author of the plugin/theme +msgid "Chad Butler" +msgstr "" + +#. Author URI of the plugin/theme +msgid "https://butlerblog.com/" +msgstr "" diff --git a/inc/class-wp-members-sortable-user-columns.php b/inc/class-wp-members-sortable-user-columns.php deleted file mode 100644 index 38ff2ba2..00000000 --- a/inc/class-wp-members-sortable-user-columns.php +++ /dev/null @@ -1,66 +0,0 @@ -args = ( is_array( $args ) ) ? $args : array(); - add_action( 'pre_user_query', array( &$this, 'query' ) ); - add_action( 'manage_users_custom_column', array( &$this, 'content' ), 10, 3 ); - add_filter( 'manage_users_columns', array( &$this, 'columns' ) ); - add_filter( 'manage_users_sortable_columns', array( &$this, 'sortable') ); - } - - function query( $query ) { - $vars = $query->query_vars; - if ( in_array( $vars['orderby'], $this->defaults ) ) { - return; - } - $title = $this->args[ $vars['orderby'] ]; - if ( ! empty( $title ) ) { - $query->query_from .= " LEFT JOIN wp_usermeta m ON (wp_users.ID = m.user_id AND m.meta_key = '" . $vars['orderby'] . "')"; - $query->query_orderby = "ORDER BY m.meta_value ".$vars['order']; - } - } - - function columns( $columns ) { - foreach ( $this->args as $key => $value ) { - $columns[ $key ] = $value; - } - return $columns; - } - - function sortable( $columns ) { - foreach ( $this->args as $key => $value ) { - $columns[ $key ] = $key; - } - return $columns; - } - - function content( $value, $column_name, $user_id ) { - $user = get_userdata( $user_id ); - return $user->$column_name; - } - -} \ No newline at end of file diff --git a/inc/class-wp-members-tinymce-buttons.php b/inc/class-wp-members-tinymce-buttons.php deleted file mode 100644 index 17afcf70..00000000 --- a/inc/class-wp-members-tinymce-buttons.php +++ /dev/null @@ -1,42 +0,0 @@ -=' ) ) { - $plugin_array['wpmem_shortcodes'] = WPMEM_DIR .'js/shortcodes_tinymce_4.js?ver=' . $ver; - } else { - $plugin_array['wpmem_shortcodes'] = WPMEM_DIR .'js/shortcodes_tinymce.js?ver=' . $ver; - } - return $plugin_array; - } - - function register_button( $buttons ) { - array_push( $buttons, "wpmem_shortcodes_button" ); - return $buttons; - } -} - -// End of File. \ No newline at end of file diff --git a/inc/class-wp-members-widget.php b/inc/class-wp-members-widget.php deleted file mode 100644 index a3a719ff..00000000 --- a/inc/class-wp-members-widget.php +++ /dev/null @@ -1,104 +0,0 @@ - 'wp-members', - 'description' => __( 'Displays the WP-Members sidebar login.', 'wp-members' ), - ) - ); - } - - /** - * Displays the WP-Members login widget settings - * controls on the widget panel. - * - * @param array $instance - */ - function form( $instance ) { - - /* Default widget settings. */ - $defaults = array( - 'title' => __('Login Status', 'wp-members'), - 'redirect_to' => '', - ); - $instance = wp_parse_args( ( array ) $instance, $defaults ); - - /* Title input */ ?> -

    - - -

    -

    - - -

    - '; - - /** - * Filter the widget title. - * - * @since ?.? - * - * @param string $title The widget title. - */ - echo $args['before_title'] . apply_filters( 'wpmem_widget_title', $title ) . $args['after_title']; - - // The Widget - if ( function_exists( 'wpmem' ) ) { wpmem_do_sidebar( $redirect_to ); } - - echo ''; - echo $args['after_widget']; - } -} \ No newline at end of file diff --git a/inc/class-wp-members.php b/inc/class-wp-members.php deleted file mode 100644 index 88963264..00000000 --- a/inc/class-wp-members.php +++ /dev/null @@ -1,425 +0,0 @@ -settings An array of the WP-Members settings. - */ - $settings = apply_filters( 'wpmem_settings', get_option( 'wpmembers_settings' ) ); - - // Validate that v3 settings are loaded. - if ( ! isset( $settings['version'] ) ) { - // If settings were not properly built during plugin upgrade. - require_once( WPMEM_PATH . 'wp-members-install.php' ); - $settings = apply_filters( 'wpmem_settings', wpmem_update_settings() ); - } - - // Assemble settings. - foreach ( $settings as $key => $val ) { - $this->$key = $val; - } - - // Set the stylesheet. - $this->cssurl = ( isset( $this->style ) && $this->style == 'use_custom' ) ? $this->cssurl : $this->style; - } - - /** - * Plugin initialization function to load shortcodes. - * - * @since 3.0.0 - */ - function load_shortcodes() { - - require_once( WPMEM_PATH . 'inc/shortcodes.php' ); - add_shortcode( 'wp-members', 'wpmem_shortcode' ); - add_shortcode( 'wpmem_field', 'wpmem_shortcode' ); - add_shortcode( 'wpmem_logged_in', 'wpmem_sc_logged_in' ); - add_shortcode( 'wpmem_logged_out', 'wpmem_sc_logged_out' ); - add_shortcode( 'wpmem_logout', 'wpmem_shortcode' ); - add_shortcode( 'wpmem_form', 'wpmem_sc_forms' ); - - /** - * Fires after shortcodes load (for adding additional custom shortcodes). - * - * @since 3.0.0 - */ - do_action( 'wpmem_load_shortcodes' ); - } - - /** - * Plugin initialization function to load hooks. - * - * @since 3.0.0 - */ - function load_hooks() { - - // Add actions. - add_action( 'init', array( $this, 'get_action' ) ); - add_action( 'widgets_init', 'widget_wpmemwidget_init' ); // initializes the widget - add_action( 'admin_init', 'wpmem_chk_admin' ); // check user role to load correct dashboard - add_action( 'admin_menu', 'wpmem_admin_options' ); // adds admin menu - add_action( 'user_register', 'wpmem_wp_reg_finalize' ); // handles wp native registration - add_action( 'login_enqueue_scripts', 'wpmem_wplogin_stylesheet' ); // styles the native registration - add_action( 'wp_print_styles', 'wpmem_enqueue_style' ); // load the stylesheet if using the new forms - - // Add filters. - add_filter( 'the_content', array( $this, 'do_securify' ), 1, 1 ); - add_filter( 'allow_password_reset', 'wpmem_no_reset' ); // no password reset for non-activated users - add_filter( 'register_form', 'wpmem_wp_register_form' ); // adds fields to the default wp registration - add_filter( 'registration_errors', 'wpmem_wp_reg_validate', 10, 3 ); // native registration validation - add_filter( 'comments_open', 'wpmem_securify_comments', 20, 1 ); // securifies the comments - - // If registration is moderated, check for activation (blocks backend login by non-activated users). - if ( $this->mod_reg == 1 ) { - add_filter( 'authenticate', 'wpmem_check_activated', 99, 3 ); - } - - /** - * Fires after action and filter hooks load (for adding/removing hooks). - * - * @since 3.0.0 - */ - do_action( 'wpmem_load_hooks' ); - } - - /** - * Load drop-ins. - * - * @since 3.0.0 - * - * @todo This is experimental. The function and its operation is subject to change. - */ - function load_dropins() { - - /** - * Filters the dropin file folder. - * - * @since 3.0.0 - * - * @param string $folder The dropin file folder. - */ - $folder = apply_filters( 'wpmem_dropin_folder', WP_PLUGIN_DIR . '/wp-members-dropins/' ); - - // Load any drop-ins. - foreach ( glob( $folder . '*.php' ) as $filename ) { - include_once( $filename ); - } - - /** - * Fires after dropins load (for adding additional dropings). - * - * @since 3.0.0 - */ - do_action( 'wpmem_load_dropins' ); - } - - /** - * Loads pre-3.0 constants (included primarily for add-on compatibility). - * - * @since 3.0 - */ - function load_constants() { - ( ! defined( 'WPMEM_BLOCK_POSTS' ) ) ? define( 'WPMEM_BLOCK_POSTS', $this->block['post'] ) : ''; - ( ! defined( 'WPMEM_BLOCK_PAGES' ) ) ? define( 'WPMEM_BLOCK_PAGES', $this->block['page'] ) : ''; - ( ! defined( 'WPMEM_SHOW_EXCERPT' ) ) ? define( 'WPMEM_SHOW_EXCERPT', $this->show_excerpt['post'] ) : ''; - ( ! defined( 'WPMEM_NOTIFY_ADMIN' ) ) ? define( 'WPMEM_NOTIFY_ADMIN', $this->notify ) : ''; - ( ! defined( 'WPMEM_MOD_REG' ) ) ? define( 'WPMEM_MOD_REG', $this->mod_reg ) : ''; - ( ! defined( 'WPMEM_CAPTCHA' ) ) ? define( 'WPMEM_CAPTCHA', $this->captcha ) : ''; - ( ! defined( 'WPMEM_NO_REG' ) ) ? define( 'WPMEM_NO_REG', ( -1 * $this->show_reg['post'] ) ) : ''; - ( ! defined( 'WPMEM_USE_EXP' ) ) ? define( 'WPMEM_USE_EXP', $this->use_exp ) : ''; - ( ! defined( 'WPMEM_USE_TRL' ) ) ? define( 'WPMEM_USE_TRL', $this->use_trial ) : ''; - ( ! defined( 'WPMEM_IGNORE_WARN' ) ) ? define( 'WPMEM_IGNORE_WARN', $this->warnings ) : ''; - - ( ! defined( 'WPMEM_MSURL' ) ) ? define( 'WPMEM_MSURL', $this->user_pages['profile'] ) : ''; - ( ! defined( 'WPMEM_REGURL' ) ) ? define( 'WPMEM_REGURL', $this->user_pages['register'] ) : ''; - ( ! defined( 'WPMEM_LOGURL' ) ) ? define( 'WPMEM_LOGURL', $this->user_pages['login'] ) : ''; - - define( 'WPMEM_CSSURL', $this->cssurl ); - } - - /** - * Gets the requested action. - * - * @since 3.0.0 - */ - function get_action() { - - // Get the action being done (if any). - $this->action = ( isset( $_REQUEST['a'] ) ) ? trim( $_REQUEST['a'] ) : ''; - - // Get the regchk value (if any). - $this->regchk = $this->get_regchk( $this->action ); - } - - /** - * Gets the regchk value. - * - * @since 3.0.0 - * - * @param string $action The action being done. - * @return string The regchk value. - * - * @todo Describe regchk. - */ - function get_regchk( $action ) { - - switch ( $action ) { - - case 'login': - $regchk = wpmem_login(); - break; - - case 'logout': - $regchk = wpmem_logout(); - break; - - case 'pwdchange': - $regchk = wpmem_change_password(); - break; - - case 'pwdreset': - $regchk = wpmem_reset_password(); - break; - - case 'register': - case 'update': - require_once( WPMEM_PATH . 'inc/register.php' ); - $regchk = wpmem_registration( $action ); - break; - - default: - $regchk = ( isset( $regchk ) ) ? $regchk : ''; - break; - } - - /** - * Filter wpmem_regchk. - * - * The value of regchk is determined by functions that may be run in the get_regchk function. - * This value determines what happens in the wpmem_securify() function. - * - * @since 2.9.0 - * - * @param string $this->regchk The value of wpmem_regchk. - * @param string $this->action The $wpmem_a action. - */ - $regchk = apply_filters( 'wpmem_regchk', $regchk, $action ); - - // @todo Remove legacy global variable. - global $wpmem_regchk; - $wpmem_regchk = $regchk; - - return $regchk; - } - - /** - * Determines if content should be blocked. - * - * This function was originally stand alone in the core file and - * was moved to the WP_Members class in 3.0. - * - * @since 3.0 - * - * @return bool $block true|false - */ - function is_blocked() { - - global $post; - - // Backward compatibility for old block/unblock meta. - $meta = get_post_meta( $post->ID, '_wpmem_block', true ); - if ( ! $meta ) { - // Check for old meta. - $old_block = get_post_meta( $post->ID, 'block', true ); - $old_unblock = get_post_meta( $post->ID, 'unblock', true ); - $meta = ( $old_block ) ? 1 : ( ( $old_unblock ) ? 0 : $meta ); - } - - // Setup defaults. - $defaults = array( - 'post_id' => $post->ID, - 'post_type' => $post->post_type, - 'block' => ( isset( $this->block[ $post->post_type ] ) && $this->block[ $post->post_type ] == 1 ) ? true : false, - 'block_meta' => $meta, // @todo get_post_meta( $post->ID, '_wpmem_block', true ), - 'block_type' => ( $post->post_type == 'post' ) ? $this->block['post'] : ( ( $post->post_type == 'page' ) ? $this->block['page'] : 0 ), - ); - - /** - * Filter the block arguments. - * - * @since 2.9.8 - * - * @param array $args Null. - * @param array $defaults Although you are not filtering the defaults, knowing what they are can assist developing more powerful functions. - */ - $args = apply_filters( 'wpmem_block_args', '', $defaults ); - - // Merge $args with defaults. - $args = ( wp_parse_args( $args, $defaults ) ); - - if ( is_single() || is_page() ) { - switch( $args['block_type'] ) { - case 1: // If content is blocked by default. - $args['block'] = ( $args['block_meta'] == '0' ) ? false : $args['block']; - break; - case 0 : // If content is unblocked by default. - $args['block'] = ( $args['block_meta'] == '1' ) ? true : $args['block']; - break; - } - } else { - - $args['block'] = false; - - } - - /** - * Filter the block boolean. - * - * @since 2.7.5 - * - * @param bool $args['block'] - * @param array $args - */ - return apply_filters( 'wpmem_block', $args['block'], $args ); - } - - /** - * The Securify Content Filter. - * - * This is the primary function that picks up where get_action() leaves off. - * Determines whether content is shown or hidden for both post and pages. - * - * @since 3.0 - * - * @global string $wpmem_themsg Contains messages to be output. - * @global string $wpmem_captcha_err Contains error message for reCAPTCHA. - * @global object $post The post object. - * @param string $content - * @return string $content - */ - function do_securify( $content = null ) { - - global $wpmem_themsg, $post; - - $content = ( is_single() || is_page() ) ? $content : wpmem_do_excerpt( $content ); - - if ( ( ! wpmem_test_shortcode( $content, 'wp-members' ) ) ) { - - if ( $this->regchk == "captcha" ) { - global $wpmem_captcha_err; - $wpmem_themsg = __( 'There was an error with the CAPTCHA form.' ) . '

    ' . $wpmem_captcha_err; - } - - // Block/unblock Posts. - if ( ! is_user_logged_in() && $this->is_blocked() == true ) { - - include_once( WPMEM_PATH . 'inc/dialogs.php' ); - - //Show the login and registration forms. - if ( $this->regchk ) { - - // Empty content in any of these scenarios. - $content = ''; - - switch ( $this->regchk ) { - - case "loginfailed": - $content = wpmem_inc_loginfailed(); - break; - - case "success": - $content = wpmem_inc_regmessage( $this->regchk, $wpmem_themsg ); - $content = $content . wpmem_inc_login(); - break; - - default: - $content = wpmem_inc_regmessage( $this->regchk, $wpmem_themsg ); - $content = $content . wpmem_inc_registration(); - break; - } - - } else { - - // Toggle shows excerpt above login/reg on posts/pages. - global $wp_query; - if ( isset( $wp_query->query_vars['page'] ) && $wp_query->query_vars['page'] > 1 ) { - - // Shuts down excerpts on multipage posts if not on first page. - $content = ''; - - } elseif ( $this->show_excerpt[ $post->post_type ] == 1 ) { - - if ( ! stristr( $content, 'show_login[ $post->post_type ] == 1 ) ? $content . wpmem_inc_login() : $content . wpmem_inc_login( 'page', '', 'hide' ); - - $content = ( $this->show_reg[ $post->post_type ] == 1 ) ? $content . wpmem_inc_registration() : $content; - } - - // Protects comments if expiration module is used and user is expired. - } elseif ( is_user_logged_in() && $this->is_blocked() == true ){ - - $content = ( $this->use_exp == 1 && function_exists( 'wpmem_do_expmessage' ) ) ? wpmem_do_expmessage( $content ) : $content; - - } - } - - /** - * Filter the value of $content after wpmem_securify has run. - * - * @since 2.7.7 - * - * @param string $content The content after securify has run. - */ - $content = apply_filters( 'wpmem_securify', $content ); - - if ( strstr( $content, '[wpmem_txt]' ) ) { - // Fix the wptexturize. - remove_filter( 'the_content', 'wpautop' ); - remove_filter( 'the_content', 'wptexturize' ); - add_filter( 'the_content', 'wpmem_texturize', 99 ); - } - - return $content; - - } - - /** - * Returns the registration fields. - * - * @since 3.0.0 - * - * @return array The registration fields. - */ - function load_fields() { - $this->fields = get_option( 'wpmembers_fields' ); - } - -} \ No newline at end of file diff --git a/inc/core.php b/inc/core.php deleted file mode 100644 index 9164806c..00000000 --- a/inc/core.php +++ /dev/null @@ -1,584 +0,0 @@ -get_action(); -} - - -if ( ! function_exists( 'wpmem_securify' ) ): -/** - * The Securify Content Filter. - * - * This is the primary function that picks up where wpmem() leaves off. - * Determines whether content is shown or hidden for both post and pages. - * Since 3.0, this function is a wrapper for do_securify(). - * - * @since 2.0 - * - * @global object $wpmem - * @param string $content - * @return string $content - */ -function wpmem_securify( $content = null ) { - global $wpmem; - return $wpmem->do_securify( $content ); -} -endif; - - -if ( ! function_exists( 'wpmem_block' ) ): -/** - * Determines if content should be blocked. - * - * Since 3.0, this function is a wrapper for is_blocked(). - * - * @since 2.6 - * - * @return bool $block true|false - */ -function wpmem_block() { - global $wpmem; - return $wpmem->is_blocked(); -} -endif; - - -if ( ! function_exists( 'wpmem_check_activated' ) ): -/** - * Checks if a user is activated. - * - * @since 2.7.1 - * - * @uses wp_check_password - * @param int $user - * @param string $username - * @param string $password - * @return int $user - */ -function wpmem_check_activated( $user, $username, $password ) { - - // Password must be validated. - $pass = ( ( ! is_wp_error( $user ) ) && $password ) ? wp_check_password( $password, $user->user_pass, $user->ID ) : false; - - if ( ! $pass ) { - return $user; - } - - // Activation flag must be validated. - $active = get_user_meta( $user->ID, 'active', true ); - if ( $active != 1 ) { - return new WP_Error( 'authentication_failed', __( 'ERROR: User has not been activated.', 'wp-members' ) ); - } - - // If the user is validated, return the $user object. - return $user; -} -endif; - - -if ( ! function_exists( 'wpmem_login' ) ): -/** - * Logs in the user. - * - * Logs in the the user using wp_signon (since 2.5.2). If login is - * successful, it will set a cookie using wp_set_auth_cookie (since 2.7.7), - * then it redirects and exits; otherwise "loginfailed" is returned. - * - * @since 0.1 - * - * @uses wp_signon - * @uses wp_set_auth_cookie - * @uses wp_redirect Redirects to $redirect_to if login is successful. - * @return string Returns "loginfailed" if the login fails. - */ -function wpmem_login() { - - if ( $_POST['log'] && $_POST['pwd'] ) { - - // Get username and sanitize. - $user_login = sanitize_user( $_POST['log'] ); - - // Are we setting a forever cookie? - $rememberme = ( isset( $_POST['rememberme'] ) == 'forever' ) ? true : false; - - // Assemble login credentials. - $creds = array(); - $creds['user_login'] = $user_login; - $creds['user_password'] = $_POST['pwd']; - $creds['remember'] = $rememberme; - - // Log in the user and get the user object. - $user = wp_signon( $creds, is_ssl() ); - - // If no error, user is a valid signon. continue. - if ( ! is_wp_error( $user ) ) { - - // Determine where to put the user after login. - if ( isset( $_POST['redirect_to'] ) ) { - $redirect_to = trim( $_POST['redirect_to'] ); - } else { - $redirect_to = $_SERVER['REQUEST_URI'] . ( ( isset( $_SERVER['QUERY_STRING'] ) ) ? $_SERVER['QUERY_STRING'] : '' ); - } - - /** - * Filter the redirect url. - * - * @since 2.7.7 - * - * @param string $redirect_to The url to direct to. - * @param int $user->ID The user's primary key ID. - */ - $redirect_to = apply_filters( 'wpmem_login_redirect', $redirect_to, $user->ID ); - - // And do the redirect. - wp_redirect( $redirect_to ); - - // wp_redirect requires us to exit() - exit(); - - } else { - - return "loginfailed"; - } - - } else { - // Login failed. - return "loginfailed"; - } -} // End of login function. -endif; - - -if ( ! function_exists( 'wpmem_logout' ) ): -/** - * Logs the user out then redirects. - * - * @since 2.0 - * - * @uses wp_clearcookie - * @uses wp_logout - * @uses nocache_headers - * @uses wp_redirect - * @param string $redirect_to The URL to redirect to at logout. - */ -function wpmem_logout( $redirect_to = null ) { - - // Default redirect URL. - $redirect_to = ( $redirect_to ) ? $redirect_to : get_bloginfo( 'url' ); - - /** - * Filter where the user goes when logged out. - * - * @since 2.7.1 - * - * @param string The blog home page. - */ - $redirect_to = apply_filters( 'wpmem_logout_redirect', $redirect_to ); - - wp_clear_auth_cookie(); - - // This action is defined in /wp-includes/pluggable.php. - do_action( 'wp_logout' ); - - nocache_headers(); - - wp_redirect( $redirect_to ); - exit(); -} -endif; - - -if ( ! function_exists( 'wpmem_login_status' ) ): -/** - * Displays the user's login status. - * - * @since 2.0 - * - * @uses wpmem_inc_memberlinks() - * @param boolean $echo Determines whether function should print result or not (default: true). - * @return string $status The user status string produced by wpmem_inc_memberlinks(). - */ -function wpmem_login_status( $echo = true ) { - - include_once( WPMEM_PATH . 'inc/dialogs.php' ); - if ( is_user_logged_in() ) { - $status = wpmem_inc_memberlinks( 'status' ); - if ( $echo ) { - echo $status; - } - return $status; - } -} -endif; - - -if ( ! function_exists( 'wpmem_inc_sidebar' ) ): -/** - * Displays the sidebar. - * - * This function is a wrapper for wpmem_do_sidebar(). - * - * @since 2.0 - * - * @uses wpmem_do_sidebar() - */ -function wpmem_inc_sidebar() { - include_once( WPMEM_PATH . 'inc/sidebar.php' ); - wpmem_do_sidebar(); -} -endif; - - -if ( ! function_exists( 'widget_wpmemwidget_init' ) ): -/** - * Initializes the widget. - * - * @since 2.0 - * - * @uses register_widget - */ -function widget_wpmemwidget_init() { - include_once( WPMEM_PATH . 'inc/class-wp-members-widget.php' ); - include_once( WPMEM_PATH . 'inc/sidebar.php' ); - register_widget( 'widget_wpmemwidget' ); -} -endif; - - -if ( ! function_exists( 'wpmem_change_password' ) ): -/** - * Handles user password change (not reset). - * - * @since 2.1 - * - * @global $user_ID - * @return string the value for $wpmem->regchk - */ -function wpmem_change_password() { - - global $user_ID; - if ( isset( $_POST['formsubmit'] ) ) { - - $pass1 = trim( $_POST['pass1'] ); - $pass2 = trim( $_POST['pass2'] ); - - if ( ! $pass1 && ! $pass2 ) { // Check for both fields being empty. - - return "pwdchangempty"; - - } elseif ( $pass1 != $pass2 ) { // Make sure the fields match. - - return "pwdchangerr"; - - } else { // Update password in db (wp_update_user hashes the password). - - wp_update_user( array ( 'ID' => $user_ID, 'user_pass' => $pass1 ) ); - - /** - * Fires after password change. - * - * @since 2.9.0 - * - * @param int $user_ID The user's numeric ID. - */ - do_action( 'wpmem_pwd_change', $user_ID ); - - return "pwdchangesuccess"; - - } - } - return; -} -endif; - - -if ( ! function_exists( 'wpmem_reset_password' ) ): -/** - * Resets a forgotten password. - * - * @since 2.1 - * - * @uses wp_generate_password - * @uses wp_update_user - * @return string value for $wpmem->regchk - */ -function wpmem_reset_password() { - - global $wpmem; - - if ( isset( $_POST['formsubmit'] ) ) { - - /** - * Filter the password reset arguments. - * - * @since 2.7.1 - * - * @param array The username and email. - */ - $arr = apply_filters( 'wpmem_pwdreset_args', array( - 'user' => ( isset( $_POST['user'] ) ) ? trim( $_POST['user'] ) : '', - 'email' => ( isset( $_POST['email'] ) ) ? trim( $_POST['email'] ) : '', - ) ); - - if ( ! $arr['user'] || ! $arr['email'] ) { - - // There was an empty field. - return "pwdreseterr"; - - } else { - - if ( username_exists( $arr['user'] ) ) { - - $user = get_user_by( 'login', $arr['user'] ); - - if ( strtolower( $user->user_email ) !== strtolower( $arr['email'] ) || ( ( $wpmem->mod_reg == 1 ) && ( get_user_meta( $user->ID,'active', true ) != 1 ) ) ) { - // The username was there, but the email did not match OR the user hasn't been activated. - return "pwdreseterr"; - - } else { - - // Generate a new password. - $new_pass = wp_generate_password(); - - // Update the users password. - wp_update_user( array ( 'ID' => $user->ID, 'user_pass' => $new_pass ) ); - - // Send it in an email. - require_once( WPMEM_PATH . 'inc/email.php' ); - wpmem_inc_regemail( $user->ID, $new_pass, 3 ); - - /** - * Fires after password reset. - * - * @since 2.9.0 - * - * @param int $user_ID The user's numeric ID. - */ - do_action( 'wpmem_pwd_reset', $user->ID ); - - return "pwdresetsuccess"; - } - } else { - - // Username did not exist. - return "pwdreseterr"; - } - } - } - return; -} -endif; - - -if ( ! function_exists( 'wpmem_no_reset' ) ): -/** - * Keeps users not activated from resetting their password - * via wp-login when using registration moderation. - * - * @since 2.5.1 - * - * @return bool - */ -function wpmem_no_reset() { - - global $wpmem; - - if ( strpos( $_POST['user_login'], '@' ) ) { - $user = get_user_by( 'email', trim( $_POST['user_login'] ) ); - } else { - $username = trim( $_POST['user_login'] ); - $user = get_user_by( 'login', $username ); - } - - if ( $wmem->mod_reg == 1 ) { - if ( get_user_meta( $user->ID, 'active', true ) != 1 ) { - return false; - } - } - - return true; -} -endif; - - -/** - * Add registration fields to the native WP registration. - * - * @since 2.8.3 - */ -function wpmem_wp_register_form() { - include_once( WPMEM_PATH . 'inc/wp-registration.php' ); - wpmem_do_wp_register_form(); -} - - -/** - * Validates registration fields in the native WP registration. - * - * @since 2.8.3 - * - * @param $errors - * @param $sanatized_user_login - * @param $user_email - * @return $errors - */ -function wpmem_wp_reg_validate( $errors, $sanitized_user_login, $user_email ) { - - global $wpmem; - $wpmem_fields = $wpmem->fields; //get_option( 'wpmembers_fields' ); - $exclude = wpmem_get_excluded_meta( 'register' ); - - foreach ( $wpmem_fields as $field ) { - $is_error = false; - if ( $field[5] == 'y' && $field[2] != 'user_email' && ! in_array( $field[2], $exclude ) ) { - if ( ( $field[3] == 'checkbox' ) && ( ! isset( $_POST[$field[2]] ) ) ) { - $is_error = true; - } - if ( ( $field[3] != 'checkbox' ) && ( ! $_POST[$field[2]] ) ) { - $is_error = true; - } - if ( $is_error ) { $errors->add( 'wpmem_error', sprintf( __('Sorry, %s is a required field.', 'wp-members'), $field[1] ) ); } - } - } - - return $errors; -} - - -/** - * Inserts registration data from the native WP registration. - * - * @since 2.8.3 - * - * @param $user_id - */ -function wpmem_wp_reg_finalize( $user_id ) { - - global $wpmem; - $native_reg = ( isset( $_POST['wp-submit'] ) && $_POST['wp-submit'] == esc_attr( __( 'Register' ) ) ) ? true : false; - $add_new = ( isset( $_POST['action'] ) && $_POST['action'] == 'createuser' ) ? true : false; - if ( $native_reg || $add_new ) { - // Get the fields. - $wpmem_fields = $wpmem->fields; //get_option( 'wpmembers_fields' ); - // Get any excluded meta fields. - $exclude = wpmem_get_excluded_meta( 'register' ); - foreach ( $wpmem_fields as $meta ) { - if ( isset( $_POST[$meta[2]] ) && ! in_array( $meta[2], $exclude ) ) { - update_user_meta( $user_id, $meta[2], sanitize_text_field( $_POST[$meta[2]] ) ); - } - } - } - return; -} - - -/** - * Loads the stylesheet for backend registration. - * - * @since 2.8.7 - */ -function wpmem_wplogin_stylesheet() { - echo ''; -} - - -/** - * Securifies the comments. - * - * If the user is not logged in and the content is blocked - * (i.e. wpmem_block() returns true), function loads a - * dummy/empty comments template. - * - * @since 2.9.9 - * - * @return bool $open Whether the current post is open for comments. - */ -function wpmem_securify_comments( $open ) { - - $open = ( ! is_user_logged_in() && wpmem_block() ) ? false : $open; - - /** - * Filters whether comments are open or not. - * - * @since 3.0.0 - * - * @param bool $open Whether the current post is open for comments. - */ - $open = apply_filters( 'wpmem_securify_comments', $open ); - - if ( ! $open ) { - add_filter( 'comments_array' , 'wpmem_securify_comments_array' , 10, 2 ); - } - - return $open; -} - - -/** - * Empties the comments array if content is blocked. - * - * @since 3.0.1 - * - * @return array $comments The comments array. - */ -function wpmem_securify_comments_array( $comments , $post_id ) { - global $wpmem; - $comments = ( ! is_user_logged_in() && $wpmem->is_blocked() ) ? array() : $comments; - return $comments; -} - - -/** - * Redirects a user to defined login page with return redirect. - * - * @since 3.0.2 - */ -function wpmem_redirect_to_login() { - - global $wpmem; - - if( ! is_user_logged_in() && $wpmem->is_blocked() ) { - global $post; - // Get the page location. - $page = urlencode( "http://" . $_SERVER["HTTP_HOST"] . $_SERVER["REQUEST_URI"] ); - - $url = wpmem_chk_qstr( $wpmem->user_pages['login'] ) . 'redirect_to=' . $page; - - wp_redirect( $url ); - exit(); - } - return; -} - - -// End of File. \ No newline at end of file diff --git a/inc/dialogs.php b/inc/dialogs.php index d2bd87ea..10e83fb0 100644 --- a/inc/dialogs.php +++ b/inc/dialogs.php @@ -1,386 +1,10 @@ - '
    ', - 'div_after' => '
    ', - 'heading_before' => '

    ', - 'heading' => __( 'Login Failed!', 'wp-members' ), - 'heading_after' => '

    ', - 'p_before' => '

    ', - 'message' => __( 'You entered an invalid username or password.', 'wp-members' ), - 'p_after' => '

    ', - 'link' => '' . __( 'Click here to continue.', 'wp-members' ) . '', - ); - - /** - * Filter the login failed dialog arguments. - * - * @since 2.9.0 - * - * @param array An array of arguments to merge with defaults. - */ - $args = apply_filters( 'wpmem_login_failed_args', '' ); - - // Merge $args with defaults. - $args = wp_parse_args( $args, $defaults ); - - $str = $args['div_before'] - . $args['heading_before'] . $args['heading'] . $args['heading_after'] - . $args['p_before'] . $args['message'] . $args['p_after'] - . $args['p_before'] . $args['link'] . $args['p_after'] - . $args['div_after']; - - /** - * Filter the login failed dialog. - * - * @since ?.? - * - * @param string $str The login failed dialog. - */ - $str = apply_filters( 'wpmem_login_failed', $str ); - - return $str; -} -endif; - - -if ( ! function_exists( 'wpmem_inc_regmessage' ) ): -/** - * Message Dialog. - * - * Returns various dialogs and error messages. - * - * @since 1.8 - * - * @param string $toggle Error message toggle to look for specific error messages. - * @param string $msg A message that has no toggle that is passed directly to the function. - * @return string $str The final HTML for the message. - */ -function wpmem_inc_regmessage( $toggle, $msg = '' ) { - - // defaults - $defaults = array( - 'div_before' => '
    ', - 'div_after' => '
    ', - 'p_before' => '

    ', - 'p_after' => '

    ', - 'toggles' => array( - 'user', - 'email', - 'success', - 'editsuccess', - 'pwdchangerr', - 'pwdchangesuccess', - 'pwdreseterr', - 'pwdresetsuccess', - ), - ); - - /** - * Filter the message arguments. - * - * @since 2.9.0 - * - * @param array An array of arguments to merge with defaults. - */ - $args = apply_filters( 'wpmem_msg_args', '' ); - - // Get dialogs set in the db. - $dialogs = get_option( 'wpmembers_dialogs' ); - - for ( $r = 0; $r < count( $defaults['toggles'] ); $r++ ) { - if ( $toggle == $defaults['toggles'][$r] ) { - $msg = __( stripslashes( $dialogs[$r+1] ), 'wp-members' ); - break; - } - } - $defaults['msg'] = $msg; - - /** - * Filter the message array - * - * @since 2.9.2 - * - * @param array $defaults An array of the defaults. - * @param string $toggle The toggle that we are on, if any. - */ - $defaults = apply_filters( 'wpmem_msg_dialog_arr', $defaults, $toggle ); - - // Merge $args with defaults. - $args = wp_parse_args( $args, $defaults ); - - $str = $args['div_before'] . $args['p_before'] . stripslashes( $msg ) . $args['p_after'] . $args['div_after']; - - /** - * Filter the message. - * - * @since ?.? - * - * @param string $str The message. - */ - return apply_filters( 'wpmem_msg_dialog', $str ); - -} -endif; - - -if ( ! function_exists( 'wpmem_inc_memberlinks' ) ): -/** - * Member Links Dialog. - * - * Outputs the links used on the members area. - * - * @since 2.0 - * - * @param string $page - * @return string $str - */ -function wpmem_inc_memberlinks( $page = 'members' ) { - - global $user_login, $wpmem; - - $link = wpmem_chk_qstr(); - - /** - * Filter the log out link. - * - * @since 2.8.3 - * - * @param string $link The default logout link. - */ - $logout = apply_filters( 'wpmem_logout_link', $link . 'a=logout' ); - - switch ( $page ) { - - case 'members': - $str = ''; - /** - * Filter the links displayed on the User Profile page (logged in state). - * - * @since 2.8.3 - * - * @param string $str The default links. - */ - $str = apply_filters( 'wpmem_member_links', $str ); - break; - - case 'register': - $str = '

    ' . sprintf( __( 'You are logged in as %s', 'wp-members' ), $user_login ) . '

    - '; - /** - * Filter the links displayed on the Register page (logged in state). - * - * @since 2.8.3 - * - * @param string $str The default links. - */ - $str = apply_filters( 'wpmem_register_links', $str ); - break; - - case 'login': - - $args = array( - 'wrapper_before' => '

    ', - 'wrapper_after' => '

    ', - 'user_login' => $user_login, - 'welcome' => __( 'You are logged in as %s', 'wp-members' ), - 'logout_text' => __( 'Click to log out', 'wp-members' ), - 'logout_link' => '%s', - 'separator' => '
    ', - ); - /** - * Filter the status message parts. - * - * @since 2.9.9 - * - * @param array $args. - */ - $args = apply_filters( 'wpmem_login_links_args', $args ); - - // Assemble the message string. - $str = $args['wrapper_before'] - . sprintf( $args['welcome'], $args['user_login'] ) - . $args['separator'] - . sprintf( $args['logout_link'], $args['logout_text'] ) - . $args['wrapper_after']; - - /** - * Filter the links displayed on the Log In page (logged in state). - * - * @since 2.8.3 - * - * @param string $str The default links. - */ - $str = apply_filters( 'wpmem_login_links', $str ); - break; - - case 'status': - $args = array( - 'wrapper_before' => '

    ', - 'wrapper_after' => '

    ', - 'user_login' => $user_login, - 'welcome' => __( 'You are logged in as %s', 'wp-members' ), - 'logout_text' => __( 'click to log out', 'wp-members' ), - 'logout_link' => '%s', - 'separator' => ' | ', - ); - /** - * Filter the status message parts. - * - * @since 2.9.9 - * - * @param array $args. - */ - $args = apply_filters( 'wpmem_status_msg_args', $args ); - - // Assemble the message string. - $str = $args['wrapper_before'] - . sprintf( $args['welcome'], $args['user_login'] ) - . $args['separator'] - . sprintf( $args['logout_link'], $args['logout_text'] ) - . $args['wrapper_after']; - break; - - } - - return $str; -} -endif; - - -if ( ! function_exists( 'wpmem_page_pwd_reset' ) ): -/** - * Password reset forms. - * - * This function creates both password reset and forgotten - * password forms for page=password shortcode. - * - * @since 2.7.6 - * - * @param string $wpmem_regchk - * @param string $content - * @return string $content - */ -function wpmem_page_pwd_reset( $wpmem_regchk, $content ) { - - if ( is_user_logged_in() ) { - - switch ( $wpmem_regchk ) { - - case "pwdchangempty": - $content = wpmem_inc_regmessage( $wpmem_regchk, __( 'Password fields cannot be empty', 'wp-members' ) ); - $content = $content . wpmem_inc_changepassword(); - break; - - case "pwdchangerr": - $content = wpmem_inc_regmessage( $wpmem_regchk ); - $content = $content . wpmem_inc_changepassword(); - break; - - case "pwdchangesuccess": - $content = $content . wpmem_inc_regmessage( $wpmem_regchk ); - break; - - default: - $content = $content . wpmem_inc_changepassword(); - break; - } - - } else { - - switch( $wpmem_regchk ) { - - case "pwdreseterr": - $content = $content - . wpmem_inc_regmessage( $wpmem_regchk ) - . wpmem_inc_resetpassword(); - $wpmem_regchk = ''; // Clear regchk. - break; - - case "pwdresetsuccess": - $content = $content . wpmem_inc_regmessage( $wpmem_regchk ); - $wpmem_regchk = ''; // Clear regchk. - break; - - default: - $content = $content . wpmem_inc_resetpassword(); - break; - } - - } - - return $content; - -} -endif; - - -if ( ! function_exists( 'wpmem_page_user_edit' ) ): -/** - * Creates a user edit page. - * - * @since 2.7.6 - * - * @param string $wpmem_regchk - * @param string $content - * @return string $content - */ -function wpmem_page_user_edit( $wpmem_regchk, $content ) { - - global $wpmem_a, $wpmem_themsg; - /** - * Filter the default User Edit heading for shortcode. - * - * @since 2.7.6 - * - * @param string The default edit mode heading. - */ - $heading = apply_filters( 'wpmem_user_edit_heading', __( 'Edit Your Information', 'wp-members' ) ); - - if ( $wpmem_a == "update") { $content.= wpmem_inc_regmessage( $wpmem_regchk, $wpmem_themsg ); } - $content = $content . wpmem_inc_registration( 'edit', $heading ); - - return $content; -} -endif; - -/** End of File **/ \ No newline at end of file +user_login ); - $arr['user_email'] = stripslashes( $user->user_email ); - $arr['blogname'] = wp_specialchars_decode( get_option ( 'blogname' ), ENT_QUOTES ); - $arr['exp_type'] = ( $wpmem->use_exp == 1 ) ? get_user_meta( $user_id, 'exp_type', true ) : ''; - $arr['exp_date'] = ( $wpmem->use_exp == 1 ) ? get_user_meta( $user_id, 'expires', true ) : ''; - $arr['wpmem_msurl'] = $wpmem->user_pages['profile']; - $arr['reg_link'] = esc_url( get_user_meta( $user_id, 'wpmem_reg_url', true ) ); - $arr['do_shortcodes'] = true; - $arr['add_footer'] = true; - $arr['disable'] = false; - - // Apply filters (if set) for the sending email address. - global $wpmem_mail_from, $wpmem_mail_from_name; - add_filter( 'wp_mail_from', 'wpmem_mail_from' ); - add_filter( 'wp_mail_from_name', 'wpmem_mail_from_name' ); - $default_header = ( $wpmem_mail_from && $wpmem_mail_from_name ) ? 'From: ' . $wpmem_mail_from_name . ' <' . $wpmem_mail_from . '>' : ''; - - /** - * Filters the email headers. - * - * @since 2.7.4 - * - * @param mixed $default_header The email headers. - * @param string $arr['toggle'] Toggle to determine what email is being generated (newreg|newmod|appmod|repass|admin). - */ - $arr['headers'] = apply_filters( 'wpmem_email_headers', $default_header, $arr['toggle'] ); - - // Handle backward compatibility for customizations that may call the email function directly. - if ( ! $wpmem_fields ) { - $wpmem_fields = $wpmem->fields; //get_option( 'wpmembers_fields' ); - } - - /** - * Filter the email. - * - * This is a new and more powerful filter than was previously available for - * emails. This new filter passes the email subject, body, user ID, and several - * other settings and parameters for use in the filter function. It also passes - * an array of the WP-Members fields, and an array of the posted registration - * data from the register function. - * - * @since 2.9.7 - * - * @param array $arr An array containing email body, subject, user id, and additional settings. - * @param array $wpmem_fields An array of the WP-Members fields. - * @param array $field_data An array of the posted registration data. - */ - $arr = apply_filters( 'wpmem_email_filter', $arr, $wpmem_fields, $field_data ); - - //If emails are not disabled, continue the email process. - if ( ! $arr['disable'] ) { - - // Legacy email filters applied. - switch ( $arr['toggle'] ) { - - case 'newreg': - // This is a new registration. - /** - * Filters the new registration email. - * - * @since 2.7.4 - * - * @param string $arr['body'] The body content of the new registration email. - */ - $arr['body'] = apply_filters( 'wpmem_email_newreg', $arr['body'] ); - break; - - case 'newmod': - // Registration is moderated. - /** - * Filters the new moderated registration email. - * - * @since 2.7.4 - * - * @param string $arr['body'] The body content of the moderated registration email. - */ - $arr['body'] = apply_filters( 'wpmem_email_newmod', $arr['body'] ); - break; - - case 'appmod': - // Registration is moderated, user is approved. - /** - * Filters the reset password email. - * - * @since 2.7.4 - * - * @param string $arr['body'] The body content of the reset password email. - */ - $arr['body'] = apply_filters( 'wpmem_email_appmod', $arr['body'] ); - break; - - case 'repass': - // This is a password reset. - /** - * Filters the approved registration email. - * - * @since 2.7.4 - * - * @param string $arr['body'] The body content of the approved registration email. - */ - $arr['body'] = apply_filters( 'wpmem_email_repass', $arr['body'] ); - break; - - } - - // Get the email footer if needed. - $foot = ( $arr['add_footer'] ) ? get_option ( 'wpmembers_email_footer' ) : ''; - - // If doing shortcode replacements. - if ( $arr['do_shortcodes'] ) { - - // Setup default shortcodes. - $shortcd = array( - '[blogname]', - '[username]', - '[password]', - '[reglink]', - '[members-area]', - '[exp-type]', - '[exp-data]', - ); - - // Replacement values for default shortcodes. - $replace = array( - $arr['blogname'], - $arr['user_login'], - $password, - $arr['reg_link'], - $arr['wpmem_msurl'], - $arr['exp_type'], - $arr['exp_date'], - ); - - // Setup custom field shortcodes. - foreach ( $wpmem_fields as $field ) { - $shortcd[] = '[' . $field[2] . ']'; - $replace[] = get_user_meta( $user_id, $field[2], true ); - } - - // Do replacements for subject, body, and footer shortcodes. - $arr['subj'] = str_replace( $shortcd, $replace, $arr['subj'] ); - $arr['body'] = str_replace( $shortcd, $replace, $arr['body'] ); - $foot = ( $arr['add_footer'] ) ? str_replace( $shortcd, $replace, $foot ) : ''; - } - - // Append footer if needed. - $arr['body'] = ( $arr['add_footer'] ) ? $arr['body'] . "\r\n" . $foot : $arr['body']; - - // Send the message. - wp_mail( $arr['user_email'], stripslashes( $arr['subj'] ), stripslashes( $arr['body'] ), $arr['headers'] ); - - } - - return; - -} -endif; - - -if ( ! function_exists( 'wpmem_notify_admin' ) ): -/** - * Builds the email for admin notification of new user registration. - * - * @since 2.3 - * - * @uses wp_mail - * - * @param int $user_id - * @param array $wpmem_fields - * @param array $field_data - */ -function wpmem_notify_admin( $user_id, $wpmem_fields, $field_data = null ) { - - global $wpmem; - - // WP default user fields. - $wp_user_fields = array( - 'user_login', - 'user_nicename', - 'user_url', - 'user_registered', - 'display_name', - 'first_name', - 'last_name', - 'nickname', - 'description', - ); - - // Get the user data. - $user = get_userdata( $user_id ); - - // Get the email stored values. - $arr = get_option( 'wpmembers_email_notify' ); - - // Userdata for default shortcodes. - $arr['user_id'] = $user_id; - $arr['user_login'] = stripslashes( $user->user_login ); - $arr['user_email'] = stripslashes( $user->user_email ); - $arr['blogname'] = wp_specialchars_decode( get_option ( 'blogname' ), ENT_QUOTES ); - $arr['user_ip'] = get_user_meta( $user_id, 'wpmem_reg_ip', true ); - $arr['reg_link'] = esc_url( get_user_meta( $user_id, 'wpmem_reg_url', true ) ); - $arr['act_link'] = get_bloginfo ( 'wpurl' ) . "/wp-admin/user-edit.php?user_id=".$user_id; - $arr['exp_type'] = ( $wpmem->use_exp == 1 ) ? get_user_meta( $user_id, 'exp_type', true ) : ''; - $arr['exp_date'] = ( $wpmem->use_exp == 1 ) ? get_user_meta( $user_id, 'expires', true ) : ''; - $arr['do_shortcodes'] = true; - $arr['add_footer'] = true; - $arr['disable'] = false; - - // Builds an array of the user data fields. - $field_arr = array(); - foreach ( $wpmem_fields as $meta ) { - if ( $meta[4] == 'y' ) { - $name = $meta[1]; - if ( ! in_array( $meta[2], wpmem_get_excluded_meta( 'email' ) ) ) { - if ( ( $meta[2] != 'user_email' ) && ( $meta[2] != 'password' ) ) { - if ( $meta[2] == 'user_url' ) { - $val = esc_url( $user->user_url ); - } elseif ( in_array( $meta[2], $wp_user_fields ) ) { - $val = esc_html( $user->$meta[2] ); - } else { - $val = esc_html( get_user_meta( $user_id, $meta[2], true ) ); - } - $field_arr[ $name ] = $val; - } - } - } - } - $arr['field_arr'] = $field_arr; - - // Apply filters (if set) for the sending email address. - global $wpmem_mail_from, $wpmem_mail_from_name; - add_filter( 'wp_mail_from', 'wpmem_mail_from' ); - add_filter( 'wp_mail_from_name', 'wpmem_mail_from_name' ); - $default_header = ( $wpmem_mail_from && $wpmem_mail_from_name ) ? 'From: ' . $wpmem_mail_from_name . ' <' . $wpmem_mail_from . '>' : ''; - - /** - * Filters the email headers. - * - * @since 2.7.4 - * - * @param mixed $default_header The email headers (default = null). - * @param string $toggle Toggle to determine what email is being generated (newreg|newmod|appmod|repass|admin). - */ - $arr['headers'] = apply_filters( 'wpmem_email_headers', $default_header, 'admin' ); - - // Handle backward compatibility for customizations that may call the email function directly. - if ( ! $wpmem_fields ) { - $wpmem_fields = $wpmem->fields; //get_option( 'wpmembers_fields' ); - } - - /** - * Filters the address the admin notification is sent to. - * - * @since 2.7.5 - * - * @param string The email address of the admin to send to. - */ - $arr['admin_email'] = apply_filters( 'wpmem_notify_addr', get_option( 'admin_email' ) ); - - /** - * Filter the email. - * - * This is a new and more powerful filter than was previously available for - * emails. This new filter passes the email subject, body, user ID, and several - * other settings and parameters for use in the filter function. It also passes - * an array of the WP-Members fields, and an array of the posted registration - * data from the register function. - * - * @since 2.9.8 - * - * @param array $arr An array containing email body, subject, user id, and additional settings. - * @param array $wpmem_fields An array of the WP-Members fields. - * @param array $arr['field_arr'] An array of the posted registration data. - */ - $arr = apply_filters( 'wpmem_notify_filter', $arr, $wpmem_fields, $field_data ); - - // If emails are not disabled, continue the email process. - if ( ! $arr['disable'] ) { - - // Split field_arr into field_str. - $field_str = ''; - foreach ( $arr['field_arr'] as $key => $val ) { - $field_str.= $key . ': ' . $val . "\r\n"; - } - - // Get the email footer if needed. - $foot = ( $arr['add_footer'] ) ? get_option ( 'wpmembers_email_footer' ) : ''; - - // If doing shortcode replacements. - if ( $arr['do_shortcodes'] ) { - - // Setup default shortcodes. - $shortcd = array( - '[blogname]', - '[username]', - '[email]', - '[reglink]', - '[exp-type]', - '[exp-data]', - '[user-ip]', - '[activate-user]', - '[fields]', - ); - - // Replacement values for default shortcodes. - $replace = array( - $arr['blogname'], - $arr['user_login'], - $arr['user_email'], - $arr['reg_link'], - $arr['exp_type'], - $arr['exp_date'], - $arr['user_ip'], - $arr['act_link'], - $field_str, - ); - - // Create the custom field shortcodes. - foreach ( $wpmem_fields as $field ) { - $shortcd[] = '[' . $field[2] . ']'; - $replace[] = get_user_meta( $user_id, $field[2], true ); - } - - // Get the subject, body, and footer shortcodes. - $arr['subj'] = str_replace( $shortcd, $replace, $arr['subj'] ); - $arr['body'] = str_replace( $shortcd, $replace, $arr['body'] ); - $foot = ( $arr['add_footer'] ) ? str_replace( $shortcd, $replace, $foot ) : ''; - } - - // Append footer if needed. - $arr['body'] = ( $arr['add_footer'] ) ? $arr['body'] . "\r\n" . $foot : $arr['body']; - - /** - * Filters the admin notification email. - * - * @since 2.8.2 - * - * @param string $arr['body'] The admin notification email body. - */ - $arr['body'] = apply_filters( 'wpmem_email_notify', $arr['body'] ); - - // Send the message. - wp_mail( $arr['admin_email'], stripslashes( $arr['subj'] ), stripslashes( $arr['body'] ), $arr['headers'] ); - } -} -endif; - - -/** - * Filters the wp_mail from address (if set). - * - * @since 2.7 - * - * @param string $email - * @return string $email - */ -function wpmem_mail_from( $email ) { - global $wpmem_mail_from; - $wpmem_mail_from = ( get_option( 'wpmembers_email_wpfrom' ) ) ? get_option( 'wpmembers_email_wpfrom' ) : $email; - return $wpmem_mail_from; -} - - -/** - * Filters the wp_mail from name (if set). - * - * @since 2.7 - * - * @param string $name - * @return string $name - */ -function wpmem_mail_from_name( $name ) { - global $wpmem_mail_from_name; - $wpmem_mail_from_name = ( get_option( 'wpmembers_email_wpname' ) ) ? stripslashes( get_option( 'wpmembers_email_wpname' ) ) : $name; - return $wpmem_mail_from_name; -} - -/** End of File **/ \ No newline at end of file +' . __( stripslashes( $arr[0] ), 'wp-members' ) . '

    '; - - /** - * Filter the post restricted message. - * - * @since 2.7.3 - * - * @param string $str The post restricted message. - */ - $str = apply_filters( 'wpmem_restricted_msg', $str ); - - } - } - - // create the default inputs - $default_inputs = array( - array( - 'name' => __( 'Username' ), - 'type' => 'text', - 'tag' => 'log', - 'class' => 'username', - 'div' => 'div_text', - ), - array( - 'name' => __( 'Password' ), - 'type' => 'password', - 'tag' => 'pwd', - 'class' => 'password', - 'div' => 'div_text', - ), - ); - - /** - * Filter the array of login form fields. - * - * @since 2.9.0 - * - * @param array $default_inputs An array matching the elements used by default. - */ - $default_inputs = apply_filters( 'wpmem_inc_login_inputs', $default_inputs ); - - $defaults = array( - 'heading' => __( 'Existing Users Log In', 'wp-members' ), - 'action' => 'login', - 'button_text' => __( 'Log In' ), - 'inputs' => $default_inputs, - 'redirect_to' => $redirect_to, - ); - - /** - * Filter the arguments to override login form defaults. - * - * @since 2.9.0 - * - * @param array $args An array of arguments to use. Default null. - */ - $args = apply_filters( 'wpmem_inc_login_args', '' ); - - $arr = wp_parse_args( $args, $defaults ); - - $str = ( $show == 'show' ) ? $str . wpmem_login_form( $page, $arr ) : $str; - - return $str; -} -endif; - - -if ( ! function_exists( 'wpmem_inc_changepassword' ) ): -/** - * Change Password Dialog. - * - * Loads the form for changing password. - * - * @since 2.0 - * - * @uses wpmem_login_form() - * - * @return string $str the generated html for the change password form. - */ -function wpmem_inc_changepassword() { - - // create the default inputs - $default_inputs = array( - array( - 'name' => __( 'New password' ), - 'type' => 'password', - 'tag' => 'pass1', - 'class' => 'password', - 'div' => 'div_text', - ), - array( - 'name' => __( 'Confirm new password' ), - 'type' => 'password', - 'tag' => 'pass2', - 'class' => 'password', - 'div' => 'div_text', - ), - ); - - /** - * Filter the array of change password form fields. - * - * @since 2.9.0 - * - * @param array $default_inputs An array matching the elements used by default. - */ - $default_inputs = apply_filters( 'wpmem_inc_changepassword_inputs', $default_inputs ); - - $defaults = array( - 'heading' => __('Change Password', 'wp-members'), - 'action' => 'pwdchange', - 'button_text' => __('Update Password', 'wp-members'), - 'inputs' => $default_inputs, - ); - - /** - * Filter the arguments to override change password form defaults. - * - * @since 2.9.0 - * - * @param array $args An array of arguments to use. Default null. - */ - $args = apply_filters( 'wpmem_inc_changepassword_args', '' ); - - $arr = wp_parse_args( $args, $defaults ); - - $str = wpmem_login_form( 'page', $arr ); - - return $str; -} -endif; - - -if ( ! function_exists( 'wpmem_inc_resetpassword' ) ): -/** - * Reset Password Dialog. - * - * Loads the form for resetting password. - * - * @since 2.1 - * - * @uses wpmem_login_form() - * - * @return string $str the generated html fo the reset password form. - */ -function wpmem_inc_resetpassword() -{ - /** create the default inputs **/ - $default_inputs = array( - array( - 'name' => __( 'Username' ), - 'type' => 'text', - 'tag' => 'user', - 'class' => 'username', - 'div' => 'div_text', - ), - array( - 'name' => __( 'Email' ), - 'type' => 'text', - 'tag' => 'email', - 'class' => 'password', - 'div' => 'div_text', - ), - ); - - /** - * Filter the array of reset password form fields. - * - * @since 2.9.0 - * - * @param array $default_inputs An array matching the elements used by default. - */ - $default_inputs = apply_filters( 'wpmem_inc_resetpassword_inputs', $default_inputs ); - - $defaults = array( - 'heading' => __( 'Reset Forgotten Password', 'wp-members' ), - 'action' => 'pwdreset', - 'button_text' => __( 'Reset Password' ), - 'inputs' => $default_inputs, - ); - - /** - * Filter the arguments to override reset password form defaults. - * - * @since 2.9.0 - * - * @param array $args An array of arguments to use. Default null. - */ - $args = apply_filters( 'wpmem_inc_resetpassword_args', '' ); - - $arr = wp_parse_args( $args, $defaults ); - - $str = wpmem_login_form( 'page', $arr ); - - return $str; -} -endif; - - -if ( ! function_exists( 'wpmem_login_form' ) ): -/** - * Login Form Dialog. - * - * Builds the form used for login, change password, and reset password. - * - * @since 2.5.1 - * - * @param string $page - * @param array $arr The elements needed to generate the form (login|reset password|forgotten password). - * @return string $form The HTML for the form as a string. - */ -function wpmem_login_form( $page, $arr ) { - - global $wpmem; - - // extract the arguments array - extract( $arr ); - - // set up default wrappers - $defaults = array( - - // wrappers - 'heading_before' => '', - 'heading_after' => '', - 'fieldset_before' => '
    ', - 'fieldset_after' => '
    ', - 'main_div_before' => '
    ', - 'main_div_after' => '
    ', - 'txt_before' => '[wpmem_txt]', - 'txt_after' => '[/wpmem_txt]', - 'row_before' => '', - 'row_after' => '', - 'buttons_before' => '
    ', - 'buttons_after' => '
    ', - 'link_before' => '', - - // classes & ids - 'form_id' => '', - 'form_class' => 'form', - 'button_id' => '', - 'button_class' => 'buttons', - - // other - 'strip_breaks' => true, - 'wrap_inputs' => true, - 'remember_check' => true, - 'n' => "\n", - 't' => "\t", - 'redirect_to' => ( isset( $_REQUEST['redirect_to'] ) ) ? esc_url( $_REQUEST['redirect_to'] ) : ( ( isset( $redirect_to ) ) ? $redirect_to : get_permalink() ), - - ); - - /** - * 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 - * - * @param array An array of arguments to merge with defaults. Default null. - * @param string $action The action being performed by the form. login|pwdreset|pwdchange. - */ - $args = apply_filters( 'wpmem_login_form_args', '', $action ); - - // merge $args with defaults - extract( wp_parse_args( $args, $defaults ) ); - - // build the input rows - foreach ( $inputs as $input ) { - $label = ''; - $field = wpmem_create_formfield( $input['tag'], $input['type'], '', '', $input['class'] ); - $field_before = ( $wrap_inputs ) ? '
    ' : ''; - $field_after = ( $wrap_inputs ) ? '
    ' : ''; - $rows[] = array( - 'row_before' => $row_before, - 'label' => $label, - 'field_before' => $field_before, - 'field' => $field, - 'field_after' => $field_after, - 'row_after' => $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 - * - * @param array $rows An array containing the form rows. - * @param string $action The action being performed by the form. login|pwdreset|pwdchange. - */ - $rows = apply_filters( 'wpmem_login_form_rows', $rows, $action ); - - // put the rows from the array into $form - $form = ''; - foreach ( $rows as $row_item ) { - $row = ( $row_item['row_before'] != '' ) ? $row_item['row_before'] . $n . $row_item['label'] . $n : $row_item['label'] . $n; - $row .= ( $row_item['field_before'] != '' ) ? $row_item['field_before'] . $n . $t . $row_item['field'] . $n . $row_item['field_after'] . $n : $row_item['field'] . $n; - $row .= ( $row_item['row_before'] != '' ) ? $row_item['row_after'] . $n : ''; - $form.= $row; - } - - // build hidden fields, filter, and add to the form - $hidden = wpmem_create_formfield( 'redirect_to', 'hidden', $redirect_to ) . $n; - $hidden = $hidden . wpmem_create_formfield( 'a', 'hidden', $action ) . $n; - $hidden = ( $action != 'login' ) ? $hidden . wpmem_create_formfield( 'formsubmit', 'hidden', '1' ) : $hidden; - - /** - * 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. - */ - $form = $form . apply_filters( 'wpmem_login_hidden_fields', $hidden, $action ); - - // build the buttons, filter, and add to the form - if ( $action == 'login' ) { - $remember_check = ( $remember_check ) ? $t . wpmem_create_formfield( 'rememberme', 'checkbox', 'forever' ) . ' ' . __( 'Remember Me' ) . '  ' . $n : ''; - $buttons = $remember_check . $t . '' . $n; - } else { - $buttons = '' . $n; - } - - /** - * 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. - */ - $form = $form . apply_filters( 'wpmem_login_form_buttons', $buttons_before . $n . $buttons . $buttons_after . $n, $action ); - - if ( ( $wpmem->user_pages['profile'] != null || $page == 'members' ) && $action == 'login' ) { - - /** - * Filter the forgot password link. - * - * @since 2.8.0 - * - * @param string The forgot password link. - */ - $link = apply_filters( 'wpmem_forgot_link', wpmem_chk_qstr( $wpmem->user_pages['profile'] ) . 'a=pwdreset' ); - $str = __( 'Forgot password?', 'wp-members' ) . ' ' . __( 'Click here to reset', 'wp-members' ) . ''; - $form = $form . $link_before . apply_filters( 'wpmem_forgot_link_str', $str ) . $link_after . $n; - - } - - if ( ( $wpmem->user_pages['register'] != null ) && $action == 'login' ) { - - /** - * Filter the link to the registration page. - * - * @since 2.8.0 - * - * @param string The registration page link. - */ - $link = apply_filters( 'wpmem_reg_link', $wpmem->user_pages['register'] ); - $str = __( 'New User?', 'wp-members' ) . ' ' . __( 'Click here to register', 'wp-members' ) . ''; - $form = $form . $link_before . apply_filters( 'wpmem_reg_link_str', $str ) . $link_after . $n; - - } - - // apply the heading - $form = $heading_before . $heading . $heading_after . $n . $form; - - // apply fieldset wrapper - $form = $fieldset_before . $n . $form . $fieldset_after . $n; - - // apply form wrapper - $form = '
    ' . $n . $form . '
    '; - - // apply anchor - $form = '' . $n . $form; - - // apply main wrapper - $form = $main_div_before . $n . $form . $n . $main_div_after; - - // apply wpmem_txt wrapper - $form = $txt_before . $form . $txt_after; - - // remove line breaks - $form = ( $strip_breaks ) ? str_replace( array( "\n", "\r", "\t" ), array( '','','' ), $form ) : $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 $action The action being performed by the form. login|pwdreset|pwdchange. - */ - $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. - */ - $form = apply_filters( 'wpmem_login_form_before', '', $action ) . $form; - - return $form; -} // end wpmem_login_form -endif; - - -if ( ! function_exists( 'wpmem_inc_registration' ) ): -/** - * Registration Form Dialog. - * - * Outputs the form for new user registration and existing user edits. - * - * @since 2.5.1 - * - * @param string $toggle (optional) Toggles between new registration ('new') and user profile edit ('edit'). - * @param string $heading (optional) The heading text for the form, null (default) for new registration. - * @global string $wpmem_regchk Used to determine if the form is in an error state. - * @global array $userdata Used to get the user's registration data if they are logged in (user profile edit). - * @return string $form The HTML for the entire form as a string. - */ -function wpmem_inc_registration( $toggle = 'new', $heading = '' ) { - - global $wpmem, $wpmem_regchk, $userdata; - - // set up default wrappers - $defaults = array( - - // wrappers - 'heading_before' => '', - 'heading_after' => '', - 'fieldset_before' => '
    ', - 'fieldset_after' => '
    ', - 'main_div_before' => '
    ', - 'main_div_after' => '
    ', - 'txt_before' => '[wpmem_txt]', - 'txt_after' => '[/wpmem_txt]', - 'row_before' => '', - 'row_after' => '', - 'buttons_before' => '
    ', - 'buttons_after' => '
    ', - - // classes & ids - 'form_id' => '', - 'form_class' => 'form', - 'button_id' => '', - 'button_class' => 'buttons', - - // required field tags and text - 'req_mark' => '*', - 'req_label' => __( 'Required field', 'wp-members' ), - 'req_label_before' => '
    ', - 'req_label_after' => '
    ', - - // buttons - 'show_clear_form' => false, - 'clear_form' => __( 'Reset Form', 'wp-members' ), - 'submit_register' => __( 'Register' ), - 'submit_update' => __( 'Update Profile', 'wp-members' ), - - // other - 'strip_breaks' => true, - 'use_nonce' => false, - 'wrap_inputs' => true, - 'n' => "\n", - 't' => "\t", - - ); - - /** - * 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 - * - * @param array An array of arguments to merge with defaults. Default null. - * @param string $toggle Toggle new registration or profile update. new|edit. - */ - $args = apply_filters( 'wpmem_register_form_args', '', $toggle ); - - // merge $args with defaults - extract( wp_parse_args( $args, $defaults ) ); - - // Username is editable if new reg, otherwise user profile is not - if ( $toggle == 'edit' ) { - // this is the User Profile edit - username is not editable - $val = $userdata->user_login; - $label = ''; - $input = '

    ' . $val . '

    '; - $field_before = ( $wrap_inputs ) ? '
    ' : ''; - $field_after = ( $wrap_inputs ) ? '
    ' : ''; - } else { - // this is a new registration - $val = ( isset( $_POST['log'] ) ) ? stripslashes( $_POST['log'] ) : ''; - $label = ''; - $input = wpmem_create_formfield( 'log', 'text', $val, '', 'username' ); - - } - $field_before = ( $wrap_inputs ) ? '
    ' : ''; - $field_after = ( $wrap_inputs ) ? '
    ': ''; - - // add the username row to the array - $rows['username'] = array( - 'order' => 0, - 'meta' => 'username', - 'type' => 'text', - 'value' => $val, - 'row_before' => $row_before, - 'label' => $label, - 'field_before' => $field_before, - 'field' => $input, - 'field_after' => $field_after, - 'row_after' => $row_after, - ); - - /** - * 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 - * - * @param array The array of form fields. - * @param string $toggle Toggle new registration or profile update. new|edit. - */ - // $wpmem_fields = apply_filters( 'wpmem_register_fields_arr', get_option( 'wpmembers_fields' ), $toggle ); - $wpmem_fields = apply_filters( 'wpmem_register_fields_arr', $wpmem->fields, $toggle ); - - // loop through the remaining fields - foreach ( $wpmem_fields as $field ) { - - // start with a clean row - $val = ''; $label = ''; $input = ''; $field_before = ''; $field_after = ''; - - // skips user selected passwords for profile update - $pass_arr = array( 'password', 'confirm_password', 'password_confirm' ); - $do_row = ( $toggle == 'edit' && in_array( $field[2], $pass_arr ) ) ? false : true; - - // skips tos, makes tos field hidden on user edit page, unless they haven't got a value for tos - if ( $field[2] == 'tos' && $toggle == 'edit' && ( get_user_meta( $userdata->ID, 'tos', true ) ) ) { - $do_row = false; - $hidden_tos = wpmem_create_formfield( $field[2], 'hidden', get_user_meta( $userdata->ID, 'tos', true ) ); - } - - // if the field is set to display and we aren't skipping, construct the row - if ( $field[4] == 'y' && $do_row == true ) { - - // label for all but TOS - if ( $field[2] != 'tos' ) { - - $class = ( $field[3] == 'password' ) ? 'text' : $field[3]; - - $label = ''; - - } - - // gets the field value for both edit profile and submitted reg w/ error - if ( ( $toggle == 'edit' ) && ( $wpmem_regchk != 'updaterr' ) ) { - - switch ( $field[2] ) { - case( 'description' ): - $val = htmlspecialchars( get_user_meta( $userdata->ID, 'description', 'true' ) ); - break; - - case( 'user_email' ): - case( 'confirm_email' ): - $val = $userdata->user_email; - break; - - case( 'user_url' ): - $val = esc_url( $userdata->user_url ); - break; - - default: - $val = htmlspecialchars( get_user_meta( $userdata->ID, $field[2], 'true' ) ); - break; - } - - } else { - - $val = ( isset( $_POST[ $field[2] ] ) ) ? $_POST[ $field[2] ] : ''; - - } - - // does the tos field - if ( $field[2] == 'tos' ) { - - $val = ( isset( $_POST[ $field[2] ] ) ) ? $_POST[ $field[2] ] : ''; - - // should be checked by default? and only if form hasn't been submitted - $val = ( ! $_POST && $field[8] == 'y' ) ? $field[7] : $val; - $input = wpmem_create_formfield( $field[2], $field[3], $field[7], $val ); - $input = ( $field[5] == 'y' ) ? $input . $req_mark : $input; - - // determine if TOS is a WP page or not... - $tos_content = stripslashes( get_option( 'wpmembers_tos' ) ); - if ( ( wpmem_test_shortcode( $tos_content, 'wp-members' ) ) ) { - $link = do_shortcode( $tos_content ); - $tos_pop = ''; - } else { - $tos_pop = ""; - } - - /** - * Filter the TOS link text. - * - * @since 2.7.5 - * - * @param string The link text. - * @param string $toggle Toggle new registration or profile update. new|edit. - */ - $input.= apply_filters( 'wpmem_tos_link_txt', sprintf( __( 'Please indicate that you agree to the %s TOS %s', 'wp-members' ), $tos_pop, '' ), $toggle ); - - // in previous versions, the div class would end up being the same as the row before. - $field_before = ( $wrap_inputs ) ? '
    ' : ''; - $field_after = ( $wrap_inputs ) ? '
    ' : ''; - - } else { - - // for checkboxes - if ( $field[3] == 'checkbox' ) { - $valtochk = $val; - $val = $field[7]; - // if it should it be checked by default (& only if form not submitted), then override above... - if ( $field[8] == 'y' && ( ! $_POST && $toggle != 'edit' ) ) { $val = $valtochk = $field[7]; } - } - - // for dropdown select - if ( $field[3] == 'select' ) { - $valtochk = $val; - $val = $field[7]; - } - - if ( ! isset( $valtochk ) ) { $valtochk = ''; } - - // for all other input types - $input = wpmem_create_formfield( $field[2], $field[3], $val, $valtochk ); - - // determine input wrappers - $field_before = ( $wrap_inputs ) ? '
    ' : ''; - $field_after = ( $wrap_inputs ) ? '
    ' : ''; - } - - } - - // if the row is set to display, add the row to the form array - if ( $field[4] == 'y' ) { - $rows[$field[2]] = array( - 'order' => $field[0], - 'meta' => $field[2], - 'type' => $field[3], - 'value' => $val, - 'row_before' => $row_before, - 'label' => $label, - 'field_before' => $field_before, - 'field' => $input, - 'field_after' => $field_after, - 'row_after' => $row_after, - ); - } - } - - // if captcha is Really Simple CAPTCHA - if ( $wpmem->captcha == 2 && $toggle != 'edit' ) { - $row = wpmem_build_rs_captcha(); - $rows['captcha'] = array( - 'order' => '', - 'meta' => '', - 'type' => 'text', - 'value' => '', - 'row_before' => $row_before, - 'label' => $row['label'], - 'field_before' => ( $wrap_inputs ) ? '
    ' : '', - 'field' => $row['field'], - 'field_after' => ( $wrap_inputs ) ? '
    ' : '', - 'row_after' => $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 - * - * @param array $rows An array containing the form rows. - * @param string $toggle Toggle new registration or profile update. new|edit. - */ - $rows = apply_filters( 'wpmem_register_form_rows', $rows, $toggle ); - - // put the rows from the array into $form - $form = ''; $enctype = ''; - foreach ( $rows as $row_item ) { - $enctype = ( $row_item['type'] == 'file' ) ? "multipart/form-data" : $enctype; - $row = ( $row_item['row_before'] != '' ) ? $row_item['row_before'] . $n . $row_item['label'] . $n : $row_item['label'] . $n; - $row .= ( $row_item['field_before'] != '' ) ? $row_item['field_before'] . $n . $t . $row_item['field'] . $n . $row_item['field_after'] . $n : $row_item['field'] . $n; - $row .= ( $row_item['row_after'] != '' ) ? $row_item['row_after'] . $n : ''; - $form.= $row; - } - - // do recaptcha if enabled - if ( ( $wpmem->captcha == 1 || $wpmem->captcha == 3 ) && $toggle != 'edit' ) { // don't show on edit page! - - // get the captcha options - $wpmem_captcha = get_option( 'wpmembers_captcha' ); - - // start with a clean row - $row = ''; - $row = '
    '; - $row.= '
    ' . wpmem_inc_recaptcha( $wpmem_captcha['recaptcha'] ) . '
    '; - - // 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 $toggle Toggle new registration or profile update. new|edit. - */ - $form.= apply_filters( 'wpmem_register_captcha_row', $row_before . $row . $row_after, $toggle ); - } - - // create hidden fields - $var = ( $toggle == 'edit' ) ? 'update' : 'register'; - $redirect_to = ( isset( $_REQUEST['redirect_to'] ) ) ? esc_url( $_REQUEST['redirect_to'] ) : get_permalink(); - $hidden = '' . $n; - $hidden .= '' . $n; - $hidden = ( isset( $hidden_tos ) ) ? $hidden . $hidden_tos . $n : $hidden; - - /** - * Filter the hidden field HTML. - * - * @since 2.9.0 - * - * @param string $hidden The generated HTML of hidden fields. - * @param string $toggle Toggle new registration or profile update. new|edit. - */ - $hidden = apply_filters( 'wpmem_register_hidden_fields', $hidden, $toggle ); - - // add the hidden fields to the form - $form.= $hidden; - - // create buttons and wrapper - $button_text = ( $toggle == 'edit' ) ? $submit_update : $submit_register; - $buttons = ( $show_clear_form ) ? ' ' . $n : ''; - $buttons.= '' . $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 - * - * @param string $buttons The generated HTML of the form buttons. - * @param string $toggle Toggle new registration or profile update. new|edit. - */ - $buttons = apply_filters( 'wpmem_register_form_buttons', $buttons, $toggle ); - - // add the buttons to the form - $form.= $buttons_before . $n . $buttons . $buttons_after . $n; - - // add the required field notation to the bottom of the form - $form.= $req_label_before . $req_mark . $req_label . $req_label_after; - - // apply the heading - /** - * Filter the registration form heading. - * - * @since 2.8.2 - * - * @param string $str - * @param string $toggle Toggle new registration or profile update. new|edit. - */ - $heading = ( !$heading ) ? apply_filters( 'wpmem_register_heading', __( 'New User Registration', 'wp-members' ), $toggle ) : $heading; - $form = $heading_before . $heading . $heading_after . $n . $form; - - // apply fieldset wrapper - $form = $fieldset_before . $n . $form . $n . $fieldset_after; - - // apply attribution if enabled - $form = $form . wpmem_inc_attribution(); - - // apply nonce - $form = ( defined( 'WPMEM_USE_NONCE' ) || $use_nonce ) ? wp_nonce_field( 'wpmem-validate-submit', 'wpmem-form-submit' ) . $n . $form : $form; - - // apply form wrapper - $enctype = ( $enctype == 'multipart/form-data' ) ? ' enctype="multipart/form-data"' : ''; - $form = '
    ' . $n . $form. $n . '
    '; - - // apply anchor - $form = '' . $n . $form; - - // apply main div wrapper - $form = $main_div_before . $n . $form . $n . $main_div_after . $n; - - // apply wpmem_txt wrapper - $form = $txt_before . $form . $txt_after; - - // remove line breaks if enabled for easier filtering later - $form = ( $strip_breaks ) ? str_replace( array( "\n", "\r", "\t" ), array( '','','' ), $form ) : $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 $toggle Toggle new registration or profile update. new|edit. - * @param array $rows The rows array - * @param string $hidden The HTML string of hidden fields - */ - $form = apply_filters( 'wpmem_register_form', $form, $toggle, $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 $toggle Toggle new registration or profile update. new|edit. - */ - $form = apply_filters( 'wpmem_register_form_before', '', $toggle ) . $form; - - // return the generated form - return $form; -} // end wpmem_inc_registration -endif; - - -if ( ! function_exists( 'wpmem_inc_recaptcha' ) ): -/** - * Create reCAPTCHA form. - * - * @since 2.6.0 - * - * @param array $arr - * @return string $str - */ -function wpmem_inc_recaptcha( $arr ) { - - // determine if reCAPTCHA should be another language - $allowed_langs = array( 'nl', 'fr', 'de', 'pt', 'ru', 'es', 'tr' ); - $compare_lang = strtolower( substr( WPLANG, -2 ) ); - $use_the_lang = ( in_array( $compare_lang, $allowed_langs ) ) ? $compare_lang : false; - $lang = ( $use_the_lang ) ? ' lang : \'' . $use_the_lang . '\'' : ''; - - // determine if we need ssl - $http = wpmem_use_ssl(); - - global $wpmem; - if ( $wpmem->captcha == 1 ) { - - $str = ' - - '; - - } elseif ( $wpmem->captcha == 3 ) { - - $str = ' -
    '; - } - - /** - * Filter the reCAPTCHA HTML. - * - * @since 2.7.4 - * - * @param string $str A string of HTML for the reCAPTCHA. - */ - $str = apply_filters( 'wpmem_recaptcha', $str ); - - return $str; -} -endif; - - -/** - * Create an attribution link in the form. - * - * @since 2.6.0 - * - * @return string $str - */ -function wpmem_inc_attribution() { - - $http = ( is_ssl() ) ? 'https://' : 'http://'; - $str = ' -
    - Powered by WP-Members -
    '; - - return ( get_option( 'wpmembers_attrib' ) ) ? $str : ''; -} - - -/** - * Create Really Simple CAPTCHA. - * - * @since 2.9.5 - * - * @return array Form elements for Really Simple CAPTCHA. - */ -function wpmem_build_rs_captcha() { - - if ( defined( 'REALLYSIMPLECAPTCHA_VERSION' ) ) { - // setup defaults - $defaults = array( - 'characters' => 'ABCDEFGHJKLMNPQRSTUVWXYZ23456789', - 'num_char' => '4', - 'dim_w' => '72', - 'dim_h' => '30', - 'font_color' => '0,0,0', - 'bg_color' => '255,255,255', - 'font_size' => '12', - 'kerning' => '14', - 'img_type' => 'png', - ); - $wpmem_captcha = get_option( 'wpmembers_captcha' ); - - extract( wp_parse_args( $wpmem_captcha['really_simple'], $defaults ) ); - - $img_size = array( $dim_w, $dim_h ); - $fg = explode( ",", $font_color ); - $bg = explode( ",", $bg_color ); - - $wpmem_captcha = new ReallySimpleCaptcha(); - $wpmem_captcha->chars = $characters; - $wpmem_captcha->char_length = $num_char; - $wpmem_captcha->img_size = $img_size; - $wpmem_captcha->fg = $fg; - $wpmem_captcha->bg = $bg; - $wpmem_captcha->font_size = $font_size; - $wpmem_captcha->font_char_width = $kerning; - $wpmem_captcha->img_type = $img_type; - - $wpmem_captcha_word = $wpmem_captcha->generate_random_word(); - $wpmem_captcha_prefix = mt_rand(); - $wpmem_captcha_image_name = $wpmem_captcha->generate_image( $wpmem_captcha_prefix, $wpmem_captcha_word ); - - /** - * Filters the default Really Simple Captcha folder location. - * - * @since 3.0 - * - * @param string The default location of RS Captcha. - */ - $wpmem_captcha_image_url = apply_filters( 'wpmem_rs_captcha_folder', get_bloginfo('wpurl') . '/wp-content/plugins/really-simple-captcha/tmp/' ); - - $img_w = $wpmem_captcha->img_size[0]; - $img_h = $wpmem_captcha->img_size[1]; - $src = $wpmem_captcha_image_url . $wpmem_captcha_image_name; - $size = $wpmem_captcha->char_length; - $pre = $wpmem_captcha_prefix; - - return array( - 'label' => '', - 'field' => ' - - captcha' - ); - } else { - return; - } -} - -/** End of File **/ \ No newline at end of file diff --git a/inc/index.php b/inc/index.php new file mode 100644 index 00000000..dc051a13 --- /dev/null +++ b/inc/index.php @@ -0,0 +1 @@ +fields; // get_option( 'wpmembers_fields' ); - foreach ( $wpmem_fields as $meta ) { - if ( $meta[4] == 'y' ) { - if ( $meta[2] != 'password' ) { - $fields[ $meta[2] ] = ( isset( $_POST[ $meta[2] ] ) ) ? sanitize_text_field( $_POST[ $meta[2] ] ) : ''; - } else { - // We do have password as part of the registration form. - $fields['password'] = ( isset( $_POST['password'] ) ) ? $_POST['password'] : ''; - } - } - } - - /** - * Filter the submitted form field date prior to validation. - * - * @since 2.8.2 - * - * @param array $fields An array of the posted form field data. - */ - $fields = apply_filters( 'wpmem_pre_validate_form', $fields ); - - // Check for required fields, reverse the array for logical error message order. - $wpmem_fields_rev = array_reverse( $wpmem_fields ); - - foreach ( $wpmem_fields_rev as $meta ) { - $pass_arr = array( 'password', 'confirm_password', 'password_confirm' ); - $pass_chk = ( $toggle == 'update' && in_array( $meta[2], $pass_arr ) ) ? true : false; - if ( $meta[5] == 'y' && $pass_chk == false ) { - if ( ! $fields[ $meta[2] ] ) { - $wpmem_themsg = sprintf( __( 'Sorry, %s is a required field.', 'wp-members' ), $meta[1] ); - } - } - } - - switch ( $toggle ) { - - case "register": - - if ( is_multisite() ) { - // Multisite has different requirements. - $result = wpmu_validate_user_signup( $fields['username'], $fields['user_email'] ); - $errors = $result['errors']; - if ( $errors->errors ) { - $wpmem_themsg = $errors->get_error_message(); return $wpmem_themsg; exit; - } - - } else { - // Validate username and email fields. - $wpmem_themsg = ( email_exists( $fields['user_email'] ) ) ? "email" : $wpmem_themsg; - $wpmem_themsg = ( username_exists( $fields['username'] ) ) ? "user" : $wpmem_themsg; - $wpmem_themsg = ( ! is_email( $fields['user_email']) ) ? __( 'You must enter a valid email address.', 'wp-members' ) : $wpmem_themsg; - $wpmem_themsg = ( ! validate_username( $fields['username'] ) ) ? __( 'The username cannot include non-alphanumeric characters.', 'wp-members' ) : $wpmem_themsg; - $wpmem_themsg = ( ! $fields['username'] ) ? __( 'Sorry, username is a required field', 'wp-members' ) : $wpmem_themsg; - - // If there is an error from username, email, or required field validation, stop registration and return the error. - if ( $wpmem_themsg ) { - return $wpmem_themsg; - exit(); - } - } - - // If form contains password and email confirmation, validate that they match. - if ( array_key_exists( 'confirm_password', $fields ) && $fields['confirm_password'] != $fields ['password'] ) { - $wpmem_themsg = __( 'Passwords did not match.', 'wp-members' ); - } - if ( array_key_exists( 'confirm_email', $fields ) && $fields['confirm_email'] != $fields ['user_email'] ) { - $wpmem_themsg = __( 'Emails did not match.', 'wp-members' ); - } - - // Get the captcha settings (api keys). - $wpmem_captcha = get_option( 'wpmembers_captcha' ); - - // If captcha is on, check the captcha. - if ( $wpmem->captcha == 1 && $wpmem_captcha['recaptcha'] ) { - - // If there is no api key, the captcha never displayed to the end user. - if ( $wpmem_captcha['recaptcha']['public'] && $wpmem_captcha['recaptcha']['private'] ) { - if ( ! $_POST["recaptcha_response_field"] ) { // validate for empty captcha field - $wpmem_themsg = __( 'You must complete the CAPTCHA form.', 'wp-members' ); - return "empty"; exit(); - } - } - - // Check to see if the recaptcha library has already been loaded by another plugin. - if ( ! function_exists( '_recaptcha_qsencode' ) ) { - require_once( WPMEM_PATH . 'lib/recaptchalib.php' ); - } - - $publickey = $wpmem_captcha['recaptcha']['public']; - $privatekey = $wpmem_captcha['recaptcha']['private']; - - // The response from reCAPTCHA. - $resp = null; - // The error code from reCAPTCHA, if any. - $error = null; - - if ( $_POST["recaptcha_response_field"] ) { - - $resp = recaptcha_check_answer ( - $privatekey, - $_SERVER["REMOTE_ADDR"], - $_POST["recaptcha_challenge_field"], - $_POST["recaptcha_response_field"] - ); - - if ( ! $resp->is_valid ) { - - // Set the error code so that we can display it. - global $wpmem_captcha_err; - $wpmem_captcha_err = $resp->error; - $wpmem_captcha_err = wpmem_get_captcha_err( $wpmem_captcha_err ); - - return "captcha"; - exit(); - - } - } // End check recaptcha. - } elseif ( $wpmem->captcha == 2 ) { - if ( defined( 'REALLYSIMPLECAPTCHA_VERSION' ) ) { - // Validate Really Simple Captcha. - $wpmem_captcha = new ReallySimpleCaptcha(); - // This variable holds the CAPTCHA image prefix, which corresponds to the correct answer. - $wpmem_captcha_prefix = ( isset( $_POST['captcha_prefix'] ) ) ? $_POST['captcha_prefix'] : ''; - // This variable holds the CAPTCHA response, entered by the user. - $wpmem_captcha_code = ( isset( $_POST['captcha_code'] ) ) ? $_POST['captcha_code'] : ''; - // Check CAPTCHA validity. - $wpmem_captcha_correct = ( $wpmem_captcha->check( $wpmem_captcha_prefix, $wpmem_captcha_code ) ) ? true : false; - // Clean up the tmp directory. - $wpmem_captcha->remove( $wpmem_captcha_prefix ); - $wpmem_captcha->cleanup(); - // If CAPTCHA validation fails (incorrect value entered in CAPTCHA field), return an error. - if ( ! $wpmem_captcha_correct ) { - $wpmem_themsg = wpmem_get_captcha_err( 'really-simple' ); - return "empty"; exit(); - } - } - } elseif ( $wpmem->captcha == 3 && $wpmem_captcha['recaptcha'] ) { - // Get the captcha response. - if ( isset( $_POST['g-recaptcha-response'] ) ) { - $captcha = $_POST['g-recaptcha-response']; - } - - // If there is no captcha value, return error. - if ( ! $captcha ) { - $wpmem_themsg = __( 'You must complete the CAPTCHA form.', 'wp-members' ); - return "empty"; exit(); - } - - // We need the private key for validation. - $privatekey = $wpmem_captcha['recaptcha']['private']; - - // Validate the captcha. - $response = file_get_contents( "https://www.google.com/recaptcha/api/siteverify?secret=" . $privatekey . "&response=" . $captcha . "&remoteip=" . $_SERVER['REMOTE_ADDR'] ); - - // If captcha validation was unsuccessful. - if ( $response['success'] == false ) { - $wpmem_themsg = __( 'CAPTCHA was not valid.', 'wp-members' ); - return "empty"; exit(); - } - } - - // Check for user defined password. - $fields['password'] = ( ! isset( $_POST['password'] ) ) ? wp_generate_password() : $_POST['password']; - - // Add for _data hooks - $fields['user_registered'] = gmdate( 'Y-m-d H:i:s' ); - $fields['user_role'] = get_option( 'default_role' ); - $fields['wpmem_reg_ip'] = $_SERVER['REMOTE_ADDR']; - $fields['wpmem_reg_url'] = $_REQUEST['redirect_to']; - - /* - * These native fields are not installed by default, but if they - * are added, use the $_POST value - otherwise, default to username. - * Value can be filtered with wpmem_register_data. - */ - $fields['user_nicename'] = ( isset( $_POST['user_nicename'] ) ) ? sanitize_title( $_POST['user_nicename'] ) : $fields['username']; - $fields['display_name'] = ( isset( $_POST['display_name'] ) ) ? sanitize_user ( $_POST['display_name'] ) : $fields['username']; - $fields['nickname'] = ( isset( $_POST['nickname'] ) ) ? sanitize_user ( $_POST['nickname'] ) : $fields['username']; - - /** - * Filter registration data after validation before data insertion. - * - * @since 2.8.2 - * - * @param array $fields An array of the registration field data. - * @param string $toggle A switch to indicate the action (new|edit). - */ - $fields = apply_filters( 'wpmem_register_data', $fields, 'new' ); - - /** - * Fires before any insertion/emails. - * - * This action is the final step in pre registering a user. This - * can be used for attaching custom validation to the registration - * process. It cannot be used for changing any user registration - * data. Use the wpmem_register_data filter for that. - * - * @since 2.7.2 - * - * @param array $fields The user's submitted registration data. - */ - do_action( 'wpmem_pre_register_data', $fields ); - - // If the _pre_register_data hook sends back an error message. - if ( $wpmem_themsg ) { - return $wpmem_themsg; - } - - // Main new user fields are ready. - $new_user_fields = array ( - 'user_pass' => $fields['password'], - 'user_login' => $fields['username'], - 'user_nicename' => $fields['user_nicename'], - 'user_email' => $fields['user_email'], - 'display_name' => $fields['display_name'], - 'nickname' => $fields['nickname'], - 'user_registered' => $fields['user_registered'], - 'role' => $fields['user_role'] - ); - - // Get any excluded meta fields. - $excluded_meta = wpmem_get_excluded_meta( 'register' ); - - // Fields for wp_insert_user: user_url, first_name, last_name, description, jabber, aim, yim. - $new_user_fields_meta = array( 'user_url', 'first_name', 'last_name', 'description', 'jabber', 'aim', 'yim' ); - foreach ( $wpmem_fields as $meta ) { - if ( in_array( $meta[2], $new_user_fields_meta ) ) { - if ( $meta[4] == 'y' && ! in_array( $meta[2], $excluded_meta ) ) { - $new_user_fields[ $meta[2] ] = $fields[ $meta[2] ]; - } - } - } - - // Inserts to wp_users table. - $fields['ID'] = wp_insert_user( $new_user_fields ); - - // Set remaining fields to wp_usermeta table. - foreach ( $wpmem_fields as $meta ) { - // If the field is not excluded, update accordingly. - if ( ! in_array( $meta[2], $excluded_meta ) && ! in_array( $meta[2], $new_user_fields_meta ) ) { - if ( $meta[4] == 'y' && $meta[2] != 'user_email' ) { - update_user_meta( $fields['ID'], $meta[2], $fields[ $meta[2] ] ); - } - } - } - - // Capture IP address of user at registration. - update_user_meta( $fields['ID'], 'wpmem_reg_ip', $fields['wpmem_reg_ip'] ); - - // Store the registration url. - update_user_meta( $fields['ID'], 'wpmem_reg_url', $fields['wpmem_reg_url'] ); - - // Set user expiration, if used. - if ( $wpmem->use_exp == 1 && $wpmem->mod_reg != 1 ) { wpmem_set_exp( $fields['ID'] ); } - - /** - * Fires after user insertion but before email. - * - * @since 2.7.2 - * - * @param array $fields The user's submitted registration data. - */ - do_action( 'wpmem_post_register_data', $fields ); - - require_once( WPMEM_PATH . 'inc/email.php' ); - - /* - * If this was successful, and you have email properly - * configured, send a notification email to the user. - */ - wpmem_inc_regemail( $fields['ID'], $fields['password'], $wpmem->mod_reg, $wpmem_fields, $fields ); - - // Notify admin of new reg, if needed. - if ( $wpmem->notify == 1 ) { - wpmem_notify_admin( $fields['ID'], $wpmem_fields ); - } - - /** - * Fires after registration is complete. - * - * @since 2.7.1 - */ - do_action( 'wpmem_register_redirect' ); - - // successful registration message - return "success"; exit(); - break; - - case "update": - - if ( $wpmem_themsg ) { - return "updaterr"; - exit(); - } - - /* - * Doing a check for existing email is not the same as a new reg. check first to - * see if it's different, then check if it is a valid address and it exists. - */ - global $current_user; get_currentuserinfo(); - if ( $fields['user_email'] != $current_user->user_email ) { - if ( email_exists( $fields['user_email'] ) ) { - return "email"; - exit(); - } - if ( !is_email( $fields['user_email']) ) { - $wpmem_themsg = __( 'You must enter a valid email address.', 'wp-members' ); - return "updaterr"; - exit(); - } - } - - // If form includes email confirmation, validate that they match. - if ( array_key_exists( 'confirm_email', $fields ) && $fields['confirm_email'] != $fields ['user_email'] ) { - $wpmem_themsg = __( 'Emails did not match.', 'wp-members' ); - } - - // Add the user_ID to the fields array. - $fields['ID'] = $user_ID; - - /** - * Filter registration data after validation before data insertion. - * - * @since 2.8.2 - * - * @param array $fields An array of the registration field data. - * @param string $toggle A switch to indicate the action (new|edit). - */ - $fields = apply_filters( 'wpmem_register_data', $fields, 'edit' ); - - /** - * Fires before data insertion. - * - * This action is the final step in pre updating a user. This - * can be used for attaching custom validation to the update - * process. It cannot be used for changing any user update - * data. Use the wpmem_register_data filter for that. - * - * @since 2.7.2 - * - * @param array $fields The user's submitted update data. - */ - do_action( 'wpmem_pre_update_data', $fields ); - - /* - * If the _pre_update_data hook sends back an error message. - * @todo - double check this. it should probably return "updaterr" and the hook should globalize wpmem_themsg - */ - if ( $wpmem_themsg ){ return $wpmem_themsg; } - - // A list of fields that can be updated by wp_update_user. - $native_fields = array( - 'user_nicename', - 'user_url', - 'user_email', - 'display_name', - 'nickname', - 'first_name', - 'last_name', - 'description', - 'role', - 'jabber', - 'aim', - 'yim' - ); - $native_update = array( 'ID' => $user_ID ); - - foreach ( $wpmem_fields as $meta ) { - // If the field is not excluded, update accordingly. - if ( ! in_array( $meta[2], wpmem_get_excluded_meta( 'update' ) ) ) { - switch ( $meta[2] ) { - - // If the field can be updated by wp_update_user. - case( in_array( $meta[2], $native_fields ) ): - $fields[ $meta[2] ] = ( isset( $fields[ $meta[2] ] ) ) ? $fields[ $meta[2] ] : ''; - $native_update[ $meta[2] ] = $fields[ $meta[2] ]; - break; - - // If the field is password. - case( 'password' ): - // Do nothing. - break; - - // Everything else goes into wp_usermeta. - default: - if ( $meta[4] == 'y' ) { - update_user_meta( $user_ID, $meta[2], $fields[ $meta[2] ] ); - } - break; - } - } - } - - // Update wp_update_user fields. - wp_update_user( $native_update ); - - /** - * Fires at the end of user update data insertion. - * - * @since 2.7.2 - * - * @param array $fields The user's submitted registration data. - */ - do_action( 'wpmem_post_update_data', $fields ); - - return "editsuccess"; exit(); - break; - } -} // End registration function. -endif; - - -if ( ! function_exists( 'wpmem_get_captcha_err' ) ): -/** - * Generate reCAPTCHA error messages. - * - * @since 2.4 - * - * @param string $wpmem_captcha_err The response from the reCAPTCHA API. - * @return string $wpmem_captcha_err The appropriate error message. - */ -function wpmem_get_captcha_err( $wpmem_captcha_err ) { - - switch ( $wpmem_captcha_err ) { - - case "invalid-site-public-key": - $wpmem_captcha_err = __( 'We were unable to validate the public key.', 'wp-members' ); - break; - - case "invalid-site-public-key": - $wpmem_captcha_err = __( 'We were unable to validate the private key.', 'wp-members' ); - break; - - case "invalid-request-cookie": - $wpmem_captcha_err = __( 'The challenge parameter of the verify script was incorrect.', 'wp-members' ); - break; - - case "incorrect-captcha-sol": - $wpmem_captcha_err = __( 'The CAPTCHA solution was incorrect.', 'wp-members' ); - break; - - case "verify-params-incorrect": - $wpmem_captcha_err = __( 'The parameters to verify were incorrect', 'wp-members' ); - break; - - case "invalid-referrer": - $wpmem_captcha_err = __( 'reCAPTCHA API keys are tied to a specific domain name for security reasons.', 'wp-members' ); - break; - - case "recaptcha-not-reachable": - $wpmem_captcha_err = __( 'The reCAPTCHA server was not reached. Please try to resubmit.', 'wp-members' ); - break; - - case 'really-simple': - $wpmem_captcha_err = __( 'You have entered an incorrect code value. Please try again.', 'wp-members' ); - break; - } - - return $wpmem_captcha_err; -} -endif; - -/** End of File **/ \ No newline at end of file diff --git a/inc/shortcodes.php b/inc/shortcodes.php deleted file mode 100644 index 0c5e54d9..00000000 --- a/inc/shortcodes.php +++ /dev/null @@ -1,515 +0,0 @@ -regchk == 'loginfailed' ) ? wpmem_inc_loginfailed() : wpmem_inc_login( 'login', $redirect_to ); - } - break; - - case in_array( 'register', $atts ): - if ( is_user_logged_in() ) { - /* - * If the user is logged in, return any nested content (if any) - * or the default bullet links if no nested content. - */ - $content = ( $content ) ? $content : wpmem_inc_memberlinks( 'register' ); - } else { - // @todo Can this be moved into another function? Should $wpmem get an error message handler? - if ( $wpmem->regchk == 'captcha' ) { - global $wpmem_captcha_err; - $wpmem_themsg = __( 'There was an error with the CAPTCHA form.' ) . '

    ' . $wpmem_captcha_err; - } - $content = ( $wpmem_themsg || $wpmem->regchk == 'success' ) ? wpmem_inc_regmessage( $wpmem->regchk, $wpmem_themsg ) : ''; - $content .= ( $wpmem->regchk == 'success' ) ? wpmem_inc_login() : wpmem_inc_registration(); - } - break; - - case in_array( 'password', $atts ): - $content = wpmem_page_pwd_reset( $wpmem->regchk, $content ); - break; - - case in_array( 'user_edit', $atts ): - $content = wpmem_page_user_edit( $wpmem->regchk, $content ); - break; - - } - - /* - * @todo - This is temporary for texturizing. Need to work it into an argument in the function call as - * to whether the [wpmem_txt] shortcode is even included. For now, this will allow this function to be - * tested as an include during the 3.0 alpha/beta testing period and a permanent solution can be worked - * out for 3.x.x. - */ - if ( array_key_exists( 'texturize', $atts ) && $atts['texturize'] == 'false' ) { - $content = str_replace( array( '[wpmem_txt]', '[/wpmem_txt]' ), array( '', '' ), $content ); - } - if ( strstr( $content, '[wpmem_txt]' ) ) { - // Fixes the wptexturize. - remove_filter( 'the_content', 'wpautop' ); - remove_filter( 'the_content', 'wptexturize' ); - add_filter( 'the_content', 'wpmem_texturize', 99 ); - } - // @todo - Look into shortcode_unautop(). - /** End temporary texturize functions */ - - return do_shortcode( $content ); -} - - -/** - * Handles the logged in status shortcodes. - * - * There are two shortcodes to display content based on a user being logged - * in - [wp-members status=in] and [wpmem_logged_in] (status=in is a legacy - * shortcode, but will still function). There are several attributes that - * can be used with the shortcode: in|out, sub for subscription only info, - * id, and role. IDs and roles can be comma separated values for multiple - * users and roles. Additionally, status=out can be used to display content - * only to logged out users or visitors. - * - * @since 3.0.0 - * - * @param array $atts - * @param string $content - * @param string $tag - * @return string $content - */ -function wpmem_sc_logged_in( $atts, $content = null, $tag = 'wpmem_logged_in' ) { - - global $wpmem; - - // Handles the 'status' attribute. - if ( ( isset( $atts['status'] ) ) || $tag == 'wpmem_logged_in' ) { - - $do_return = false; - - // If there is a status attribute of "out" and the user is not logged in. - $do_return = ( isset( $atts['status'] ) && $atts['status'] == 'out' && ! is_user_logged_in() ) ? true : $do_return; - - if ( is_user_logged_in() ) { - - // In case $current_user is not already global - $current_user = wp_get_current_user(); - - // If there is a status attribute of "in" and the user is logged in. - $do_return = ( isset( $atts['status'] ) && $atts['status'] == 'in' ) ? true : $do_return; - - // If using the wpmem_logged_in tag with no attributes & the user is logged in. - $do_return = ( $tag == 'wpmem_logged_in' && ( ! $atts ) ) ? true : $do_return; - - // If there is an "id" attribute and the user ID is in it. - if ( isset( $atts['id'] ) ) { - $ids = explode( ',', $atts['id'] ); - foreach ( $ids as $id ) { - if ( trim( $id ) == $current_user->ID ) { - $do_return = true; - } - } - } - - // If there is a "role" attribute and the user has a matching role. - if ( isset( $atts['role'] ) ) { - $roles = explode( ',', $atts['role'] ); - foreach ( $roles as $role ) { - if ( in_array( trim( $role ), $current_user->roles ) ) { - $do_return = true; - } - } - } - - // If there is a status attribute of "sub" and the user is logged in. - if ( ( isset( $atts['status'] ) ) && $atts['status'] == 'sub' && is_user_logged_in() ) { - if ( $wpmem->use_exp == 1 ) { - if ( ! wpmem_chk_exp() ) { - $do_return = true; - } elseif ( $atts['msg'] == true ) { - $do_return = true; - $content = wpmem_sc_expmessage(); - } - } - } - - } - - // Return content (or empty content) depending on the result of the above logic. - return ( $do_return ) ? do_shortcode( $content ) : ''; - } -} - - -/** - * Handles the [wpmem_logged_out] shortcode. - * - * @since 3.0.0 - * - * @param array $atts - * @param string $content - * @param string $tag - * @return string $content - */ -function wpmem_sc_logged_out( $atts, $content = null, $tag ) { - return ( ! is_user_logged_in() ) ? do_shortcode( $content ) : ''; -} - - -/** - * Displays login form when called by shortcode. - * - * @since 3.0 - * - * @param $atts - * @param $content - * @param $tag - * @return $content - -function wpmem_sc_login_form( $atts, $content, $tag ) { - - // Dependencies. - global $wpmem; - include_once( WPMEM_PATH . 'inc/core.php' ); - include_once( WPMEM_PATH . 'inc/dialogs.php' ); - // Defaults. - $redirect_to = ( isset( $atts['redirect_to'] ) ) ? $atts['redirect_to'] : null; - $texturize = ( isset( $atts['texturize'] ) ) ? $atts['texturize'] : false; - - if ( is_user_logged_in() ) { - return ( $content ) ? $content : wpmem_inc_memberlinks( 'login' ); - } else { - return ( $wpmem->regchk == 'loginfailed' ) ? wpmem_inc_loginfailed() : wpmem_inc_login( 'login', $redirect_to, $texturize ); - } -} */ - - -if ( ! function_exists( 'wpmem_shortcode' ) ): -/** - * Executes various shortcodes. - * - * This function executes shortcodes for pages (settings, register, login, user-list, - * and tos pages), as well as login status and field attributes when the wp-members tag - * is used. Also executes shortcodes for login status with the wpmem_logged_in tags - * and fields when the wpmem_field tags are used. - * - * @since 2.4 - * - * @param array $attr page|url|status|msg|field|id - * @param string $content - * @param string $tag - * @return string Returns the result of wpmem_do_sc_pages|wpmem_list_users|wpmem_sc_expmessage|$content. - */ -function wpmem_shortcode( $attr, $content = null, $tag = 'wp-members' ) { - - global $wpmem; - - // Set all default attributes to false. - $defaults = array( - 'page' => false, - 'redirect_to' => null, - 'url' => false, - 'status' => false, - 'msg' => false, - 'field' => false, - 'id' => false, - 'underscores' => 'off', - ); - - // Merge defaults with $attr. - $atts = shortcode_atts( $defaults, $attr, $tag ); - - // Handles the 'page' attribute. - if ( $atts['page'] ) { - if ( $atts['page'] == 'user-list' ) { - if ( function_exists( 'wpmem_list_users' ) ) { - $content = do_shortcode( wpmem_list_users( $attr, $content ) ); - } - } elseif ( $atts['page'] == 'tos' ) { - return $atts['url']; - } else { - $content = do_shortcode( wpmem_do_sc_pages( $atts['page'], $atts['redirect_to'] ) ); - } - - // Resolve any texturize issues. - if ( strstr( $content, '[wpmem_txt]' ) ) { - // Fixes the wptexturize. - remove_filter( 'the_content', 'wpautop' ); - remove_filter( 'the_content', 'wptexturize' ); - add_filter( 'the_content', 'wpmem_texturize', 99 ); - } - return $content; - } - - // Handles the 'status' attribute. - if ( ( $atts['status'] ) || $tag == 'wpmem_logged_in' ) { - return do_shortcode( wpmem_sc_logged_in( $atts, $content, $tag ) ); - } - - // @deprecated 3.0.0 - // Handles the wpmem_logged_out tag with no attributes & the user is not logged in. - /* - if ( $tag == 'wpmem_logged_out' && ( ! $attr ) && ! is_user_logged_in() ) { - return do_shortcode( $content ); - } - */ - - // Handles the 'field' attribute. - if ( $atts['field'] || $tag == 'wpmem_field' ) { - if ( $atts['id'] ) { - // We are getting some other user. - if ( $atts['id'] == 'get' ) { - $the_user_ID = ( isset( $_GET['uid'] ) ) ? $_GET['uid'] : ''; - } else { - $the_user_ID = $atts['id']; - } - } else { - // Get the current user. - $the_user_ID = get_current_user_id(); - } - $user_info = get_userdata( $the_user_ID ); - - if ( $atts['underscores'] == 'off' && $user_info ) { - $user_info->$atts['field'] = str_replace( '_', ' ', $user_info->$atts['field'] ); - } - - return ( $user_info ) ? htmlspecialchars( $user_info->$atts['field'] ) . do_shortcode( $content ) : do_shortcode( $content ); - } - - // Logout link shortcode. - if ( is_user_logged_in() && $tag == 'wpmem_logout' ) { - $link = ( $atts['url'] ) ? wpmem_chk_qstr( $atts['url'] ) . 'a=logout' : wpmem_chk_qstr( get_permalink() ) . 'a=logout'; - $text = ( $content ) ? $content : __( 'Click here to log out.', 'wp-members' ); - return do_shortcode( "$text" ); - } - -} -endif; - - -if ( ! function_exists( 'wpmem_do_sc_pages' ) ): -/** - * Builds the shortcode pages (login, register, user-profile, user-edit, password). - * - * Some of the logic here is similar to the wpmem_securify() function. - * But where that function handles general content, this function - * handles building specific pages generated by shortcodes. - * - * @since 2.6 - * - * @param string $page - * @param string $redirect_to - * @global object $wpmem - * @global string $wpmem_themsg - * @global object $post - * @return string $content - */ -function wpmem_do_sc_pages( $page, $redirect_to = null ) { - - global $wpmem, $wpmem_themsg, $post; - include_once( WPMEM_PATH . 'inc/dialogs.php' ); - - $content = ''; - - // Deprecating members-area parameter to be replaced by user-profile. - $page = ( $page == 'user-profile' ) ? 'members-area' : $page; - - if ( $page == 'members-area' || $page == 'register' ) { - - if ( $wpmem->regchk == "captcha" ) { - global $wpmem_captcha_err; - $wpmem_themsg = __( 'There was an error with the CAPTCHA form.' ) . '

    ' . $wpmem_captcha_err; - } - - if ( $wpmem->regchk == "loginfailed" ) { - return wpmem_inc_loginfailed(); - } - - if ( ! is_user_logged_in() ) { - if ( $wpmem->action == 'register' ) { - - switch( $wpmem->regchk ) { - - case "success": - $content = wpmem_inc_regmessage( $wpmem->regchk,$wpmem_themsg ); - $content = $content . wpmem_inc_login(); - break; - - default: - $content = wpmem_inc_regmessage( $wpmem->regchk,$wpmem_themsg ); - $content = $content . wpmem_inc_registration(); - break; - } - - } elseif ( $wpmem->action == 'pwdreset' ) { - - $content = wpmem_page_pwd_reset( $wpmem->regchk, $content ); - - } else { - - $content = ( $page == 'members-area' ) ? $content . wpmem_inc_login( 'members' ) : $content; - $content = ( $page == 'register' || $wpmem->show_reg[ $post->post_type ] != 0 ) ? $content . wpmem_inc_registration() : $content; - } - - } elseif ( is_user_logged_in() && $page == 'members-area' ) { - - /** - * Filter the default heading in User Profile edit mode. - * - * @since 2.7.5 - * - * @param string The default edit mode heading. - */ - $heading = apply_filters( 'wpmem_user_edit_heading', __( 'Edit Your Information', 'wp-members' ) ); - - switch( $wpmem->action ) { - - case "edit": - $content = $content . wpmem_inc_registration( 'edit', $heading ); - break; - - case "update": - - // Determine if there are any errors/empty fields. - - if ( $wpmem->regchk == "updaterr" || $wpmem->regchk == "email" ) { - - $content = $content . wpmem_inc_regmessage( $wpmem->regchk, $wpmem_themsg ); - $content = $content . wpmem_inc_registration( 'edit', $heading ); - - } else { - - //Case "editsuccess". - $content = $content . wpmem_inc_regmessage( $wpmem->regchk, $wpmem_themsg ); - $content = $content . wpmem_inc_memberlinks(); - - } - break; - - case "pwdchange": - - $content = wpmem_page_pwd_reset( $wpmem->regchk, $content ); - break; - - case "renew": - $content = wpmem_renew(); - break; - - default: - $content = wpmem_inc_memberlinks(); - break; - } - - } elseif ( is_user_logged_in() && $page == 'register' ) { - - $content = $content . wpmem_inc_memberlinks( 'register' ); - - } - - } - - if ( $page == 'login' ) { - $content = ( $wpmem->regchk == "loginfailed" ) ? wpmem_inc_loginfailed() : $content; - $content = ( ! is_user_logged_in() ) ? $content . wpmem_inc_login( 'login', $redirect_to ) : wpmem_inc_memberlinks( 'login' ); - } - - if ( $page == 'password' ) { - $content = wpmem_page_pwd_reset( $wpmem->regchk, $content ); - } - - if ( $page == 'user-edit' ) { - $content = wpmem_page_user_edit( $wpmem->regchk, $content ); - } - - return $content; -} // End wpmem_do_sc_pages. -endif; - - -/** - * User count shortcode. - * - * @since 3.0 - * - * @todo Evaluate this shortcode for full inclusion. - */ -add_shortcode( 'wpmem_show_count', 'wpmem_sc_user_count' ); -function wpmem_sc_user_count( $atts, $content = null ) { - global $wpdb; - $do_query = ( $atts['key'] && $atts['value'] ) ? true : false; - if ( $do_query ) { - $user_meta_query = $wpdb->get_var( $wpdb->prepare( - "SELECT COUNT(*) - FROM $wpdb->usermeta - WHERE meta_key = %s - AND meta_value = %s", - $atts['key'], - $atts['value'] - ) ); - } - return ( $do_query ) ? $atts['label'] . $user_meta_query : ''; -} - - /** End of File **/ \ No newline at end of file diff --git a/inc/sidebar.php b/inc/sidebar.php deleted file mode 100644 index 4ea906ac..00000000 --- a/inc/sidebar.php +++ /dev/null @@ -1,259 +0,0 @@ -' . sprintf( __( 'You are logged in as %s', 'wp-members' ), $user_login ) - . ' | ' . __( 'click to log out', 'wp-members' ) . '

    '; - - return $status; -} -endif; - - -if ( ! function_exists( 'wpmem_do_sidebar' ) ): -/** - * Creates the sidebar login form and status. - * - * This function determines if the user is logged in and displays either - * a login form, or the user's login status. Typically used for a sidebar. - * You can call this directly, or with the widget. - * - * @since 2.4 - * - * @param string $post_to A URL to redirect to upon login, default null. - * @global string $wpmem_regchk - * @global string $user_login - */ -function wpmem_do_sidebar( $post_to = null ) { - - global $wpmem, $wpmem_regchk; - - // Used here and in the logout. - $url = get_bloginfo('url'); - - if ( ! $post_to ) { - if ( isset( $_REQUEST['redirect_to'] ) ) { - $post_to = $_REQUEST['redirect_to']; - } elseif ( is_home() || is_front_page() ) { - $post_to = $_SERVER['REQUEST_URI']; - } elseif ( is_single() || is_page() ) { - $post_to = get_permalink(); - } elseif ( is_category() ) { - global $wp_query; - $cat_id = get_query_var( 'cat' ); - $post_to = get_category_link( $cat_id ); - } elseif ( is_search() ) { - $post_to = $url . '/?s=' . get_search_query(); - } else { - $post_to = $_SERVER['REQUEST_URI']; - } - } - - // Clean whatever the url is. - $post_to = esc_url( $post_to ); - - if ( ! is_user_logged_in() ){ - - // If the user is not logged in, we need the form. - - // Defaults. - $defaults = array( - // Wrappers. - 'error_before' => '

    ', - 'error_after' => '

    ', - 'fieldset_before' => '
    ', - 'fieldset_after' => '
    ', - 'inputs_before' => '
    ', - 'inputs_after' => '
    ', - 'buttons_before' => '
    ', - 'buttons_after' => '
    ', - - // Messages. - 'error_msg' => __( 'Login Failed!
    You entered an invalid username or password.', 'wp-members' ), - 'status_msg' => __( 'You are not logged in.', 'wp-members' ) . '
    ', - - // Other. - 'strip_breaks' => true, - 'wrap_inputs' => true, - 'n' => "\n", - 't' => "\t", - ); - - /** - * Filter arguments for the sidebar defaults. - * - * @since 2.9.0 - * - * @param array An array of the defaults to be changed. - */ - $args = apply_filters( 'wpmem_sb_login_args', '' ); - - // Merge $args with defaults. - extract( wp_parse_args( $args, $defaults ) ); - - $form = ''; - - $label = ''; - $input = ''; - - $input = ( $wrap_inputs ) ? $inputs_before . $input . $inputs_after : $input; - $row1 = $label . $n . $input . $n; - - $label = ''; - $input = ''; - - $input = ( $wrap_inputs ) ? $inputs_before . $input . $inputs_after : $input; - $row2 = $label . $n . $input . $n; - - $form = $row1 . $row2; - - $hidden = '' . $n . - '' . $n . - '' . $n . - ''; - /** - * Filter sidebar login form hidden fields. - * - * @since 2.9.0 - * - * @param string $hidden The HTML for the hidden fields. - */ - $form = $form . apply_filters( 'wpmem_sb_hidden_fields', $hidden ); - - - $buttons = ''; - - if ( $wpmem->user_pages['profile'] != null ) { - /** - * Filter the sidebar forgot password link. - * - * @since 2.8.0 - * - * @param string The forgot password link. - */ - $link = apply_filters( 'wpmem_forgot_link', wpmem_chk_qstr( $wpmem->user_pages['profile'] ) . 'a=pwdreset' ); - $buttons.= ' ' . __( 'Forgot?', 'wp-members' ) . ' '; - } - - if ( $wpmem->user_pages['register'] != null ) { - /** - * Filter the sidebar register link. - * - * @since 2.8.0 - * - * @param string The register link. - */ - $link = apply_filters( 'wpmem_reg_link', $wpmem->user_pages['register'] ); - $buttons.= ' ' . __( 'Register' ) . ''; - } - - $form = $form . $n . $buttons_before . $buttons . $n . $buttons_after; - - $form = $fieldset_before . $n . $form . $n . $fieldset_after; - - $form = '
    ' . $n . $form . $n . '
    '; - - // Add status message. - $form = $status_msg . $n . $form; - - // Strip breaks. - $form = ( $strip_breaks ) ? str_replace( array( "\n", "\r", "\t" ), array( '','','' ), $form ) : $form; - - /** - * Filter the sidebar form. - * - * @since ?.? - * - * @param string $form The HTML for the sidebar login form. - */ - $form = apply_filters( 'wpmem_sidebar_form', $form ); - - $do_error_msg = ''; - if ( isset( $_POST['slog'] ) && $wpmem_regchk == 'loginfailed' ) { - $do_error_msg = true; - $error_msg = $error_before . $error_msg . $error_after; - /** - * Filter the sidebar login failed message. - * - * @since ?.? - * - * @param string $error_msg The error message. - */ - $error_msg = apply_filters( 'wpmem_login_failed_sb', $error_msg ); - } - $form = ( $do_error_msg ) ? $error_msg . $form : $form; - - echo $form; - - } else { - - global $user_login; - - /** - * Filter the sidebar logout link. - * - * @since ?.? - * - * @param string The logout link. - */ - $logout = apply_filters( 'wpmem_logout_link', $url . '/?a=logout' ); - - $str = '

    ' . sprintf( __( 'You are logged in as %s', 'wp-members' ), $user_login ) . '
    - ' . __( 'click here to log out', 'wp-members' ) . '

    '; - - /** - * Filter the sidebar user login status. - * - * @since ?.? - * - * @param string $str The login status for the user. - */ - $str = apply_filters( 'wpmem_sidebar_status', $str ); - - echo $str; - } -} -endif; - -/** End of File **/ \ No newline at end of file diff --git a/inc/users.php b/inc/users.php deleted file mode 100644 index 120663d3..00000000 --- a/inc/users.php +++ /dev/null @@ -1,132 +0,0 @@ - -

    - - fields; //get_option( 'wpmembers_fields' ); - // Get excluded meta. - $exclude = wpmem_get_excluded_meta( 'user-profile' ); - - foreach ( $wpmem_fields as $meta ) { - - $val = get_user_meta( $user_id, $meta[2], true ); - $valtochk = ''; - - $chk_tos = true; - if ( $meta[2] == 'tos' && $val == 'agree' ) { - $chk_tos = false; - echo wpmem_create_formfield( $meta[2], 'hidden', $val ); - } - - // Do we exclude the row? - $chk_pass = ( in_array( $meta[2], $exclude ) ) ? false : true; - - if ( $meta[4] == "y" && $meta[6] == "n" && $chk_tos && $chk_pass ) { - // If there are any required fields. - $req = ( $meta[5] == 'y' ) ? ' ' . __( '(required)' ) . '' : ''; - $show_field = ' - - - - '; - - /** - * Filter the field for user profile additional fields. - * - * @since 2.9.1 - * - * @parma string $show_field The HTML string of the additional field. - */ - echo apply_filters( 'wpmem_user_profile_field', $show_field ); - } - } ?> -
    '; - - $val = get_user_meta( $user_id, $meta[2], true ); - if ( $meta[3] == 'checkbox' || $meta[3] == 'select' ) { - $valtochk = $val; - $val = $meta[7]; - } - $show_field.= wpmem_create_formfield( $meta[2], $meta[3], $val, $valtochk ) . ' -
    fields; //get_option( 'wpmembers_fields' ); - // Get any excluded meta fields. - $exclude = wpmem_get_excluded_meta( 'user-profile' ); - foreach ( $wpmem_fields as $meta ) { - // If this is not an excluded meta field. - if ( ! in_array( $meta[2], $exclude ) ) { - // If the field is user editable. - if ( $meta[4] == "y" && $meta[6] == "n" && $meta[3] != 'password' ) { - - // Check for required fields. - $chk = ''; - if ( $meta[5] == "n" || ( ! $meta[5] ) ) { - $chk = 'ok'; - } - if ( $meta[5] == "y" && $_POST[$meta[2]] != '' ) { - $chk = 'ok'; - } - - // Check for field value. - $field_val = ( isset( $_POST[$meta[2]] ) ) ? $_POST[$meta[2]] : ''; - - if ( $chk == 'ok' ) { - update_user_meta( $user_id, $meta[2], $field_val ); - } - } - } - } -} - -/** End of File **/ \ No newline at end of file diff --git a/inc/utilities.php b/inc/utilities.php deleted file mode 100644 index 8308e9d1..00000000 --- a/inc/utilities.php +++ /dev/null @@ -1,361 +0,0 @@ -"; - break; - - case "checkbox": - $class = ( $class == 'textbox' ) ? "checkbox" : $class; - $str = ""; - break; - - case "text": - $value = stripslashes( esc_attr( $value ) ); - $str = ""; - break; - - case "textarea": - $value = stripslashes( esc_textarea( $value ) ); - $class = ( $class == 'textbox' ) ? "textarea" : $class; - $str = ""; - break; - - case "password": - $str = ""; - break; - - case "hidden": - $str = ""; - break; - - case "option": - $str = ""; - break; - - case "select": - $class = ( $class == 'textbox' ) ? "dropdown" : $class; - $str = ""; - break; - - } - - return $str; -} -endif; - - -if ( ! function_exists( 'wpmem_selected' ) ): -/** - * Determines if a form field is selected (i.e. lists & checkboxes). - * - * @since 0.1 - * - * @param string $value - * @param string $valtochk - * @param string $type - * @return string $issame - */ -function wpmem_selected( $value, $valtochk, $type=null ) { - $issame = ( $type == 'select' ) ? ' selected' : ' checked'; - return ( $value == $valtochk ) ? $issame : ''; -} -endif; - - -if ( ! function_exists( 'wpmem_chk_qstr' ) ): -/** - * Checks querystrings. - * - * @since 2.0 - * - * @uses get_permalink - * @param string $url - * @return string $return_url - */ -function wpmem_chk_qstr( $url = null ) { - - $permalink = get_option( 'permalink_structure' ); - if ( ! $permalink ) { - $url = ( ! $url ) ? get_option( 'home' ) . "/?" . $_SERVER['QUERY_STRING'] : $url; - $return_url = $url . "&"; - } else { - $url = ( ! $url ) ? get_permalink() : $url; - $return_url = $url . "?"; - } - return $return_url; -} -endif; - - -if ( ! function_exists( 'wpmem_generatePassword' ) ): -/** - * Generates a random password. - * - * @since 2.0 - * - * @return string The random password. - */ -function wpmem_generatePassword() { - return substr( md5( uniqid( microtime() ) ), 0, 7 ); -} -endif; - - -if ( ! function_exists( 'wpmem_texturize' ) ): -/** - * Overrides the wptexturize filter. - * - * Currently only used for the login form to remove the
    tag that WP puts in after the "Remember Me". - * - * @since 2.6.4 - * - * @param string $content - * @return string $new_content - */ -function wpmem_texturize( $content ) { - - $new_content = ''; - $pattern_full = '{(\[wpmem_txt\].*?\[/wpmem_txt\])}is'; - $pattern_contents = '{\[wpmem_txt\](.*?)\[/wpmem_txt\]}is'; - $pieces = preg_split( $pattern_full, $content, -1, PREG_SPLIT_DELIM_CAPTURE ); - - foreach ( $pieces as $piece ) { - if ( preg_match( $pattern_contents, $piece, $matches ) ) { - $new_content .= $matches[1]; - } else { - $new_content .= wptexturize( wpautop( $piece ) ); - } - } - - return $new_content; -} -endif; - - -if ( ! function_exists( 'wpmem_enqueue_style' ) ): -/** - * Loads the stylesheet for tableless forms. - * - * @since 2.6 - * - * @global $wpmem - * @uses wp_register_style - * @uses wp_enqueue_style - */ -function wpmem_enqueue_style() { - global $wpmem; - wp_register_style( 'wp-members', $wpmem->cssurl, '', WPMEM_VERSION ); - wp_enqueue_style ( 'wp-members' ); -} -endif; - - -if ( ! function_exists( 'wpmem_do_excerpt' ) ): -/** - * Creates an excerpt on the fly if there is no 'more' tag. - * - * @since 2.6 - * - * @param string $content - * @return string $content - */ -function wpmem_do_excerpt( $content ) { - - global $wpmem; - - $arr = $wpmem->autoex; // get_option( 'wpmembers_autoex' ); - - // Is there already a 'more' link in the content? - $has_more_link = ( stristr( $content, 'class="more-link"' ) ) ? true : false; - - // If auto_ex is on. - if ( $arr['auto_ex'] == true ) { - - // Build an excerpt if one does not exist. - if ( ! $has_more_link ) { - - $words = explode( ' ', $content, ( $arr['auto_ex_len'] + 1 ) ); - if ( count( $words ) > $arr['auto_ex_len'] ) { - array_pop( $words ); - } - $content = implode( ' ', $words ); - - // Check for common html tags. - $common_tags = array( 'i', 'b', 'strong', 'em', 'h1', 'h2', 'h3', 'h4', 'h5' ); - foreach ( $common_tags as $tag ) { - if ( stristr( $content, '<' . $tag . '>' ) ) { - $after = stristr( $content, '' ); - $content = ( ! stristr( $after, '' ) ) ? $content . '' : $content; - } - } - } - } - - global $post, $more; - // If there is no 'more' link and auto_ex is on. - if ( ! $has_more_link && ( $arr['auto_ex'] == true ) ) { - // The default $more_link_text. - $more_link_text = __( '(more…)' ); - // The default $more_link. - $more_link = ' ' . $more_link_text . ''; - // Apply the_content_more_link filter if one exists (will match up all 'more' link text). - $more_link = apply_filters( 'the_content_more_link' , $more_link, $more_link_text ); - // Add the more link to the excerpt. - $content = $content . $more_link; - } - - /** - * Filter the auto excerpt. - * - * @since 2.8.1 - * - * @param string $content The excerpt. - */ - $content = apply_filters( 'wpmem_auto_excerpt', $content ); - - // Return the excerpt. - return $content; -} -endif; - - -if ( ! function_exists( 'wpmem_test_shortcode' ) ): -/** - * Tests $content for the presence of the [wp-members] shortcode. - * - * @since 2.6 - * - * @global string $post - * @uses get_shortcode_regex - * @return bool - * - * @example http://codex.wordpress.org/Function_Reference/get_shortcode_regex - */ -function wpmem_test_shortcode( $content, $tag ) { - - global $shortcode_tags; - if ( array_key_exists( $tag, $shortcode_tags ) ) { - preg_match_all( '/' . get_shortcode_regex() . '/s', $content, $matches, PREG_SET_ORDER ); - if ( empty( $matches ) ) { - return false; - } - - foreach ( $matches as $shortcode ) { - if ( $tag === $shortcode[2] ) { - return true; - } - } - } - return false; -} -endif; - - -/** - * Sets an array of user meta fields to be excluded from update/insert. - * - * @since 2.9.3 - * - * @param string $tag A tag so we know where the function is being used. - */ -function wpmem_get_excluded_meta( $tag ) { - - /** - * Filter the fields to be excluded when user is created/updated. - * - * @since 2.9.3 - * - * @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. - */ - return apply_filters( 'wpmem_exclude_fields', array( 'password', 'confirm_password', 'confirm_email', 'password_confirm', 'email_confirm' ), $tag ); -} - - -/** - * Returns http:// or https:// depending on ssl. - * - * @ since 2.9.8 - */ -function wpmem_use_ssl() { - return ( is_ssl() ) ? 'https://' : 'http://'; -} - - -/** - * Returns an array of WordPress reserved terms. - * - * @since 3.0.2 - * - * @return array An array of WordPress reserved terms. - */ -function wpmem_wp_reserved_terms() { - $reserved_terms = array( 'attachment', 'attachment_id', 'author', 'author_name', 'calendar', 'cat', 'category', 'category__and', 'category__in', 'category__not_in', 'category_name', 'comments_per_page', 'comments_popup', 'customize_messenger_channel', 'customized', 'cpage', 'day', 'debug', 'error', 'exact', 'feed', 'fields', 'hour', 'link_category', 'm', 'minute', 'monthnum', 'more', 'name', 'nav_menu', 'nonce', 'nopaging', 'offset', 'order', 'orderby', 'p', 'page', 'page_id', 'paged', 'pagename', 'pb', 'perm', 'post', 'post__in', 'post__not_in', 'post_format', 'post_mime_type', 'post_status', 'post_tag', 'post_type', 'posts', 'posts_per_archive_page', 'posts_per_page', 'preview', 'robots', 's', 'search', 'second', 'sentence', 'showposts', 'static', 'subpost', 'subpost_id', 'tag', 'tag__and', 'tag__in', 'tag__not_in', 'tag_id', 'tag_slug__and', 'tag_slug__in', 'taxonomy', 'tb', 'term', 'theme', 'type', 'w', 'withcomments', 'withoutcomments', 'year' ); - - /** - * Filter the array of reserved terms. - * - * @since 3.0.2 - * - * @param array $reserved_terms - */ - $reserved_terms = apply_filters( 'wpmem_wp_reserved_terms', $reserved_terms ); - - return $reserved_terms; -} - -/** End of File **/ \ No newline at end of file diff --git a/inc/wp-registration.php b/inc/wp-registration.php deleted file mode 100644 index 7423c91d..00000000 --- a/inc/wp-registration.php +++ /dev/null @@ -1,201 +0,0 @@ - Add New screen. - * - * This file is part of the WP-Members plugin by Chad Butler - * You can find out more about this plugin at http://rocketgeek.com - * Copyright (c) 2006-2015 Chad Butler - * WP-Members(tm) is a trademark of butlerblog.com - * - * @package WordPress - * @subpackage WP-Members - * @author Chad Butler - * @copyright 2006-2015 - * - * Functions Included: - * - wpmem_do_wp_register_form - * - wpmem_do_wp_newuser_form - */ - - -/** - * Appends WP-Members registration fields to wp-login.php registration form. - * - * @since 2.8.7 - */ -function wpmem_do_wp_register_form() { - - global $wpmem; - $wpmem_fields = $wpmem->fields; //$wpmem_fields = get_option( 'wpmembers_fields' ); - foreach ( $wpmem_fields as $field ) { - //for ( $row = 0; $row < count( $wpmem_fields ); $row++ ) { - - $req = ( $field[5] == 'y' ) ? ' ' . __( '(required)' ) . '' : ''; - - if ( $field[4] == 'y' && $field[2] != 'user_email' ) { - - if ( $field[3] == 'checkbox' ) { - - if ( $field[2] == 'tos' ) { - $tos_content = stripslashes( get_option( 'wpmembers_tos' ) ); - if ( stristr( $tos_content, '[wp-members page="tos"' ) ) { - - $tos_content = " " . $tos_content; - $ini = strpos( $tos_content, 'url="' ); - $ini += strlen( 'url="' ); - $len = strpos( $tos_content, '"]', $ini ) - $ini; - $link = substr( $tos_content, $ini, $len ); - $tos_pop = ''; - - } else { - $tos_pop = ""; - } - /** - * Filter the TOS link text. - * - * When this filter is used for the WP native registration, the $toggle parameter is not passed. - * - * @since 2.7.5 - * - * @param string The text and link for the TOS. - */ - $tos = apply_filters( 'wpmem_tos_link_txt', sprintf( __( 'Please indicate that you agree to the %s TOS %s', 'wp-members' ), $tos_pop, '' ) ); - - } - - $label = ( $field[2] == 'tos' ) ? $tos : __( $field[1], 'wp-members' ); - - $val = ( isset( $_POST[ $field[2] ] ) ) ? $_POST[ $field[2] ] : ''; - $val = ( ! $_POST && $field[8] == 'y' ) ? $field[7] : $val; - - $row_before = '

    '; - $label = '

    '; - - } else { - - $row_before = '

    '; - $label = '

    '; - - } - - // if the row is set to display, add the row to the form array - $rows[$field[2]] = array( - 'type' => $field[3], - 'row_before' => $row_before, - 'label' => $label, - 'field' => $input, - 'row_after' => $row_after, - ); - } - } - - /** - * 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 - */ -function wpmem_do_wp_newuser_form() { - - global $wpmem; - echo ''; - - $wpmem_fields = $wpmem->fields; //get_option( 'wpmembers_fields' ); - $exclude = wpmem_get_excluded_meta( 'register' ); - - foreach ( $wpmem_fields as $field ) { - - if ( $field[6] == 'n' && ! in_array( $field[2], $exclude ) ) { - - $req = ( $field[5] == 'y' ) ? ' ' . __( '(required)' ) . '' : ''; - - echo ' - - - '; - - } - } - echo '
    - - '; - - // determine the field type and generate accordingly. - - switch ( $field[3] ) { - - case( 'select' ): - $val = ( isset( $_POST[ $field[2] ] ) ) ? $_POST[ $field[2] ] : ''; - echo wpmem_create_formfield( $field[2], $field[3], $field[7], $val ); - break; - - case( 'textarea' ): - echo ''; - break; - - case( 'checkbox' ): - $val = ( isset( $_POST[ $field[2] ] ) ) ? $_POST[ $field[2] ] : ''; - $val = ( ! $_POST && $field[8] == 'y' ) ? $field[7] : $val; - echo wpmem_create_formfield( $field[2], $field[3], $field[7], $val ); - break; - - default: - echo ''; - break; - } - - echo '
    '; - -} -/** End of File **/ \ No newline at end of file diff --git a/includes/admin/admin.php b/includes/admin/admin.php new file mode 100644 index 00000000..b00159ea --- /dev/null +++ b/includes/admin/admin.php @@ -0,0 +1,129 @@ +captcha ) { + add_filter( 'wpmem_admin_tabs', array( 'WP_Members_Admin_Tab_Captcha', 'add_tab' ) ); + add_action( 'wpmem_admin_do_tab', array( 'WP_Members_Admin_Tab_Captcha', 'do_tab' ), 1, 1 ); + } + if ( $wpmem->dropins ) { + add_filter( 'wpmem_admin_tabs', array( 'WP_Members_Admin_Tab_Dropins', 'add_tab' ) ); + add_action( 'wpmem_admin_do_tab', array( 'WP_Members_Admin_Tab_Dropins', 'do_tab' ), 1, 1 ); + } ?> + +
    + admin->do_tabs( $tab ); + + // Render any warning messages. + wpmem_a_do_warnings( $did_update ); + + /** + * Fires at the end of creating an admin panel tab. + * + * This action is part of the plugin's admin panel API for adding + * additional admin tabs. This action is for adding content for + * a custom tab. + * + * @since 2.8.0 + * + * @param string $tab The tab being generated. + */ + do_action( 'wpmem_admin_do_tab', $tab ); + ?> +
    $tag, + 'heading' => $heading, + 'subject_input' => $subject_input, + 'body_input' => $message_input, + ); + $wpmem->admin->add_email( $args ); +} + +/** + * Checks the current tab being displayed in the admin panel. + * + * @since 3.1.4 + * + * @param string $tab The tab slug. + * @return bool + */ +function wpmem_is_tab( $tab ) { + return ( $tab == wpmem_get( 'tab', false, 'get' ) ) ? true : false; +} + +/** + * Utility function generates link to user profile. + * + * @since 3.1.7 + * + * @param int $user_id + * @return string user profile URL. + */ +function wpmem_admin_user_profile( $user_id ) { + return add_query_arg( 'user_id', $user_id, admin_url( 'user-edit.php' ) ); +} + +/** + * Wrapper for form_post_url(). + * + * @since 3.1.8 + * + * @global object $wpmem The WP_Members Object. + * @param string $tab The plugin tab being displayed. + * @param mixed $args Array of additional arguments|boolean. Default: false. + * @return string $url + */ +function wpmem_admin_form_post_url( $args = false ) { + global $wpmem; + return $wpmem->admin->form_post_url( $args ); +} + +/** + * Returns an array of WordPress reserved terms. + * + * @since 3.0.2 + * @since 3.2.3 Moved to Admin API as wrapper for WP_Members_Admin_API::wp_reserved_terms(). + * + * @global object $wpmem + * @return array An array of WordPress reserved terms. + */ +function wpmem_wp_reserved_terms() { + global $wpmem; + return $wpmem->admin->wp_reserved_terms(); +} + +/** + * Updates a single plugin option. + * + * @since 3.3.6 + * + * @param string $option Name of the option to update. + * @param string $key Which key to update. Update a subkey as primary_key/subkey. + * @param string $value New value. + * @return bool True if the value was updated, otherwise false. + */ +function wpmem_update_option( $option, $key, $value ) { + $settings = get_option( $option ); + if ( strpos( $key, '/' ) ) { + $keys = explode( '/', $key ); + $settings[ $keys[0] ][ $keys[1] ] = $value; + } else { + $settings[ $key ] = $value; + } + return update_option( $option, $settings ); +} + +/** + * Returns a custom "query_where" if the current view is selected. + * + * @since 3.4.5 + * + * @param string $query_where $query_where value from the filter (required) + * @param string $view Custom view slug + * @param string $meta_key Meta key the view is filtered by (needed for count) + * @param string $meta_value Value of the meta key for the view (needed for count) + * @param string $compare Comparison operator (optional, default "=") + */ +function wpmem_add_query_where( $query_where, $view, $meta_key, $meta_value, $compare = '=' ) { + $show = sanitize_text_field( wpmem_get( 'show', false, 'get' ) ); + if ( $view == $show ) { + $query_where = wpmem_get_query_where( $meta_key, $meta_value, $compare ); + } + return $query_where; +} + +/** + * Builds a "query_where" for custom user views in Users > All Users. + * + * @since 3.4.5 + * + * @param string $meta_key Meta key the view is filtered by (needed for count) + * @param string $meta_value Value of the meta key for the view (needed for count) + * @param string $compare Comparison operator (optional, default "=") + */ +function wpmem_get_query_where( $meta_key, $meta_value, $compare = '=' ) { + global $wpdb; + $query_where = 'WHERE 1=1 AND ' . $wpdb->users . '.ID IN ( + SELECT ' . $wpdb->usermeta . '.user_id FROM ' . $wpdb->usermeta . ' + WHERE ' . $wpdb->usermeta . '.meta_key = "' . esc_sql( $meta_key ) . '" + AND ' . $wpdb->usermeta . '.meta_value ' . $compare . ' "' . esc_sql( $meta_value ) . '" )'; + return $query_where; +} + +/** + * Adds a custom user view link for Users > All Users to the existing views array. + * + * @since 3.4.5 + * + * @param array $views The $views value from the "wpmem_views_users" filter (required) + * @param string $name Text for the view link + * @param string $view Custom view slug + * @param string $meta_key Meta key the view is filtered by (needed for count) + * @param string $meta_value Value of the meta key for the view (needed for count) + * @param string $compare Comparison operator (optional, default "=") + * @param int $expires Expiration of the count transient in seconds (optional, default = 60) + */ +function wpmem_add_user_view_link( $views, $link_text, $view_slug, $meta_key, $meta_value, $compare = "=", $expires = 60 ) { + $views[ $view_slug ] = wpmem_get_user_view_link( $link_text, $view_slug, $meta_key, $meta_value, $compare, $expires ); + return $views; +} + +/** + * Returns a custom user view link for Users > All Users. + * + * @since 3.4.5 + * + * @param string $name Text for the view link + * @param string $view Custom view slug + * @param string $meta_key Meta key the view is filtered by (needed for count) + * @param string $meta_value Value of the meta key for the view (needed for count) + * @param string $compare Comparison operator (optional, default "=") + * @param int $expires Expiration of the count transient in seconds (optional, default = 60) + */ +function wpmem_get_user_view_link( $name, $view, $meta_key, $meta_value, $compare = "=", $expires = 60 ) { + $show = sanitize_text_field( wpmem_get( 'show', '', 'get' ) ); + $url = 'users.php?action=show&show=' . $view; + $class = ( $show == $view ) ? ' class="current"' : ''; + $count = wpmem_get_user_view_count( $view, $meta_key, $meta_value, $compare, $expires ); + return sprintf( + '%s (%d)', + esc_url( $url ), + $class, + $name, + $count + ); +} + +/** + * Returns a count for custom user view for Users > All Users. + * + * @since 3.4.5 + * + * @param string $view Custom view slug + * @param string $meta_key Meta key the view is filtered by (needed for count) + * @param string $meta_value Value of the meta key for the view (needed for count) + * @param string $compare Comparison operator (optional, default "=") + * @param int $expires Expiration of the count transient in seconds (optional, default = 60) + */ +function wpmem_get_user_view_count( $view, $meta_key, $meta_value, $compare = '=', $expires = 60 ) { + global $wpdb; + // Count is stored in a transient (see "if" condition below). + $count = get_transient( 'wpmem_user_counts_' . $view ); + // If the transient is not already set. + if ( false === $count ) { + + // Get the count + $count = $wpdb->get_var( $wpdb->prepare( "SELECT COUNT(*) FROM " . $wpdb->usermeta . " WHERE meta_key=%s AND meta_value " . $compare . " \"%s\"", $meta_key, $meta_value ) ); + + // Save it in a transient + $transient_expires = $expires; // Value in seconds, 1 day: ( 60 * 60 * 24 ); + set_transient( 'wpmem_user_counts_' . $view, $count, $transient_expires ); + } + // Return the count, either new or transient. + return $count; +} \ No newline at end of file diff --git a/includes/admin/class-wp-members-admin-api.php b/includes/admin/class-wp-members-admin-api.php new file mode 100644 index 00000000..a6ad5d8d --- /dev/null +++ b/includes/admin/class-wp-members-admin-api.php @@ -0,0 +1,670 @@ +path . 'includes/install.php' ); + wpmem_onboarding_new_install( $wpmem->path, $wpmem->version ); + } + + if ( 'update_pending' == $install_state ) { + require_once( $wpmem->path . 'includes/install.php' ); + wpmem_onboarding_pending_update( $wpmem->path, $wpmem->version ); + } + + // Load dependencies. + $this->load_dependencies(); + + // Load admin hooks. + $this->load_hooks(); + + // The following is only needed if we are on the WP-Members settings screen. + $is_wpmem_admin = wpmem_get( 'page', false, 'get' ); + if ( false !== $is_wpmem_admin && 'wpmem-settings' == $is_wpmem_admin ) { + $tabs = $this->default_tabs(); // Load default tabs. + $emails = $this->default_emails(); // Load default emails. + $dialogs = $this->default_dialogs(); // Load default dialogs. + } + + $wpmem->membership->admin = new WP_Members_Products_Admin(); + } + + /** + * Load dependencies. + * + * @since 3.1.0 + * @since 3.1.1 Added tab-about.php. + * @since 3.1.7 Loads all admin dependent files. + * @since 3.2.9 Removed tab-about.php until we can re-do it. + * + * @global object $wpmem + */ + function load_dependencies() { + + global $wpmem; + + include_once( $wpmem->path . 'includes/admin/admin.php' ); + include_once( $wpmem->path . 'includes/admin/class-wp-members-admin-users.php' ); + include_once( $wpmem->path . 'includes/admin/class-wp-members-admin-posts.php' ); + include_once( $wpmem->path . 'includes/admin/class-wp-members-products-admin.php' ); + include_once( $wpmem->path . 'includes/admin/class-wp-members-user-search.php' ); + include_once( $wpmem->path . 'includes/admin/dialogs.php' ); + include_once( $wpmem->path . 'includes/admin/api.php' ); + include_once( $wpmem->path . 'includes/admin/tabs/class-wp-members-admin-tab-fields.php' ); // Fields tab is used for field reorder (which is ! wpmem-settings). + if ( 'wpmem-settings' == wpmem_get( 'page', false, 'get' ) ) { + include_once( $wpmem->path . 'includes/admin/tabs/class-wp-members-admin-tab-options.php' ); + include_once( $wpmem->path . 'includes/admin/tabs/class-wp-members-admin-tab-emails.php' ); + include_once( $wpmem->path . 'includes/admin/tabs/class-wp-members-admin-tab-captcha.php' ); + // include_once( $wpmem->path . 'admin/tab-about.php' ); + include_once( $wpmem->path . 'includes/admin/tabs/class-wp-members-admin-tab-dialogs.php' ); + include_once( $wpmem->path . 'includes/admin/tabs/class-wp-members-admin-tab-dropins.php' ); + + if ( ! class_exists( 'WP_List_Table' ) ) { + require_once( ABSPATH . 'wp-admin/includes/class-wp-list-table.php' ); + } + include_once( $wpmem->path . 'includes/admin/tabs/class-wp-members-fields-table.php' ); + } + } + + /** + * Load admin. + * + * @since 3.1.0 + * @since 3.1.7 Loads all admin hooks. + * + * @global object $wpmem + */ + function load_hooks() { + + global $wpmem; + + add_action( 'admin_menu', array( $this, 'add_options_page' ) ); // Adds admin menu + add_action( 'admin_enqueue_scripts', array( $this, 'dashboard_enqueue_scripts' ) ); + add_filter( 'plugin_action_links', array( $this, 'plugin_links' ), 10, 2 ); + + add_action( 'user_new_form', array( $wpmem->forms, 'wp_newuser_form' ) ); + // add_filter( 'wpmem_admin_tabs', 'wpmem_add_about_tab' ); + + add_action( 'wp_ajax_wpmem_do_field_reorder', array( 'WP_Members_Admin_Tab_Fields', 'do_field_reorder' ) ); + + add_action( 'wpmem_admin_do_tab', array( 'WP_Members_Admin_Tab_Options', 'do_tab' ), 1 ); + add_action( 'wpmem_admin_do_tab', array( 'WP_Members_Admin_Tab_Fields', 'do_tab' ), 5 ); + add_action( 'wpmem_admin_do_tab', array( 'WP_Members_Admin_Tab_Dialogs', 'do_tab' ), 10 ); + add_action( 'wpmem_admin_do_tab', array( 'WP_Members_Admin_Tab_Emails', 'do_tab' ), 15 ); + // add_action( 'wpmem_admin_do_tab', 'wpmem_a_about_tab', 999, 1 ); + + // If user has a role that cannot edit users, set profile actions for non-admins. + + // User actions and filters. + add_action( 'user_edit_form_tag', array( 'WP_Members_User_Profile', 'add_multipart' ) ); + add_action( 'show_user_profile', array( 'WP_Members_User_Profile', 'profile' ) ); + add_action( 'edit_user_profile', array( 'WP_Members_User_Profile', 'profile' ) ); + add_action( 'profile_update', array( 'WP_Members_User_Profile', 'update' ) ); + add_action( 'edit_user_profile', array( 'WP_Members_User_Profile', '_profile_tabs' ), 99 ); + add_action( 'show_user_profile', array( 'WP_Members_User_Profile', '_profile_tabs' ), 99 ); + + if ( current_user_can( 'list_users' ) ) { + add_action( 'admin_footer-users.php', array( 'WP_Members_Admin_Users', 'bulk_user_action' ) ); + add_action( 'load-users.php', array( 'WP_Members_Admin_Users', 'page_load' ) ); + add_action( 'admin_notices', array( 'WP_Members_Admin_Users', 'admin_notices' ) ); + add_filter( 'views_users', array( 'WP_Members_Admin_Users', 'views' ) ); + add_filter( 'manage_users_columns', array( 'WP_Members_Admin_Users', 'add_user_column' ) ); + add_filter( 'manage_users_custom_column', array( 'WP_Members_Admin_Users', 'add_user_column_content' ), 10, 3 ); + add_action( 'wpmem_user_activated', array( 'WP_Members_Admin_Users', 'set_activated_user' ) ); + add_action( 'wpmem_user_deactivated', array( 'WP_Members_Admin_Users', 'set_deactivated_user' ) ); + add_filter( 'user_row_actions', array( 'WP_Members_Admin_Users', 'insert_hover_links' ), 10, 2 ); + add_action( 'wpmem_admin_after_profile', array( 'WP_Members_User_Profile', '_show_activate' ), 7 ); + add_action( 'wpmem_admin_after_profile', array( 'WP_Members_User_Profile', '_show_expiration' ), 8 ); + add_action( 'wpmem_admin_after_profile', array( 'WP_Members_User_Profile', '_show_ip' ), 9 ); + if ( 1 == $wpmem->enable_products ) { + //add_action( 'wpmem_admin_after_profile', array( 'WP_Members_User_Profile', '_show_product' ), 10 ); + } + } + + // If user has a role that can edit posts, add the block/unblock meta boxes and custom post/page columns. + if ( current_user_can( 'edit_posts' ) ) { + // Post actions and filters. + add_action( 'add_meta_boxes', array( 'WP_Members_Admin_Posts', 'block_meta_add' ) ); + add_action( 'save_post', array( 'WP_Members_Admin_Posts', 'block_meta_save' ) ); + add_filter( 'manage_posts_columns', array( 'WP_Members_Admin_Posts', 'columns' ) ); + add_action( 'manage_posts_custom_column', array( 'WP_Members_Admin_Posts', 'columns_content' ), 10, 2 ); + add_filter( 'manage_pages_columns', array( 'WP_Members_Admin_Posts', 'columns' ) ); + add_action( 'manage_pages_custom_column', array( 'WP_Members_Admin_Posts', 'columns_content' ), 10, 2 ); + add_action( 'admin_footer-edit.php', array( 'WP_Members_Admin_Posts', 'bulk_action' ) ); + add_action( 'load-edit.php', array( 'WP_Members_Admin_Posts', 'page_load' ) ); + add_action( 'admin_notices', array( 'WP_Members_Admin_Posts', 'notices' ) ); + add_action( 'load-post.php', array( 'WP_Members_Admin_Posts', 'load_tinymce' ) ); + add_action( 'load-post-new.php', array( 'WP_Members_Admin_Posts', 'load_tinymce' ) ); + } + + if ( ! is_multisite() && current_user_can( 'manage_options' ) ) { + add_action('wp_dashboard_setup', 'butlerblog_dashboard_widget'); + } + + add_action( 'wpmem_after_admin_init', array( 'WP_Members_Admin_Tab_Fields', 'update' ) ); + add_action( 'admin_print_styles', array( 'WP_Members_Admin_Tab_Fields', 'enqueue_scripts' ) ); + add_action( 'admin_footer', array( 'WP_Members_Admin_Tab_Fields', 'bulk_actions' ) ); + + if ( current_user_can( 'manage_options' ) ) { + add_action( 'admin_notices', array( $this, 'do_admin_notices' ) ); + } + } // End of load_hooks() + + /** + * Adds the plugin options page and JavaScript. + * + * @since 2.5.2 + * @since 3.4.4 Moved from wp-members.php/wpmem_admin_options() to main admin object. + */ + function add_options_page() { + global $wpmem; + if ( ! is_multisite() || ( is_multisite() && current_user_can( 'edit_theme_options' ) ) ) { + $plugin_page = add_options_page( 'WP-Members', 'WP-Members', 'manage_options', 'wpmem-settings', 'wpmem_admin' ); + } + } + + /** + * Add admin notices. + * + * @since 3.3.0 + */ + function do_admin_notices() { + global $wpmem; //echo '
    '; print_r( $wpmem ); exit();
    +		if ( $wpmem->admin_notices ) {
    +			foreach ( $wpmem->admin_notices as $key => $value ) {
    +				echo '
    +

    ' . $value['notice'] . '

    +
    '; + + } + } + } + + /** + * Display admin tabs. + * + * @since 3.1.0 + * + * @param string $current The current tab being displayed (default: options). + */ + function do_tabs( $current = 'options' ) { + + /** + * Filter the admin tabs for the plugin settings page. + * + * @since 2.8.0 + * + * @param array $tabs An array of the tabs to be displayed on the plugin settings page. + */ + $this->tabs = apply_filters( 'wpmem_admin_tabs', $this->tabs ); + + $links = array(); + foreach ( $this->tabs as $tab => $name ) { + $link_args = array( 'page' => 'wpmem-settings', 'tab' => $tab ); + $link = add_query_arg( $link_args, admin_url( 'options-general.php' ) ); + $class = ( $tab == $current ) ? 'nav-tab nav-tab-active' : 'nav-tab'; + $links[] = sprintf( '%s', $class, $link, $name ); + } + + echo ''; + } + + /** + * Handles custom email settings. + * + * @since 3.1.0 + * + * @param array $args Settings array for the email. + * @return array $args + */ + function add_email( $args ) { + + // Get saved settings. + $settings = get_option( $args['name'] ); + + $defaults = array( + 'name' => $args['name'], + 'heading' => __( 'Custom email', 'wp-members' ), + 'subject_label' => __( 'Subject', 'wp-members' ), + 'subject_input' => $args['name'] . '_subject', + 'subject_value' => ( $settings ) ? $settings['subj'] : __( 'Subject', 'wp-members' ), + 'body_label' => __( 'Body', 'wp-members' ), + 'body_input' => $args['name'] . '_body', + 'body_value' => ( $settings ) ? $settings['body'] : __( 'Your custom email message content.', 'wp-members' ), + ); + + // Merge args with settings. + $args = wp_parse_args( $args, $defaults ); + + $this->emails[ $args['name'] ] = $args; + + return $args; + } + + /** + * Adds dialogs to the Dialogs tab. + * + * @since 3.1.1 + * + * @param array $args Settings array for the dialog. + */ + function do_dialog_input( $args ) { ?> + + + + dialogs as $dialog ) { + if ( isset( $_POST[ $dialog['name'] . '_dialog' ] ) ) { + $settings[ $dialog['name'] ] = wp_kses( $_POST[ $dialog['name'] . '_dialog' ], 'post' ); + } + } + update_option( 'wpmembers_dialogs', $settings, true ); + // Refresh settings + $this->default_dialogs(); + return; + } + + /** + * Handles custom dialog settings. + * + * @since 3.1.1 + * + * @param array $args Settings array for the dialog. + * @return array $args + */ + function add_dialog( $args ) { + global $wpmem; + if ( is_array( $args ) && isset( $args['label'] ) ) { + $defaults = array( + 'name' => $args['name'], + 'label' => $args['label'], + //'input' => $args['name'] . '_dialog', + 'value' => $args['value'], + //'value' => ( $args['value'] ) ? $args['value'] : wpmem_get_text( $key ), + ); + + // Merge args with settings. + $args = wp_parse_args( $args, $defaults ); + + $this->dialogs[ $args['name'] ] = $args; + } + + //return $args; + } + + /** + * Settings for default tabs. + * + * @since 3.1.0 + */ + function default_tabs() { + $this->tabs = array( + 'options' => 'WP-Members ' . __( 'Options', 'wp-members' ), + 'fields' => __( 'Fields', 'wp-members' ), + 'dialogs' => __( 'Dialogs', 'wp-members' ), + 'emails' => __( 'Emails', 'wp-members' ), + ); + } + + /** + * Settings for default emails. + * + * @since 3.1.0 + */ + function default_emails() { + global $wpmem; + + if ( 0 == $wpmem->mod_reg ) { + + $this->add_email( array( + 'name' => 'wpmembers_email_newreg', + 'heading' => __( "New Registration", 'wp-members' ), + 'subject_input' => 'wpmembers_email_newreg_subj', + 'body_input' => 'wpmembers_email_newreg_body', + ) ); + + if ( 1 == $wpmem->act_link ) { + $this->add_email( array( + 'name' => 'wpmembers_email_validated', + 'heading' => __( "User email validated", 'wp-members' ), + 'subject_input' => 'wpmembers_email_validated_subj', + 'body_input' => 'wpmembers_email_validated_body', + ) ); + } + + } else { + + $this->add_email( array( + 'name' => 'wpmembers_email_newmod', + 'heading' => __( "Registration is Moderated", 'wp-members' ), + 'subject_input' => 'wpmembers_email_newmod_subj', + 'body_input' => 'wpmembers_email_newmod_body', + ) ); + + if ( 1 == $wpmem->act_link ) { + $this->add_email( array( + 'name' => 'wpmembers_email_validated', + 'heading' => __( "User email validated", 'wp-members' ), + 'subject_input' => 'wpmembers_email_validated_subj', + 'body_input' => 'wpmembers_email_validated_body', + ) ); + } + + $this->add_email( array( + 'name' => 'wpmembers_email_appmod', + 'heading' => __( "Registration is Moderated, User is Approved", 'wp-members' ), + 'subject_input' => 'wpmembers_email_appmod_subj', + 'body_input' => 'wpmembers_email_appmod_body', + ) ); + } + + $this->add_email( array( + 'name' => 'wpmembers_email_repass', + 'heading' => __( "Password Reset", 'wp-members' ), + 'subject_input' => 'wpmembers_email_repass_subj', + 'body_input' => 'wpmembers_email_repass_body', + ) ); + + $this->add_email( array( + 'name' => 'wpmembers_email_getuser', + 'heading' => __( "Retrieve Username", 'wp-members' ), + 'subject_input' => 'wpmembers_email_getuser_subj', + 'body_input' => 'wpmembers_email_getuser_body', + ) ); + + if ( $wpmem->notify == 1 ) { + $this->add_email( array( + 'name' => 'wpmembers_email_notify', + 'heading' => __( "Admin Notification", 'wp-members' ), + 'subject_input' => 'wpmembers_email_notify_subj', + 'body_input' => 'wpmembers_email_notify_body', + ) ); + } + + } + + /** + * Settings for default dialogs. + * + * @since 3.1.1 + */ + function default_dialogs() { + global $wpmem; + + /** + * Filter the dialog array to add custom dialogs. + * + * @since 3.1.1 + * + * @param array $dialog_array + */ + $dialogs = apply_filters( 'wpmem_dialogs', get_option( 'wpmembers_dialogs' ) ); + + $dialog_labels = array( + 'restricted_msg' => __( "Restricted post (or page), displays above the login/registration form", 'wp-members' ), + 'user' => __( "Username is taken", 'wp-members' ), + 'email' => __( "Email is registered", 'wp-members' ), + 'success' => __( "Registration completed", 'wp-members' ), + 'editsuccess' => __( "User update", 'wp-members' ), + 'pwdchangerr' => __( "Passwords did not match", 'wp-members' ), + 'pwdchangesuccess' => __( "Password changes", 'wp-members' ), + 'pwdreseterr' => __( "Username or email do not exist when trying to reset forgotten password", 'wp-members' ), + 'pwdresetsuccess' => __( "Password reset", 'wp-members' ), + ); + + foreach ( $dialogs as $key => $val ) { + if ( array_key_exists( $key, $dialog_labels ) ) { + $dialogs[ $key ] = array( + 'name' => $key, + 'label' => $dialog_labels[ $key ], + 'value' => $dialogs[ $key ], + ); + } + } + + foreach ( $dialogs as $val ) { + $this->add_dialog( $val ); + } + } + + + /** + * Get the current form. + * + * @since 3.1.2 + * + * @todo Work on multi-form project, no current milestone. + */ + function get_form( $form = 'default' ) { + /* + $current_form = ( isset( $_GET['form'] ) ) ? $_GET['form'] : $form; + $wpmem_forms = get_option( 'wpmembers_forms' ); + $fields = $wpmem_forms[ $current_form ]; + $this->current_form = $current_form; + $this->current_form_fields = $fields; + */ + $this->current_form = sanitize_text_field( wpmem_get( 'form', $form, 'get' ) ); //( isset( $_GET['form'] ) ) ? $_GET['form'] : $form; + global $wpmem; + // Add numeric array form fields as associative + //foreach( $wpmem->fields as $field ) { + // $wpmem->fields[ $field[2] ] = $field; + //} + $this->current_form_fields = wpmem_fields(); + } + + /** + * Build admin panel form action url. + * + * @since 3.1.8 + * + * @global string $pagenow + * @global string $plugin_page + * @global object $wpmem The WP_Members Object. + * @param mixed $args Array of additional arguments|boolean. Default: false. + * @return string $url + */ + function form_post_url( $args = false ) { + global $pagenow, $plugin_page, $wpmem; + $tab = sanitize_text_field( wpmem_get( 'tab', false, 'get' ) ); + $params = array( 'page' => $plugin_page ); + if ( $tab ) { + $params['tab'] = $tab; + } + if ( $args ) { + foreach( $args as $key => $val ) { + $params[ $key ] = $val; + } + } + $url = add_query_arg( $params, admin_url( $pagenow ) ); + return esc_url( $url ); + } + + /** + * Enqueues the admin javascript and css files. + * + * Replaces wpmem_admin_enqueue_scripts(). + * Only loads the js and css on admin screens that use them. + * + * @since 3.1.7 + * @since 3.2.0 Moved into admin object, renamed dashboard_enqueue_scripts(). + * @since 3.2.1 Load js for post.php hook. + * @since 3.3.0 Everything loads from /assets/ folder. + * + * @global object $current_screen + * @param string $hook The admin screen hook being loaded. + */ + function dashboard_enqueue_scripts( $hook ) { + global $current_screen; + if ( 'edit.php' == $hook + || 'post.php' == $hook + || 'post-new.php' == $hook + || 'user-new.php' == $hook + || 'user-edit.php' == $hook + || 'profile.php' == $hook + || 'users.php' == $hook + || 'settings_page_wpmem-settings' == $hook ) { + wp_enqueue_style( 'wpmem-admin', wpmem_get_plugin_url() . 'assets/css/admin' . wpmem_get_suffix() . '.css', '', wpmem_get_plugin_version() ); + } + if ( 'settings_page_wpmem-settings' == $hook || 'post.php' == $hook || 'post-new.php' == $hook ) { + wp_enqueue_script( 'jquery-ui-dialog' ); // enqueue jQuery UI Dialog dependency + wp_register_script( 'wpmem-admin', wpmem_get_plugin_url() . 'assets/js/admin' . wpmem_get_suffix() . '.js', 'jquery', wpmem_get_plugin_version(), true ); + $translation_array = array( + 'close_btn' => __( 'Close', 'wp-members' ), + ); + wp_localize_script( 'wpmem-admin', 'wpmem_get_settings_vars', $translation_array ); + wp_enqueue_script( 'wpmem-admin' ); + } + if ( ( ( 'post.php' == $hook || 'post-new.php' == $hook ) && wpmem_is_enabled( 'enable_products' ) ) + || ( 'wpmem_product' == get_post_type() ) + || ( 'user-edit' == $current_screen->id || 'profile' == $current_screen->id ) + || ( 'settings_page_wpmem-settings' == $hook ) ) { + wp_enqueue_script( 'jquery' ); + wp_enqueue_script( 'jquery-ui-core' ); // enqueue jQuery UI Core + wp_enqueue_script( 'jquery-ui-datepicker' ); // enqueue jQuery UI Datepicker + if ( ! wp_style_is( 'jquery-ui-style', 'enqueued' ) ) { + wp_register_style( 'jquery-ui-style', wpmem_get_plugin_url() . 'includes/vendor/jquery-ui/css/jquery-ui' . wpmem_get_suffix() . '.css' ); + } + wp_enqueue_style( 'jquery-ui-style' ); + } + if ( ( 'post.php' == $hook || 'post-new.php' == $hook ) && wpmem_is_enabled( 'enable_products' ) ) { + if ( ! wp_script_is( 'select2', 'enqueued' ) ) { + wp_register_style( 'select2-style', wpmem_get_plugin_url() . 'includes/vendor/select2/css/select2' . wpmem_get_suffix() . '.css', false, '4.0.5', 'all' ); + wp_register_script( 'select2', wpmem_get_plugin_url() . 'includes/vendor/select2/js/select2' . wpmem_get_suffix() . '.js', array( 'jquery' ), '4.0.5', true ); + wp_enqueue_style( 'select2-style' ); + wp_enqueue_script( 'select2' ); + } + } + if ( 'user-edit' == $current_screen->id || 'profile' == $current_screen->id ) { + wp_enqueue_script( 'jquery-ui-tabs' ); // enqueue jQuery UI Tabs + } + } + + /** + * Filter to add link to settings from plugin panel. + * + * @since 2.4.0 + * @since 3.2.0 Moved to admin API class, renamed from wpmem_admin_plugin_links(). + * + * @global object $wpmem + * + * @param array $links + * @param string $file + * @return array $links + */ + function plugin_links( $links, $file ) { + global $wpmem; + static $wpmem_plugin; + if ( ! $wpmem_plugin ) { + $wpmem_plugin = plugin_basename( $wpmem->path . '/wp-members.php' ); + } + if ( $file == $wpmem_plugin ) { + $settings_link = '' . __( 'Settings', 'wp-members' ) . ''; + $links = array_merge( array( $settings_link ), $links ); + } + return $links; + } + + /** + * Returns an array of WordPress reserved terms. + * + * @since 3.0.2 + * @since 3.2.3 Moved to WP_Members_Admin_API class. + * + * @return array An array of WordPress reserved terms. + */ + function wp_reserved_terms() { + $reserved_terms = array( 'attachment', 'attachment_id', 'author', 'author_name', 'calendar', 'cat', 'category', 'category__and', 'category__in', 'category__not_in', 'category_name', 'comments_per_page', 'comments_popup', 'customize_messenger_channel', 'customized', 'cpage', 'day', 'debug', 'error', 'exact', 'feed', 'fields', 'hour', 'link_category', 'm', 'minute', 'monthnum', 'more', 'name', 'nav_menu', 'nonce', 'nopaging', 'offset', 'order', 'orderby', 'p', 'page', 'page_id', 'paged', 'pagename', 'pb', 'perm', 'post', 'post__in', 'post__not_in', 'post_format', 'post_mime_type', 'post_status', 'post_tag', 'post_type', 'posts', 'posts_per_archive_page', 'posts_per_page', 'preview', 'robots', 'role', 's', 'search', 'second', 'sentence', 'showposts', 'static', 'subpost', 'subpost_id', 'tag', 'tag__and', 'tag__in', 'tag__not_in', 'tag_id', 'tag_slug__and', 'tag_slug__in', 'taxonomy', 'tb', 'term', 'theme', 'type', 'w', 'withcomments', 'withoutcomments', 'year' ); + + /** + * Filter the array of reserved terms. + * + * @since 3.0.2 + * + * @param array $reserved_terms + */ + $reserved_terms = apply_filters( 'wpmem_wp_reserved_terms', $reserved_terms ); + + return $reserved_terms; + } + + function settings( $which ) { + switch ( $which ) { + case 'content': + return array( 'block' => 'Content Restriction', 'show_excerpt' => 'Show Excerpts', 'show_login' => 'Show Login Form', 'show_reg' => 'Show Registration Form', 'autoex' => 'Auto Excerpt' ); + break; + case 'options': + return array( 'notify' => 'Notify admin', 'mod_reg' => 'Moderate registration', 'captcha' => 'Enable registration CAPTCHA', 'warnings' => 'Ignore warning messages', 'dropins' => 'Enable dropins', 'enable_products' => 'Enable membership products', 'clone_menus' => 'Clone menus' ); + break; + } + } + + function post_types() { + return get_post_types( array( 'public' => true, '_builtin' => false ), 'names', 'and' ); + } + +} // End of WP_Members_Admin_API class. + +// End of file. \ No newline at end of file diff --git a/includes/admin/class-wp-members-admin-posts.php b/includes/admin/class-wp-members-admin-posts.php new file mode 100644 index 00000000..b93a5862 --- /dev/null +++ b/includes/admin/class-wp-members-admin-posts.php @@ -0,0 +1,406 @@ +post_types ) ) ) || ! isset( $_GET['post_type'] ) ) { ?> + current_action(); + $sendback = ''; + + switch ( $action ) { + + case ( 'unblock' ): + case ( 'block' ): + case ( 'hide' ): + // Validate nonce. + check_admin_referer( 'bulk-posts' ); + // Get the posts. + $posts = wpmem_get( 'post', '', 'request' ); + // Convert action. + $status = ( 'hide' == $action ) ? 2 : ( ( 'block' == $action ) ? 1 : 0 ); + // Update posts. + $x = ''; + if ( $posts ) { + foreach ( $posts as $post_id ) { + // Keep a count of posts updated. + $x++; + // Make sure $post_id is just an integer. + $post_id = (int)$post_id; + // Get the post type. + $post = get_post( $post_id ); + $type = $post->post_type; + // Update accordingly. + self::set_block_status( $status, $post_id, $post->post_type ); + } + // Set the return message. + $arr = array( + 'a' => 'updated', + 'n' => $x, + 'post_type' => $type, + ); + if ( isset( $_GET['post_status'] ) && 'all' != $_GET['post_status'] ) { + $arr['post_status'] = sanitize_text_field( $_GET['post_status'] ); + } + + $sendback = add_query_arg( array( $arr ), '', $sendback ); + + } else { + // Set the return message. + $sendback = add_query_arg( array( 'a' => 'none' ), '', $sendback ); + } + break; + + default: + return; + + } + + // If we did not return already, we need to wp_safe_redirect. + wp_safe_redirect( $sendback ); + exit(); + } + + + /** + * Function to echo admin update message. + * + * @since 2.8.2 + * @since 3.3.0 Changed from wpmem_posts_admin_notices(). + * + * @global $pagenow + * @global $post_type + */ + static function notices() { + + global $pagenow, $post_type; + if ( $pagenow == 'edit.php' && isset( $_REQUEST['a'] ) ) { + $msg = ( $_REQUEST['a'] == 'block' ) ? sprintf( __( '%s restricted', 'wp-members' ), $post_type ) : sprintf( __( '%s unrestricted', 'wp-members' ), $post_type ); + echo '

    ' . esc_html( $_REQUEST['n'] ) . ' ' . esc_html( $msg ) . '

    '; + } + } + + + /** + * Adds the blocking meta boxes for post and page editor screens. + * + * @since 2.8.0 + * @since 3.3.0 Changed from wpmem_block_meta_add(). + * + * @global object $wp_post_types The Post Type object. + * @global object $wpmem The WP-Members object. + */ + static function block_meta_add() { + + global $wp_post_types, $wpmem; + + // Build an array of post types + $post_arr = array( + 'post' => 'Posts', + 'page' => 'Pages', + ); + if ( isset( $wpmem->post_types ) ) { + foreach ( $wpmem->post_types as $key => $val ) { + $post_arr[ $key ] = $val; + } + } + + foreach ( $post_arr as $key => $val ) { + if ( isset( $wp_post_types[ $key ] ) ) { + $post_type = $wp_post_types[ $key ]; + /** + * Filter the post meta box title. + * + * @since 2.9.0 + * + * @param Post restriction title. + */ + $post_title = apply_filters( 'wpmem_admin_' . $key . '_meta_title', sprintf( __( '%s Restriction', 'wp-members' ), $post_type->labels->singular_name ) ); + + add_meta_box( 'wpmem-block-meta-id', $post_title, array( 'WP_Members_Admin_Posts', 'block_meta' ), $key, 'side', 'high' + // ,array( '__back_compat_meta_box' => true, ) // @todo Convert to Block and declare this for backwards compat ONLY! + ); + } + } + } + + + /** + * Builds the meta boxes for post and page editor screens. + * + * @since 2.8.0 + * @since 3.3.0 Changed from wpmem_block_meta(). + * + * @global object $post The WordPress post object. + * @global object $wp_post_types The Post Type object. + * @global object $wpmem The WP-Members object. + */ + static function block_meta() { + + global $post, $wp_post_types, $wpmem; + + wp_nonce_field( 'wpmem_block_meta_nonce', 'wpmem_block_meta_nonce' ); + + $post_type = $wp_post_types[ $post->post_type ]; + $post_meta_value = get_post_meta( $post->ID, '_wpmem_block', true ); + $post_meta_value = ( null == $post_meta_value ) ? $wpmem->block[ $post->post_type ] : $post_meta_value; + $post_meta_settings = array( + '0' => array( 'text' => __( 'Unrestricted', 'wp-members' ), 'icon' => '' ), + '1' => array( 'text' => __( 'Restricted', 'wp-members' ), 'icon' => '' ), + '2' => array( 'text' => __( 'Hidden', 'wp-members' ), 'icon' => '' ), + ); ?> +

    $value ) { + echo $value['icon']; + } ?> +

    +

    +

    + $value ) { + $original_value = ( $post_meta_value == $key ) ? $key : $original_value; + $original_label = ( $post_meta_value == $key ) ? $value['text'] : $original_label; + echo '
    '; + } + echo ''; + echo ''; + ?> +

    + + +

    +
    +

    + post_type ); + + /** + * Fires after the post block meta box is saved. + * + * Allows actions to be hooked to the meta save process. + * + * @since 2.8.8 + * + * @param $post object The WP Post Object. + * @param $block boolean The WP-Members block value. + */ + do_action( 'wpmem_admin_block_meta_save', $post, $block, '' ); + } + + + /** + * Adds WP-Members blocking status to Posts Table columns. + * + * @since 2.8.3 + * @since 3.3.0 Changed from wpmem_post_columns(). + * + * @global object $wpmem The WP-Members Object + * @param array $columns The array of table columns. + * @return array $columns + */ + static function columns( $columns ) { + global $wpmem; + $post_type = ( isset( $_REQUEST['post_type'] ) ) ? sanitize_text_field( $_REQUEST['post_type'] ) : 'post'; + + if ( $post_type == 'page' || $post_type == 'post' || array_key_exists( $post_type, $wpmem->post_types ) ) { + $columns['wpmem_block'] = __( 'Status', 'wp-members' ); + } + return $columns; + } + + + /** + * Adds blocking status to the Post Table column. + * + * @since 2.8.3 + * @since 3.3.0 Changed from wpmem_post_columns_content(). + * + * @global object $wpmem The WP_Members Object. + * @param string $column_name + * @param int $post_ID + */ + static function columns_content( $column_name, $post_ID ) { + + global $wpmem; + $post_type = sanitize_text_field( wpmem_get( 'post_type', 'post', 'request' ) ); + + if ( $column_name == 'wpmem_block' ) { + + $block_meta = get_post_meta( $post_ID, '_wpmem_block', true ); + + // Backward compatibility for old block/unblock meta. + if ( ! $block_meta ) { + // Check for old meta. + $old_block = get_post_meta( $post_ID, 'block', true ); + $old_unblock = get_post_meta( $post_ID, 'unblock', true ); + $block_meta = ( $old_block ) ? 1 : ( ( $old_unblock ) ? 0 : $block_meta ); + } + + if ( $wpmem->block[ $post_type ] == 1 ) { + $block_span = array( 'lock', 'green', __( 'Restricted', 'wp-members' ) ); + } + if ( $wpmem->block[ $post_type ] == 0 ) { + $block_span = array( 'unlock', 'red', __( 'Unrestricted', 'wp-members' ) ); + } + if ( $wpmem->block[ $post_type ] == 1 && $block_meta == '0' ) { + $block_span = array( 'unlock', 'red', __( 'Unrestricted', 'wp-members' ) ); + } elseif ( $wpmem->block[ $post_type ] == 0 && $block_meta == '1' ) { + $block_span = array( 'lock', 'green', __( 'Restricted', 'wp-members' ) ); + } elseif ( 2 == $block_meta ) { + $block_span = array( 'hidden', '', __( 'Hidden', 'wp-members' ) ); + } + echo ''; + } + } + + /** + * Sets custom block status for a post. + * + * @since 3.2.0 + * @since 3.3.0 Changed from wpmem_set_block_status(). + * + * @global object $wpmem The WP_Members object class. + * @param int $status 0|1|2 for unblock|block|hide + * @param int $post_id The post ID to set a meta value. + * @param string $post_type The post type. + */ + static function set_block_status( $status, $post_id, $post_type ) { + global $wpmem; + + // Previous value. + $prev_value = get_post_meta( $post_id, '_wpmem_block', true ); + + // Update accordingly. + if ( false !== $prev_value && $status != $prev_value ) { + if ( $status == $wpmem->block[ $post_type ] ) { + delete_post_meta( $post_id, '_wpmem_block' ); + } else { + update_post_meta( $post_id, '_wpmem_block', $status ); + } + } elseif ( ! $prev_value && $status != $wpmem->block[ $post_type ] ) { + update_post_meta( $post_id, '_wpmem_block', $status ); + } elseif ( $status != $prev_value ) { + delete_post_meta( $post_id, '_wpmem_block' ); + } + + // If the value is to hide, delete the transient so that it updates. + if ( 2 == $status || ( 2 == $prev_value && $status != $prev_value ) ) { + $wpmem->update_hidden_posts(); + } + } + + /** + * Adds shortcode dropdown to post editor tinymce. + * + * @since 3.0 + * @since 3.3.2 Added to posts class as static + * + * @global object $wpmem_shortcode The WP_Members_TinyMCE_Buttons object. + */ + static function load_tinymce() { + if ( version_compare( get_bloginfo( 'version' ), '3.9', '>=' ) ) { + global $wpmem, $wpmem_shortcode; + include( $wpmem->path . 'includes/admin/class-wp-members-tinymce-buttons.php' ); + $wpmem_shortcode = new WP_Members_TinyMCE_Buttons; + } + } +} \ No newline at end of file diff --git a/includes/admin/class-wp-members-admin-users.php b/includes/admin/class-wp-members-admin-users.php new file mode 100644 index 00000000..548d6860 --- /dev/null +++ b/includes/admin/class-wp-members-admin-users.php @@ -0,0 +1,627 @@ + + ID != get_current_user_id() ) { + + if ( 1 == $wpmem->act_link ) { + if ( false === wpmem_is_user_confirmed( $user_object->ID ) ) { + $action = 'confirm'; + $term = __( 'Confirm', 'wp-members' ); + } else { + $action = 'unconfirm'; + $term = __( 'Unconfirm', 'wp-members' ); + } + $url = add_query_arg( array( 'action' => $action . '-single', 'user' => $user_object->ID ), "users.php" ); + $url = wp_nonce_url( $url, 'confirm-user' ); + $actions[ $action ] = '' . $term . ''; + + // Resend welcome email (will contain confirmation link if enabled). + //$actions['resend_welcome'] = '' . __( 'Resend welcome email', 'wp-members' ) . ''; + } + + if ( 1 == $wpmem->mod_reg ) { + $is_active = wpmem_is_user_activated( $user_object->ID ); + + if ( false === $is_active ) { + $action = 'activate'; + $term = __( 'Activate', 'wp-members' ); + } else { + $action = 'deactivate'; + $term = __( 'Deactivate', 'wp-members' ); + } + $url = add_query_arg( array( 'action' => $action . '-single', 'user' => $user_object->ID ), "users.php" ); + $url = wp_nonce_url( $url, 'activate-user' ); + $actions[ $action ] = '' . $term . ''; + } + } + return $actions; + } + + /** + * Function to handle bulk actions at page load. + * + * @since 2.8.2 + * + * @uses WP_Users_List_Table + * + * @global object $wpmem + */ + static function page_load() { + + global $wpmem; + if ( current_user_can( 'list_users' ) ) { + $wpmem->admin->user_search = new WP_Members_Admin_User_Search(); + } + + // If exporting all users, do it, then exit. + if ( current_user_can( 'list_users' ) && wpmem_get( 'export_all', false, 'request' ) ) { + $today = date( "Y-m-d" ); + wpmem_export_users(); + exit(); + } + + $wp_list_table = _get_list_table( 'WP_Users_List_Table' ); + $action = $wp_list_table->current_action(); + $sendback = ''; + + switch ( $action ) { + + case 'activate': + case 'deactivate': + + // Validate nonce. + check_admin_referer( 'bulk-users' ); + + // Get the users. + if ( isset( $_REQUEST['users'] ) ) { + + $users = $_REQUEST['users']; + + // Update the users. + $x = 0; + foreach ( $users as $user ) { + $user = filter_var( $user, FILTER_VALIDATE_INT ); + // Current user cannot activate or deactivate themselves. + if ( $user != get_current_user_id() ) { + // Check to see if the user is already activated, if not, activate. + if ( 'activate' == $action && 1 != get_user_meta( $user, 'active', true ) ) { + wpmem_activate_user( $user ); + } elseif( 'deactivate' == $action ) { + wpmem_deactivate_user( $user ); + } + $x++; + } + } + $msg = ( 'activate' == $action ) ? urlencode( sprintf( __( '%s users activated', 'wp-members' ), $x ) ) : urlencode( sprintf( __( '%s users deactivated', 'wp-members' ), $x ) ); + + } else { + $msg = urlencode( __( 'No users selected', 'wp-members' ) ); + } + + // Set the return message. + $sendback = add_query_arg( array( 'activated' => $msg ), $sendback ); + break; + + case 'activate-single': + case 'deactivate-single': + + // Validate nonce. + check_admin_referer( 'activate-user' ); + + // Get the users. + $user_id = filter_var( $_REQUEST['user'], FILTER_VALIDATE_INT ); + + // Check to see if the user is already activated, if not, activate. + if ( $user_id == get_current_user_id() ) { + $msg = urlencode( sprintf( esc_html__( 'You cannot activate or deactivate yourself', 'wp-members' ) ) ); + + } elseif ( 'activate-single' == $action && false === wpmem_is_user_activated( $user_id ) ) { + wpmem_activate_user( $user_id ); + $user_info = get_userdata( $user_id ); + $msg = urlencode( sprintf( esc_html__( "%s activated", 'wp-members' ), $user_info->user_login ) ); + + } elseif ( 'deactivate-single' == $action ) { + wpmem_deactivate_user( $user_id ); + $user_info = get_userdata( $user_id ); + $msg = urlencode( sprintf( esc_html__( "%s deactivated", 'wp-members' ), $user_info->user_login ) ); + + } else { + // Set the return message. + $msg = urlencode( __( "That user is already active", 'wp-members' ) ); + } + $sendback = add_query_arg( array( 'activated' => $msg ), $sendback ); + break; + + case 'confirm-single': + case 'unconfirm-single': + + // Validate nonce. + check_admin_referer( 'confirm-user' ); + + // Get the users. + $user_id = filter_var( $_REQUEST['user'], FILTER_VALIDATE_INT ); + + // Check to see if the user is already activated, if not, activate. + if ( $user_id == get_current_user_id() ) { + $msg = urlencode( sprintf( esc_html__( 'You cannot confirm or unconfirm yourself', 'wp-members' ) ) ); + + } elseif ( 'confirm-single' == $action && false === wpmem_is_user_confirmed( $user_id ) ) { + wpmem_set_user_as_confirmed( $user_id ); + $user_info = get_userdata( $user_id ); + $msg = urlencode( sprintf( esc_html__( "%s confirmed", 'wp-members' ), $user_info->user_login ) ); + + } elseif ( 'unconfirm-single' == $action ) { + wpmem_set_user_as_unconfirmed( $user_id ); + $user_info = get_userdata( $user_id ); + $msg = urlencode( sprintf( esc_html__( "%s unconfirmed", 'wp-members' ), $user_info->user_login ) ); + + } else { + // Set the return message. + $msg = urlencode( __( "That user is already confirmed", 'wp-members' ) ); + } + $sendback = add_query_arg( array( 'activated' => $msg ), $sendback ); + break; + + case 'show': + + add_action( 'pre_user_query', array( 'WP_Members_Admin_Users', 'pre_user_query' ) ); + return; + break; + + case 'export': + + $users = wpmem_get( 'users', array(), 'request' ); + wpmem_export_users( array( 'export'=>'selected' ), wpmem_sanitize_array( $users, 'integer' ) ); + return; + break; + + default: + return; + break; + + } + + /** + * Doing user action. + * + * @since 3.3.0 + */ + do_action( 'wpmem_user_action' ); + + // If we did not return already, we need to wp_safe_redirect. + wp_safe_redirect( $sendback ); + exit(); + + } + + /** + * Function to echo admin update message. + * + * @since 2.8.2 + */ + static function admin_notices() { + + global $pagenow, $user_action_msg; + if( $pagenow == 'users.php' && isset( $_REQUEST['activated'] ) ) { + $message = esc_html( $_REQUEST['activated'] ); + echo "

    {$message}

    "; + } + + if ( $user_action_msg ) { + echo "

    {$user_action_msg}

    "; + } + } + + /** + * Function to add user views to the top list. + * + * @since 2.8.2 + * @since 3.1.2 Added user view counts as transient. + * + * @todo Could revise to use wpmem_add_user_view_link(). + * + * @global object $wpdb + * @global object $wpmem + * @param array $views + * @return array $views + */ + static function views( $views ) { + + global $wpmem; + + // Get the cached user counts. + $user_counts = get_transient( 'wpmem_user_counts' ); + + // check to see if data was successfully retrieved from the cache + if ( false === $user_counts ) { + + // @todo For now, 5 minutes. We'll see how things go. + $transient_expires = 300; // Value in seconds, 1 day: ( 60 * 60 * 24 ); + + global $wpdb; + + // We need a count of total users. + // @todo - need a more elegant way of this entire process. + $sql = "SELECT COUNT(*) FROM " . $wpdb->users; + $users = $wpdb->get_var( $sql ); + + // What needs to be counted? + $count_metas = array( + 'pending' => 'pending', // Used for PayPal Extension + 'trial' => 'trial', // Used for PayPal Extension + 'subscription' => 'subscription', // Used for PayPal Extension + 'expired' => 'expired', // Used for PayPal Extension + 'active' => 'active', + 'notactive' => 'active', + 'deactivated' => 'deactivated', + 'notexported' => 'exported', + 'confirmed' => '_wpmem_user_confirmed', + 'notconfirmed' => '_wpmem_user_confirmed', + ); + + // Handle various counts. + $user_counts = array(); + foreach ( $count_metas as $key => $meta_key ) { + if ( 'confirmed' == $key || 'notconfirmed' == $key ) { + $count = $wpdb->get_var( $wpdb->prepare( "SELECT COUNT(*) FROM " . $wpdb->usermeta . " WHERE meta_key=%s AND meta_value>0", $meta_key ) ); + $count = ( 'notconfirmed' == $key ) ? $users - $count : $count; + } + if ( 'active' == $key ) { + $count = $wpdb->get_var( $wpdb->prepare( "SELECT COUNT(*) FROM " . $wpdb->usermeta . " WHERE meta_key=%s AND meta_value=1", $meta_key ) ); + } + if ( 'notactive' == $key || 'notexported' == $key ) { + $users_with_meta = $wpdb->get_var( $wpdb->prepare( "SELECT COUNT(*) FROM " . $wpdb->usermeta . " WHERE meta_key=%s AND meta_value=1", $meta_key ) ); + $count = $users - $users_with_meta; + } + if ( 'deactivated' == $key ) { + $count = $wpdb->get_var( "SELECT COUNT(*) FROM " . $wpdb->usermeta . " WHERE meta_key = 'active' AND meta_value = 0" ); + } + if ( 'trial' == $key || 'subscription' == $key || 'pending' == $key ) { + $count = $wpdb->get_var( $wpdb->prepare( "SELECT COUNT(*) FROM " . $wpdb->usermeta . " WHERE meta_key = 'exp_type' AND meta_value = \"%s\"", $key ) ); + } + if ( 'expired' == $key ) { + $count = $wpdb->get_var( "SELECT COUNT(*) FROM " . $wpdb->usermeta . " WHERE meta_key = 'expires' AND STR_TO_DATE( meta_value, '%m/%d/%Y' ) < CURDATE() AND meta_value != '01/01/1970'" ); + } + $user_counts[ $key ] = $count; + } + set_transient( 'wpmem_user_counts', $user_counts, $transient_expires ); + } + + if ( defined( 'WPMEM_EXP_MODULE' ) && 1 == $wpmem->use_exp ) { + $views['pending'] = __( 'Pending', 'wp-members' ); + $views['trial'] = __( 'Trial', 'wp-members' ); + $views['subscription'] = __( 'Subscription', 'wp-members' ); + $views['expired'] = __( 'Expired', 'wp-members' ); + } + if ( 1 == $wpmem->mod_reg ) { + $views['active'] = __( 'Activated', 'wp-members' ); + $views['notactive'] = __( 'Pending Activation', 'wp-members' ); + $views['deactivated'] = __( 'Deactivated', 'wp-members' ); + } + if ( 1 == $wpmem->act_link ) { + $views['confirmed'] = __( 'Confirmed', 'wp-members' ); + $views['notconfirmed'] = __( 'Not Confirmed', 'wp-members' ); + } + $views['notexported'] = __( 'Not Exported', 'wp-members' ); + $show = sanitize_text_field( wpmem_get( 'show', false, 'get' ) ); + + foreach ( $views as $key => $view ) { + if ( isset( $user_counts[ $key ] ) ) { + $link = "users.php?action=show&show=" . $key; + $current = ( $show == $key ) ? ' class="current"' : ''; + $views[ $key ] = sprintf( + '%s (%d)', + esc_url( $link ), + $current, + $view, + isset( $user_counts[ $key ] ) ? $user_counts[ $key ] : '' + ); + } + } + + /** + * Filters all views before returning to the WP 'views_users' filter. + * + * @since 3.3.0 + * @since unknown Added $show + * + * @param array $views { + * + * @type string The HTML for the view. + * } + * @param string $show + */ + $views = apply_filters( 'wpmem_views_users', $views, $show ); + + return $views; + } + + /** + * Function to add custom user columns to the user table. + * + * @since 2.8.2 + * + * @param array $columns + * @return array $columns + */ + static function add_user_column( $columns ) { + + global $wpmem_user_columns, $wpmem; + + // Get any columns to be added to the Users > All Users screen. + $wpmem_user_columns = get_option( 'wpmembers_utfields' ); + + if ( $wpmem_user_columns ) { + $column_labels = array(); + if ( 1 != $wpmem->mod_reg ) { + unset( $wpmem_user_columns['active'] ); + } + + // @todo This is a workaround so that wpmembers_utfields doesn't have to be updated. + if ( isset( $wpmem_user_columns['active'] ) ) { + $wpmem_user_columns['active'] = __( 'Activated', 'wp-members' ); + } + + if ( 1 != $wpmem->act_link ) { + unset( $wpmem_user_columns['_wpmem_user_confirmed'] ); + } + + // @todo Need to eventually change the wpmembers_utfields setting so we don't have to do it this way. + $fields = wpmem_fields(); + foreach ( $wpmem_user_columns as $key => $value ) { + $column_labels[ $key ] = ( isset( $fields[ $key ] ) ) ? $fields[ $key ]['label'] : $value; + } + + /** + * Filter the User > All Users custom columns before they are merged. + * + * @since 3.3.8 + * + * @param array + */ + $column_labels = apply_filters( 'wpmem_user_columns', $column_labels ); + + $columns = array_merge( $columns, $column_labels ); + } + + // Makes WP-Members columns sortable. + // @todo - finish debugging class or add sortable functions to users.php. + // require_once( $wpmem->path . 'admin/includes/class-wp-members-sortable-user-columns.php' ); + // new WP_Members_Sortable_User_Columns( $wpmem_user_columns ); + + return $columns; + } + + /** + * Function to add the user content to the custom column. + * + * @since 2.8.2 + * + * @param $value + * @param $column_name + * @param $user_id + * @return The user value for the custom column. + */ + static function add_user_column_content( $value, $column_name, $user_id ) { + + // Is the column a WP-Members column? + global $wpmem_user_columns, $wpmem; + $is_wpmem = ( is_array( $wpmem_user_columns ) && array_key_exists( $column_name, $wpmem_user_columns ) ) ? true : false; + + if ( $is_wpmem ) { + + switch ( $column_name ) { + + case 'active': + if ( 1 == $wpmem->mod_reg ) { + // If the column is "active", then return the value or empty. Returning in here keeps us from displaying another value. + return ( get_user_meta( $user_id , 'active', 'true' ) != 1 ) ? '' : ''; + } else { + return; + } + break; + + case '_wpmem_user_confirmed': + if ( 1 == $wpmem->act_link ) { + $user_confirmed = get_user_meta( $user_id , '_wpmem_user_confirmed', 'true' ); + return ( $user_confirmed ) ? date_i18n( get_option( 'date_format' ), $user_confirmed ) : __( 'Not confirmed', 'wp-members' ); + } else { + return; + } + break; + + case 'user_url': + case 'user_registered': + // Unlike other fields, website/url is not a meta field. + $user_info = get_userdata( $user_id ); + return $user_info->$column_name; + break; + + case 'user_id': + return $user_id; + + default: + return get_user_meta( $user_id, $column_name, true ); + break; + } + + } + + /** + * Filter user column content. + * + * @since 3.3.8 + * + * @param string $value + * @param string $column_name + * @param int $user_id + */ + $value = apply_filters( 'wpmem_user_column_content', $value, $column_name, $user_id ); + return $value; + } + + /** + * Adjusts user query based on custom views. + * + * @since 2.8.3 + * + * @todo Currently, not activated query returns users who are deactivated. This + * may be confusing for admins, so work on a query that displays only + * users who have never been activated. + * + * @todo Do theses using wpmem_add_query_where(). + * + * @param $user_search + */ + static function pre_user_query( $user_search ) { + + global $wpdb; + $show = sanitize_text_field( wpmem_get( 'show', '', 'get' ) ); + switch ( $show ) { + + case 'trial': + case 'subscription': + case 'pending': + $replace_query = "WHERE 1=1 AND {$wpdb->users}.ID IN ( + SELECT {$wpdb->usermeta}.user_id FROM $wpdb->usermeta + WHERE {$wpdb->usermeta}.meta_key = 'exp_type' + AND {$wpdb->usermeta}.meta_value = \"" . esc_sql( $show ) . "\" )"; + break; + + case 'expired': + $replace_query = "WHERE 1=1 AND {$wpdb->users}.ID IN ( + SELECT {$wpdb->usermeta}.user_id FROM $wpdb->usermeta + WHERE {$wpdb->usermeta}.meta_key = 'expires' + AND STR_TO_DATE( {$wpdb->usermeta}.meta_value, '%m/%d/%Y' ) < CURDATE() + AND {$wpdb->usermeta}.meta_value != '01/01/1970' )"; + break; + + case 'confirmed': + case 'notconfirmed': + $in = ( 'confirmed' == $show ) ? 'IN' : 'NOT IN'; + $replace_query = "WHERE 1=1 AND {$wpdb->users}.ID " . esc_sql( $in ) . " ( + SELECT {$wpdb->usermeta}.user_id FROM $wpdb->usermeta + WHERE {$wpdb->usermeta}.meta_key = \"" . esc_sql( '_wpmem_user_confirmed' ) . "\" )"; + break; + + case 'active': + case 'notactive': + case 'notexported': + case 'deactivated': + default: + $key = ( 'notactive' == $show || 'deactivated' == $show ) ? 'active' : 'exported'; + $in = ( 'deactivated' == $show ) ? 'IN' : 'NOT IN'; + $val = ( 'deactivated' == $show ) ? '0' : '1'; + if ( 'active' == $show ) { + $key = 'active'; $in = 'IN'; + } + $replace_query = "WHERE 1=1 AND {$wpdb->users}.ID " . esc_sql( $in ) . " ( + SELECT {$wpdb->usermeta}.user_id FROM $wpdb->usermeta + WHERE {$wpdb->usermeta}.meta_key = \"" . esc_sql( $key ) . "\" + AND {$wpdb->usermeta}.meta_value = \"" . esc_sql( $val ) . "\" )"; + break; + } + + $query_where = str_replace( 'WHERE 1=1', $replace_query, $user_search->query_where ); + + /** + * Filters the pre_user_query being applied. + * + * @since 3.3.0 + * + * @param string $query_where + */ + $query_where = apply_filters( 'wpmem_query_where', $query_where, $show ); + + $user_search->query_where = $query_where; + } + + /** + * Use wpmem_post_register_data to set the user_status field to 2 using wp_update_user. + * http://codex.wordpress.org/Function_Reference/wp_update_user + * + * @deprecated 3.3.6 No longer used. + * + * @uses wpmem_set_user_status + * @param $fields + */ + static function set_new_user_non_active( $fields ) { + wpmem_set_user_status( $fields['ID'], 2 ); + return; + } + + /** + * Use wpmem_user_activated to set the user_status field to 0 using wp_update_user. + * + * @uses wpmem_set_user_status + * @param $user_id + */ + static function set_activated_user( $user_id ) { + wpmem_set_user_status( $user_id, 0 ); + return; + } + + /** + * Use wpmem_user_deactivated to set the user_status field to 2 using wp_update_user. + * + * @uses wpmem_set_user_status + * @param $user_id + */ + static function set_deactivated_user( $user_id ) { + wpmem_set_user_status( $user_id, 2 ); + return; + } + +} \ No newline at end of file diff --git a/includes/admin/class-wp-members-bulk-edit-users.php b/includes/admin/class-wp-members-bulk-edit-users.php new file mode 100644 index 00000000..c0ba66a7 --- /dev/null +++ b/includes/admin/class-wp-members-bulk-edit-users.php @@ -0,0 +1,174 @@ + Update All Users. + * 3. Follow prompts on screen. + * 4. Remove the code snippet when completed. + */ + +class WP_Members_Bulk_Edit_Users { + + public $settings = array( + 'enable_products' => "Membership", + 'mod_reg' => "Activation", + 'act_link' => "Confirmation", + ); + + function __construct() { + add_action( 'admin_menu', array( $this, 'admin_menu' ) ); + } + + function admin_menu() { + global $wpmem; + if ( 1 == $wpmem->act_link || 1 == $wpmem->mod_reg || 1 == $wpmem->enable_products ) { + $hook = add_users_page( 'WP-Members Bulk Edit Users', 'Bulk Edits', 'edit_users', 'wpmem-bulk-user-update', array( $this, 'admin_page' ) ); + add_action( "load-$hook", array( $this, 'admin_page_load' ) ); + } + } + + function admin_page_load() { + global $update_all_complete; + $update_all_complete = false; + + $utility_state = wpmem_get( 'wpmem_bulk_utility_state', false, 'request' ); + + if ( isset( $_GET['page'] ) && 'wpmem-bulk-user-update' == $_GET['page'] ) { + + } + + if ( isset( $_GET['page'] ) && 'update-all-users' == $_GET['page'] && isset( $_POST['update-all-confirm'] ) && 1 == $_POST['update-all-confirm'] ) { + $users = get_users( array( 'fields'=>'ID' ) ); + // This is where we loop through users and update them. + foreach ( $users as $user_id ) { + + // This is the custom process. + my_update_selected_user( $user_id ); + + } + $update_all_complete = true; + } + } + + function admin_page() { + global $wpmem, $update_all_complete; + + $utility_state = wpmem_get( 'wpmem_bulk_utility_state', false, 'request' ); + $form_post = ( function_exists( 'wpmem_admin_form_post_url' ) ) ? wpmem_admin_form_post_url() : ''; + + echo '
    '; + echo "

    " . __( 'WP-Members Bulk User Update', 'wp-members' ) . "

    "; + echo '
    '; + + switch ( $utility_state ) { + + case false: + + echo '

    This utility allows you to run various bulk edits to all users.

    '; + echo '

    Select the utility to run:

    '; + echo ' + '; + break; + + case 'start_activation': + case 'start_confirmation': + echo '

    '; + echo ( 'start_activation' == $utility_state ) ? 'This process will set ALL users as activated.' : 'This process will set ALL users as confirmed.'; + echo '

    '; + echo '

    '; + echo ( 'start_activation' == $utility_state ) ? 'Activate all users' : 'Confirm all users'; + echo '

    '; + echo ''; + break; + + case 'activation_confirm': + case 'confirmation_confirm': + echo '

    '; + echo ( 'start_activation' == $utility_state ) ? 'All users have been set as activated.' : 'All users have been set as confirmed.'; + echo '

    '; + break; + + case 'start_membership': + echo '

    '; + echo 'This will set all users to a valid membership based on imported values.'; + echo '

    '; + break; + + case 'membership_confirm': + echo '

    '; + echo 'All user memberships have been set.'; + echo '

    '; + break; + } + + if ( $update_all_complete ) { + echo '

    All users were updated.
    '; + echo 'You may now remove this code snippet if desired.

    '; + } else { + + } + + echo '
    '; + echo '
    '; + } +} +// End of My_Update_All_Users_Class \ No newline at end of file diff --git a/includes/admin/class-wp-members-products-admin.php b/includes/admin/class-wp-members-products-admin.php new file mode 100644 index 00000000..3d3f076a --- /dev/null +++ b/includes/admin/class-wp-members-products-admin.php @@ -0,0 +1,848 @@ +enable_products ) { + add_filter( 'manage_wpmem_product_posts_columns', array( $this, 'columns_heading' ) ); + add_action( 'manage_wpmem_product_posts_custom_column', array( $this, 'columns_content' ), 10, 2 ); + add_action( 'add_meta_boxes', array( $this, 'meta_boxes' ) ); + add_action( 'page_attributes_misc_attributes', array( $this, 'membership_attributes' ) ); + add_action( 'save_post', array( $this, 'save_details' ) ); + add_action( 'wpmem_admin_after_block_meta', array( $this, 'add_product_to_post' ), 10, 2 ); + add_action( 'wpmem_admin_block_meta_save', array( $this, 'save_product_to_post' ), 10, 3 ); + add_action( 'admin_footer', array( $this, 'enqueue_select2' ) ); + add_filter( 'manage_users_columns', array( $this, 'user_columns' ) ); + add_filter( 'manage_users_custom_column', array( $this, 'user_columns_content' ), 10, 3 ); + add_action( 'admin_head', array( $this, 'post_columns_width' ) ); + add_filter( 'manage_posts_columns', array( $this, 'post_columns' ) ); + add_action( 'manage_posts_custom_column', array( $this, 'post_columns_content' ), 10, 2 ); + add_filter( 'manage_pages_columns', array( $this, 'post_columns' ) ); + add_action( 'manage_pages_custom_column', array( $this, 'post_columns_content' ), 10, 2 ); + foreach( $wpmem->post_types as $key => $val ) { + add_filter( 'manage_' . $key . '_posts_columns', array( $this, 'post_columns' ) ); + add_action( 'manage_' . $key . '_posts_custom_column', array( $this, 'post_columns_content' ), 10, 2 ); + } + + add_filter( 'wpmem_user_profile_tabs', array( $this, 'user_profile_tabs' ), 1 ); + add_action( 'wpmem_user_profile_tabs_content', array( $this, 'user_profile_tab_content' ), 10 ); + + add_filter( 'wpmem_views_users', array( $this, 'user_views' ), 10, 2 ); + add_filter( 'wpmem_query_where', array( $this, 'query_where' ), 10, 2 ); + } + + $this->default_products = $wpmem->membership->get_default_products(); + } + + /** + * Column headings for list table. + * + * @since 3.2.0 + * + * @param array $columns + * @return array $columns + */ + function columns_heading( $columns ) { + unset( $columns['date'] ); + $columns['slug'] = __( 'Slug', 'wp-members' ); + $columns['role'] = __( 'Role', 'wp-members' ); + $columns['expires'] = __( 'Expires', 'wp-members' ); + if ( $this->default_products ) { + $columns['default_products'] = __( 'Default', 'wp-members' ); + } + $columns['last_updated'] = __( 'Last updated', 'wp-members' ); + return $columns; + } + + /** + * Column content for list table. + * + * @since 3.2.0 + * + * @param string $column_name + * @param int $post_id + */ + function columns_content( $column, $post_id ) { + $post = get_post( $post_id ); + switch ( $column ) { + case 'slug': + echo $post->post_name; + break; + case 'role': + $role_slug = $this->get_meta( 'wpmem_product_role' ); + if ( $role_slug ) { + $wp_roles = new WP_Roles; + $names = $wp_roles->get_names(); + + $role = $names[ $role_slug ] . ' (' . __( 'slug:', 'wp-members' ) . ' ' . $role_slug . ')'; + echo esc_html( $role ); + } else { + __( 'No role required', 'wp-members' ); + } + break; + case 'expires': + $expires = $this->get_meta( 'wpmem_product_expires' ); + $period = ( false !== $expires ) ? explode( "|", $expires[0] ) : __( 'Does not expire', 'wp-members' ); + echo ( is_array( $period ) ) ? esc_html( $period[0] . ' ' . $period[1] ) : esc_html( $period ); + break; + case 'default_products': + echo ( in_array( $post->post_name, $this->default_products ) ) ? __( 'Yes', 'wp-members' ) : ''; + break; + case 'last_updated': + echo date_i18n( get_option( 'date_format' ), strtotime( esc_attr( $post->post_modified ) ) ); + break; + } + } + + /** + * Gets value of requested post meta. + * + * @since 3.2.0 + * + * @param string $value + * @return string + */ + function get_meta( $value ) { + global $post; + $field = get_post_meta( $post->ID, $value, true ); + if ( ! empty( $field ) ) { + return is_array( $field ) ? stripslashes_deep( $field ) : stripslashes( wp_kses_decode_entities( $field ) ); + } else { + return false; + } + } + + /** + * Handles meta boxes for CPT editor. + * + * @since 3.2.0 + * @since 3.3.4 Added message meta box. + */ + function meta_boxes() { + remove_meta_box( 'slugdiv', 'wpmem_product', 'normal' ); + add_meta_box( + 'membership_product', + __( 'Membership Product Details', 'wp-members' ), + array( $this, 'details_html' ), + 'wpmem_product', + 'normal', + 'high' + ); + add_meta_box( + 'membership_product_message', + __( 'Membership Product Message (optional)', 'wp-members' ), + array( $this, 'message_meta_box_detail' ), + 'wpmem_product' + ); + } + + /** + * Adds child membership access option to Membership Attributes meta box. + * + * @since 3.4.1 + */ + function membership_attributes( $post ) { + if ( 'wpmem_product' == $post->post_type ) { + $checked = get_post_meta( $post->ID, 'wpmem_product_child_access', true ); + echo '

    + +
    +

    '; + } + } + + /** + * Gets an array of post types. + * + * @since 3.3.3 + * + * @return array $post_types + */ + function get_post_types() { + global $wpmem; + // @todo This comes from option tab. Should consider it being an api function. + $post_arr = array( + 'post' => __( 'Posts' ), + 'page' => __( 'Pages' ), + ); + if ( ! empty( $wpmem->post_types ) ) { + foreach ( $wpmem->post_types as $key => $post_type ) { + $post_arr[ $key ] = $post_type; + } + } + return $post_arr; + } + + /** + * Outputs HTML for CPT editor. + * + * @since 3.2.0 + * + * @param object $post + */ + function details_html( $post ) { + + $product_default = $this->get_meta( 'wpmem_product_default' ); + $product_expires = $this->get_meta( 'wpmem_product_expires' ); + $product_role = $this->get_meta( 'wpmem_product_role' ); + $product_no_gap = $this->get_meta( 'wpmem_product_no_gap' ); + $product_fixed_period = $this->get_meta( 'wpmem_product_fixed_period' ); + + $product_expires = ( false !== $product_expires ) ? $product_expires[0] : $product_expires; + + $periods = array( __( 'Period', 'wp-members' ) . '|', __( 'Day', 'wp-members' ) . '|day', __( 'Week', 'wp-members' ) . '|week', __( 'Month', 'wp-members' ) . '|month', __( 'Year', 'wp-members' ) . '|year' ); + $show_role_detail = ( false !== $product_role ) ? 'show' : 'hide'; + $show_exp_detail = ( false !== $product_expires ) ? 'show' : 'hide'; + $show_exp_fixed = ( false !== $product_fixed_period ) ? 'show' : 'hide'; + + /** + * Fires before membership product detail meta box. + * + * @since 3.3.5 + */ + do_action( 'wpmem_membership_product_meta_before' ); ?> + + +

    +

    post_name ); ?>

    +

    +

    + /> + +

    +

    + get_post_types() as $key => $post_type ) { + echo '

    '; + echo 'get_meta( "wpmem_product_set_default_" . $key ) ) ? 'checked' : ''; echo ' />'; + echo ''; + echo '
    '; + } + + ?> +

    +

    +

    + /> + + + +

    +

    + /> + + + + + + + 'wpmem_product_time_period', 'type'=>'select', 'value'=>$periods, 'compare'=>( ( isset( $period[1] ) ) ? $period[1] : '' ) ) ); ?> +
    + + 'wpmem_product_no_gap', 'type'=>'checkbox', 'value'=>'1', 'compare'=>( ( isset( $product_no_gap ) ) && 1 == $product_no_gap ) ? $product_no_gap : '' ) ); ?> + + +
    + 'wpmem_product_fixed_period', 'type'=>'checkbox', 'value'=>'1', 'compare'=>( false != $product_fixed_period ) ? 1 : '' ) ); ?> + +
    +

    + + +
    +
    +
    + + +

    + + + + + + + + 'wpmem_product_fixed_period_grace_period', 'type'=>'select', 'value'=>$periods, 'compare'=>( ( isset( $period_grace_per ) ) ? $period_grace_per : '' ) ) ); ?> + +

    + +
    +
    + +

    + ID, 'wpmem_product_message', true ); + $message = ( $product_message ) ? $product_message : ''; + /** + * Fires before membership product message meta box. + * + * @since 3.3.5 + */ + do_action( 'wpmem_membership_product_message_meta_before' ); + + echo '

    ' . __( 'Restricted Message (displays when a user does not have access to a membership)', 'wp-members' ) . '

    '; + + $args = array( + 'media_buttons' => false, + 'textarea_rows' => 10, + ); + + wp_editor( $message, 'product_message', $args ); + + /** + * Fires after membership product messate meta box. + * + * @since 3.3.5 + */ + do_action( 'wpmem_membership_product_message_meta_after' ); + } + + /** + * Saves meta fields for CPT + * + * @since 3.2.0 + * @since 3.3.4 Added message meta. + * + * @param int $post_id + */ + function save_details( $post_id ) { + + if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE ) return; + if ( ! isset( $_POST['wpmem_product_nonce'] ) || ! wp_verify_nonce( $_POST['wpmem_product_nonce'], '_wpmem_product_nonce' ) ) return; + if ( ! current_user_can( 'edit_posts', $post_id ) ) return; + + $post = get_post( $post_id ); + + $product_name = wpmem_get( 'wpmem_product_name', false ); + $product_name = ( $product_name ) ? $product_name : $post->post_name; + update_post_meta( $post_id, 'wpmem_product_name', sanitize_text_field( $product_name ) ); + + $product_default = wpmem_get( 'wpmem_product_default', false ); + update_post_meta( $post_id, 'wpmem_product_default', ( ( $product_default ) ? true : false ) ); + + $role_required = wpmem_get( 'wpmem_product_role_required', false ); + if ( ! $role_required ) { + update_post_meta( $post_id, 'wpmem_product_role', false ); + } else { + update_post_meta( $post_id, 'wpmem_product_role', sanitize_text_field( wpmem_get( 'wpmem_product_role' ) ) ); + } + + $expires = wpmem_get( 'wpmem_product_expires', false ); + if ( ! $expires ) { + update_post_meta( $post_id, 'wpmem_product_expires', false ); + } else { + $number = sanitize_text_field( wpmem_get( 'wpmem_product_number_of_periods' ) ); + $period = sanitize_text_field( wpmem_get( 'wpmem_product_time_period' ) ); + $no_gap = sanitize_text_field( wpmem_get( 'wpmem_product_no_gap' ) ); + $expires_array = array( $number . "|" . $period ); + update_post_meta( $post_id, 'wpmem_product_expires', $expires_array ); + if ( $no_gap ) { + update_post_meta( $post_id, 'wpmem_product_no_gap', 1 ); + } else { + delete_post_meta( $post_id, 'wpmem_product_no_gap' ); + } + + $fixed_period = sanitize_text_field( wpmem_get( 'wpmem_product_fixed_period' ) ); + if ( $fixed_period ) { + + // Start and end. + $period_start = sanitize_text_field( wpmem_get( 'wpmem_product_fixed_period_start' ) ); + $period_end = sanitize_text_field( wpmem_get( 'wpmem_product_fixed_period_end' ) ); + + // Is there an entry grace period? + $grace_number = sanitize_text_field( wpmem_get( 'wpmem_product_fixed_period_grace_number', false ) ); + $grace_period = sanitize_text_field( wpmem_get( 'wpmem_product_fixed_period_grace_period', false ) ); + $save_fixed_period = $period_start . '-' . $period_end; + if ( $grace_number && $grace_period ) { + $save_fixed_period .= '-' . $grace_number . '-' . $grace_period; + } + update_post_meta( $post_id, 'wpmem_product_fixed_period', $save_fixed_period ); + } else { + delete_post_meta( $post_id, 'wpmem_product_fixed_period' ); + } + } + + foreach( $this->get_post_types() as $key => $post_type ) { + if ( false !== wpmem_get( 'wpmem_product_set_default_' . $key, false ) ) { + update_post_meta( $post_id, 'wpmem_product_set_default_' . $key, 1 ); + } else { + delete_post_meta( $post_id, 'wpmem_product_set_default_' . $key ); + } + } + + $product_message = wp_kses_post( wpmem_get( 'product_message', false ) ); + if ( false !== $product_message ) { + if ( '' != $product_message ) { + update_post_meta( $post_id, 'wpmem_product_message', $product_message ); + } else { + delete_post_meta( $post_id, 'wpmem_product_message' ); + } + } + + $child_access = intval( wpmem_get( 'wpmem_product_child_access', 0 ) ); + if ( 1 == $child_access ) { + update_post_meta( $post_id, 'wpmem_product_child_access', $child_access ); + } else { + delete_post_meta( $post_id, 'wpmem_product_child_access' ); + } + } + + /** + * Add dropdown to post and page meta box for marking access by product.. + * + * @since 3.2.0 + * @since 3.3.3 Added defaults. + * + * @global object $pagenow + * @global object $wpmem + * @param object $post + * @param string $block + */ + function add_product_to_post( $post, $block ) { + global $pagenow, $wpmem; + + // For checking default memberships. + $is_new = ( 'post-new.php' == $pagenow ) ? true : false; + + $product = $wpmem->membership->get_post_products( $post->ID ); //get_post_meta( $post->ID, $wpmem->membership->post_meta, true ); + $product = ( $product ) ? $product : array(); + $values[] = __( 'None', 'wp-members' ) . '|'; + + foreach ( $wpmem->membership->products as $key => $value ) { + + if ( $is_new ) { + if ( isset( $value[ 'set_default_' . $post->post_type ] ) && 1 == $value[ 'set_default_' . $post->post_type ] ) { + $product[] = $key; + } + } + + $values[] = $value['title'] . '|' . $key; + } + + echo wpmem_form_label( array( + 'meta_key'=>$wpmem->membership->post_meta, + 'label'=>__( 'Restrict access by membership:', 'wp-members' ), + 'type'=> 'multiselect' + ) ); + echo "
    "; + echo wpmem_form_field( array( + 'name' => $wpmem->membership->post_meta, + 'type' => 'multiselect', + 'value' => $values, + 'compare' => $product, + 'class' => 'wpmem-product-select2 populate placeholder', + ) ); + } + + /** + * Save custom post meta for access by product. + * + * @since 3.2.0 + * + * @global object $wpmem + * @param object $post + */ + function save_product_to_post( $post ) { + global $wpmem; + $products = wpmem_sanitize_array( wpmem_get( $wpmem->membership->post_meta ) ); + $products = ( $products ) ? $products : array(); + if ( empty( $products ) || ( 1 == count( $products ) && '' == $products[0] ) ) { + delete_post_meta( $post->ID, $wpmem->membership->post_meta ); + } else { + update_post_meta( $post->ID, $wpmem->membership->post_meta, $products ); + } + foreach ( $wpmem->membership->products as $key => $value ) { + if ( in_array( $key, $products ) ) { + update_post_meta( $post->ID, wpmem_get_membership_meta( $key ), 1 ); + } else { + delete_post_meta( $post->ID, wpmem_get_membership_meta( $key ) ); + } + } + } + + /** + * Enqueue select2 JS. + * + * @since 3.2.3 + */ + function enqueue_select2() { + $screen = get_current_screen(); + if ( $screen->base == 'post' && $screen->parent_base == 'edit' ) { ?> + .column-wpmem_product{ min-width:140px; width: 12%;}'; + } + } + + /** + * Add membership product column to post table. + * + * @since 3.2.4 + * + * @global object $wpmem + * @param array $columns + * @return array $columns + */ + function post_columns( $columns ){ + global $wpmem; + $post_type = ( isset( $_REQUEST['post_type'] ) ) ? sanitize_text_field( $_REQUEST['post_type'] ) : 'post'; + if ( $post_type == 'page' || $post_type == 'post' || array_key_exists( $post_type, $wpmem->post_types ) ) { + $product = array( 'wpmem_product' => __( 'Required Membership', 'wp-members' ) ); + $columns = wpmem_array_insert( $columns, $product, 'wpmem_block', 'before' ); + } + return $columns; + } + + /** + * Membership product column data. + * + * @since 3.2.4 + * + * @global object $wpmem + * @param string $column_name + * @param int $post_id + */ + function post_columns_content( $column_name, $post_id ) { + if ( 'wpmem_product' == $column_name ) { + global $wpmem; + $post_products = $wpmem->membership->get_post_products( $post_id ); + if ( $post_products ) { + foreach ( $post_products as $meta ) { + $display[] = wpmem_get_membership_name( $meta ); + } + echo implode( ", ", $display ); + } + } + } + + /** + * Add membership product column to post table. + * + * @since 3.2.4 + * + * @param array $columns + * @return array $columns + */ + function user_columns( $columns ) { + /** + * Filters the membership column name. + * + * @since 3.3.5 + * + * @param string $column_name + */ + $columns['wpmem_product'] = apply_filters( 'wpmem_user_columns_membership_title', __( 'Membership', 'wp-members' ) ); + return $columns; + } + + /** + * Membership product column data. + * + * @since 3.2.4 + * + * @global object $wpmem + * @param string $column_name + * @param int $post_id + * @return array $display + */ + function user_columns_content( $val, $column_name, $user_id ) { + /** + * Filter the users > all users screen membership column default html. + * + * @since 3.4.0 + * + * @param array $defaults + * @param array $val + * @param array $column_name + * @param array $user_id + */ + $defaults = apply_filters( 'wpmem_user_columns_membership_defaults', array( + 'item_wrap_before' => '
    ', + 'item_wrap_after' => '
    ', + ), $val, $column_name, $user_id ); + if ( 'wpmem_product' == $column_name ) { + global $wpmem; + $display = array(); + $user_products = $wpmem->user->get_user_products( $user_id ); + if ( $user_products ) { + foreach ( $user_products as $meta => $value ) { + $expires = ( $user_products[ $meta ] > 1 ) ? '
    ' . __( 'expires:', 'wp-members' ) . ' ' . date_i18n( get_option( 'date_format' ), $user_products[ $meta ] ) : ''; + $display[] = $defaults['item_wrap_before'] . wpmem_get_membership_name( $meta ) . $expires . $defaults['item_wrap_after']; + } + } + /** + * Filter the membership column value (per user). + * + * @since 3.3.5 + * + * @param string $display + * @param array $display_rows + * @param int $user_id + * @param array $user_products + */ + return apply_filters( 'wpmem_user_columns_membership_value', implode( " ", $display ), $display, $user_id, $user_products ); + } + return $val; + } + + /** + * Creates tab for user profile. + * + * @since + * + * @param array $tabs + */ + function user_profile_tabs( $tabs ) { + $tabs['memberships'] = array( + 'tab' => __( 'Memberships', 'wp-members' ), + ); + return $tabs; + } + + /** + * Add user product access to user profile. + * + * @since 3.2.0 + * + * @global string $pagenow + * @global object $wpmem + * @param string $key + */ + public function user_profile_tab_content( $key ) { + // If product enabled + if ( 'memberships' == $key ) { + global $pagenow, $wpmem; + /* + * If an admin is editing their provile, we need their ID, + * otherwise, it's the user_id param from the URL. It's a + * little more complicated than it sounds since you can't just + * check if the user is logged in, because the admin is always + * logged in when checking profiles. + */ + $user_id = ( 'profile' == $pagenow && current_user_can( 'edit_users' ) ) ? get_current_user_id() : sanitize_text_field( wpmem_get( 'user_id', false, 'get' ) ); + $user_products = wpmem_get_user_products( $user_id ); + echo '

    ' . __( 'Membership Access', 'wp-members' ) . '

    '; + if ( ! empty( $wpmem->membership->products ) ) { + $expires_heading = " "; + foreach( $wpmem->membership->products as $key => $value ) { + $expires_heading = ( ! empty( $value['expires'] ) ) ? __( 'Expires', 'wp-members' ) : $expires_heading; + } + echo ' + + + + + + '; ?> + membership->products as $key => $value ) { + $checked = ( $user_products && array_key_exists( $key, $user_products ) ) ? "checked" : ""; + echo ""; + echo ''; + + // If user has date, display that; otherwise placeholder + $date_value = ( isset( $user_products[ $key ] ) && 1 != $user_products[ $key ] && 0 != $user_products[ $key ] && '' != $user_products[ $key ] ) ? date( 'Y-m-d', $user_products[ $key ] ) : ""; + $placeholder = ( ! isset( $user_products[ $key ] ) ) ? 'placeholder="' . __( 'Expiration date (optional)', 'wp-members' ) . '" ' : ''; + $product_date_field = ' '; + + if ( isset( $user_products[ $key ] ) ) { + echo ''; + if ( $user_products[ $key ] != 1 ) { + echo ''; + } else { + echo ''; + } + } else { + if ( isset( $value['expires'] ) && ! empty( $value['expires'] ) ) { + echo ''; + echo ''; + } else { + echo ''; + } + } + echo ''; + } + + ?>
    ' . __( 'Action', 'wp-members' ) . '' . __( 'Membership', 'wp-members' ) . '' . __( 'Enabled?', 'wp-members' ) . '' . $expires_heading . '
    + ' . $value['title'] . '' . $product_date_field . ' ' . $product_date_field . ' 
    + + ' . sprintf( __( 'No memberships have been created. %sCreate new memberships here%s', 'wp-members' ), '', '' ); + } + } + } + + /** + * Adds user view links to Users > All Users for each membership. + * + * @since 3.3.9 + * + * @param array $views + * @param string $show The slug of the current view. + * @return array $views + */ + function user_views( $views, $show ) { + + global $wpdb, $wpmem; + + // Add a view for each membership + foreach ( $wpmem->membership->product_by_id as $membership_slug ) { + $views = wpmem_add_user_view_link( + $views, + wpmem_get_membership_name( $membership_slug ), // $wpmem->membership->products[ $product_slug ]['title'], + $membership_slug, + wpmem_get_membership_meta( $membership_slug ), // "_wpmem_products_" . $product_slug, + 0, + ">" + ); + } + + // Return the $views array with the added membership views. + return $views; + } + + /** + * Filters the "where" query for user view links in Users > All Users for each membership. + * + * @since 3.3.9 + * + * @param string $query_where + * @param string $show The slug of the current view. + * @return string $query_where + */ + function query_where( $query_where, $show ) { + + global $wpdb, $wpmem; + + // Check for membership views. + foreach ( $wpmem->membership->product_by_id as $membership_slug ) { + // Check if we are viewing ($show) a membership ($prduct_slug). + $query_where = wpmem_add_query_where( $query_where, $membership_slug, wpmem_get_membership_meta( $membership_slug ), 0, $compare = '>' ); + } + + return $query_where; + } +} \ No newline at end of file diff --git a/includes/admin/class-wp-members-sortable-user-columns.php b/includes/admin/class-wp-members-sortable-user-columns.php new file mode 100644 index 00000000..77089fd6 --- /dev/null +++ b/includes/admin/class-wp-members-sortable-user-columns.php @@ -0,0 +1,139 @@ +args = $args; + //add_action( 'pre_user_query', array(&$this, 'query' ) ); + add_action( 'manage_users_custom_column', array( &$this, 'column_content' ), 10, 3 ); + add_filter( 'manage_users_columns', array( &$this, 'add_to_columns' ) ); + add_filter( 'manage_users_sortable_columns', array( &$this, 'make_column_sortable') ); + + add_filter( 'request', array( &$this, 'custom_column_orderby' ) ); + } + + /** + * Prequery function. + * + * @since 3.0 + * + * @param string $query + */ + function query( $query ) { + global $wpdb; + $vars = $query->query_vars; + if ( in_array( $vars['orderby'], $this->defaults ) ) { + return; + } + $title = $this->args[ $vars['orderby'] ]; + if ( ! empty( $title ) ) { + $query->query_from .= " LEFT JOIN " . $wpdb->prefix . "usermeta m ON (" . $wpdb->prefix . "users.ID = m.user_id AND m.meta_key = '" . $vars['orderby'] . "')"; + $query->query_orderby = "ORDER BY m.meta_value " . $vars['order']; + } + } + + /** + * Adds selected WP-Members columns to the Users > All Users columns. + * + * @since 3.0 + * + * @param array $columns + */ + function add_to_columns( $columns ) { + foreach ( $this->args as $key => $value ) { + $columns[ $key ] = $value; + } + return $columns; + } + + /** + * Sets selected WP-Members columns as sortable. + * + * @since 3.0 + * + * @param array $columns + */ + function make_column_sortable( $columns ) { + $custom = array(); + foreach ( $this->args as $key => $value ) { + $custom[ $key ] = $key; + } + return wp_parse_args( $custom, $columns ); + } + + /** + * Returns the column content value for WP-Members selected columns. + * + * @since 3.0 + * + * @param string $value + * @param string $column_name + * @param int $user_id + */ + function column_content( $value, $column_name, $user_id ) { + foreach ( $this->args as $key => $val ) { + if ( $column_name == $key ) { + $user = get_userdata( $user_id ); + return $user->$column_name; + } + } + return $value; + } + + /** + * Sort custom column. + * + * @since 3.0.5 + */ + function custom_column_orderby( $vars ) { + foreach ( $this->args as $key => $val ) { + if ( isset( $vars[ $key ] ) && $val == $vars[ $key ] ) { + $vars = array_merge( $vars, array( + 'meta_key' => $key, + 'orderby' => $key, + ) ); + } + } + return $vars; + } +} +endif; \ No newline at end of file diff --git a/includes/admin/class-wp-members-tinymce-buttons.php b/includes/admin/class-wp-members-tinymce-buttons.php new file mode 100644 index 00000000..00dc1b8b --- /dev/null +++ b/includes/admin/class-wp-members-tinymce-buttons.php @@ -0,0 +1,66 @@ +' ) ) { + $plugin_array['wpmem_shortcodes'] = $wpmem->url . 'assets/js/shortcodes_tinymce' . wpmem_get_suffix() . '.js?ver=' . $wpmem->version; + } + return $plugin_array; + } + + /** + * Register the button. + * + * @since 3.0 + * + * @param array $buttons + * @return array $buttons + */ + function register_button( $buttons ) { + array_push( $buttons, "wpmem_shortcodes_button" ); + return $buttons; + } +} + +// End of File. \ No newline at end of file diff --git a/includes/admin/class-wp-members-user-export.php b/includes/admin/class-wp-members-user-export.php new file mode 100644 index 00000000..6aa451e1 --- /dev/null +++ b/includes/admin/class-wp-members-user-export.php @@ -0,0 +1,309 @@ + 'heading value'. + * The array can include fields in the Fields tab, plus the following: + * + * @type int $ID ID from wp_users + * @type string $username user_login from wp_users + * @type string $user_nicename user_nicename + * @type string $user_url user_url + * @type string $display_name display_name + * @type int $active Whether the user is active/deactivated. + * @type string $exp_type If the PayPal extension is installed pending|subscrption (optional) + * @type string $expires If the PayPal extension is installed MM/DD/YYYY (optional) + * @type string $user_registered user_registered + * @type string $user_ip The IP of the user when they registered. + * @type string $role The user's role (or roles, if multiple). + * } + * @type array $exclude_fields @deprecated 3.4.0 + * @type boolean $entity_decode Whether HTML entities should be decoded (default: false) + * @type string $date_format A PHP readable date format (default: Y-m-d which results in YYYY-MM-DD) + * } + * @param array $users Array of user IDs to export. + * @param string $tag + */ + public static function export_users( $args = array(), $users = array(), $tag = 'default' ) { + + $export_fields = ( ! isset( $args['fields'] ) ) ? self::get_export_fields() : $args['fields']; + + /** + * Filter the export fields. + * + * @since 3.2.5 + * @since 3.4.0 Added $tag. + * + * @param array $export_fields { + * The array of export fields is keyed as 'meta_key' => 'heading value'. + * The array will include all fields in the Fields tab, plus the following: + * + * @type int $ID ID from wp_users + * @type string $username user_login from wp_users + * @type string $user_nicename user_nicename + * @type string $user_url user_url + * @type string $display_name display_name + * @type int $active Whether the user is active/deactivated. + * @type string $exp_type If the PayPal extension is installed pending|subscrption (optional) + * @type string $expires If the PayPal extension is installed MM/DD/YYYY (optional) + * @type string $user_registered user_registered + * @type string $user_ip The IP of the user when they registered. + * @type string $role The user's role (or roles, if multiple). + * } + * @param string $tag + */ + $export_fields = apply_filters( 'wpmem_export_fields', $export_fields, $tag ); + + $today = date( "Y-m-d" ); + + // Setup defaults. + $defaults = array( + 'export' => 'all', + 'filename' => 'wp-members-user-export-' . $today . '.csv', + 'fields' => $export_fields, + 'entity_decode' => false, + 'date_format' => 'Y-m-d', + 'required_caps' => 'list_users', + ); + // Merge args with default (in case any were missing). + $args = wp_parse_args( $args, $defaults ); + + /** + * Filter the default export arguments. + * + * @since 2.9.7 + * @since 3.4.0 Filter all defaults (like other _args changes), then wp_parse_args() in case any are missing. + * @since 3.4.0 Added $tag. + * @since 3.4.0 Deprecated 'exclude_fields' (unset using wpmem_export_fields instead). + * @since 3.4.0 Deprecated 'export_fields' use "fields" instead. + * + * @param array $args { + * Array of defaults for export. + * + * @type string $export + * @type string $filename + * @type array $fields + * @type array $exclude_fields @deprecated 3.4.0 + * @type boolean $entity_decode + * @type string $date_format + * } + * @param string $tag + */ + $args = apply_filters( 'wpmem_export_args', $args, $tag ); + + // Merge args with default (in case any were missing). + $args = wp_parse_args( $args, $defaults ); + + if ( current_user_can( $args['required_caps'] ) ) { + // Output needs to be buffered, start the buffer. + ob_start(); + + // If exporting all, get all of the users. + $export_users = ( 'all' == $args['export'] ) ? get_users( array( 'fields' => 'ID' ) ) : $users; + + // Generate headers and a filename based on date of export. + header( "Content-Description: File Transfer" ); + header( "Content-type: application/octet-stream" ); + header( "Content-Disposition: attachment; filename=" . $args['filename'] ); + header( "Content-Type: text/csv; charset=" . get_option( 'blog_charset' ), true ); + + $handle = fopen( 'php://output', 'w' ); + fputs( $handle, "\xEF\xBB\xBF" ); // UTF-8 BOM + + // Remove excluded fields from $export_fields while setting up $header array. + $header = array(); + foreach ( $args['fields'] as $meta => $field ) { + $header[ $meta ] = $field; + } + + /** + * Filters user export header row before assembly. + * + * As of 3.4.0, this really isn't a necessary filter. You can specify the header + * value in wpmem_export_fields instead and just use one filter. + * + * @since 3.2.1 + * @since 3.4.0 Added $tag. + * + * @param array $header The header column values + * @param string $tag + */ + $header = apply_filters( 'wpmem_user_export_header', $header, $tag ); + + fputcsv( $handle, $header ); + + // Loop through the array of users, assemble csv. + // $fields only includes fields to be exported at this point. + foreach ( $export_users as $user ) { + + $user_info = get_userdata( $user ); + + $wp_user_fields = array( 'ID', 'user_login', 'user_pass', 'user_nicename', 'user_email', 'user_url', 'user_registered', 'user_activation_key', 'user_status', 'display_name' ); + foreach ( $args['fields'] as $meta => $field ) { + + switch ( $meta ) { + case 'ID': + case 'user_login': + case 'user_pass': + case 'user_nicename': + case 'user_email': + case 'user_url': + case 'user_registered': + case 'user_activation_key': + case 'user_status': + case 'display_name': + $row[ $meta ] = $user_info->{$meta}; + break; + case 'username': + $row['username'] = $user_info->user_login; + break; + case 'password': + $row['password'] = $user_info->user_pass; + break; + case 'active': + $row['active'] = wpmem_get_user_meta( $user, 'active' ) ? __( 'Yes' ) : __( 'No' ); + break; + case 'exp_type': + $exp_type = wpmem_get_user_meta( $user, 'exp_type' ); + $row['exp_type'] = ( false !== $exp_type ) ? $exp_type : ''; + break; + case 'expires': + $expires = wpmem_get_user_meta( $user, 'expires' ); + $row['expires'] = ( false !== $expires ) ? $expires : ''; + break; + case 'wpmem_reg_ip': + $reg_ip = wpmem_get_user_meta( $user, 'wpmem_reg_ip' ); + $row['wpmem_reg_ip'] = ( false !== $reg_ip ) ? $reg_ip : ''; + break; + case 'role': + $role = wpmem_get_user_role( $user, true ); // As of 3.4, wpmem_get_user_role() can get all roles. + $row['role'] = ( is_array( $role ) ) ? implode( ",", $role ) : $role; + break; + case ( self::$membership_product_stem === substr( $meta, 0, strlen( self::$membership_product_stem ) ) ): + $product = str_replace( self::$membership_product_stem, '', $meta ); + $row[ $meta ] = wpmem_get_user_meta( $user, $meta ); + // If value is a date and false is not the format_date option... + if ( false !== $args['date_format'] && '' != $row[ $meta ] && $row[ $meta ] > 2 ) { + $date_format = ( 'wp' == $args['date_format'] ) ? get_option('date_format') : $args['date_format']; + $row[ $meta ] = date( $date_format, $row[ $meta ] ); + } + break; + default: + if ( in_array( $meta, $wp_user_fields ) ) { + $row[ $meta ] = ( 'username' == $meta ) ? $user_info->user_login : $user_info->{$meta}; + } else { + $raw_data = wpmem_get_user_meta( $user, $meta ); + $raw_data = ( $raw_data ) ? $raw_data : ''; + $row[ $meta ] = ( $args['entity_decode'] ) ? html_entity_decode( $raw_data ) : $raw_data; + } + break; + } + } + + /** + * Filter the user data before assembly. + * + * @since 3.2.1 + * @since 3.4.0 Added user ID (it may not be included in the $row array if the field were filtered out). + * @since 3.4.0 Added $tag. + * + * @param array $row The user data row. + * @param int $user_id The user ID. + * @param string $tag + */ + $row = apply_filters( 'wpmem_user_export_row', $row, $user_info->ID, $tag ); + + fputcsv( $handle, $row ); + + // Update the user record as being exported. + if ( 'all' != $args['export'] ) { + update_user_meta( $user, 'exported', 1 ); + } + } + + fclose( $handle ); + print( ob_get_clean() ); + + exit(); + } else { + wp_die( __( 'You do not have the required user capabilities to export users.', 'wp-members' ) ); + } + } + + private static function get_export_fields() { + + $wpmem_fields = wpmem_fields(); + + // Fields to exclude. + $exclude_fields = array( 'user_pass', 'password', 'confirm_password', 'confirm_email' ); + + // Prepare fields, add additional "special" fields. + $export_fields = array( + 'ID' => __( 'User ID', 'wp-members' ), + ); + foreach( $wpmem_fields as $meta_key => $value ) { + if ( ! in_array( $meta_key, $exclude_fields ) ) { + $export_fields[ $meta_key ] = $value['label']; + } + } + $export_fields['username'] = __( 'Username', 'wp-members' ); + if ( wpmem_is_enabled( 'mod_reg' ) ) { + $export_fields['active'] = __( 'Activated?', 'wp-members' ); + } + if ( wpmem_is_enabled( 'act_link' ) ) { + $export_fields['_wpmem_user_confirmed'] = __( 'Confirmed?', 'wp-members' ); + } + if ( defined( 'WPMEM_EXP_MODULE' ) && wpmem_is_enabled( 'use_exp' ) ) { + $export_fields['exp_type'] = __( 'Subscription', 'wp-members' ); + $export_fields['expires'] = __( 'Expires', 'wp-members' ); + } + $export_fields['user_registered'] = __( 'Registered', 'wp-members' ); + $export_fields['wpmem_reg_ip'] = __( 'IP', 'wp-members' ); + $export_fields['role'] = __( 'Role', 'wp-members' ); + if ( wpmem_is_enabled( 'enable_products' ) ) { + $membership_products = wpmem_get_memberships(); + foreach( $membership_products as $product_key => $product ) { + $export_fields[ self::$membership_product_stem . $product_key ] = $membership_products[ $product_key ]['title']; + } + } + + return $export_fields; + } +} \ No newline at end of file diff --git a/includes/admin/class-wp-members-user-search.php b/includes/admin/class-wp-members-user-search.php new file mode 100644 index 00000000..354b5427 --- /dev/null +++ b/includes/admin/class-wp-members-user-search.php @@ -0,0 +1,221 @@ + wpmembers_user_search_crud + * + * @access private + * @var string + */ + private $table = "wpmembers_user_search_crud"; + + /** + * Constructor function. + * + * @since 3.1.9 + */ + public function __construct() { + // This plugin is for the backend only + if ( ! is_admin() ) { + return; + } + + $saved_keys = get_option( 'wpmembers_usfields' ); + if ( $saved_keys ) { + $this->keys = $saved_keys; + // Add the overwrite actions for the search + add_action( 'pre_user_query', array( $this, 'pre_user_query' ), 100 ); + } + } + + /** + * pre_user_query function. + * + * @since 3.1.9 + * + * @global stdClass $wpdb + * + * @param string $user_query + */ + public function pre_user_query( $user_query ) { + + // Exit if no search is being done. + $terms = wpmem_get( 's', false, 'get' ); + if ( ! $terms ) { + return; + } + + global $wpdb; + + // Get the data we need from helper methods. + $terms = $this->get_search_terms(); + $meta_keys = $this->get_meta_keys(); + + // If there are meta keys to search. + if ( ! empty( $meta_keys ) ) { + + // Are we performing an AND (default) or an OR? + $search_with_or = in_array( 'or', $terms ); + + if ( $search_with_or ) { + // Remove the OR keyword(s) from the terms. + $terms = array_diff( $terms, array( 'or', 'and' ) ); + + // Reset the array keys. + $terms = array_values( $terms ); + } + + // Need a permanent crud table because you cannot reference MySQL temporary tables more than once per query. + $mktable = $wpdb->prefix . $this->table; + + // If the table does not exist, create the table to store the meta keys. + $wpdb->query( "CREATE TABLE IF NOT EXISTS {$mktable} (meta_key VARCHAR(255) NOT NULL) " . $wpdb->get_charset_collate() . ";" ); + + // Empty the table to ensure that we have an accurate set of meta keys. + $wpdb->query( "TRUNCATE TABLE {$mktable};" ); + + // Insert the meta keys into the table. + $prepare_values_array = array_fill( 0, count( $meta_keys ), '(%s)' ); + $prepare_values = implode( ", ", $prepare_values_array ); + + $insert_sql = $wpdb->prepare( " + INSERT INTO {$mktable} + (meta_key) + VALUES + {$prepare_values};", $meta_keys ); + + $wpdb->query( $insert_sql ); + + // Build data for $wpdb->prepare. + $values = array(); + + // Make sure we replicate each term XX number of times (refer to query below for correct number). + foreach ( $terms as $term ) { + for ( $i = 0; $i < 6; $i++ ) { + $values[] = "%{$term}%"; + } + } + + // Last value is for HAVING COUNT(*), so add that. + // Note the min count is 1 if we found OR in the terms. + $values[] = ( $search_with_or !== false ? 1 : count( $terms ) ); + + // Query for matching users. + $user_ids = $wpdb->get_col( $sql = $wpdb->prepare( " + SELECT user_id + FROM (" . implode( 'UNION ALL', array_fill( 0, count( $terms ), " + SELECT DISTINCT u.ID AS user_id + FROM {$wpdb->users} u + INNER JOIN {$wpdb->usermeta} um + ON um.user_id = u.ID + INNER JOIN {$mktable} mk + ON mk.meta_key = um.meta_key + WHERE LOWER(um.meta_value) LIKE %s + OR LOWER(u.user_login) LIKE %s + OR LOWER(u.user_nicename) LIKE %s + OR LOWER(u.user_email) LIKE %s + OR LOWER(u.user_url) LIKE %s + OR LOWER(u.display_name) LIKE %s + " ) ) . ") AS user_search_union + GROUP BY user_id + HAVING COUNT(*) >= %d;", $values ) ); + + // Change query to include the new user IDs. + if ( is_array( $user_ids ) && count( $user_ids ) ) { + // Combine the IDs into a comma separated list. + $id_string = implode( ',', $user_ids ); + + // Build the SQL we are adding to the query. + $extra_sql = " OR ID IN ({$id_string})"; + $add_after = 'WHERE '; + $add_position = strpos( $user_query->query_where, $add_after ) + strlen( $add_after ); + + // Add the query to the end. + $user_query->query_where = substr( $user_query->query_where, 0, $add_position ) . '(' . substr( $user_query->query_where, $add_position ) . ')' . $extra_sql; + } + } + } + + /** + * Get array of user search terms. + * + * @since 3.1.9 + * + * @return array $terms + */ + public function get_search_terms() { + // Get the WordPress search term(s). + $terms = ( wpmem_get( 's', false, 'get' ) ) ? trim( strtolower( stripslashes( $_GET['s'] ) ) ) : false; + + // Quite if no search term(s) exist. + if ( empty( $terms ) ) { + return array(); + } + + // Split terms by space into an array. + $terms = explode( ' ', $terms ); + + // Remove empty terms. + foreach ( $terms as $key => $term ) { + if ( empty( $term ) ) { + unset( $terms[ $key ] ); + } + } + + // Reset the array keys. + $terms = array_values( $terms ); + + return $terms; + } + + /** + * Get meta keys for query. + * + * @since 3.1.9 + * + * @return array $meta_keys + */ + public function get_meta_keys() { + // Setting is an array of meta_key => meta_value, need the key. + $meta_keys = array(); + if ( $this->keys ) { + foreach ( $this->keys as $key => $val ) { + $meta_keys[] = $key; + } + } + // Return the meta keys. + return $meta_keys; + } +} \ No newline at end of file diff --git a/includes/admin/dialogs.php b/includes/admin/dialogs.php new file mode 100644 index 00000000..351a0ca9 --- /dev/null +++ b/includes/admin/dialogs.php @@ -0,0 +1,249 @@ + +

    warnings == 0 ) ? true : false; + + // Is there an active warning? + $active_warnings = array(); + + // Settings allow anyone to register. + if ( get_option( 'users_can_register' ) != 0 && $warnings_on ) { + $active_warnings[] = wpmem_a_warning_msg( 'users_can_register' ); + } + + // Settings allow anyone to comment. + if ( get_option( 'comment_registration' ) !=1 && $warnings_on ) { + $active_warnings[] = wpmem_a_warning_msg( 'comment_registration' ); + } + + // Rss set to full text feeds. + if ( get_option( 'rss_use_excerpt' ) !=1 && $warnings_on ) { + $active_warnings[] = wpmem_a_warning_msg( 'rss_use_excerpt' ); + } + + // Holding registrations but haven't changed default successful registration message. + if ( $warnings_on && $wpmem->mod_reg == 1 && $dialogs['success'] == wpmem_get_text( 'success' ) ) { + $active_warnings[] = wpmem_a_warning_msg( 'success' ); + } + + // Haven't entered recaptcha api keys. + if ( $warnings_on && $wpmem->captcha > 0 ) { + $wpmem_captcha = get_option( 'wpmembers_captcha' ); + if ( 1 == $wpmem->captcha || 3 == $wpmem->captcha ) { + if ( ! $wpmem_captcha['recaptcha']['public'] || ! $wpmem_captcha['recaptcha']['private'] ) { + $active_warnings[] = wpmem_a_warning_msg( 'wpmembers_captcha' ); + } + } + } + + // If there is an active warning, display message about warnings. + if ( ! empty( $active_warnings ) ) { + $strong_msg = __( 'WP-Members Options', 'wp-members' ) . ': ' . __( 'You have active settings that are not recommended.', 'wp-members' ); + $remain_msg = __( 'If you will not be changing these settings, you can turn off this warning message by checking the "Ignore warning messages" in the settings below.', 'wp-members' ); + + echo '

    ' . $strong_msg . '

      '; + foreach ( $active_warnings as $warning ) { + echo $warning; + } + echo '
    '; + echo '

    ' . $remain_msg . '

    '; + } + +} + + +/** + * Assembles the various admin warning messages. + * + * @since 2.4.0 + * @since 3.1.0 Changed $msg argument to string. + * + * @param string $msg The number for which message should be displayed. + */ +function wpmem_a_warning_msg( $msg ) { + + $strong_msg = $remain_msg = $span_msg = ''; + + switch ( $msg ) { + + case 'users_can_register': + $strong_msg = __( 'Your WP settings allow anyone to register - this is not the recommended setting.', 'wp-members' ); + $remain_msg = sprintf( __( 'You can %s change this here %s making sure the box next to "Anyone can register" is unchecked.', 'wp-members'), '', '' ); + $span_msg = __( 'If you do not want users to register through wp-login.php, uncheck this option.', 'wp-members' ); + break; + + case 'comment_registration': + $strong_msg = __( 'Your WP settings allow anyone to comment - this is not the recommended setting.', 'wp-members' ); + $remain_msg = sprintf( __( 'You can %s change this here %s by checking the box next to "Users must be registered and logged in to comment."', 'wp-members' ), '', '' ); + $span_msg = __( 'If you do not want non-registered users to comment, change this setting.', 'wp-members' ); + break; + + case 'rss_use_excerpt': + $strong_msg = __( 'Your WP settings allow full text rss feeds - this is not the recommended setting.', 'wp-members' ); + $remain_msg = sprintf( __( 'You can %s change this here %s by changing "For each article in a feed, show" to "Summary."', 'wp-members' ), '' , '' ); + $span_msg = __( 'Full text feeds allow your protected content in an RSS reader.', 'wp-members' ); + break; + + case 'success': + $strong_msg = __( 'You have set WP-Members to hold registrations for approval', 'wp-members' ); + $remain_msg = __( 'but you have not changed the default message for "Registration Completed" under "WP-Members Dialogs and Error Messages." You should change this message to let users know they are pending approval.', 'wp-members' ); + break; + + case 'wpmembers_captcha': + $strong_msg = __( 'You have turned on reCAPTCHA', 'wp-members'); + $remain_msg = __( 'but you have not entered API keys. You will need both a public and private key. The CAPTCHA will not display unless a valid API key is included.', 'wp-members' ); + break; + + } + + if ( $span_msg ) { + $span_msg = ' [why is this?]'; + } + + return '
  • ' . $strong_msg . ' ' . $remain_msg . $span_msg . '
  • '; + +} + + +/** + * Assemble the side meta box. + * + * @since 2.8.0 + * + * @global object $wpmem + */ +function wpmem_a_meta_box() { + + global $wpmem; + + ?>
    +

    WP-Members Information

    +
    + +

    version; ?>
    +
    +
    + + +

    Find out how to get access to WP-Members private members forum, premium code snippets, tutorials, and add-on modules! + +

    + +

    + ™!

    +  Chad Butler
    + ButlerBlog: RSS | Twitter
    + Copyright © 2006-

    + Premium support and installation service available at rocketgeek.com. +

    +
    +
    +

    +
    'https://rocketgeek.com/feed/', //put your feed URL here + 'title' => __( 'Latest from RocketGeek', 'wp-members' ), + 'items' => 4, //how many posts to show + 'show_summary' => 0, + 'show_author' => 0, + 'show_date' => 0, + ) );?> +
    +
    +

    +
    ', '' ); ?>
    +
    '; + wp_widget_rss_output( array( + 'url' => 'https://feeds.feedburner.com/butlerblog', + 'title' => __( 'Latest from ButlerBlog', 'wp-members' ), + 'items' => 5, + 'show_summary' => 0, + 'show_author' => 0, + 'show_date' => 1, + ) ); + echo ""; +} + +// End of file. \ No newline at end of file diff --git a/includes/admin/index.php b/includes/admin/index.php new file mode 100644 index 00000000..dc051a13 --- /dev/null +++ b/includes/admin/index.php @@ -0,0 +1 @@ + get_site_url(), + 'utm_medium' => 'wp-members-core-plugin', + 'utm_campaign' => 'plugin-install', +); + +$action_complete = ( 'update_pending' == $install_state ) ? __( 'Plugin update complete', 'wp-members' ) : __( 'Plugin installation complete', 'wp-members' ); +?> +
    +
    +

    +

    + + + + +

    WP-Members installs some basic defaults to get you started. Be sure to review the plugin's default setup here. + There are links to related documentation in the plugin settings. There are also some helpful links below.

    + + +

    +

    There are premium plugin add-ons available as well as a discounted bundle.

    +

    Need more help?

    +

    If you need additional assistance, consider a premium support subscription.

    +

     

    +
      +
    • »
    • +
    • »
    • +
    • »
    • +
    +
    +
    \ No newline at end of file diff --git a/includes/admin/partials/onboarding_notice.php b/includes/admin/partials/onboarding_notice.php new file mode 100644 index 00000000..691823dd --- /dev/null +++ b/includes/admin/partials/onboarding_notice.php @@ -0,0 +1,23 @@ + +
    +
    +

    {$which}['notice_heading']; ?>

    + +{$which}['show_release_notes'] ) { ?> +

    + +has_user_opted_in() ) { ?> +

    +

    + +

    +

    +
    + +

    + +

    + + +
    +
    \ No newline at end of file diff --git a/includes/admin/tabs/class-wp-members-admin-tab-captcha.php b/includes/admin/tabs/class-wp-members-admin-tab-captcha.php new file mode 100644 index 00000000..3e109aa4 --- /dev/null +++ b/includes/admin/tabs/class-wp-members-admin-tab-captcha.php @@ -0,0 +1,321 @@ + 'Captcha' ) ); + } + + /** + * Builds the captcha options. + * + * @since 2.4.0 + * @since 3.3.0 Ported wpmem_a_build_captcha_options() to build_settings(). + */ + public static function build_settings() { + + // Global settings. + global $wpmem, $updated_captcha_type; + + $wpmem_captcha = get_option( 'wpmembers_captcha' ); + $url = home_url(); + $help_link = sprintf( __( 'See the %sUsers Guide on CAPTCHA%s.', 'wp-members' ), '', '' ); + ?> +
    + +
    + +
    +

    +
    + +
    +
    +
    + +
    +
    +
    + +

    +
    +
    + + + + + + + + + + + + captcha || 4 == $wpmem->captcha ) { + $show_update_button = true; + $private_key = ( isset( $wpmem_captcha['recaptcha'] ) ) ? $wpmem_captcha['recaptcha']['private'] : ''; + $public_key = ( isset( $wpmem_captcha['recaptcha'] ) ) ? $wpmem_captcha['recaptcha']['public'] : ''; + ?> + + + + + captcha ) { + $show_update_button = true; + $private_key = ( isset( $wpmem_captcha['hcaptcha'] ) ) ? $wpmem_captcha['hcaptcha']['secret'] : ''; + $public_key = ( isset( $wpmem_captcha['hcaptcha'] ) ) ? $wpmem_captcha['hcaptcha']['api_key'] : ''; + ?> + + + + + captcha == 2 ) { + + // Setup defaults. + $defaults = array( + 'characters' => 'ABCDEFGHJKLMNPQRSTUVWXYZ23456789', + 'num_char' => '4', + 'dim_w' => '72', + 'dim_h' => '30', + 'font_color' => '0,0,0', + 'bg_color' => '255,255,255', + 'font_size' => '12', + 'kerning' => '14', + 'img_type' => 'png', + ); + + $args = ( isset( $wpmem_captcha['really_simple'] ) && is_array( $wpmem_captcha['really_simple'] ) ) ? $wpmem_captcha['really_simple'] : array(); + + $args = wp_parse_args( $args, $defaults ); + + // Explode colors. + $font_color = explode( ',', $args['font_color'] ); + $bg_color = explode( ',', $args['bg_color'] ); + + $show_update_button = true; + if ( is_plugin_active( 'really-simple-captcha/really-simple-captcha.php' ) ) { ?> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + captcha ) { + case 1: + $captcha_type = 'recaptcha'; + break; + case 2: + $captcha_type = 'really_simple'; + break; + case 3: + case 4: + $captcha_type = 'recaptcha2'; + break; + case 5: + $captcha_type = 'hcaptcha'; + break; + } ?> + + + + + +
    captcha ) { + $wpmem->captcha = 3; // reCAPTCHA v1 is fully obsolete. Change it to v2. + } + $captcha[] = __( 'reCAPTCHA v2', 'wp-members' ) . '|3'; + $captcha[] = __( 'reCAPTCHA v3', 'wp-members' ) . '|4'; + $captcha[] = __( 'Really Simple CAPTCHA', 'wp-members' ) . '|2'; + $captcha[] = __( 'hCaptcha', 'wp-members' ) . '|5'; + echo wpmem_form_field( 'wpmem_settings_captcha', 'select', $captcha, $wpmem->captcha ); ?> +
    +

    +
    +

    ", '' ); + } ?>

    +


    +


    +
    +

    ", '' ); + } ?>

    +


    +


    +
    R: G: B:
    R: G: B:
    +
    +

    +

    ', '' ), 'wp-members' ); ?>

    +
      + + + +
    +
    +
    +
    +
    +
    +
    + captcha != $which ) { + // Changing captcha type. + global $updated_captcha_type; + $updated_captcha_type = true; + $wpmem->captcha = $which; + wpmem_update_option( 'wpmembers_settings', 'captcha', $which ); + } + + if ( $update_type == 'recaptcha' || $update_type == 'recaptcha2' ) { + $settings['recaptcha'] = array( + 'public' => sanitize_text_field( wpmem_get( 'wpmem_captcha_publickey', '' ) ), + 'private' => sanitize_text_field( wpmem_get( 'wpmem_captcha_privatekey', '' ) ), + ); + if ( 'recaptcha' == wpmem_get( 'wpmem_captcha_theme', false ) ) { + $settings['recaptcha']['theme'] = sanitize_text_field( wpmem_get( 'wpmem_captcha_theme', '' ) ); + } + } + + if ( 'hcaptcha' == $update_type ) { + $settings['hcaptcha']['api_key'] = sanitize_text_field( wpmem_get( 'wpmem_captcha_publickey', '' ) ); + $settings['hcaptcha']['secret'] = sanitize_text_field( wpmem_get( 'wpmem_captcha_privatekey', '' ) ); + } + + if ( $update_type == 'really_simple' ) { + $font_color = sanitize_text_field( wpmem_get( 'font_color_r', '' ) ) . ',' . sanitize_text_field( wpmem_get( 'font_color_g', '' ) ) . ',' . sanitize_text_field( wpmem_get( 'font_color_b', '' ) ); + $bg_color = sanitize_text_field( wpmem_get( 'bg_color_r', '' ) ) . ',' . sanitize_text_field( wpmem_get( 'bg_color_g', '' ) ) . ',' . sanitize_text_field( wpmem_get( 'bg_color_b', '' ) ); + $settings['really_simple'] = array( + 'characters' => sanitize_text_field( wpmem_get( 'characters', '' ) ), + 'num_char' => sanitize_text_field( wpmem_get( 'num_char', '' ) ), + 'dim_w' => sanitize_text_field( wpmem_get( 'dim_w', '' ) ), + 'dim_h' => sanitize_text_field( wpmem_get( 'dim_h', '' ) ), + 'font_color' => $font_color, + 'bg_color' => $bg_color, + 'font_size' => sanitize_text_field( wpmem_get( 'font_size', '' ) ), + 'kerning' => sanitize_text_field( wpmem_get( 'kerning', '' ) ), + 'img_type' => sanitize_text_field( wpmem_get( 'img_type', '' ) ), + ); + } + + update_option( 'wpmembers_captcha', $settings ); + return __( 'CAPTCHA was updated for WP-Members', 'wp-members' ); + } +} \ No newline at end of file diff --git a/includes/admin/tabs/class-wp-members-admin-tab-dialogs.php b/includes/admin/tabs/class-wp-members-admin-tab-dialogs.php new file mode 100644 index 00000000..fb8d31df --- /dev/null +++ b/includes/admin/tabs/class-wp-members-admin-tab-dialogs.php @@ -0,0 +1,127 @@ + +
    + +
    + +
    +

    +
    + See the Users Guide on dialogs. +
    +
    +
    + +
    +
    +
    +

    WP-Members

    +
    +

    +
    + + + admin->dialogs ) ) { + foreach( $wpmem->admin->dialogs as $dialog ) { + $wpmem->admin->do_dialog_input( $dialog ); + } + } ?> + + + + + + + + + +
      + + +
    +
    +
    +
    +
    +
    +
    + admin->dialogs ) ) { + $wpmem->admin->dialog_update(); + } + + // Terms of Service. + update_option( 'wpmembers_tos', wp_kses( $_POST['dialogs_tos'], 'post' ) ); + + return __( 'WP-Members dialogs were updated', 'wp-members' ); + } + +} // End of file. \ No newline at end of file diff --git a/includes/admin/tabs/class-wp-members-admin-tab-dropins.php b/includes/admin/tabs/class-wp-members-admin-tab-dropins.php new file mode 100644 index 00000000..ba882203 --- /dev/null +++ b/includes/admin/tabs/class-wp-members-admin-tab-dropins.php @@ -0,0 +1,231 @@ + +
    + $val ) { + // Check against default strings. Only save if different. + if ( html_entity_decode( wpmem_get_text( $key ) ) != html_entity_decode( $val ) ) { + $settings['text'][ $key ] = $val; + } else { + if ( ! empty( $old_settings['text'] ) && array_key_exists( $key, $old_settings['text'] ) ) { + $settings['text'][ $key ] = $val; + } + } + } + // Double check settings for defaults. + foreach ( $settings['text'] as $k => $v ) { + if ( wpmem_get_text( $k ) == $v ) { + unset( $settings['text'][ $k ] ); + } + } + } + + // If there are any changes, update settings. + if ( ! empty( $settings ) ) { + update_option( 'wpmembers_dropins', $settings ); + } else { + // Delete if empty. + delete_option( 'wpmembers_dropins' ); + } + + $wpmem_dropins_saved = true; + } + if ( $wpmem_dropins_saved ) { ?> +

    + + + 'Dropins' ), + array_slice( $tabs, 1 ) + ); + } + + /** + * Builds the Dropins tab in the admin. + * + * @since 3.1.9 + * + * @param string $tab The WP-Members admin panel tab being displayed. + */ + public static function do_tab( $tab ) { + if ( $tab == 'dropins' ) { + self::do_table(); + } + return; + } + + /** + * Check dropins directory. + * + * @since 3.1.9 + * + * @return boolean + */ + public static function check_dir() { + + /** This filter is documented in inc/class-wp-members.php */ + $dir = apply_filters( 'wpmem_dropin_dir', $wpmem->dropin_dir ); + $check = false; + if ( file_exists( $dir ) ) { + $file = $dir . '.htaccess'; + if ( ! file_exists ( $file ) ) { + $check = self::create_htaccess( $file ); + } else { + $handle = fopen( $file, "r" ); + if ( $handle ) { + // Read file line-by-line + while ( ( $buffer = fgets( $handle ) ) !== false ) { + if ( strpos( $buffer, "Options -Indexes" ) !== false ) + $check = true; + break; + } + } + fclose( $handle ); + $check = ( false === $check ) ? self::create_htaccess( $file ) : $check; + } + } + return $check; + } + + /** + * Creates .htaccess in dropins directory if none exists. + * + * @since 3.1.9 + * + * @param string + * @return boolean + */ + public static function create_htaccess( $file ) { + $handle = fopen( $file, "w" ); + fwrite( $handle, "Options -Indexes" ); + fclose( $handle ); + return ( $handle ) ? true : false; + } + + /** + * Function to display the table of fields in the field manager tab. + * + * @since 3.1.9 + * + * @global object $wpmem + */ + public static function do_table() { + global $wpmem; + + // Get the dropin folder. + /** This filter is documented in inc/class-wp-members.php */ + $folder = apply_filters( 'wpmem_dropin_folder', $wpmem->dropin_dir ); + + // Set file headers for dropins. + $headers = array( + 'Dropin Name' => 'Dropin Name', + 'Dropin Description' => 'Dropin Description', + 'Version' => 'Version', + ); + + // Array container for dropin file info. + $field_items = array(); + + // Parse dropins. + foreach ( glob( $folder . '*.php' ) as $filename ) { + $file_data = get_file_data( $filename, $headers ); + + $filename = explode( '/', $filename ); + $filename = end( $filename ); + if ( ! empty( $file_data['Dropin Name'] ) ) { + $field_items[] = array( + 'dropin_enabled' => '', + 'dropin_name' => $file_data['Dropin Name'], + 'dropin_file' => $filename, + 'dropin_version' => $file_data['Version'], + 'dropin_description' => $file_data['Dropin Description'], + ); + } + } + + // Set up table. + include_once( $wpmem->path . 'includes/admin/tabs/class-wp-members-dropins-table.php' ); + $table = new WP_Members_Dropins_Table(); + + $heading = __( 'Manage Dropins', 'wp-members' ); + $loc_info = __( 'Current dropin folder: ', 'wp-members' ); + $loc_desc = __( 'You can change location of the dropin folder using the wpmem_dropin_folder filter.', 'wp-members' ); + echo '
    '; + printf( '

    %s

    ', $heading ); + printf( '

    %s

    ', $loc_info ); + printf( '

    %s

    ', $loc_desc ); + printf( '
    ', wpmem_admin_form_post_url() ); + $table->items = $field_items; + $table->prepare_items(); + $table->display(); + echo '
    '; + echo '
    '; + } + +} \ No newline at end of file diff --git a/includes/admin/tabs/class-wp-members-admin-tab-emails.php b/includes/admin/tabs/class-wp-members-admin-tab-emails.php new file mode 100644 index 00000000..80f68586 --- /dev/null +++ b/includes/admin/tabs/class-wp-members-admin-tab-emails.php @@ -0,0 +1,229 @@ + +
    + +
    +
    +
    +

    WP-Members

    +
    +

    +
    + + +

    +
    +
    + + + + + + + + + + + + + + + + admin->emails ) ) { + foreach( $wpmem->admin->emails as $email ) { + self::do_email_input( $email ); + } + } + $arr = get_option( 'wpmembers_email_footer' ); + $footer_args = array( + 'body_input' => 'wpmembers_email_footer_body', + 'body_value' => $arr, + ); ?> + + + + + + + + + +
      email@yourdomain.com
      John Smith
    email->html, 1, true ); ?> />


      + + +
    +
    +
    +
    +
    +

    + +
    +
    +
    +
    + email->from != $_POST['wp_mail_from'] || $wpmem->email->from_name != $_POST['wp_mail_from_name'] || $wpmem->email->html != wpmem_get( 'wpmem_email_html', 0 ) ) { + $wpmem->email->from = sanitize_email( $_POST['wp_mail_from'] ); + $wpmem->email->from_name = sanitize_text_field( $_POST['wp_mail_from_name'] ); + $wpmem->email->html = intval( wpmem_get( 'wpmem_email_html', 0 ) ); + update_option( 'wpmembers_email_wpfrom', $wpmem->email->from ); + update_option( 'wpmembers_email_wpname', $wpmem->email->from_name ); + update_option( 'wpmembers_email_html', $wpmem->email->html ); + } + + // Update the various emails being used. + ( $wpmem->mod_reg == 0 ) ? $arr = array( 'wpmembers_email_newreg' ) : $arr = array( 'wpmembers_email_newmod', 'wpmembers_email_appmod' ); + array_push( $arr, 'wpmembers_email_repass' ); + array_push( $arr, 'wpmembers_email_getuser' ); + ( $wpmem->notify == 1 ) ? array_push( $arr, 'wpmembers_email_notify' ) : false; + array_push( $arr, 'wpmembers_email_footer' ); + + for ( $row = 0; $row < ( count( $arr ) - 1 ); $row++ ) { + $arr2 = array( + "subj" => sanitize_text_field( $_POST[ $arr[ $row ] . '_subj' ] ), + "body" => wp_kses( $_POST[ $arr[ $row ] . '_body' ], 'post' ), + ); + update_option( $arr[ $row ], $arr2, false ); + $arr2 = ''; + } + + // Updated the email footer. + update_option( $arr[ $row ], wp_kses( $_POST[ $arr[ $row ] . '_body' ], 'post' ), false ); + + if ( ! empty ( $wpmem->admin->emails ) ) { + foreach( $wpmem->admin->emails as $email ) { + self::email_update( $email ); + } + } + + return __( 'WP-Members emails were updated', 'wp-members' ); + + } + + /** + * Adds custom email dialog to the Emails tab. + * + * @since 3.1.0 + * @since 3.4.0 Moved to emails tab class. + * + * @param array $args Settings array for the email. + */ + static private function do_email_input( $args ) { ?> + + + + + + + + + +
    email->html ) { + $editor_args = array( + 'media_buttons' => false, + 'textarea_rows' => 10, + ); + wp_editor( $args['body_value'], esc_attr( $args['body_input'] ), $editor_args ); + } else { ?> + + sanitize_text_field( wpmem_get( $args['subject_input'] ) ), + 'body' => wp_kses( wpmem_get( $args['body_input'] ), 'post' ), + ); + update_option( $args['name'], $settings, true ); + $wpmem->admin->emails[ $args['name'] ]['subject_value'] = $settings['subj']; + $wpmem->admin->emails[ $args['name'] ]['body_value'] = $settings['body']; + return; + } +} // End of file. \ No newline at end of file diff --git a/includes/admin/tabs/class-wp-members-admin-tab-fields.php b/includes/admin/tabs/class-wp-members-admin-tab-fields.php new file mode 100644 index 00000000..c02e825f --- /dev/null +++ b/includes/admin/tabs/class-wp-members-admin-tab-fields.php @@ -0,0 +1,832 @@ + + + +

    + +

    + fields[ $meta ]['label'] ) . ' (meta key: ' . $meta . ')
    '; + } ?> +
    + + " /> + + +
    +

    + +

    +
    + +
    + ' . __( '(optional)', 'wp-members' ) . ''; + $span_required = '' . __( '(required)', 'wp-members' ) . ''; + $form_submit = array( 'mode' => $mode ); + if ( isset( $_GET['field'] ) ) { + $form_submit['field'] = $meta_key; + } ?> +

    +
    + +
      +
    • + + + +
    • +
    • + + $meta_key"; ?> + + + + + +
    • +
    • + + ' . $field['type'] . ''; ?> + + + + +
    • +
    • + + + /> + + + + +
    • +
    • + + + /> + + + + +
    • + + + ' : ''; ?> +
    • + + +
    • + ' : ''; ?> + + + ' : ''; ?> +
    • + + +
    • + ' : ''; ?> + + + ' : ''; ?> +
    • + + +
    • + ' : ''; ?> + + + ' : ''; ?> +
    • + + +
    • + ' : ''; ?> + + + + ' : ''; ?> +
    • + + +
    • +
    • + + +
    • + ' : ''; ?> + + + ' : ''; ?> +
    • + + +
    • +
    • + + +
    • + ' : ''; ?> + + + ' : ''; ?> +
    • + + +
    • +
    • + + +
    • + ' : ''; ?> + + + ' : ''; ?> +
    • + + /> +
    • +
    • + + +
    • +
    • + + +
    • + ' : ''; ?> + + ' : ''; ?> + ' : ''; + if ( isset( $field['delimiter'] ) && ( "|" == $field['delimiter'] || "," == $field['delimiter'] ) ) { + $delimiter = $field['delimiter']; + } else { + $delimiter = "|"; + } + ?> +
    • + + +
    • + ' : ''; + } ?> +
    • + + +
    • +
    • + + +
    • +
    • + + +
    • + ' : ''; ?> + + + ' : ''; ?> +
    • + + +
    • + ' : ''; ?> + +

    + + + + + + +

    «

    +
    $field ) { + + // @todo - transitional until new array keys (so maybe never, or maybe 3.5.0) + if ( is_numeric( $key ) ) { + // Adjust for profile @todo - temporary until new array keys. + if ( isset( $field['profile'] ) ) { + $profile = ( true == $field['profile'] ) ? 'y' : 'n'; + } else { + $profile = $field[4]; + } + + $meta = $field[2]; + $ut_checked = ( ( $wpmem_ut_fields ) && ( array_key_exists( $meta, $wpmem_ut_fields ) ) ) ? $meta : false; + $us_checked = ( ( $wpmem_us_fields ) && ( array_key_exists( $meta, $wpmem_us_fields ) ) ) ? $meta : false; + + $item['order'] = $field[0]; + $item['label'] = $field[1]; + $item['meta'] = $meta; + $item['type'] = $field[3]; + $item['display'] = ( 'user_email' != $meta && 'username' != $meta ) ? wpmem_form_field( array( + 'name' => "wpmem_fields_display[]", + 'type' => 'checkbox', + 'value' => $meta, + 'compare' => ( ( 'y' == $field[4] ) ? $meta : false ) + ) ) : ''; + $item['req'] = ( 'user_email' != $meta && 'username' != $meta ) ? wpmem_form_field( array( + 'name' => "wpmem_fields_required[]", + 'type' => 'checkbox', + 'value' => $meta, + 'compare' => ( ( 'y' == $field[5] ) ? $meta : false ) + ) ) : ''; + $item['profile'] = ( 'user_email' != $meta && 'username' != $meta && 'password' != $meta && 'confirm_password' != $meta ) ? wpmem_form_field( array( + 'name' => "wpmem_fields_profile[]", + 'type' => "checkbox", + 'value' => $meta, + 'compare' => ( ( 'y' == $profile ) ? $meta : false ) + ) ) : ''; + $item['userscrn'] = ( ! in_array( $meta, $wpmem_ut_fields_skip ) ) ? wpmem_form_field( array( + 'name' => "wpmem_fields_uscreen[]", + 'type' => 'checkbox', + 'value' => $meta, + 'compare' => ( ( $ut_checked == $meta ) ? $ut_checked : false ) + ) ) : ''; + $item['usearch'] = ( ! in_array( $meta, $wpmem_us_fields_skip ) ) ? wpmem_form_field( array( + 'name' => "wpmem_fields_usearch[]", + 'type' => 'checkbox', + 'value' => $meta, + 'compare' => ( ( $us_checked == $meta ) ? $us_checked : false ) + ) ) : ''; + + /* + if ( wpmem_is_woo_active() ) { + if ( wpmem_is_enabled( 'woo/add_checkout_fields' ) ) { + $item['wcchkout'] = ( ! in_array( $meta, $wpmem_ut_fields_skip ) && ! in_array( $meta, $wpmem_wc_checkout_skip ) ) ? wpmem_form_field( array( + 'name' => "wpmem_fields_wcchkout[]", + 'type' => 'checkbox', + 'value' => $meta, + 'compare' => ( ( isset( $field['wcchkout'] ) && 'y' == $field['wcchkout'] ) ? $meta : false ) + ) ) : ''; + } + if ( wpmem_is_enabled( 'woo/add_my_account_fields' ) ) { + $item['wcaccount'] = ( ! in_array( $meta, $wpmem_ut_fields_skip ) && ! in_array( $meta, $wpmem_wc_checkout_skip ) ) ? wpmem_form_field( array( + 'name' => "wpmem_fields_wcaccount[]", + 'type' => 'checkbox', + 'value' => $meta, + 'compare' => ( ( isset( $field['wcaccount'] ) && 'y' == $field['wcaccount'] ) ? $meta : false ) + ) ) : ''; + } + if ( wpmem_is_enabled( 'woo/add_update_fields' ) ) { + $item['wcupdate'] = ( ! in_array( $meta, $wpmem_ut_fields_skip ) && ! in_array( $meta, $wpmem_wc_checkout_skip ) ) ? wpmem_form_field( array( + 'name' => "wpmem_fields_wcupdate[]", + 'type' => 'checkbox', + 'value' => $meta, + 'compare' => ( ( isset( $field['wcupdate'] ) && 'y' == $field['wcupdate'] ) ? $meta : false ) + ) ) : ''; + } + } + */ + + $item['edit'] = ''; + + $field_items[] = $item; + } + } + + $extra_user_screen_items = array( + 'user_registered' => __( 'Registration Date', 'wp-members' ), + '_wpmem_user_confirmed' => __( 'Confirmed', 'wp-members' ), + 'active' => __( 'Activated', 'wp-members' ), + 'wpmem_reg_ip' => __( 'Registration IP', 'wp-members' ), + 'exp_type' => __( 'Subscription Type', 'wp-members' ), + 'expires' => __( 'Expires', 'wp-members' ), + 'user_id' => __( 'User ID', 'wp-members' ), + ); + + foreach ( $extra_user_screen_items as $key => $item ) { + $ut_checked = ( ( $wpmem_ut_fields ) && ( in_array( $item, $wpmem_ut_fields ) ) ) ? $item : ''; + if ( 'user_id' == $key + || 'user_registered' == $key + || 'wpmem_reg_ip' == $key + || ( '_wpmem_user_confirmed' == $key && 1 == $wpmem->act_link ) + || ( 'active' == $key && 1 == $wpmem->mod_reg ) + || defined( 'WPMEM_EXP_MODULE' ) && $wpmem->use_exp == 1 && ( 'exp_type' == $key || 'expires' == $key ) ) { + $user_screen_items[ $key ] = array( 'label' => __( $item, 'wp-members' ), 'meta' => $key, + 'userscrn' => wpmem_form_field( "ut_fields[{$key}]", 'checkbox', $item, $ut_checked ), + ); + } + } + + foreach ( $user_screen_items as $screen_item ) { + $field_items[] = array( + 'label' => $screen_item['label'], + 'meta' => $screen_item['meta'], + 'type' => '', + 'display' => '', + 'req' => '', + 'profile' => '', + 'userscrn' => $screen_item['userscrn'], + 'usearch' => '', + 'edit' => '', + 'sort' => '', + ); + } + + $table = new WP_Members_Fields_Table(); + + $heading = __( 'Manage Fields', 'wp-members' ); + //$description = __( 'Displaying fields for:', 'wp-members' ); + //$which_form = $wpmem->form_tags[ $wpmem->admin->current_form ]; + + echo '
    '; + printf( '

    %s

    ', $heading ); + //printf( '

    %s %s

    ', $description, $which_form ); + printf( '
    ', wpmem_admin_form_post_url() ); + + $table->items = $field_items; + $table->prepare_items(); + $table->display(); + echo '
    '; + echo '
    '; + } + + /** + * Javascript to ID the fields table and add curser style to rows. + * + * @since 3.1.8 + * @since 3.3.0 Changed from wpmem_bulk_fields_actions() to bulk_actions(). + */ + + public static function bulk_actions() { + if ( 'wpmem-settings' == wpmem_get( 'page', false, 'get' ) && 'fields' == wpmem_get( 'tab', false, 'get' ) ) { + ?> $item ) { + $ut_fields_arr[ sanitize_text_field( $key ) ] = sanitize_text_field( $item ); + } + update_option( 'wpmembers_utfields', $ut_fields_arr ); + + // Update user search fields. + $arr = ( isset( $_POST['us_fields'] ) ) ? $_POST['us_fields'] : array(); + $us_fields_arr = array(); + foreach ( $arr as $key => $item ) { + $us_fields_arr[ sanitize_text_field( $key ) ] = sanitize_text_field( $item ); + } + update_option( 'wpmembers_usfields', $us_fields_arr ); + + // Update display/required settings + foreach ( $wpmem_fields as $key => $field ) { + + // What is the field? + $meta_key = $field[2]; + + // Main settings (display, required, profile). + if ( 'username' == $meta_key || 'user_email' == $meta_key ) { + $wpmem_fields[ $key ][4] = 'y'; + $wpmem_fields[ $key ][5] = 'y'; + $wpmem_fields[ $key ]['profile'] = ( 'username' == $meta_key ) ? false : true; + } else { + $wpmem_fields[ $key ][4] = ( wpmem_get( $meta_key . "_display" ) ) ? 'y' : ''; + $wpmem_fields[ $key ][5] = ( wpmem_get( $meta_key . "_required" ) ) ? 'y' : ''; + $wpmem_fields[ $key ]['profile'] = ( wpmem_get( $meta_key . '_profile' ) ) ? true : false; + } + } + + // Save updates. + update_option( 'wpmembers_fields', $wpmem_fields ); + $wpmem->forms->load_fields(); + + // Set update message. + $did_update = __( 'WP-Members fields were updated', 'wp-members' ); + + // Return. + return $did_update; + + } elseif ( 'delete' == $action ) { + + // Check nonce. + check_admin_referer( 'bulk-settings_page_wpmem-settings' ); + + $delete_action = 'delete'; + + } elseif ( ( 'add_field' == wpmem_get( 'wpmem_admin_a' ) || 'edit_field' == wpmem_get( 'wpmem_admin_a' ) ) && check_admin_referer( 'wpmem_add_field' ) ) { + + // Set action. + $action = sanitize_text_field( wpmem_get( 'wpmem_admin_a' ) ); + + global $add_field_err_msg; + + $add_field_err_msg = false; + $add_name = sanitize_text_field( wpmem_get( 'add_name' ) ); + $add_option = sanitize_text_field( wpmem_get( 'add_option' ) ); + + // Error check that field label and option name are included and unique. + $add_field_err_msg = ( ! $add_name ) ? __( 'Field Label is required. Nothing was updated.', 'wp-members' ) : $add_field_err_msg; + $add_field_err_msg = ( ! $add_option ) ? __( 'Meta Key is required. Nothing was updated.', 'wp-members' ) : $add_field_err_msg; + + $add_field_err_msg = ( ! preg_match("/^[A-Za-z0-9_]*$/", $add_option ) ) ? __( 'Meta Key must contain only letters, numbers, and underscores', 'wp-members' ) : $add_field_err_msg; + + // Check for duplicate field names. + $chk_fields = array(); + foreach ( $wpmem_fields as $field ) { + $chk_fields[] = $field[2]; + } + $add_field_err_msg = ( in_array( $add_option, $chk_fields ) ) ? __( 'A field with that meta key already exists', 'wp-members' ) : $add_field_err_msg; + + // Error check for reserved terms. + $reserved_terms = wpmem_wp_reserved_terms(); + if ( in_array( strtolower( $add_option ), $reserved_terms ) ) { + $add_field_err_msg = sprintf( __( 'Sorry, "%s" is a reserved term. Field was not added.', 'wp-members' ), $add_option ); + } + + // Error check option name for spaces and replace with underscores. + $us_option = preg_replace( "/ /", '_', $add_option ); + + $arr = array(); + + $type = sanitize_text_field( wpmem_get( 'add_type' ) ); + + $arr[0] = filter_var( wpmem_get( 'add_order_id' ), FILTER_SANITIZE_NUMBER_INT ); + $arr[1] = sanitize_text_field( stripslashes( wpmem_get( 'add_name' ) ) ); + $arr[2] = $us_option; + $arr[3] = $type; + $arr[4] = ( 'y' == wpmem_get( 'add_display', 'n' ) ) ? 'y' : 'n'; + $arr[5] = ( 'y' == wpmem_get( 'add_required', 'n' ) ) ? 'y' : 'n'; + + // Mark native fields: + $native_fields = array( 'user_login', 'user_pass', 'user_nicename', 'user_email', 'user_url', 'user_registered', 'display_name', 'first_name', 'last_name', 'nickname', 'description' ); + $arr[6] = ( in_array( $us_option, $native_fields ) ) ? 'y' : 'n'; + + if ( 'text' == $type || 'email' == $type || 'textarea' == $type || 'password' == $type || 'url' == $type || 'number' == $type || 'date' == $type || 'timestamp' == $type ) { + $arr['placeholder'] = sanitize_text_field( stripslashes( wpmem_get( 'add_placeholder' ) ) ); + } + + if ( 'text' == $type || 'email' == $type || 'password' == $type || 'url' == $type || 'number' == $type || 'date' == $type || 'timestamp' == $type ) { + $arr['pattern'] = sanitize_text_field( stripslashes( wpmem_get( 'add_pattern' ) ) ); + $arr['title'] = sanitize_text_field( stripslashes( wpmem_get( 'add_title' ) ) ); + } + + if ( 'number' == $type || 'date' == $type ) { + $arr['min'] = filter_var( wpmem_get( 'add_min' ), FILTER_SANITIZE_NUMBER_INT ); + $arr['max'] = filter_var( wpmem_get( 'add_max' ), FILTER_SANITIZE_NUMBER_INT ); + } + + if ( 'textarea' == $type ) { + $arr['rows'] = filter_var( wpmem_get( 'add_rows' ), FILTER_SANITIZE_NUMBER_INT ); + $arr['cols'] = filter_var( wpmem_get( 'add_cols' ), FILTER_SANITIZE_NUMBER_INT ); + } + + if ( $type == 'checkbox' ) { + $add_field_err_msg = ( ! $_POST['add_checked_value'] ) ? __( 'Checked value is required for checkboxes. Nothing was updated.', 'wp-members' ) : $add_field_err_msg; + $arr[7] = sanitize_text_field( wpmem_get( 'add_checked_value', false ) ); + $arr[8] = ( 'y' == wpmem_get( 'add_checked_default', 'n' ) ) ? 'y' : 'n'; + $arr['checkbox_label'] = intval( wpmem_get( 'add_checkbox_label', 0 ) ); + } + + if ( $type == 'select' + || $type == 'multiselect' + || $type == 'radio' + || $type == 'multicheckbox' + ) { + // Get the values. + $str = stripslashes( sanitize_textarea_field( $_POST['add_dropdown_value'] ) ); + // Remove linebreaks. + $str = trim( str_replace( array("\r", "\r\n", "\n"), '', $str ) ); + // Create array. + if ( ! function_exists( 'str_getcsv' ) ) { + $arr[7] = explode( ',', $str ); + } else { + $arr[7] = str_getcsv( $str, ',', '"' ); + } + // If multiselect or multicheckbox, set delimiter. + if ( 'multiselect' == $type || 'multicheckbox' == $type ) { + $arr[8] = ( ',' === wpmem_get( 'add_delimiter_value', '|' ) ) ? ',' : '|'; + } + } + + if ( $type == 'file' || $type == 'image' ) { + $arr[7] = sanitize_text_field( stripslashes( $_POST['add_file_value'] ) ); + } + + if ( wpmem_get( 'add_type' ) == 'hidden' ) { + $add_field_err_msg = ( ! $_POST['add_hidden_value'] ) ? __( 'A value is required for hidden fields. Nothing was updated.', 'wp-members' ) : $add_field_err_msg; + $arr[7] = ( isset( $_POST['add_hidden_value'] ) ) ? sanitize_text_field( stripslashes( $_POST['add_hidden_value'] ) ) : ''; + } + + if ( 'timestamp' == wpmem_get( 'add_type' ) ) { + $arr['timestamp_display'] = sanitize_text_field( wpmem_get( 'add_timestamp_display', 'Y-m-d', 'post' ) ); + } + + if ( $action == 'add_field' ) { + if ( ! $add_field_err_msg ) { + array_push( $wpmem_fields, $arr ); + $did_update = sprintf( __( '%s was added', 'wp-members' ), esc_html( $_POST['add_name'] ) ); + } else { + $did_update = $add_field_err_msg; + } + } else { + for ( $row = 0; $row < count( $wpmem_fields ); $row++ ) { + if ( $wpmem_fields[ $row ][2] == wpmem_get( 'field', false, 'get' ) ) { + $arr[0] = $wpmem_fields[ $row ][0]; + foreach ( $arr as $key => $value ) { + $wpmem_fields[ $row ][ $key ] = $arr[ $key ]; + } + } + } + $did_update = sprintf( __( '%s was updated', 'wp-members' ), esc_html( stripslashes( $add_name ) ) ); + $did_update.= '

    « ' . __( 'Return to Fields Table', 'wp-members' ) . '

    '; + } + + $wpmem_newfields = $wpmem_fields; + + update_option( 'wpmembers_fields', $wpmem_newfields ); + $wpmem->forms->load_fields(); + return $did_update; + } + } + } + + /** + * Reorders form fields. + * + * @since 2.5.1 + * @since 3.1.8 Rebuilt for new List Table. + * @since 3.3.0 Merged do_field_reorder() and field_reorder(). + */ + public static function do_field_reorder() { + + // Start fresh. + $new_order = $wpmem_fields = $field = $key = $wpmem_new_fields = $id = $k = ''; + $wpmem_fields = get_option( 'wpmembers_fields' ); + + // Get the list items + $new_order = $_POST; + + // Put fields in the proper order for the current form. + $wpmem_new_fields = array(); + foreach ( $new_order['list_items'] as $id ) { + foreach( $wpmem_fields as $val ) { + if ( $val[0] == $id ) { + $wpmem_new_fields[] = $val; + } + } + } + + // Save fields array with new current form field order. + update_option( 'wpmembers_fields', $wpmem_new_fields ); + + // Indicate successful transaction. + _e( 'Form field order updated.', 'wp-members' ); + + die(); // This is required to return a proper result. + + } +} +// End of file. \ No newline at end of file diff --git a/includes/admin/tabs/class-wp-members-admin-tab-options.php b/includes/admin/tabs/class-wp-members-admin-tab-options.php new file mode 100644 index 00000000..99157961 --- /dev/null +++ b/includes/admin/tabs/class-wp-members-admin-tab-options.php @@ -0,0 +1,709 @@ +', '', '', '' ); + $help_link = sprintf( __( 'See the %sUsers Guide on plugin options%s.', 'wp-members' ), '', '' ); + + // Build an array of post types + $post_types = $wpmem->admin->post_types(); + $post_arr = array( + 'post' => __( 'Posts' ), + 'page' => __( 'Pages' ), + ); + if ( $post_types ) { + foreach ( $post_types as $post_type ) { + $cpt_obj = get_post_type_object( $post_type ); + $post_arr[ $cpt_obj->name ] = $cpt_obj->labels->name; + } + } ?> + +
    + +
    + + +
    +

    +
    +

    +

    +
    +
    + +
    + +
    +
    +
    +

    +
    +
    + +

    +
      + $val ) { + if ( $key == 'post' || $key == 'page' || ( isset( $wpmem->post_types ) && array_key_exists( $key, $wpmem->post_types ) ) ) { + ?> + > + + block[ $key ] ) ) ? $wpmem->block[ $key ] : ''; + $values = array( + __( 'Do not restrict', 'wp-members' ) . '|0', + __( 'Restrict', 'wp-members' ) . '|1', + // @todo Future development. __( 'Hide', 'wp-members' ) . '|2', + ); + echo wpmem_form_field( 'wpmem_block_' . $key, 'select', $values, $block ); ?> + + + __( 'Show Excerpts', 'wp-members' ), + 'show_login' => __( 'Show Login Form', 'wp-members' ), + 'show_reg' => __( 'Show Registration Form', 'wp-members' ), + 'autoex' => __( 'Auto Excerpt:', 'wp-members' ), + ); + + foreach ( $option_group_array as $item_key => $item_val ) { + $i = 0; + $len = count( $post_arr ); + foreach ( $post_arr as $key => $val ) { + if ( $key == 'post' || $key == 'page' || ( isset( $wpmem->post_types ) && array_key_exists( $key, $wpmem->post_types ) ) ) { + ?> + > + + {$item_key}[ $key ] ) && $wpmem->{$item_key}[ $key ]['enabled'] == 1 ) { + $setting = 1; + $ex_len = $wpmem->{$item_key}[ $key ]['length']; + $ex_text = ( isset( $wpmem->{$item_key}[ $key ]['text'] ) ) ? $wpmem->{$item_key}[ $key ]['text'] : ''; + } else { + $setting = 0; + $ex_len = ''; + $ex_text = ''; + } + echo wpmem_form_field( 'wpmem_' . $item_key . '_' . $key, 'checkbox', '1', $setting ); ?>      +      + + {$item_key}[ $key ] ) ) ? $wpmem->{$item_key}[ $key ] : 0; + echo wpmem_form_field( 'wpmem_' . $item_key . '_' . $key, 'checkbox', '1', $setting ); ?> + + + +
    + +

    +
      +
    • + + {$row[3]} ); ?>   + +
    • +
    +

    + '; + $reset_link_end = ''; + $rows = array( + //array(__('Password Reset Link', 'wp-members'),'wpmem_settings_pwd_link',__('Send password reset link instead of new password. (Requires additional configuration)','wp-members'),'pwd_link'), + array(__('Legacy Password Reset', 'wp-members'),'wpmem_settings_pwd_link',sprintf(__('Use legacy password reset. %s(Requires additional configuration)%s','wp-members'),$reset_link_start,$reset_link_end),'pwd_link'), + //array(__('Enable WP Login Error', 'wp-members' ),'wpmem_settings_login_error',__('Use WP login error object instead of WP-Members default login error','wp-members'),'login_error'), + array(__('Legacy Login Error', 'wp-members' ),'wpmem_settings_login_error',__('Use legacy WP-Members login error instead of WP error object.','wp-members'),'login_error'), + array(__('Notifications & Diagnostics', 'wp-members' ),'wpmem_settings_optin',__('Opt in to security and updates notifications and non-sensitive diagnostics tracking', 'wp-members'),'optin'), + ); + ?>
      $row ) { ?> +
    • + + woo->{$row[3]} : $wpmem->{$row[3]}; ?> +    +    + + +
    • + +
    + + +

    + +
      $row ) { ?> +
    • + + woo->{$row[3]} ) ) ? $wpmem->woo->{$row[3]} : 0; + echo wpmem_form_field( $row[1], 'checkbox', '1', $checkbox_value ); + ?>   + +
    • + +
    + + +

    +
      + dropin_dir ); + $mem_link_start = ''; + $mem_link_end = ''; + $conf_link_start = ''; + $conf_link_end = ''; + $rows = array( + array(__('Enable memberships', 'wp-members'),'wpmem_settings_products',sprintf(__('Enables creation of different %s membership products %s','wp-members'),$mem_link_start,$mem_link_end),'enable_products'), + array(__('Clone menus','wp-members'),'wpmem_settings_menus',__('Enables logged in menus','wp-members'),'clone_menus'), + array(__('Notify admin','wp-members'),'wpmem_settings_notify',sprintf(__('Notify %s for each new registration? %s','wp-members'),$admin_email,$chg_email),'notify'), + array(__('Moderate registration','wp-members'),'wpmem_settings_moderate',__('Holds new registrations for admin approval','wp-members'),'mod_reg'), + array(__('Confirmation Link', 'wp-members'),'wpmem_settings_act_link',sprintf(__('Send email confirmation link on new registration. %s(Requires additional configuration)%s','wp-members'),$conf_link_start,$conf_link_end),'act_link'), + array(__('Ignore warning messages','wp-members'),'wpmem_settings_ignore_warnings',__('Ignores WP-Members warning messages in the admin panel','wp-members'),'warnings'), + //array(__('Enable dropins', 'wp-members'),'wpmem_settings_enable_dropins',sprintf(__('Enables dropins in %s', 'wp-members'), $dropin_dir),'dropins'), + ); + foreach ( $rows as $row ) { + if ( $row[0] == __('Clone menus','wp-members') && 1 != $wpmem->clone_menus ) { + continue; + }?> +
    • + + {$row[3]} ); ?>   + +
    • + +
    • + + attrib ); ?>   + +
    • +
    • + + captcha ) { + $wpmem->captcha = 3; // reCAPTCHA v1 is fully obsolete. Change it to v2. + } + $captcha[] = __( 'reCAPTCHA v2', 'wp-members' ) . '|3'; + $captcha[] = __( 'reCAPTCHA v3', 'wp-members' ) . '|4'; + $captcha[] = __( 'Really Simple CAPTCHA', 'wp-members' ) . '|2'; + $captcha[] = __( 'hCaptcha', 'wp-members' ) . '|5'; + echo wpmem_form_field( 'wpmem_settings_captcha', 'select', $captcha, $wpmem->captcha ); ?> +
    • +

      + array( + 'url' => $wpmem->user_pages['login'], + 'label' => __( 'Login Page:', 'wp-members' ), + 'description' => __( 'Specify a login page (optional)', 'wp-members' ), + ), + 'reg' => array( + 'url' => $wpmem->user_pages['register'], + 'label' => __( 'Register Page:', 'wp-members' ), + 'description' => __( 'For creating a register link in the login form', 'wp-members' ), + ), + 'ms' => array( + 'url' => $wpmem->user_pages['profile'], + 'label' => __( 'User Profile Page:', 'wp-members' ), + 'description' => __( 'For creating a forgot password link in the login form', 'wp-members' ), + ), + ); + foreach ( $user_pages as $key => $setting ) { ?> +
    • + +  
      +
      + + +
      +
    • +

      +
    • + + +
    • + cssurl; ?> +
      +
    • + + +
    • +
      + + +
    +
    +

    If you like WP-Members please give it a ★★★★★ rating. Thanks!!

    +
    +
    + +
    +

    +
    +
    + + + + + + + + + + + + + +
    $val ) { + if ( 'post' != $key && 'page' != $key && 'wpmem_product' != $key ) { + $checked = ( isset( $wpmem->post_types ) && array_key_exists( $key, $wpmem->post_types ) ) ? ' checked' : ''; + echo '
    '; + } + } + ?>
    +
    +
    +
    +
    + +
    +
    +
    +
    +

    +

    +
    +	
    +	
    + +
    + true, '_builtin' => false ), 'names', 'and' ); + if ( $post_types ) { + foreach ( $post_types as $post_type ) { + $cpt_obj = get_post_type_object( $post_type ); + if ( $cpt_obj->labels->name != 'wpmem_product' ) { + $post_arr[ $cpt_obj->name ] = $cpt_obj->labels->name; + } + } + } + + $post_vals = ( isset( $_POST['wpmembers_handle_cpts'] ) ) ? $_POST['wpmembers_handle_cpts'] : false; + if ( $post_vals ) { + foreach ( $post_vals as $val ) { + $cpts[ $val ] = sanitize_text_field( $post_arr[ $val ] ); + } + } else { + $cpts = array(); + } + $wpmem_newsettings['post_types'] = $cpts; + + // Update settings, remove or add CPTs. + $chk_settings = array( 'block', 'show_excerpt', 'show_login', 'show_reg', 'autoex' ); + foreach ( $chk_settings as $chk ) { + // Handle removing unmanaged CPTs. + foreach ( $wpmem_newsettings[ $chk ] as $key => $val ) { + if ( 'post' != $key && 'page' != $key ) { + // If the $key is not in managed CPTs, remove it. + if ( ! array_key_exists( $key, $cpts ) ) { + unset( $wpmem_newsettings[ $chk ][ $key ] ); + } + } + } + // Handle adding managed CPTs. + foreach ( $cpts as $key => $val ) { + if ( ! array_key_exists( $key, $wpmem_newsettings[ $chk ] ) ) { + if ( 'autoex' == $chk ) { + // Auto excerpt is an array. + $wpmem_newsettings[ $chk ][ $key ] = array( + 'enabled' => 0, + 'length' => '', + ); + } else { + // All other settings are 0|1. + $wpmem_newsettings[ $chk ][ $key ] = 0; + } + } + } + } + + WP_Members_Admin_Tab_Options::save_settings( $wpmem_newsettings ); + + return __( 'Custom Post Type settings were updated', 'wp-members' ); + + } else { + + global $wpmem; + + // Check nonce. + check_admin_referer( 'wpmem-update-settings' ); + + $wpmem_settings_msurl = ( $_POST['wpmem_settings_mspage'] == 'use_custom' ) ? esc_url( $_POST['wpmem_settings_msurl'] ) : ''; + $wpmem_settings_mspage = ( $_POST['wpmem_settings_mspage'] == 'use_custom' ) ? '' : wpmem_sanitize_field( $_POST['wpmem_settings_mspage'], 'int' ); + if ( $wpmem_settings_msurl != '' && $wpmem_settings_msurl != 'use_custom' && ! $wpmem_settings_mspage ) { + $msurl = trim( $wpmem_settings_msurl ); + } else { + $msurl = $wpmem_settings_mspage; + } + + $wpmem_settings_regurl = ( $_POST['wpmem_settings_regpage'] == 'use_custom' ) ? esc_url( $_POST['wpmem_settings_regurl'] ) : ''; + $wpmem_settings_regpage = ( $_POST['wpmem_settings_regpage'] == 'use_custom' ) ? '' : wpmem_sanitize_field( $_POST['wpmem_settings_regpage'], 'int' ); + if ( $wpmem_settings_regurl != '' && $wpmem_settings_regurl != 'use_custom' && ! $wpmem_settings_regpage ) { + $regurl = trim( $wpmem_settings_regurl ); + } else { + $regurl = $wpmem_settings_regpage; + } + + $wpmem_settings_logurl = ( $_POST['wpmem_settings_logpage'] == 'use_custom' ) ? esc_url( $_POST['wpmem_settings_logurl'] ) : ''; + $wpmem_settings_logpage = ( $_POST['wpmem_settings_logpage'] == 'use_custom' ) ? '' : wpmem_sanitize_field( $_POST['wpmem_settings_logpage'], 'int' ); + if ( '' != $wpmem_settings_logurl && 'use_custom' != $wpmem_settings_logurl && ! $wpmem_settings_logpage ) { + $logurl = trim( $wpmem_settings_logurl ); + } else { + $logurl = $wpmem_settings_logpage; + } + + $wpmem_settings_cssurl = esc_url( $_POST['wpmem_settings_cssurl'] ); + $cssurl = ( '' != $wpmem_settings_cssurl ) ? trim( $wpmem_settings_cssurl ) : ''; + + $wpmem_settings_style = ( isset( $_POST['wpmem_settings_style'] ) ) ? sanitize_text_field( $_POST['wpmem_settings_style'] ) : false; + + $wpmem_newsettings = array( + 'version' => $wpmem->version, + 'db_version' => $wpmem->db_version, + 'act_link' => wpmem_sanitize_field( wpmem_get( 'wpmem_settings_act_link', 0 ), 'int' ), + 'pwd_link' => wpmem_sanitize_field( wpmem_get( 'wpmem_settings_pwd_link', 1 ), 'int' ), + 'login_error' => wpmem_sanitize_field( wpmem_get( 'wpmem_settings_login_error', 1 ), 'int' ), + 'enable_products' => wpmem_sanitize_field( wpmem_get( 'wpmem_settings_products', 0 ), 'int' ), + 'clone_menus' => wpmem_sanitize_field( wpmem_get( 'wpmem_settings_menus', 0 ), 'int' ), + 'notify' => wpmem_sanitize_field( wpmem_get( 'wpmem_settings_notify', 0 ), 'int' ), + 'mod_reg' => wpmem_sanitize_field( wpmem_get( 'wpmem_settings_moderate', 0 ), 'int' ), + 'captcha' => wpmem_sanitize_field( wpmem_get( 'wpmem_settings_captcha', 0 ), 'int' ), + 'use_exp' => wpmem_sanitize_field( wpmem_get( 'wpmem_settings_time_exp', 0 ), 'int' ), + 'use_trial' => wpmem_sanitize_field( wpmem_get( 'wpmem_settings_trial', 0 ), 'int' ), + 'warnings' => wpmem_sanitize_field( wpmem_get( 'wpmem_settings_ignore_warnings', 0 ), 'int' ), + 'dropins' => wpmem_sanitize_field( wpmem_get( 'wpmem_settings_enable_dropins', 0 ), 'int' ), + 'user_pages' => array( + 'profile' => ( $msurl ) ? $msurl : '', + 'register' => ( $regurl ) ? $regurl : '', + 'login' => ( $logurl ) ? $logurl : '', + ), + 'woo' => array( + 'add_checkout_fields' => wpmem_sanitize_field( wpmem_get( 'wpmem_settings_add_woo_checkout_fields', 0 ), 'int' ), + 'add_my_account_fields' => wpmem_sanitize_field( wpmem_get( 'wpmem_settings_add_woo_my_account_fields', 0 ), 'int' ), + 'add_update_fields' => wpmem_sanitize_field( wpmem_get( 'wpmem_settings_add_woo_update_fields', 0 ), 'int' ), + 'product_restrict' => wpmem_sanitize_field( wpmem_get( 'wpmem_settings_add_restrict_woo_products', 0 ), 'int' ), + ), + 'cssurl' => ( $cssurl ) ? $cssurl : '', + 'select_style' => $wpmem_settings_style, + 'attrib' => wpmem_sanitize_field( wpmem_get( 'attribution', 0 ), 'int' ), + ); + + // Build an array of post types + $post_arr = array( 'post', 'page' ); + if ( isset( $wpmem->post_types ) ) { + $wpmem_newsettings['post_types'] = $wpmem->post_types; + foreach ( $wpmem_newsettings['post_types'] as $key => $val ) { + $post_arr[] = $key; + } + } + + // If activation link is being enabled, make sure current admin is marked as activated. + if ( 1 == $wpmem_newsettings['act_link'] && 0 == $wpmem->act_link ) { + update_user_meta( get_current_user_id(), '_wpmem_user_confirmed', time() ); + } + + // Leave form tag settings alone. + if ( isset( $wpmem->form_tags ) ) { + $wpmem_newsettings['form_tags'] = $wpmem->form_tags; + } + + // Get settings for blocking, excerpts, show login, and show registration for posts, pages, and custom post types. + $option_group_array = array( 'block', 'show_excerpt', 'show_login', 'show_reg', 'autoex' ); + foreach ( $option_group_array as $option_group_item ) { + $arr = array(); + foreach ( $post_arr as $post_type ) { + $post_var = 'wpmem_' . $option_group_item . '_' . $post_type; + if ( $option_group_item == 'autoex' ) { + // Auto excerpt is an array. + $arr[ $post_type ]['enabled'] = ( isset( $_POST[ $post_var ] ) ) ? wpmem_sanitize_field( $_POST[ $post_var ], 'int' ) : 0; + $arr[ $post_type ]['length'] = ( isset( $_POST[ $post_var . '_len' ] ) ) ? ( ( $_POST[ $post_var . '_len' ] == '' ) ? 0 : wpmem_sanitize_field( $_POST[ $post_var . '_len' ], 'int' ) ) : ''; + $arr[ $post_type ]['text'] = ( isset( $_POST[ $post_var . '_text' ] ) ) ? sanitize_text_field( $_POST[ $post_var . '_text' ] ) : ''; + } else { + // All other settings are 0|1. + $arr[ $post_type ] = ( isset( $_POST[ $post_var ] ) ) ? wpmem_sanitize_field( $_POST[ $post_var ], 'int' ) : 0; + } + } + $wpmem_newsettings[ $option_group_item ] = $arr; + } + + /* + * If we are setting registration to be moderated, + * check to see if the current admin has been + * activated so they don't accidentally lock themselves + * out later. + */ + if ( isset( $_POST['wpmem_settings_moderate'] ) == 1 ) { + update_user_meta( get_current_user_id(), 'active', 1 ); + } + + if ( isset( $_POST['wpmem_settings_act_link'] ) == 1 ) { + update_user_meta( get_current_user_id(), '_wpmem_activation_confirm', time() ); + } + + WP_Members_Admin_Tab_Options::save_settings( $wpmem_newsettings ); + + return __( 'WP-Members settings were updated', 'wp-members' ); + } + } + + /** + * Puts new settings into the current object. + * + * @since 3.0.9 + * @since 3.3.0 Ported from wpmem_admin_new_settings(). + * + * @global $wpmem + * @param $new + * @return $settings + */ + static function save_settings( $new ) { + + // Update saved settings. + update_option( 'wpmembers_settings', $new ); + + // Update the current WP_Members object with the new settings. + global $wpmem; + foreach ( $new as $key => $val ) { + if ( 'user_pages' == $key ) { + foreach ( $val as $subkey => $subval ) { + $val[ $subkey ] = ( is_numeric( $subval ) ) ? get_page_link( $subval ) : $subval; + } + } + $wpmem->{$key} = $val; + } + + if ( isset( $_POST['wpmem_settings_optin'] ) && 0 == $wpmem->optin ) { + update_option( 'wpmembers_optin', 1 ); + $wpmem->optin = 1; + } elseif ( ! isset( $_POST['wpmem_settings_optin'] ) && 1 == $wpmem->optin ) { + update_option( 'wpmembers_optin', 0 ); + $wpmem->optin = 0; + } + } + + /** + * Create the stylesheet dropdown selection. + * + * @since 2.8.0 + * @since 3.3.0 Ported from wpmem_admin_style_list(). + * + * @param $style string The stored stylesheet setting. + */ + static function style_list( $style ) { + + $list = array( + 'No Float' => 'generic-no-float', + 'Rigid' => 'generic-rigid', + 'Twenty Sixteen - no float' => 'wp-members-2016-no-float', + 'Twenty Fifteen' => 'wp-members-2015', + 'Twenty Fifteen - no float' => 'wp-members-2015-no-float', + 'Twenty Fourteen' => 'wp-members-2014', + 'Twenty Fourteen - no float' => 'wp-members-2014-no-float', + //'Twenty Thirteen' => WPMEM_DIR . 'css/wp-members-2013.css', + //'Twenty Twelve' => WPMEM_DIR . 'css/wp-members-2012.css', + //'Twenty Eleven' => WPMEM_DIR . 'css/wp-members-2011.css', + //'Twenty Ten' => WPMEM_DIR . 'css/wp-members.css', + //'Kubrick' => WPMEM_DIR . 'css/wp-members-kubrick.css', + ); + + /** + * Filters the list of stylesheets in the plugin options dropdown. + * + * @since 2.8.0 + * @deprecated 3.3.0 There is no way to manage custom values in the dropdown with the new setting rules. + * + * @param array $list An array of stylesheets that can be applied to the plugin's forms. + */ + //$list = apply_filters( 'wpmem_admin_style_list', $list ); + + $selected = false; + foreach ( $list as $name => $location ) { + $selected = ( $location == $style ) ? true : $selected; + echo '\n"; + } + $selected = ( ! $selected ) ? ' selected' : ''; + echo ''; + + return; + } + + /** + * Create a dropdown selection of pages. + * + * @since 2.8.1 + * @since 3.3.0 Ported from wpmem_admin_page_list(). + * + * @todo Consider wp_dropdown_pages. Can be retrieved as HTML (echo=false) and str_replaced to add custom values. + * + * @param string $val + */ + static function page_list( $val, $show_custom_url = true ) { + + $selected = ( '' == $val ) ? 'select a page' : false; + $pages = get_pages(); + + echo ''; + + foreach ( $pages as $page ) { + $selected = ( get_page_link( $page->ID ) == $val ) ? true : $selected; //echo "VAL: " . $val . ' PAGE LINK: ' . get_page_link( $page->ID ); + $option = ''; + echo $option; + } + if ( $show_custom_url ) { + $selected = ( ! $selected ) ? ' selected' : ''; + echo ''; + } + } + +} // End of file. \ No newline at end of file diff --git a/includes/admin/tabs/class-wp-members-dropins-table.php b/includes/admin/tabs/class-wp-members-dropins-table.php new file mode 100644 index 00000000..c9a86f35 --- /dev/null +++ b/includes/admin/tabs/class-wp-members-dropins-table.php @@ -0,0 +1,193 @@ + 'dropin', + 'plural' => 'dropins', + 'ajax' => false, + ) ); + + $this->dropins = get_option( 'wpmembers_dropins', array() ); //print_r( $this->dropins ); + } + + /** + * Checkbox at start of row. + * + * @since 3.1.9 + * + * @param $item + * @return string The checkbox. + */ + function column_cb( $item ) { + global $wpmem; + $checked = checked( true, in_array( $item['dropin_file'], $wpmem->dropins_enabled ), false ); + //return sprintf( '', $item['dropin_file'], __( 'delete', 'wp-members' ) ); + return sprintf( '', $this->_args['singular'], $item['dropin_file'], $checked ); + } + + /** + * Returns table columns. + * + * @since 3.1.9 + * + * @return array + */ + function get_columns() { + return array( + 'cb' => '', + 'dropin_name' => __( 'Name', 'wp-members' ), + 'dropin_enabled' => __( 'Enabled', 'wp-members' ), + 'dropin_file' => __( 'File', 'wp-members' ), + 'dropin_version' => __( 'Version', 'wp-members' ), + 'dropin_description' => __( 'Description', 'wp-members' ), + ); + } + + /** + * Set up table columns. + * + * @since 3.1.9 + */ + function prepare_items() { + $columns = $this->get_columns(); + $hidden = array(); + $sortable = array(); + $this->_column_headers = array( $columns, $hidden, $sortable ); + $this->process_bulk_action(); + } + + /** + * Iterates through the columns + * + * @since 3.1.9 + * + * @param array $item + * @param string $column_name + * @return string $item[ $column_name ] + */ + function column_default( $item, $column_name ) { + switch( $column_name ) { + default: + return $item[ $column_name ]; + } + } + + /** + * Sets actions in the bulk menu. + * + * @since 3.1.9 + * + * @return array $actions + */ + function get_bulk_actions() { + $actions = array( + //'delete' => __( 'Delete Selected', 'wp-members' ), + 'save' => __( 'Save Settings', 'wp-members' ), + ); + return $actions; + } + + /** + * Handles "delete" column - checkbox + * + * @since 3.1.9 + * + * @param array $item + * @return string + */ + function column_delete( $item ) { + + } + + /** + * Sets rows so that they have field IDs in the id. + * + * @since 3.1.9 + * + * @global wpmem + * @param array $columns + */ + function single_row( $columns ) { + echo ''; + echo $this->single_row_columns( $columns ); + echo "\n"; + } + + public function process_bulk_action() { + + global $wpmem; + + //nonce validations,etc + + $dir_chk = WP_Members_Admin_Tab_Dropins::check_dir(); + + //echo ( $dir_chk ) ? '.htaccess OK!' : 'NO .htaccess!!!'; + + $action = $this->current_action(); + + switch ( $action ) { + + case 'delete': + + // Do whatever you want + //wp_safe_redirect( esc_url( add_query_arg() ) ); + break; + + case 'save': + $settings = array(); + //echo "SAVING SETTINGS";print_r( $_REQUEST['dropin'] ); + if ( wpmem_get( 'dropin' ) ) { + foreach( wpmem_get( 'dropin' ) as $dropin ) { + $settings[] = $dropin; + } + update_option( 'wpmembers_dropins', $settings, true ); + } else { + delete_option( 'wpmembers_dropins' ); + } + $wpmem->dropins_enabled = $settings; + echo '

    ' . __( 'WP-Members Dropin settings were updated', 'wp-members' ) . '

    '; + break; + + default: + // do nothing or something else + return; + break; + } + return; + } + +} + +// End of file. \ No newline at end of file diff --git a/includes/admin/tabs/class-wp-members-fields-table.php b/includes/admin/tabs/class-wp-members-fields-table.php new file mode 100644 index 00000000..a9e3ca92 --- /dev/null +++ b/includes/admin/tabs/class-wp-members-fields-table.php @@ -0,0 +1,199 @@ +no_delete ) || in_array( $item['meta'], $this->excludes ) ) { + return; + } else { + return sprintf( '', $item['meta'], __( 'delete', 'wp-members' ) ); + } + } + + function column_meta( $item ) { + if ( '' == $item['edit'] ) { + return $item['meta']; + } else { + $link = add_query_arg( array( + 'page' => 'wpmem-settings', + 'tab' => 'fields', + 'mode' => 'edit', + 'edit' => 'field', + 'field' => $item['meta'], + ), admin_url( 'options-general.php' ) ); + return ' ' . $item['meta'] . ''; + } + } + + /** + * Returns table columns. + * + * @since 3.1.8 + * + * @return array + */ + function get_columns() { + $columns = array( + 'cb' => '', + 'label' => __( 'Display Label', 'wp-members' ), + 'meta' => __( 'Meta Key', 'wp-members' ), + 'type' => __( 'Field Type', 'wp-members' ), + 'display' => ' ' . __( 'Registration', 'wp-members' ), // __( 'Registration', 'wp-members' ), @todo Wait until fix + 'req' => ' ' . __( 'Required', 'wp-members' ), + //'profile' => ' ' . __( 'Profile', 'wp-members' ), + 'userscrn' => ' ' . __( 'Users', 'wp-members' ), + 'usearch' => ' ' . __( 'Search', 'wp-members' ), + ); + + /* + if ( wpmem_is_woo_active() ) { + if ( wpmem_is_enabled( 'woo/add_checkout_fields' ) ) { + $columns['wcchkout'] = ' ' . __( 'WC Chkout', 'wp-members' ); + } + if ( wpmem_is_enabled( 'woo/add_my_account_fields' ) ) { + $columns['wcaccount'] = ' ' . __( 'WC My Acct', 'wp-members' ); + } + if ( wpmem_is_enabled( 'woo/add_update_fields' ) ) { + $columns['wcupdate'] = ' ' . __( 'WC Update', 'wp-members' ); + } + } + */ + + $columns['edit'] = ''; + + return $columns; + } + + /** + * Set up table columns. + * + * @since 3.1.8 + */ + function prepare_items() { + $columns = $this->get_columns(); + $hidden = array(); + $sortable = array(); + $this->_column_headers = array( $columns, $hidden, $sortable ); + } + + /** + * Iterates through the columns + * + * @since 3.1.8 + * + * @param array $item + * @param string $column_name + * @return string $item[ $column_name ] + */ + function column_default( $item, $column_name ) { + switch( $column_name ) { + default: + return $item[ $column_name ]; + } + } + + /** + * Sets actions in the bulk menu. + * + * @since 3.1.8 + * + * @return array $actions + */ + function get_bulk_actions() { + $actions = array( + 'delete' => __( 'Delete Selected', 'wp-members' ), + 'save' => __( 'Save Settings', 'wp-members' ), + ); + return $actions; + } + + /** + * Handles "delete" column - checkbox + * + * @since 3.1.8 + * + * @param array $item + * @return string + */ + function column_delete( $item ) { + $can_delete = ( $item['meta_key'] == 'user_nicename' || $item['meta_key'] == 'display_name' || $item['meta_key'] == 'nickname' ) ? true : false; + return ( ( $can_delete ) || ! $item['native'] ) ? sprintf( $item['native'] . '', $item['meta'] ) : ''; + } + + /** + * Sets rows so that they have field IDs in the id. + * + * @since 3.1.8 + * + * @global wpmem + * @param array $columns + */ + function single_row( $columns ) { + if ( in_array( $columns['meta'], $this->excludes ) ) { + echo ''; + echo $this->single_row_columns( $columns ); + echo "\n"; + } else { + echo ''; + echo $this->single_row_columns( $columns ); + echo "\n"; + } + } + + public function process_bulk_action() { + + //nonce validations,etc + + $action = $this->current_action(); + + switch ( $action ) { + + case 'delete': + + // Do whatever you want + wp_safe_redirect( esc_url( add_query_arg() ) ); + break; + + default: + // do nothing or something else + return; + break; + } + return; + } + +} \ No newline at end of file diff --git a/includes/admin/tabs/index.php b/includes/admin/tabs/index.php new file mode 100644 index 00000000..dc051a13 --- /dev/null +++ b/includes/admin/tabs/index.php @@ -0,0 +1 @@ +email->from; +} + +/** + * Returns the wp_mail from name (if set). + * + * @since 2.7 + * @since 3.1 Converted to use email var in object. + * + * @global object $wpmem + * @return string $wpmem_mail_from_name|$name + */ +function wpmem_mail_from_name() { + global $wpmem; + return $wpmem->email->from_name; +} + +/** + * Returns the wp_mail content type (if set). + * + * @since 3.4.0 + * + * @global object $wpmem + * @return string $wpmem_mail_content_type + * + * @note Currently checks for existing function. Advanced Options set up for + * backward compatibility could potentially load first if wp-members directory + * is named something other than "wp-members". + */ +if ( ! function_exists( 'wpmem_mail_content_type' ) ): +function wpmem_mail_content_type() { + global $wpmem; + return $wpmem->email->content_type(); +} +endif; + +/** + * Builds emails for the user. + * + * @since 3.2.3 + * + * @global object $wpmem The WP_Members object. + * @param mixed $args { + * Settings arguments or The User's ID. + * + * @type int $user_id + * @type string $password + * @type string $tag + * @type array $wpmem_fields + * @type array $fields + * @type array $custom { + * Settings for custom email if used (optional). + * + * @type string $subj The email subject. + * @type string $body The email message body. + * @type string $tag The email tag. + * } + * } + * @param string $password Password from the registration process. + * @param string $tag Indicates the email being sent (newreg|newmod|appmod|repass|getuser). + * @param array $wpmem_fields Array of the WP-Members fields (defaults to null). + * @param array $fields Array of the registration data (defaults to null). + * @param array $custom { + * Array of custom email information (defaults to null). + * + * @type string $subj The email subject. + * @type string $body The email message body. + * @type string $tag The email tag. + * } + * + * @todo Will probably change the WP_Members_Email::to_user() arguments to just accept the array. + */ +function wpmem_email_to_user( $args, $password = null, $tag = null, $wpmem_fields = null, $field_data = null, $custom = null ) { + global $wpmem; + if ( is_array( $args ) ) { + $user_id = $args['user_id']; + $tag = $args['tag']; + $password = ( isset( $args['password'] ) ) ? $args['password'] : ''; + $wpmem_fields = ( isset( $args['wpmem_fields'] ) ) ? $args['wpmem_fields'] : ''; + $field_data = ( isset( $args['field_data'] ) ) ? $args['field_data'] : ''; + $custom = ( isset( $args['custom'] ) ) ? $args['custom'] : ''; + } else { + $user_id = $args; + } + $wpmem->email->to_user( $user_id, $password, $tag, $wpmem_fields, $field_data, $custom ); + return; +} + +if ( ! function_exists( 'wpmem_notify_admin' ) ): +/** + * Builds the email for admin notification of new user registration. + * + * @since 2.3 + * @since 3.2.3 Changed inputs. + * + * @global object $wpmem The WP_Members object. + * @param mixed $args Settings arguments or The User's ID. + * @param array $wpmem_fields Array of the WP-Members fields (defaults to null). + * @param array $field_data Array of the registration data (defaults to null). + */ +function wpmem_notify_admin( $args, $wpmem_fields = null, $field_data = null ) { + global $wpmem; + if ( is_array( $args ) ) { + $user_id = $args['user_id']; + $wpmem_fields = $args['wpmem_fields']; + $field_data = $args['field_data']; + } else { + $user_id = $args; + } + $wpmem->email->notify_admin( $user_id, $wpmem_fields, $field_data ); +} +endif; \ No newline at end of file diff --git a/includes/api/api-forms.php b/includes/api/api-forms.php new file mode 100644 index 00000000..a2bcb09a --- /dev/null +++ b/includes/api/api-forms.php @@ -0,0 +1,683 @@ +forms->login_form() + * @since 3.3.0 Added to API. + * @since 3.4.0 Main API function for displaying login form. + * + * @global object $wpmem + * @param array $args { + * Possible arguments for creating the form. + * + * @type string $id + * @type string $tag + * @type string $form + * @type string $redirect_to + * } + * @param array $arr { + * Maintained only for legacy reasons. + * 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). + * @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 wpmem_login_form( $args = array(), $arr = false ) { + global $wpmem; + + /* + // Convert legacy values. + if ( ( ! is_array( $args ) && is_array( $arr ) ) || ( is_array( $args ) && empty( $args ) ) ) { + $page = $args; + $args = $arr; + $args['page'] = $page; + } + $args['form'] = ( isset( $args['form'] ) ) ? $args['form'] : 'login'; + // @todo Work on making this $wpmem->forms->do_login_form( $args ); + return $wpmem->forms->login_form( $args ); + */ + + return $wpmem->forms->do_shortform( 'login', $args ); +} +endif; + +/** + * Use the WP login form. + * + * @since 3.3.2 + * @since 3.4.2 echo set to false by default. + * + * @global stdClass $wpmem + * @param array $args + */ +function wpmem_wp_login_form( $args ) { + global $wpmem; + $args['echo'] = ( ! isset( $args['echo'] ) ) ? false : $args['echo']; + return $wpmem->forms->wp_login_form( $args ); +} + +/** + * Invokes a registration or user profile update form. + * + * @since 3.2.0 + * + * @global object $wpmem + * @param array $args { + * Possible arguments for creating the form. + * + * @type string id + * @type string tag + * @type string form + * @type string product + * @type string include_fields + * @type string exclude_fields + * @type string redirect_to + * @type string heading + * } + * @return string $html + */ +function wpmem_register_form( $args = 'new' ) { + global $wpmem; + return $wpmem->forms->register_form( $args ); +} + +/** + * Change Password Form. + * + * @since 3.3.0 Replaces wpmem_inc_changepassword(). + * @since 3.3.0 Added $action argument. + * + * @global stdClass $wpmem The WP_Members object. + * + * @param string $action Determine if it is password change or reset. + * @return string $str The generated html for the change password form. + */ +function wpmem_change_password_form() { + global $wpmem; + return $wpmem->forms->do_shortform( 'changepassword' ); +} + +/** + * Reset Password Form. + * + * @since 3.3.0 Replaced wpmem_inc_resetpassword(). + * + * @global object $wpmem The WP_Members object. + * @return string $str The generated html fo the reset password form. + */ +function wpmem_reset_password_form() { + global $wpmem; + return $wpmem->forms->do_shortform( 'resetpassword' ); +} + +/** + * Forgot Username Form. + * + * @since 3.3.0 Replaced wpmem_inc_forgotusername(). + * + * @global object $wpmem The WP_Members object class. + * @return string $str The generated html for the forgot username form. + */ +function wpmem_forgot_username_form() { + global $wpmem; + return $wpmem->forms->do_shortform( 'forgotusername' ); +} + +/** + * Add registration fields to the native WP registration. + * + * @since 2.8.3 + * @since 3.1.8 Added $process argument. + * @since 3.3.0 Moved to forms API. + * + * @global stdClass $wpmem + * @param string $process + */ +function wpmem_wp_register_form( $process = 'register_wp' ) { + global $wpmem; + $wpmem->forms->wp_register_form( $process ); +} + +/** + * Add registration fields to WooCommerce registration. + * + * As of WooCommerce 3.0, the WC registration process no longer includes the + * WP register_form action hook. It only includes woocommerce_register_form. + * In previous versions, WP-Members hooked to register_form for both WP and + * WC registration. To provide backward compatibility with users who may + * continue to use updated WP-Members with pre-3.0 WooCommerce, this function + * checks for WC version and if it is older than 3.0 it will ignore adding + * the WP-Members form fields as they would have already been added when the + * register_form action hook fired. + * + * @since 3.1.8 + * @since 3.3.0 Moved to forms API. + * + * @global stdClass $woocommerce + */ +function wpmem_woo_register_form() { + if ( class_exists( 'WooCommerce' ) ) { + global $woocommerce; + if ( version_compare( $woocommerce->version, '3.0', ">=" ) ) { + wpmem_wp_register_form( 'woo' ); + } + } +} + +/** + * Alias for $wpmem->create_form_field(). + * + * @since 3.1.2 + * @since 3.2.0 Accepts wpmem_create_formfield() arguments. + * + * @global object $wpmem The WP_Members object class. + * @param string|array $args { + * @type string $name (required) The field meta key. + * @type string $type (required) The field HTML type (url, email, image, file, checkbox, text, textarea, password, hidden, select, multiselect, multicheckbox, radio). + * @type string $value (optional) The field's value (can be a null value). + * @type string $compare (optional) Compare value. + * @type string $class (optional) Class identifier for the field. + * @type boolean $required (optional) If a value is required default: true). + * @type string $delimiter (optional) The field delimiter (pipe or comma, default: | ). + * @type string $placeholder (optional) Defines the placeholder attribute. + * @type string $pattern (optional) Adds a regex pattern to the field (HTML5). + * @type string $title (optional) Defines the title attribute. + * @type string $min (optional) Adds a min attribute (HTML5). + * @type string $max (optional) Adds a max attribute (HTML5). + * @type string $rows (optional) Adds rows attribute to textarea. + * @type string $cols (optional) Adds cols attribute to textarea. + * } + * @param string $type The field type. + * @param string $value The default value for the field. + * @param string $valtochk Optional for comparing the default value of the field. + * @param string $class Optional for setting a specific CSS class for the field. + * @return string The HTML of the form field. + */ +//function wpmem_form_field( $args ) { +function wpmem_form_field( $name, $type=null, $value=null, $valtochk=null, $class='textbox' ) { + global $wpmem; + if ( is_array( $name ) ) { + $args = $name; + } else { + $args = array( + 'name' => $name, + 'type' => $type, + 'value' => $value, + 'compare' => $valtochk, + 'class' => $class, + ); + } + return $wpmem->forms->create_form_field( $args ); +} + +/** + * Wrapper for $wpmem->create_form_label(). + * + * @since 3.1.7 + * + * @global object $wpmem + * @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 The HTML of the form label. + */ +function wpmem_form_label( $args ) { + global $wpmem; + return $wpmem->forms->create_form_label( $args ); +} + +/** + * Wrapper to get form fields. + * + * @since 3.1.1 + * @since 3.1.5 Checks if fields array is set or empty before returning. + * @since 3.1.7 Added wpmem_form_fields filter. + * @since 3.3.9 load_fields() moved to forms object class. + * + * @global object $wpmem The WP_Members object. + * @param string $tag The action being used (default: null). + * @param string $form The form being generated. + * @return array $fields The form fields. + */ +function wpmem_fields( $tag = '', $form = 'default' ) { + global $wpmem; + // Load fields if none are loaded. + if ( ! isset( $wpmem->fields ) || empty( $wpmem->fields ) ) { + $wpmem->forms->load_fields( $form ); + } + + // @todo Review for removal. + $tag = $wpmem->convert_tag( $tag ); + + /** + * Filters the fields array. + * + * @since 3.1.7 + * @since 3.3.2 Change object var and return. + * @since 3.4.2 Added $form parameter. + * + * @param array $wpmem->fields + * @param string $tag (optional) + * @param string $form (optional) + */ + $wpmem->fields = apply_filters( 'wpmem_fields', $wpmem->fields, $tag, $form ); + + return $wpmem->fields; +} + +/** + * Sanitizes classes passed to the WP-Members form building functions. + * + * This generally uses just sanitize_html_class() but allows for + * whitespace so multiple classes can be passed (such as "regular-text code"). + * This is an API wrapper for WP_Members_Forms::sanitize_class(). + * + * @since 3.2.9 + * @since 3.4.0 Now an alias for rktgk_sanitize_class(). + * + * @global object $wpmem + * + * @param string $class + * @return string sanitized_class + */ +function wpmem_sanitize_class( $class ) { + return rktgk_sanitize_class( $class ); +} + +/** + * Sanitizes the text in an array. + * + * This is an API wrapper for WP_Members_Forms::sanitize_array(). + * + * @since 3.2.9 + * @since 3.3.7 Added optional $type + * @since 3.4.0 Now an alias for rktgk_sanitize_array(). + * + * @global object $wpmem + * + * @param array $data + * @param string $type The data type integer|int (default: false) + * @return array $data + */ +function wpmem_sanitize_array( $data, $type = false ) { + return rktgk_sanitize_array( $data, $type ); +} + +/** + * A multi use sanitization function. + * + * @since 3.3.0 + * @since 3.4.2 Added text, url, array, class as accepted $type + * + * @global object $wpmem + * + * @param string $data + * @param string $type (text|array|multiselect|multicheckbox|textarea|email|file|image|int|integer|number|url|class) Default:text + * @return string $sanitized_data + */ +function wpmem_sanitize_field( $data, $type = 'text' ) { + return rktgk_sanitize_field( $data, $type ); +} + +/** + * Generate a form nonce. + * + * @since 3.3.0 + * + * @param string $nonce + * @param boolean $echo + * @return string The nonce. + */ +function wpmem_form_nonce( $nonce, $echo = false ) { + $form = ( 'update' == $nonce || 'register' == $nonce ) ? 'longform' : 'shortform'; + return wp_nonce_field( 'wpmem_' . $form . '_nonce', '_wpmem_' . $nonce . '_nonce', true, $echo ); +} + +// @todo Experimental +/** + * Create WP-Members fields set for woo checkout. + * + * @since 3.3.4 + * + * @param array $checkout_fields + */ +function wpmem_woo_checkout_fields( $checkout_fields = false ) { + $woo_checkout = array( + 'billing_first_name', + 'billing_last_name', + 'billing_company', + 'billing_country', + 'billing_address_1', + 'billing_address_2', + 'billing_city', + 'billing_state', + 'billing_postcode', + 'billing_phone', + 'billing_email', + 'account_username', + 'account_password', + ); + $fields = wpmem_fields(); + + if ( ! $checkout_fields ) { + $checkout_fields = WC()->checkout()->checkout_fields; + } + + foreach ( $fields as $meta_key => $field ) { + + if ( 1 != $fields[ $meta_key ]['register'] ) { + unset( $fields[ $meta_key ] ); + } else { + if ( isset( $checkout_fields['billing'][ $meta_key ] ) ) { + unset( $fields[ $meta_key ] ); + } + if ( isset( $checkout_fields['shipping'][ $meta_key ] ) ) { + unset( $fields[ $meta_key ] ); + } + if ( isset( $checkout_fields['account'][ $meta_key ] ) ) { + unset( $fields[ $meta_key ] ); + } + if ( isset( $checkout_fields['order'][ $meta_key ] ) ) { + unset( $fields[ $meta_key ] ); + } + } + + // @todo For now, remove any unsupported field types. + if ( 'hidden' == $field['type'] || 'image' == $field['type'] || 'file' == $field['type'] || 'membership' == $field['type'] ) { + unset( $fields[ $meta_key ] ); + } + } + unset( $fields['username'] ); + unset( $fields['password'] ); + unset( $fields['confirm_password'] ); + unset( $fields['confirm_email'] ); + unset( $fields['user_email'] ); + unset( $fields['first_name'] ); + unset( $fields['last_name'] ); + + return $fields; +} + +/** + * Adds WP-Members custom fields to woo checkout. + * + * @since 3.3.4 + * + * @param array $checkout_fields + */ +function wpmem_woo_checkout_form( $checkout_fields ) { + global $wpmem; + $fields = wpmem_woo_checkout_fields( $checkout_fields ); + + /** + * Filters the initial WC priority of the WP-members added fields. + * + * @since 3.3.7 + * + * @param int + */ + $priority = apply_filters( 'wpmem_wc_checkout_field_priority_seed', 10 ); + + foreach ( $fields as $meta_key => $field ) { + $checkout_fields['order'][ $meta_key ] = array( + 'type' => $fields[ $meta_key ]['type'], + 'label' => ( 'tos' == $meta_key ) ? $wpmem->forms->get_tos_link( $field, 'woo' ) : $fields[ $meta_key ]['label'], + 'required' => $fields[ $meta_key ]['required'], + 'priority' => $priority, + ); + if ( isset( $fields[ $meta_key ]['placeholder'] ) ) { + $checkout_fields['order'][ $meta_key ]['placeholder'] = $fields[ $meta_key ]['placeholder']; + } + $priority = $priority + 10; + } + return $checkout_fields; +} + +/** + * Saves WP-Members custom fields for woo checkout. + * + * @since 3.3.4 + * + * @param int $order_id + */ +function wpmem_woo_checkout_update_meta( $order_id ) { + + // Get user id from order. + $order = wc_get_order( $order_id ); + $user_id = $order->get_user_id(); + + $checkout_fields = WC()->checkout()->checkout_fields; + $fields = wpmem_fields(); + foreach ( $fields as $meta_key => $field ) { + if ( isset( $checkout_fields['order'][ $meta_key ] ) && isset( $_POST[ $meta_key ] ) ) { + switch ( $fields[ $meta_key ]['type'] ) { + case 'checkbox': + update_user_meta( $user_id, $meta_key, $field['checked_value'] ); + break; + case 'textarea': + update_user_meta( $user_id, $meta_key, sanitize_textarea_field( $_POST[ $meta_key ] ) ); + break; + case 'multicheckbox': + case 'multiselect': + update_user_meta( $user_id, $meta_key, wpmem_sanitize_array( $_POST[ $meta_key ] ) ); + break; + case 'membership': + wpmem_set_user_product( wpmem_sanitize_array( $_POST[ $meta_key ] ), $user_id ); + break; + default: + if ( 'user_url' == $meta_key ) { + wp_update_user( array( 'ID' => $user_id, 'user_url' => sanitize_text_field( $_POST[ $meta_key ] ) ) ); + } else { + update_user_meta( $user_id, $meta_key, sanitize_text_field( $_POST[ $meta_key ] ) ); + } + break; + } + } + } +} + +/** + * Adds WP-Members custom fields to woo profile update. + * + * @since 3.5.0 + * + * @param array $checkout_fields + */ +function wpmem_woo_edit_account_form() { + $fields = wpmem_woo_edit_account_fields(); + foreach ( $fields as $meta_key => $field ) { ?> +

    + + +

    + $settings ) { + if ( isset( $settings['wcupdate'] ) && true == $settings['wcupdate'] ) { + $return_fields[ $meta ] = $settings; + } + } + return $return_fields; +} + +/** + * Handle custom fields for WooCommerce. + * + * @since Unknown + * + * @param string $field + * @param string $key The field's meta key. + * @param array $args + * @param string $value + * @param string $field + */ +function wpmem_form_field_wc_custom_field_types( $field, $key, $args, $value ) { + + $wpmem_fields = wpmem_fields(); + /** + * @type string $name (required) The field meta key. + * @type string $type (required) The field HTML type (url, email, image, file, checkbox, text, textarea, password, hidden, select, multiselect, multicheckbox, radio). + * @type string $value (optional) The field's value (can be a null value). + * @type string $compare (optional) Compare value. + * @type string $class (optional) Class identifier for the field. + * @type boolean $required (optional) If a value is required default: true). + * @type string $delimiter (optional) The field delimiter (pipe or comma, default: | ). + * @type string $placeholder (optional) Defines the placeholder attribute. + * @type string $pattern (optional) Adds a regex pattern to the field (HTML5). + * @type string $title (optional) Defines the title attribute. + * @type string $min (optional) Adds a min attribute (HTML5). + * @type string $max (optional) Adds a max attribute (HTML5). + * @type string $rows (optional) Adds rows attribute to textarea. + * @type string $cols (optional) Adds cols attribute to textarea. + */ + + // Let's only mess with WP-Members fields (in case another checkout fields plugin is used). + if ( array_key_exists( $key, $wpmem_fields ) ) { + + // If it is a checkbox. + if ( 'checkbox' == $wpmem_fields[ $key ]['type'] ) { + + if ( ! $_POST && $wpmem_fields[ $key ]['checked_default'] ) { + $field = str_replace( ' $key, + 'type' => $wpmem_fields[ $key ]['type'], + 'required' => $wpmem_fields[ $key ]['required'], + 'delimiter' => $wpmem_fields[ $key ]['delimiter'], + 'value' => $wpmem_fields[ $key ]['values'], + ); + + $field_html = wpmem_form_field( $field_args ); + $field_html = str_replace( 'class="' . $wpmem_fields[ $key ]['type'] . '"', 'class="' . $wpmem_fields[ $key ]['type'] . '" style="display:initial;"', $field_html ); + $field = '

    + '; + $field .= $field_html; + $field .= '

    '; + } + + } + + return $field; +} + +function wpmem_woo_reg_validate( $username, $email, $errors ) { + + $fields = wpmem_woo_checkout_fields(); + + unset( $fields['username'] ); + unset( $fields['password'] ); + unset( $fields['confirm_password'] ); + unset( $fields['user_email'] ); + unset( $fields['first_name'] ); + unset( $fields['last_name'] ); + + foreach ( $fields as $key => $field_args ) { + if ( 1 == $field_args['required'] && empty( $_POST[ $key ] ) ) { + $message = sprintf( __( '%s is a required field.', 'wp-members' ), '' . $field_args['label'] . '' ); + $errors->add( $key, $message ); + } + } + return $errors; +} + +function wpmem_is_reg_form_showing() { + global $wpmem; + return ( isset( $wpmem->reg_form_showing ) && true == $wpmem->reg_form_showing ) ? true : false; +} + +/** + * Returns the display value of certain field types. + * + * Some WP-Members field types may have a different "saved" value and + * "displayed" value. This function provides a simple way to get the displayed + * value for a field based on the saved value. + * + * @since 3.4.0 + * @since 3.4.2 Cleanup, completed support for all field types. + * + * @param string $field_meta The meta key for the requested field. + * @param string $value The value to convert (empty for checkbox). + * @param boolean $echo Whether to echo or return the value (default: false). + * @return string + */ +function wpmem_field_display_value( $field_meta, $value = '', $echo = false ) { + $fields = wpmem_fields(); + $type = $fields[ $field_meta ]['type']; + + $display_value = ( 'checkbox' == $type ) ? $fields[ $field_meta ]['label'] : $fields[ $field_meta ]['options'][ $value ]; + + /** + * Filter the value. + * + * @since 3.4.0 + * + * @param string $display_value + * @param string $field_meta + * @param string $type + */ + $display_value = apply_filters( 'wpmem_' . $type . '_field_display', $display_value, $field_meta, $type ); + if ( $echo ) { + echo $display_value; + } else { + return $display_value; + } +} + +function wpmem_checkbox_field_display( $field_meta, $echo = false ) { + return wpmem_field_display_value( $field_meta, '', $echo ); +} + +function wpmem_select_field_display( $field_meta, $value, $echo = false ) { + return wpmem_field_display_value( $field_meta, $value, $echo ); +} \ No newline at end of file diff --git a/includes/api/api-products.php b/includes/api/api-products.php new file mode 100644 index 00000000..48eb716e --- /dev/null +++ b/includes/api/api-products.php @@ -0,0 +1,381 @@ +membership->get_all_posts( $membership_key ); +} + +/** + * Gets the membership products for a given post. + * + * @since 3.3.7 + * @since 3.4.5 Alias of wpmem_get_post_memberships(). + * + * @global stdClass $wpmem + * @param integer $post_id + * @return array + */ +function wpmem_get_post_products( $post_id ) { + return wpmem_get_post_memberships( $post_id ); +} + +/** + * Gets the membership products for a given post. + * + * @since 3.4.5 + * + * @global stdClass $wpmem + * @param integer $post_id + * @return array + */ +function wpmem_get_post_memberships( $post_id ) { + global $wpmem; + return $wpmem->membership->get_post_products( $post_id ); +} + +/** + * Gets access message if user does not have required membership. + * + * @since 3.4.0 + * + * @global stdClass $wpmem + * @param array $post_products + * @return string $message + */ +function wpmem_get_access_message( $post_products ) { + global $wpmem; + return $wpmem->membership->get_access_message( $post_products ); +} + +/** + * Gets all memberships for the site. + * Alias of wpmem_get_memberships(). + * + * @since Unknown + * + * @return array + */ +function wpmem_get_products() { + return wpmem_get_memberships(); +} + +/** + * Gets all memberships for the site. + * + * @since Unknown + * + * @return array + */ +function wpmem_get_memberships() { + global $wpmem; + return ( ! empty( $wpmem->membership->products ) ) ? $wpmem->membership->products : false; +} + +/** + * Get array of memberships keyed by ID. + * + * @since Unknown + * + * return array + */ +function wpmem_get_memberships_ids() { + global $wpmem; + return array_flip( $wpmem->membership->product_by_id ); +} + +/** + * Get membership id by slug. + * + * @since 3.4.7 + * + * @param string $membership_slug + * @return int $ID + */ +function wpmem_get_membership_id( $membership_slug ) { + $membership = get_page_by_path( $membership_slug ); + return ( $membership ) ? $membership->ID: false; +} + +/** + * Get membership display title by slug. + * + * @since 3.4.5 + * + * @param string $membership_slug + * @return string Value of $wpmem->membership->products[ $membership_slug ]['title'] if set, otherwise, $membership_slug. + */ +function wpmem_get_membership_name( $membership_slug ) { + global $wpmem; + return ( isset( $wpmem->membership->products[ $membership_slug ]['title'] ) ) ? $wpmem->membership->products[ $membership_slug ]['title'] : $membership_slug; +} + +/** + * Get the membership name (slug) by membership ID. + * + * @since 3.4.7 + * + * @param int $membership_id The membership ID + * @return string The membership name/slug + */ +function wpmem_get_membership_slug( $membership_id ) { + return get_post_field( 'post_name', $membership_id ); +} + +/** + * Get meta key for membership (with stem). + * + * @since 3.4.5 + * + * @param string $membership_slug + * @return string + */ +function wpmem_get_membership_meta( $membership_slug ) { + global $wpmem; + return $wpmem->membership->post_stem . $membership_slug; +} + +/** + * Adds a membership to a post. + * + * @since 3.4.6 + * @since 3.4.7 Added $action param + * + * @param string $membership_meta + * @param int $post_id + * @param string $action Action to run (add|remove default:add) + */ +function wpmem_add_membership_to_post( $membership_meta, $post_id, $action = 'add' ) { + + global $wpmem; + + // Get existing post meta. + $post_memberships = get_post_meta( $post_id, $wpmem->membership->post_meta, true ); + + if ( 'remove' == $action ) { + // If we are removing, remove the meta key from the array. + if ( is_array( $post_memberships ) ) { + if ( ( $key = array_search( $membership_meta, $post_memberships ) ) !== false ) { + unset( $post_memberships[ $key ] ); + } + } + } else { + // If the post has membership restrictions already, add new membership requirement. + if ( is_array( $post_memberships ) ) { + if ( ! in_array( $membership_meta, $post_memberships ) ) { + $post_memberships[] = $membership_meta; + } + } else { + $post_memberships = array( $membership_meta ); + } + } + + // Update post meta with restriction info. + update_post_meta( $post_id, $wpmem->membership->post_meta, $post_memberships ); + + if ( 'remove' == $action ) { + delete_post_meta( $post_id, wpmem_get_membership_meta( $membership_meta ) ); + } else { + update_post_meta( $post_id, wpmem_get_membership_meta( $membership_meta ), 1 ); + } +} + +/** + * Removes a membership from a post. + * + * @since 3.4.7 + * + * @param string $membership_meta + * @param int $post_id + */ +function wpmem_remove_membership_from_post( $membership_meta, $post_id ) { + wpmem_add_membership_to_post( $membership_meta, $post_id, 'remove' ); +} + +/** + * Adds a membership to an array of post IDs. + * + * @since 3.4.6 + * @since 3.4.7 Added $action param + * + * @param string $membership_meta + * @param string|array $post_ids + * @param string $action Action to run (add|remove default:add) + */ +function wpmem_add_membership_to_posts( $membership_meta, $post_ids, $action = 'add' ) { + // Make sure $post_ids is an array (prepare comma separated values) + $posts_array = ( ! is_array( $post_ids ) ) ? explode( ",", $post_ids ) : $post_ids; + + if ( 'remove' == $action ) { + // Run wpmem_remove_membership_from_post() for each ID. + foreach ( $posts_array as $ID ) { + wpmem_remove_membership_from_post( $membership_meta, $ID ); + } + } else { + // Run wpmem_add_membership_to_post() for each ID. + foreach ( $posts_array as $ID ) { + wpmem_add_membership_to_post( $membership_meta, $ID ); + } + } +} + +/** + * Removes a membership from an array of post IDs. + * + * @since 3.4.7 + * + * @param string $membership_meta + * @param string|array $post_ids + */ +function wpmem_remove_membership_from_posts( $membership_meta, $post_ids ) { + wpmem_add_membership_to_posts( $membership_meta, $post_ids, 'remove' ); +} + +/** + * Create a membership. + * + * @since 3.4.6 + * + * @param array $args { + * Parameters for creating the membership CPT. + * + * @type string $title User readable name of membership. + * @type string $name Sanitized title of the membership to be used as the meta key. + * @type string $status Published status: publish|draft (default: publish) + * @type int $author User ID of membership author, Optional, defaults to site admin. + * @type array $meta_input + * Meta fields for membership CPT (not all are required). + * + * @type string $name The sanitized title of the membership. + * @type string $default + * @type string $role Roles if a role is required. + * @type string $expires Expiration period if used (num|per). + * @type int $no_gap If renewal is "no gap" renewal. + * @type string $fixed_period (start|end|grace_num|grace_per) + * @type int $set_default_{$key} + * @type string $message Custom message for restriction. + * @type int $child_access If membership hierarchy is used. + * } + * } + * @return mixed $post_id|WP_Error + */ +function wpmem_create_membership( $args ) { + + // Get the admin user for default post_author. + $admin_email = get_option( 'admin_email' ); + $admin_user = get_user_by( 'email', $admin_email ); + + // Set up post args. + $pre_postarr = array(); + foreach ( $args as $key => $value ) { + if ( 'meta_input' == $key ) { + foreach( $value as $meta_key => $meta_value ) { + $pre_postarr['meta_input'][ 'wpmem_product_' . $meta_key ] = $meta_value; + } + } else { + + // If parent is identified by slug. + if ( 'parent' == $key && ! is_int( $value ) ) { + $value = wpmem_get_membership_id( $value ); + } + + $pre_postarr[ 'post_' . $key ] = $value; + } + } + + // Setup defaults. + $default_args = array( + 'post_title' => '', + 'post_name' => ( isset( $pre_postarr['post_name'] ) ) ? sanitize_title( $pre_postarr['post_name'] ) : sanitize_title( $pre_postarr['post_title'] ), + 'post_status' => 'publish', + 'post_author' => $admin_user->ID, + 'post_type' => 'wpmem_product', + 'meta_input' => array( + 'wpmem_product_name' => ( isset( $pre_postarr['meta_input']['wpmem_product_name'] ) ) ? sanitize_title( $pre_postarr['meta_input']['wpmem_product_name'] ) : ( ( isset( $pre_postarr['post_name'] ) ) ? sanitize_title( $pre_postarr['post_name'] ) : sanitize_title( $pre_postarr['post_title'] ) ), + 'wpmem_product_default' => false, + 'wpmem_product_role' => false, + 'wpmem_product_expires' => false, + ), + ); + + /** + * Filter the defaults. + * + * @since 3.4.6 + * + * @param array $default_args { + * Mmembership CPT params for wp_insert_post(). + * + * @type string $post_title User readable name of membership. + * @type string $post_name Sanitized title of the membership to be used as the meta key. + * @type string $post_status Published status: publish|draft (default: publish) + * @type int $post_author User ID of membership author, Optional, defaults to site admin. + * @type string $post_type Should not change this: default: wpmem_product. + * @type array $meta_input + * Meta fields for membership CPT (not all are required). + * + * @type string $wpmem_product_name The sanitized title of the membership. + * @type string $wpmem_product_default + * @type string $wpmem_product_role Roles if a role is required. + * @type string $wpmem_product_expires Expiration period if used (num|per). + * + * The following are optional and are not passed in the default args but could be returned by filter. + * + * @type int $wpmem_product_no_gap If renewal is "no gap" renewal. + * @type string $wpmem_product_fixed_period (start|end|grace_num|grace_per) + * @type int $wpmem_product_set_default_{$wpmem_product_key} + * @type string $wpmem_product_message Custom message for restriction. + * @type int $wpmem_product_child_access If membership hierarchy is used. + * } + * } + */ + $default_args = apply_filters( 'wpmem_create_membership_defaults', $default_args ); + + if ( isset( $pre_postarr['meta_input']['wpmem_product_message'] ) ) { + $pre_postarr['meta_input']['wpmem_product_message'] = wp_kses_post( $pre_postarr['meta_input']['wpmem_product_message'] ); + } + + // Merge with defaults. + $postarr = rktgk_wp_parse_args( $pre_postarr, $default_args ); + + // Insert the new membership as a CPT. + $post_id = wp_insert_post( $postarr ); + + // wp_insert_post() returns post ID on success, WP_Error on fail. + return $post_id; +} \ No newline at end of file diff --git a/includes/api/api-settings.php b/includes/api/api-settings.php new file mode 100644 index 00000000..914578c8 --- /dev/null +++ b/includes/api/api-settings.php @@ -0,0 +1,67 @@ +{$parts[0]} ) ) { + return ( isset( $wpmem->{$parts[0]}[ $parts[1] ] ) && 1 == $wpmem->{$parts[0]}[ $parts[1] ] ) ? true : false; + } elseif ( is_object( $wpmem->{$parts[0]} ) ) { + return ( isset( $wpmem->{$parts[0]}->{$parts[1]} ) && 1 == $wpmem->{$parts[0]}->{$parts[1]} ) ? true : false; + } + } else { + return ( isset( $wpmem->{$option} ) && 1 == $wpmem->{$option} ) ? true : false; + } +} + +/** + * Checks if WooCommerce is active. + * + * @since 3.3.7 + * @since 3.4.0 Now an alias for rktgk_is_woo_active(). + * @since 3.4.6 Moved from api-utilities.php. + * + * @return boolean + */ +function wpmem_is_woo_active() { + return rktgk_is_woo_active(); +} + +/** + * Conditional test if moderated registration is enabled. + * + * @since 3.4.6 + * + * @return boolean + */ +function wpmem_is_mod_reg() { + return wpmem_is_enabled( 'mod_reg' ); +} + +/** + * Verbose alias of wpmem_is_mod_reg() + * + * @since 3.4.6 + * + * @return boolean + */ +function wpmem_is_registration_moderated() { + return wpmem_is_mod_reg(); +} + +function wpmem_is_act_link() { + return wpmem_is_enabled( 'act_link' ); +} + +function wpmem_is_confirmation_link_enabled() { + return wpmem_is_act_link(); +} \ No newline at end of file diff --git a/includes/api/api-users.php b/includes/api/api-users.php new file mode 100644 index 00000000..d9507a6a --- /dev/null +++ b/includes/api/api-users.php @@ -0,0 +1,1175 @@ +roles ) : $user->roles; + return ( $user ) ? $role : false; +} + +/** + * Checks if user has a particular role. + * + * Utility function to check if a given user has a specific role. Users can + * have multiple roles assigned, so it checks the role array rather than using + * the incorrect method of current_user_can( 'role_name' ). The function can + * check the role of the current user (default) or a specific user (if $user_id + * is passed). + * + * @since 3.1.1 + * @since 3.1.6 Include accepting an array of roles to check. + * @since 3.1.9 Return false if user is not logged in. + * @since 3.2.0 Change return false to not logged in AND no user id. + * @since 3.4.5 $current_user no longer necessary. + * @since 3.4.6 $wpmem global is no longer necessary. + * + * @param string|array $role Slug or array of slugs of the role being checked. + * @param int $user_id ID of the user being checked (optional). + * @return boolean $has_role True if user has the role, otherwise false. + */ +function wpmem_user_has_role( $role, $user_id = false ) { + if ( ! is_user_logged_in() && ! $user_id ) { + return false; + } + $has_role = false; + $user = ( $user_id ) ? get_userdata( $user_id ) : wp_get_current_user(); + if ( is_array( $role ) ) { + foreach ( $role as $r ) { + if ( in_array( $r, $user->roles ) ) { + return true; + } + } + } else { + return ( in_array( $role, $user->roles ) ) ? true : $has_role; + } +} + +/** + * Gets user meta. + * + * It may seem like WP already has this feature. And it does. But most user meta + * are single, and WP's get_user_meta() defaults to "false" for the $single + * argument. This function provides a shorthand that assumes a string value for + * the meta result and drops the $single argument. + * + * @since 3.3.0 + * + * @param int $user_id + * @param string $meta_key + * @return string $result + */ +function wpmem_get_user_meta( $user_id, $meta_key ) { + return get_user_meta( $user_id, $meta_key, true ); +} + +/** + * Get a user meta checkbox label as value if checked. + * + * @since 3.4.2 + * + * @param int $user_id + * @param string $meta_key + * @return string $result + */ +function wpmem_get_user_meta_checkbox( $user_id, $meta_key ) { + $value = wpmem_get_user_meta( $user_id, $meta_key ); + return wpmem_checkbox_field_display( $value ); +} + +/** + * Get a user meta select (dropdown) value. + * + * @since 3.4.2 + * + * @param int $user_id + * @param string $meta_key + * @return string $result + */ +function wpmem_get_user_meta_select( $user_id, $meta_key ) { + $value = wpmem_get_user_meta( $user_id, $meta_key ); + return wpmem_select_field_display( $meta_key, $value ); +} + +/** + * Get a user meta radio value. + * Alias of wpmem_get_user_meta_select() for radio field type. + * + * @since 3.4.2 + * + * @param int $user_id + * @param string $meta_key + * @return string $result + */ +function wpmem_get_user_meta_radio( $user_id, $meta_key ) { + return wpmem_get_user_meta_select( $user_id, $meta_key ); +} + +/** + * Returns the meta value for a requested mutli-checkbox or multi-select + * field for a requested user ID. + * + * @since 3.4.2 + * + * @param int $user_id + * @param string $field_meta + * @param string $return_type (string|array default:string) + * @return string + */ +function wpmem_get_user_meta_multi( $user_id, $field_meta, $return_type = "string" ) { + $fields = wpmem_fields(); + $value = wpmem_get_user_meta( $user_id, $field_meta ); + $array = ( '' != $value && false != $value ) ? explode( $fields[ $field_meta ]['delimiter'], $value ) : array(); + if ( ! empty( $array ) && count( $array ) > 1 ) { + foreach ( $array as $val ) { + $display_values[] = wpmem_field_display_value( $field_meta, $val ); + } + $return_value = ( "array" == $return_type ) ? $display_values : implode( ", ", $display_values ); + } else { + $display_value = wpmem_field_display_value( $field_meta, $value ); + $return_value = ( "array" == $return_type ) ? array( $display_value ) : $display_value; + } + return $return_value; +} + +/** + * Checks if a user has a given meta value. + * + * @since 3.1.8 + * @since 3.3.0 Added wpmem_user_has_meta filter. + * @since 3.3.0 Added array check for multi-value fields (multicheckbox and multiselect). + * + * @global object $wpmem WP_Members object. + * + * @param string $meta Meta key being checked. + * @param string $value Value the meta key should have (optional). + * @param int $user_id ID of the user being checked (optional). + * @return boolean $has_meta True if user has the meta value, otherwise false. + */ +function wpmem_user_has_meta( $meta, $value = false, $user_id = false ) { + + global $wpmem; + + // Get the user ID. + $user_id = ( $user_id ) ? $user_id : get_current_user_id(); + + // Get field type. + $fields = wpmem_fields(); + $multi = ( ( isset( $fields[ $meta ] ) ) && ( 'multicheckbox' == $fields[ $meta ]['type'] || 'multiselect' == $fields[ $meta ]['type'] ) ) ? true : false; + + // Get meta. + $has_meta = false; + $user_value = get_user_meta( $user_id, $meta, true ); + + // Check meta. + if ( $value ) { + if ( $multi ) { + // Check array of values. + $user_value = explode( $fields[ $meta ]['delimiter'], $user_value ); + $has_meta = ( in_array( $value, $user_value ) ) ? true : $has_meta; + } else { + // Straight comparison. + $has_meta = ( $user_value == $value ) ? true : $has_meta; + } + } else { + // Check if the user has any meta value (regardless of actual value). + $has_meta = ( $user_value ) ? true : $has_meta; + } + + /** + * Filter the user has meta result. + * + * @since 3.3.0 + * + * @param bool $has_meta True if the user has the value, otherwise false. + * @param int $user_id The user ID being checked. + * @param string $user_value The user's stored meta value (false if none). + */ + return apply_filters( 'wpmem_user_has_meta', $has_meta, $user_id, $user_value ); +} + +/** + * Gets a user by meta key. + * + * @since 3.4.6 + * + * @global object $wpdb + * @param string $meta_key + * @param string $meta_value + * @return WP_User + */ +function wpmem_get_user_by_meta( $meta_key, $meta_value ) { + global $wpdb; + $sql = 'SELECT u1.ID, m1.meta_value + FROM ' . $wpdb->users . ' u1 + JOIN ' . $wpdb->usermeta . ' m1 ON (m1.user_id = u1.ID AND m1.meta_key = "' . esc_sql( $meta_key ) . '") + WHERE m1.meta_value = "' . esc_sql( $meta_value ) . '";'; + $user = $wpdb->get_row( $sql ); + return $user; +} + +/** + * Checks if a user is activated. + * + * @since 3.1.7 + * @since 3.2.3 Now an alias for WP_Members_Users::is_user_activated(). + * + * @global object $wpmem + * @param int $user_id + * @return bool + */ +function wpmem_is_user_activated( $user_id = false ) { + global $wpmem; + return $wpmem->user->is_user_activated( $user_id ); +} + +/** + * Gets an array of the user's registration data. + * + * Returns an array keyed by meta keys of the user's registration data for + * all fields in the WP-Members Fields. Returns the current user unless + * a user ID is specified. + * + * @since 3.2.0 + * + * @global object $wpmem + * @param integer $user_id + * @param bool $all + * @return array $user_fields + */ +function wpmem_user_data( $user_id = false, $all = false ) { + global $wpmem; + return $wpmem->user->user_data( $user_id, $all ); +} + +/** + * Updates a user's role. + * + * This is an alias for $wpmem->update_user_role(). It can add a role to a + * user, change or remove the user's role. If no action is specified it will + * change the role. + * + * @since 3.2.0 + * + * @global object $wpmem + * @param integer $user_id (required) + * @param string $role (required) + * @param string $action (optional add|remove|set default:set) + */ +function wpmem_update_user_role( $user_id, $role, $action = 'set' ) { + global $wpmem; + $wpmem->user->update_user_role( $user_id, $role, $action ); +} + +/** + * A function for checking user access criteria. + * + * @since 3.2.0 + * @since 3.2.3 Reversed order of arguments. + * + * @param mixed $membership Accepts a single membership slug/meta, or an array of multiple memberships. + * @param integer $user_id User ID (optional|default: false). + * @return boolean $access True if user has access, otherwise false. + */ +function wpmem_user_has_access( $membership, $user_id = false ) { + global $wpmem; + $user_id = ( false == $user_id ) ? get_current_user_id() : $user_id; + return $wpmem->user->has_access( $membership, $user_id ); +} + +/** + * Checks if user expiration is current. + * + * Similar to wpmem_user_has_access(), but specifically checks the + * expiration date for a specified membership (must be expiration product). + * + * Must be named _user_is_current() as _is_user_current() exists in PayPal extension. + * + * @since 3.4.0 + * + * @param string $membership The meta key of the + * @param integer $user_id The user ID to check. Optional. If not passed, the currently logged in user will be checked. + * @return boolean True if user is current (i.e. not expired), otherwise false. + */ +function wpmem_user_is_current( $membership, $user_id = false ) { + global $wpmem; + $user_id = ( false === $user_id ) ? get_current_user_id() : $user_id; + $memberships = wpmem_get_user_memberships( $user_id ); + return ( $wpmem->user->is_current( $memberships[ $membership ] ) ) ? true : false; +} + +/** + * An alias for wpmem_set_user_product(). + * + * @since 3.4.2 + */ +function wpmem_set_user_membership( $membership, $user_id = false, $date = false ) { + return wpmem_set_user_product( $membership, $user_id, $date ); +} + +/** + * An alias for wpmem_remove_user_product(). + * + * @since 3.4.2 + */ +function wpmem_remove_user_membership( $membership, $user_id = false ) { + return wpmem_remove_user_product( $membership, $user_id ); +} + +/** + * An alias for wpmem_get_user_products(). + * + * @since 3.4.2 + */ +function wpmem_get_user_memberships( $user_id = false ) { + return wpmem_get_user_products( $user_id ); +} + +/** + * Sets product access for a user. + * + * @since 3.2.3 + * @since 3.2.6 Added $date to set a specific expiration date. + * @since 3.4.2 Use wpmem_set_user_membership() instead. + * + * @global object $wpmem + * @param string $product The meta key of the product. + * @param int $user_id + * @param string $date Expiration date (optional) format: MySQL timestamp + * @return bool $result + */ +function wpmem_set_user_product( $product, $user_id = false, $date = false ) { + global $wpmem; + return $wpmem->user->set_user_product( $product, $user_id, $date ); +} + +/** + * Removes product access for a user. + * + * @since 3.2.3 + * @since 3.4.2 Use wpmem_remove_user_membership() instead. + * + * @global object $wpmem + * @param string $product + * @param int $user_id + */ +function wpmem_remove_user_product( $product, $user_id = false ) { + global $wpmem; + $wpmem->user->remove_user_product( $product, $user_id ); + return; +} + +/** + * Gets memberships a user has. + * + * @since 3.3.0 + * @since 3.4.2 Use wpmem_get_user_memberships() instead. + * + * @global stdClass $wpmem + * @param int $user_id + * @return array + */ +function wpmem_get_user_products( $user_id = false ) { + global $wpmem; + return ( $user_id ) ? $wpmem->user->get_user_products( $user_id ) : $wpmem->user->access; +} + +/** + * Get user expiration date + * + * @since 3.4.2 + * + * @param $product_key The membership slug being requested (optional: defaults to first membership in the array). + * @param $user_id The user ID (optional: defaults to current user). + * @param $format The date format to return (optional: defaults to raw epoch timestamp). + * @return $exp_date The expiration date unformatted (i.e. unix/epoch timestamp) (false if no date or membership does not exist for user). + */ +function wpmem_get_user_expiration( $product_key = false, $user_id = false, $format = false ) { + $user_id = ( false === $user_id ) ? get_current_user_id() : $user_id; + $memberships = wpmem_get_user_memberships( $user_id ); + $product_key = ( false == $product_key ) ? key( $memberships ) : $product_key; + $exp_date = ( is_numeric( $memberships[ $product_key ] ) ) ? $memberships[ $product_key ] : strtotime( $memberships[ $product_key ] ); + return $exp_date; +} + +/** + * Sets a user as logged in. + * + * @since 3.2.3 + * + * @global object $wpmem + * @param int $user_id + */ +function wpmem_set_as_logged_in( $user_id ) { + global $wpmem; + $wpmem->user->set_as_logged_in( $user_id ); +} + +if ( ! function_exists( 'wpmem_login' ) ): +/** + * Logs in the user. + * + * Logs in the the user using wp_signon (since 2.5.2). If login is + * successful, it will set a cookie using wp_set_auth_cookie (since 2.7.7), + * then it redirects and exits; otherwise "loginfailed" is returned. + * + * @since 0.1.0 + * @since 2.5.2 Now uses wp_signon(). + * @since 2.7.7 Sets cookie using wp_set_auth_cookie(). + * @since 3.0.0 Removed wp_set_auth_cookie(), this already happens in wp_signon(). + * @since 3.1.7 Now an alias for login() in WP_Members_Users Class. + * @since 3.2.4 Moved to user API (could be deprecated). + * + * @global object $wpmem + * @return string Returns "loginfailed" if the login fails. + */ +function wpmem_login() { + global $wpmem; + return $wpmem->user->login(); +} // End of login function. +endif; + +if ( ! function_exists( 'wpmem_logout' ) ): +/** + * Logs the user out then redirects. + * + * @since 2.0.0 + * @since 3.1.6 Added wp_destroy_current_session(), removed nocache_headers(). + * @since 3.1.7 Now an alias for logout() in WP_Members_Users Class. + * @since 3.2.4 Moved to user API (could be deprecated). + * + * @global object $wpmem + * @param string $redirect_to The URL to redirect to at logout. + */ +function wpmem_logout( $redirect_to = false ) { + global $wpmem; + $wpmem->user->logout( $redirect_to ); +} +endif; + +if ( ! function_exists( 'wpmem_change_password' ) ): +/** + * Handles user password change (not reset). + * + * @since 2.1.0 + * @since 3.1.7 Now an alias for password_update() in WP_Members_Users Class. + * @since 3.2.4 Moved to user API (could be deprecated). + * + * @global int $user_ID The WordPress user ID. + * + * @return string The value for $wpmem->regchk + */ +function wpmem_change_password() { + global $wpmem; + return $wpmem->user->password_update( 'change' ); +} +endif; + +if ( ! function_exists( 'wpmem_reset_password' ) ): +/** + * Resets a forgotten password. + * + * @since 2.1.0 + * @since 3.1.7 Now an alias for password_update() in WP_Members_Users Class. + * @since 3.2.4 Moved to user API (could be deprecated). + * + * @global object $wpmem The WP-Members object class. + * + * @return string The value for $wpmem->regchk + */ +function wpmem_reset_password() { + global $wpmem; + return $wpmem->user->password_update( 'reset' ); +} +endif; + +/** + * Handles retrieving a forgotten username. + * + * @since 3.0.8 + * @since 3.1.6 Dependencies now loaded by object. + * @since 3.1.8 Now an alias for $wpmem->retrieve_username() in WP_Members_Users Class. + * @since 3.2.4 Moved to user API (could be deprecated). + * + * @global object $wpmem The WP-Members object class. + * + * @return string $regchk The regchk value. + */ +function wpmem_retrieve_username() { + global $wpmem; + return $wpmem->user->retrieve_username(); +} + +/** + * Creates a membership number. + * + * @since 3.1.1 + * @since 3.2.0 Changed "lead" to "pad". + * + * @param array $args { + * @type string $option The wp_options name for the counter setting (required). + * @type string $meta_key The field's meta key (required). + * @type int $start Number to start with (optional, default 0). + * @type int $increment Number to increment by (optional, default 1). + * @type int $digits Number of digits for the number (optional). + * @type boolen $pad Pad leading zeros (optional, default true). + * } + * @return string $membersip_number + */ +function wpmem_create_membership_number( $args ) { + global $wpmem; + return $wpmem->api->generate_membership_number( $args ); +} + +/** + * Activates a user. + * + * If registration is moderated, sets the activated flag + * in the usermeta. Flag prevents login when $wpmem->mod_reg + * is true (1). Function is fired from bulk user edit or + * user profile update. + * + * @uses $wpdb WordPress Database object. + * + * @since 2.4 + * @since 3.1.6 Dependencies now loaded by object. + * @since 3.2.4 Renamed from wpmem_a_activate_user(). + * @since 3.3.0 Moved to user API. + * @since 3.3.5 Added $notify argument. + * @since 3.4.0 Added $set_pwd argument. + * + * @param int $user_id + * @param bool $notify Send notification to user (optional, default: true). + */ +function wpmem_activate_user( $user_id, $notify = true, $set_pwd = false ) { + + global $wpmem; + + // Define new_pass. + $new_pass = ''; + + // If passwords are user defined skip this. + if ( true == $set_pwd || ! wpmem_user_sets_password() ) { + $new_pass = wp_generate_password(); + wp_set_password( $new_pass, $user_id ); + } + + // @todo this should be taken out, use the wpmem_user_activated hook instead. + // If subscriptions can expire, and the user has no expiration date, set one. + if ( $wpmem->use_exp == 1 && ! get_user_meta( $user_id, 'expires', true ) ) { + if ( function_exists( 'wpmem_set_exp' ) ) { + wpmem_set_exp( $user_id ); + } + } + + // Generate and send user approved email to user. + if ( true === $notify ) { + wpmem_email_to_user( $user_id, $new_pass, 2 ); + } + + // Set the active flag in usermeta. + update_user_meta( $user_id, 'active', 1 ); + + /** + * Fires after the user activation process is complete. + * + * @since 2.8.2 + * + * @param int $user_id The user's ID. + */ + do_action( 'wpmem_user_activated', $user_id ); + + return; +} + +/** + * Deactivates a user. + * + * Reverses the active flag from the activation process + * preventing login when registration is moderated. + * + * @since 2.7.1 + * @since 3.2.4 Renamed from wpmem_a_deactivate_user(). + * @since 3.3.0 Moved to user API. + * + * @param int $user_id + */ +function wpmem_deactivate_user( $user_id ) { + update_user_meta( $user_id, 'active', 0 ); + + /** + * Fires after the user deactivation process is complete. + * + * @since 2.9.9 + * + * @param int $user_id The user's ID. + */ + do_action( 'wpmem_user_deactivated', $user_id ); +} + +/** + * Updates the user_status value in the wp_users table. + * + * @since Unknown + * @since 3.3.0 Moved to User API. + * + * @global object $wpdb + * + * @param int $user_id + * @param string $status + */ +function wpmem_set_user_status( $user_id, $status ) { + global $wpdb; + $wpdb->update( $wpdb->users, array( 'user_status' => $status ), array( 'ID' => $user_id ) ); + return; +} + +/** + * Register function. + * + * Handles registering new users and updating existing users. + * + * @since 2.2.1 + * @since 2.7.2 Added pre/post process actions. + * @since 2.8.2 Added validation and data filters. + * @since 2.9.3 Added validation for multisite. + * @since 3.0.0 Moved from wp-members-register.php to /inc/register.php. + * @since 3.3.0 Ported from wpmem_registration in /inc/register.php (now deprecated). + * + * @todo Review what should be in the API function and what should be moved to object classes. + * + * @global int $user_ID + * @global object $wpmem + * @global string $wpmem_themsg + * @global array $userdata + * + * @param string $tag Identifies 'register' or 'update'. + * @return string $wpmem_themsg|success|editsuccess + */ +function wpmem_user_register( $tag ) { + + // Get the globals. + global $user_ID, $wpmem, $wpmem_themsg, $userdata; + + $wpmem->user->register_validate( $tag ); + + // @todo Added as a fix for legacy versions of security extension and any wpmem_pre_register_data action that might null $wpmem_themsg. + if ( $wpmem_themsg ) { + return $wpmem_themsg; + } + + switch ( $tag ) { + + case "register": + + /** + * Filter registration data after validation before data insertion. + * + * @since 2.8.2 + * + * @param array $wpmem->user->post_data An array of the registration field data. + * @param string $tag A switch to indicate the action (new|edit). + */ + $wpmem->user->post_data = apply_filters( 'wpmem_register_data', $wpmem->user->post_data, 'new' ); + + /** + * Fires before any insertion/emails. + * + * This action is the final step in pre registering a user. This + * can be used for attaching custom validation to the registration + * process. It cannot be used for changing any user registration + * data. Use the wpmem_register_data filter for that. + * + * @since 2.7.2 + * + * @param array $wpmem->user->post_data The user's submitted registration data. + */ + do_action( 'wpmem_pre_register_data', $wpmem->user->post_data ); + + // If the _pre_register_data hook sends back an error message. + if ( $wpmem_themsg ) { + return $wpmem_themsg; + } + + // Main new user fields are ready. + $new_user_fields = array ( + 'user_pass' => $wpmem->user->post_data['password'], + 'user_login' => $wpmem->user->post_data['username'], + 'user_nicename' => $wpmem->user->post_data['user_nicename'], + 'user_email' => $wpmem->user->post_data['user_email'], + 'display_name' => $wpmem->user->post_data['display_name'], + 'nickname' => $wpmem->user->post_data['nickname'], + 'user_registered' => $wpmem->user->post_data['user_registered'], + 'role' => $wpmem->user->post_data['user_role'] + ); + + // Get any excluded meta fields. + $wpmem->excluded_meta = wpmem_get_excluded_meta( 'register' ); + + // Fields for wp_insert_user: user_url, first_name, last_name, description. + $new_user_fields_meta = array( 'user_url', 'first_name', 'last_name', 'description' ); + foreach ( $wpmem->fields as $meta_key => $field ) { + if ( in_array( $meta_key, $new_user_fields_meta ) ) { + if ( $field['register'] && ! in_array( $meta_key, $wpmem->excluded_meta ) ) { + $new_user_fields[ $meta_key ] = $wpmem->user->post_data[ $meta_key ]; + } + } + } + + // Inserts to wp_users table. + $user_id = wp_insert_user( $new_user_fields ); + + /** + * Fires after registration is complete. + * + * @since 2.7.1 + * @since 3.1.0 Added $fields + * @since 3.1.7 Changed $fields to $this->post_data + * @since 3.3.0 Moved to registration function. + * @since 3.3.8 Added $user parameter. + * + * @param array $wpmem->user->post_data The user's submitted registration data. + * @param int $user_id + */ + do_action( 'wpmem_register_redirect', $wpmem->user->post_data, $user_id ); + + // successful registration message + return "success"; + break; + + case "update": + + if ( $wpmem_themsg ) { + return "updaterr"; + exit(); + } + + /* + * Doing a check for existing email is not the same as a new reg. check first to + * see if it's different, then check if it is a valid address and it exists. + */ + global $current_user; wp_get_current_user(); + if ( isset( $wpmem->user->post_data['user_email'] ) ) { + if ( $wpmem->user->post_data['user_email'] != $current_user->user_email ) { + if ( email_exists( $wpmem->user->post_data['user_email'] ) ) { + return "email"; + exit(); + } + if ( in_array( 'user_email', $wpmem->fields ) && ! is_email( $wpmem->user->post_data['user_email']) ) { + $wpmem_themsg = wpmem_get_text( 'reg_valid_email' ); + return "updaterr"; + exit(); + } + } + } + + // If form includes email confirmation, validate that they match. + if ( array_key_exists( 'confirm_email', $wpmem->user->post_data ) && $wpmem->user->post_data['confirm_email'] != $wpmem->user->post_data ['user_email'] ) { + $wpmem_themsg = wpmem_get_text( 'reg_email_match' ); + return "updaterr"; + exit(); + } + + // Add the user_ID to the fields array. + $wpmem->user->post_data['ID'] = $user_ID; + + /** This filter is documented in register.php */ + $wpmem->user->post_data = apply_filters( 'wpmem_register_data', $wpmem->user->post_data, 'edit' ); + + /** + * Fires before data insertion. + * + * This action is the final step in pre updating a user. This + * can be used for attaching custom validation to the update + * process. It cannot be used for changing any user update + * data. Use the wpmem_register_data filter for that. + * + * @since 2.7.2 + * + * @param array $wpmem->user->post_data The user's submitted update data. + */ + do_action( 'wpmem_pre_update_data', $wpmem->user->post_data ); + + // If the _pre_update_data hook sends back an error message. + if ( $wpmem_themsg ){ + return "updaterr"; + } + + // A list of fields that can be updated by wp_update_user. + $native_fields = array( + 'user_nicename', + 'user_url', + 'user_email', + 'display_name', + 'nickname', + 'first_name', + 'last_name', + 'description', + 'role', + ); + $native_update = array( 'ID' => $wpmem->user->post_data['ID'] ); + + foreach ( $wpmem->fields as $meta_key => $field ) { + // If the field is not excluded, update accordingly. + if ( ! in_array( $meta_key, wpmem_get_excluded_meta( 'update' ) ) ) { + if ( 'file' != $field['type'] && 'image' != $field['type'] ) { + switch ( $meta_key ) { + + // If the field can be updated by wp_update_user. + case( in_array( $meta_key, $native_fields ) ): + if ( 1 == $field['profile'] ) { + // Prev value in prev_data array. + $wpmem->user->prev_data[ $meta_key ] = $current_user->{$meta_key}; + // Add to post_data array. + $wpmem->user->post_data[ $meta_key ] = ( isset( $wpmem->user->post_data[ $meta_key ] ) ) ? $wpmem->user->post_data[ $meta_key ] : ''; + // Add to native update for settings. + $native_update[ $meta_key ] = $wpmem->user->post_data[ $meta_key ]; + } + break; + + // If the field is password. + case( 'password' ): + // Do nothing. + break; + + // Everything else goes into wp_usermeta. + default: + if ( ( 'register' == $tag && true == $field['register'] ) || ( 'update' == $tag && true == $field['profile'] ) ) { + // Get existing value for prev_data array. + $wpmem->user->prev_data[ $meta_key ] = get_user_meta( $wpmem->user->post_data['ID'], $meta_key, true ); + // Update the value. + update_user_meta( $wpmem->user->post_data['ID'], $meta_key, $wpmem->user->post_data[ $meta_key ] ); + } + break; + } + } + } + } + + // Handle file uploads, if any. + if ( ! empty( $_FILES ) ) { + $wpmem->user->upload_user_files( $wpmem->user->post_data['ID'], $wpmem->fields ); + } + + // Update wp_update_user fields. + wp_update_user( $native_update ); + + /** + * Fires at the end of user update data insertion. + * + * @since 2.7.2 + * + * @param array $wpmem->user->post_data The user's submitted registration data. + * @param int $user_id + * @param array $wpmem->user->prev_data The data for the user prior to update (does not support file and image fields). + */ + do_action( 'wpmem_post_update_data', $wpmem->user->post_data, $wpmem->user->post_data['ID'], $wpmem->user->prev_data ); + + return "editsuccess"; exit(); + break; + } +} // End registration function. + +/** + * Get user IP address. + * + * From Pippin. + * @link https://gist.github.com/pippinsplugins/9641841 + * + * @since 3.3.0 + * @since 3.4.0 Now an alias for rktgk_get_user_ip(); + * + * @return string $ip. + */ +function wpmem_get_user_ip() { + /** + * Filter the IP result. + * + * @since 3.3.0 + * + * @param string $ip + */ + return apply_filters( 'wpmem_get_ip', rktgk_get_user_ip() ); +} + +/** + * Export all or selected users + * + * @since 2.9.7 + * @since 3.2.0 Updated to use fputcsv. + * @since 3.2.1 Added user data filters. + * @since 3.3.0 Call object class static method. + * @since 3.3.4 Moved into general API. + * + * @todo Move object class file to main /includes/ + * + * @global object $wpmem + * + * @param array $args array { + * Array of defaults for export. + * + * @type string $export The type of export (all|selected) + * @type string $filename + * @type array $fields { + * The array of export fields is keyed as 'meta_key' => 'heading value'. + * The array can include fields in the Fields tab, plus the following: + * + * @type int $ID ID from wp_users + * @type string $username user_login from wp_users + * @type string $user_nicename user_nicename + * @type string $user_url user_url + * @type string $display_name display_name + * @type int $active Whether the user is active/deactivated. + * @type string $exp_type If the PayPal extension is installed pending|subscrption (optional) + * @type string $expires If the PayPal extension is installed MM/DD/YYYY (optional) + * @type string $user_registered user_registered + * @type string $user_ip The IP of the user when they registered. + * @type string $role The user's role (or roles, if multiple). + * } + * @type array $exclude_fields @deprecated 3.4.0 + * @type boolean $entity_decode Whether HTML entities should be decoded (default: false) + * @type string $date_format A PHP readable date format (default: Y-m-d which results in YYYY-MM-DD) + * } + * @param array $users Array of user IDs to export. + */ +function wpmem_export_users( $args = array(), $users = array() ) { + global $wpmem; + include_once( $wpmem->path . 'includes/class-wp-members-user-export.php' ); + WP_Members_User_Export::export_users( $args, $users ); +} + +/** + * Gets user ID based on request. + * + * @since 3.3.5 + * + * @param mixed $user + * @return mixed + */ +function wpmem_get_user_id( $user ) { + $user_obj = wpmem_get_user_obj( $user ); + return ( is_object( $user_obj ) ) ? $user_obj->ID : false; +} + +/** + * Gets user object based on request. + * + * @since 3.3.5 + * + * @param mixed $user + * @return mixed + */ +function wpmem_get_user_obj( $user ) { + if ( is_numeric( $user ) ) { + $user_obj = get_userdata( $user ); + if ( $user_obj ) { + return $user_obj; + } + } + if ( strpos( $user, '@' ) ) { + $user_obj = get_user_by( 'email', $user ); + if ( $user_obj ) { + return $user_obj; + } + } + if ( is_string( $user ) ) { + $user_obj = get_user_by( 'login', $user ); + if ( $user_obj ) { + return $user_obj; + } + } + return false; +} + +/** + * Get all users by a meta value. + * + * @since 3.3.5 + * + * @param string $meta The meta key to search fo. + * @param string $value The meta value to search for (defaul:false). + * @return array $users An array of user IDs who have the requested meta. + */ +function wpmem_get_users_by_meta( $meta, $value = "EXISTS" ) { + $args = array( 'fields' => array( 'ID' ), 'meta_key' => $meta ); + if ( false === $value ) { + $args['meta_value'] = ''; + $args['meta_compare'] = 'NOT EXISTS'; + } elseif ( "EXISTS" === $value ) { + $args['meta_value'] = ''; + $args['meta_compare'] = '>'; + } else { + $args['meta_value'] = $value; + } + $results = get_users( $args ); + if ( $results ) { + foreach( $results as $result ) { + $users[] = $result->ID; + } + return $users; + } else { + return array(); + } +} + +/** + * Gets a list of all pending users. + * + * @since 3.3.5 + * + * @return array $users An array of user IDs where meta key "active" does not exist. + */ +function wpmem_get_pending_users() { + return wpmem_get_users_by_meta( 'active', false ); +} + +/** + * Gets a list of all activated users. + * + * @since 3.3.5 + * + * @return array $users An array of user IDs who have the meta key active=1 + */ +function wpmem_get_activated_users() { + return wpmem_get_users_by_meta( 'active', 1 ); +} + +/** + * Gets a list of all deactivated users. + * + * @since 3.3.5 + * + * @return array $users An array of users IDs who have the meta key active=0 + */ +function wpmem_get_deactivated_users() { + return wpmem_get_users_by_meta( 'active', 0 ); +} + +/** + * Sets a user as validated. + * + * @since 3.3.5 + * + * @param int $user_id + * @return void + */ +function wpmem_set_user_as_confirmed( $user_id ) { + global $wpmem; + $wpmem->act_newreg->set_as_confirmed( $user_id ); +} + +/** + * Sets user as unconfirmed (not validated). + * + * @since 3.3.8 + * + * @param int $user_id + * @return void + */ +function wpmem_set_user_as_unconfirmed( $user_id ) { + global $wpmem; + $wpmem->act_newreg->set_as_unconfirmed( $user_id ); +} + +/** + * Checks if a user is confirmed. + * + * @since 3.3.8 + * + * @global object $wpmem + * @param int $user_id + * @return bool + */ +function wpmem_is_user_confirmed( $user_id = false ) { + global $wpmem; + $user_id = ( false === $user_id ) ? get_current_user_id() : $user_id; + return ( get_user_meta( $user_id, $wpmem->act_newreg->validation_confirm, true ) ) ? true : false; +} + +/** + * Adds WP-Members custom fields to the WP Add New User form. + * + * @since 2.9.1 + * @since 3.4.0 Moved from admin.php + * + * @global stdClass $wpmem + */ +function wpmem_admin_add_new_user() { + global $wpmem; + // Output the custom registration fields. + echo $wpmem->forms->wp_newuser_form(); + return; +} + +/** + * Creates a username "placeholder" for the db from + * the user's email. + * + * @since 3.4.6 + * + * @param string $email + * @param array $fields Array of fields + * @return string $username + */ +function wpmem_create_username_from_email( $email, $fields = array() ) { + // If the WooCommerce function exists, use that. + if ( function_exists( 'wc_create_new_customer_username' ) ) { + return wc_create_new_customer_username( $email, $fields ); + } + if ( ! is_email( $email ) ) { + return false; + } + // Extract beginning of email for username + $parts = explode( "@", $email ); + $temp_user = $parts[0]; + + // Make sure it's a unique value. If not, add a number and retest. + if ( username_exists( $temp_user ) ) { + $i = 0; + do { + $i++; + $temp_user = $temp_user . $i; + } while ( username_exists( $temp_user ) ); + } + + return $temp_user; +} +// End of file. \ No newline at end of file diff --git a/includes/api/api-utilities.php b/includes/api/api-utilities.php new file mode 100644 index 00000000..38159c36 --- /dev/null +++ b/includes/api/api-utilities.php @@ -0,0 +1,304 @@ +do_securify(). + * + * @since 2.0.0 + * @since 3.0.0 Now an alias for $wpmem->do_securify(). + * @since 3.2.4 Moved to utility API (could be deprecated). + * + * @global object $wpmem The WP-Members object class. + * + * @param string $content Content of the current post. + * @return string $content Content of the current post or replaced content if post is blocked and user is not logged in. + */ +function wpmem_securify( $content = null ) { + global $wpmem; + return $wpmem->do_securify( $content ); +} +endif; + +/** + * Sets an array of user meta fields to be excluded from update/insert. + * + * @since 2.9.3 + * @since Unknown Now an alias for get_excluded_fields(). + * @since 3.3.9 excluded_fields() moved to forms object class. + * + * @param string $tag A tag so we know where the function is being used. + * @return array Array of fields to be excluded from the registration form. + */ +function wpmem_get_excluded_meta( $tag ) { + global $wpmem; + return $wpmem->forms->excluded_fields( $tag ); +} + +/** + * Forces a URL to be secure (ssl). + * + * @since 3.2.3 + * @since 3.4.0 Now an alias for rktgk_force_ssl() + * + * @param string $url URL to be make secure. + * @return string The secure URL. + */ +function wpmem_force_ssl( $url ) { + return rktgk_force_ssl( $url ); +} + +/** + * Log debugging errors. + * + * @since 3.1.2 + * @since 3.4.0 Now an alias for rktgk_write_log(). + * + * @param mixed (string|array|object) $log Information to write in the WP debug file. + */ +function wpmem_write_log( $log ) { + rktgk_write_log( $log ); +} + +/** + * String manipulation utility. + * + * Manipulates a given string based on the location of another string to return + * a requested part or parts of the original string. For extracting a string + * to get what is before or after, the returned result is a string. If the + * string is requested to be "split" by the needle string, an array containing + * the parts before, after, and the "needle" are returned. + * + * @since 3.2.0 + * @since 3.4.0 Now an alias for rktgk_get_sub_str(). + * + * @param string $needle + * @param string $haystack + * @param string $position (before|after|split default: 'after') + * @param boolean $keep_needle (default:true) + * @return string|array $new { + * An array of the original string, as split by the "needle" string. + * + * @type string $before + * @type string $after + * @type string $needle + * } + */ +function wpmem_get_sub_str( $needle, $haystack, $position = 'after', $keep_needle = true ) { + return rktgk_get_sub_str( $needle, $haystack, $position, $keep_needle ); +} + +if ( ! function_exists( 'wpmem_do_excerpt' ) ): +/** + * Creates an excerpt on the fly if there is no 'more' tag. + * + * @since 2.6 + * @since 3.2.3 Now an alias for WP_Members::do_excerpt(). + * + * @global object $wpmem The WP_Members object. + * + * @param string $content + * @return string $content + */ +function wpmem_do_excerpt( $content ) { + global $wpmem; + $content = $wpmem->do_excerpt( $content ); + return $content; +} +endif; + +if ( ! function_exists( 'wpmem_texturize' ) ): +/** + * Overrides the wptexturize filter. + * + * Currently only used for the login form to remove the
    tag that WP puts in after the "Remember Me". + * + * @since 2.6.4 + * @since 3.2.3 Now an alias for WP_Members::texturize(). + * @deprecated 3.4.0. No replacement available. + * + * @todo Possibly deprecate or severely alter this process as its need may be obsolete. + * + * @global object $wpmem + * @param string $content + * @return string $new_content + */ +function wpmem_texturize( $content ) { + global $wpmem; + //return $wpmem->texturize( $content ); + return $content; +} +endif; + +/** + * Inserts array items at a specific point in an array. + * + * @since 3.1.6 + * @since 3.2.3 Moved to utilities api. + * @since 3.4.0 Now an alias for rktgk_array_insert() + * + * @param array $array Original array. + * @param array $new Array of new items to insert into $array. + * @param string $key Array key to insert new items before or after. + * @param string $loc Location to insert relative to $key (before|after) default:after. + * @return array Original array with new items inserted. + */ +function wpmem_array_insert( array $array, array $new, $key, $loc = 'after' ) { + return rktgk_array_insert( $array, $new, $key, $loc ); +} + +/** + * Wrapper for load_dropins() + * + * @since 3.1.4 + * @since 3.2.3 Moved to utilities api. + * + * @global object $wpmem The WP_Members object. + */ +function wpmem_load_dropins() { + global $wpmem; + $wpmem->load_dropins(); +} + +/** + * Display a localized date based on the WP date format setting. + * + * @since 3.2.4 + * @since 3.4.0 Now an alias for rktgk_format_date(). + * + * @param mixed $args + * @return date $date + */ +function wpmem_format_date( $args ) { + /** + * Filter the date display and format settings. + * + * @since 3.2.4 + * @deprecated 3.4.0 Use rktgk_format_date instead. + * + * @param arrag $args + */ + $args = apply_filters( 'wpmem_format_date_args', $args ); + return rktgk_format_date( $args ); +} + +/** + * Call a shortcode function by tag name. + * + * Use this function for directly calling a shortcode without using do_shortcode. + * do_shortcode() runs an extensive regex that goes through every shortcode in + * the WP global $shortcode_tags. That's a lot of processing wasted if all you + * want to do is run a specific shortcode/function. Yes, you could run the callback + * directly, but what if that callback is in a class instance method? This utlitiy + * allows you to run a shortcode function directly, regardless of whether it is + * a direct function or in a class. It comes from an article by J.D. Grimes on this + * subject and I've provided a link to that article. + * + * @author J.D. Grimes + * @link https://codesymphony.co/dont-do_shortcode/ + * + * @since 3.2.5 + * @since 3.4.0 Now an alias for rktgk_do_shortcode(). + * + * @param string $tag The shortcode whose function to call. + * @param array $atts The attributes to pass to the shortcode function. Optional. + * @param array $content The shortcode's content. Default is null (none). + * + * @return string|bool False on failure, the result of the shortcode on success. + */ +function wpmem_do_shortcode( $tag, array $atts = array(), $content = null ) { + return rktgk_do_shortcode( $tag, $atts, $content ); +} + +/** + * Checks if a password is part of registration. + * + * Used for moderated registration to determine if a user sets their + * own password at registration. If so, password is not set during + * user activation. + * + * @since 3.3.0 + */ +function wpmem_user_sets_password() { + $chk_pass = false; + $wpmem_fields = wpmem_fields(); + foreach ( $wpmem_fields as $field ) { + if ( $field['type'] == 'password' && $field['register'] ) { + $chk_pass = true; + break; + } + } + return $chk_pass; +} + +/** + * Better unserialization than WP's maybe_unserialize(). + * + * Sanitizes array output before returning. If the unserialized result is an + * array, then it runs the result through wpmem_sanitize_array(), which + * sanitizes each individual array element. + * + * @since 3.3.0 + * @since 3.4.0 Now an alias for rktgk_maybe_unserialize(). + * + * @param mixed $original + * @return mixed $original + */ +function wpmem_maybe_unserialize( $original ) { + return rktgk_maybe_unserialize( $original ); +} + +/** + * Determines whether to use a .min suffix for a script/style file. + * + * @since 3.3.0 + * @since 3.4.0 Now an alias for rktgk_get_suffix(). + * + * @param boolean $echo + */ +function wpmem_get_suffix( $echo = false ) { + return rktgk_get_suffix( $echo ); +} + +/** + * A utility to determine a redirect_to param. + * + * @since 3.4.0 + * + * @param array $args + * @return string $redirect_to + */ +function wpmem_get_redirect_to( $args = array() ) { + // redirect_to in the form or URL will override a redirect set in the form args. + if ( isset( $_REQUEST['redirect_to'] ) ) { + $redirect_to = $_REQUEST['redirect_to']; + } else { + if ( isset( $args['redirect_to'] ) ) { + $raw_redirect_to = $args['redirect_to']; + // Is it a URL? + $redirect_to = ( false == filter_var( $raw_redirect_to, FILTER_VALIDATE_URL ) ) ? home_url( $raw_redirect_to ) : $raw_redirect_to; + } else { + $redirect_to = ( isset( $_SERVER['REQUEST_URI'] ) ) ? $_SERVER['REQUEST_URI'] : get_permalink(); + } + } + return $redirect_to; +} \ No newline at end of file diff --git a/includes/api/api.php b/includes/api/api.php new file mode 100644 index 00000000..bf99cbf9 --- /dev/null +++ b/includes/api/api.php @@ -0,0 +1,650 @@ +is_blocked( $post_id ); +} + +/** + * Checks if specific post is marked as hidden. + * + * @since 3.3.2 + * + * @param int $post_id + * @return bool $block True if content is hidden, otherwise false. + */ +function wpmem_is_hidden( $post_id = false ) { + return ( 2 == get_post_meta( $post_id, '_wpmem_block', true ) ) ? true : false; +} + +/** + * Returns the block setting for a post. + * + * @since 3.3.0 + * + * @global object $wpmem + * + * @param int $post_id + * @return int $block_value + */ +function wpmem_get_block_setting( $post_id ) { + return get_post_meta( $post_id, '_wpmem_block', true ); +} + +/** + * Gets a link to the login page with a return link redirect_to value. + * + * @since 3.4.6 + * + * @param array $args { + * Additional attributes to be merged with defaults. + * + * @type string $tag The HTML tag to be used (default: a) + * @type array $attributes { + * Any valid attributes for the HTML tag. + * + * @type string $id + * @type string $class + * @type string $href + * } + * @type string $content The text used with the tag + * } + */ +function wpmem_get_login_link( $args = array() ) { + $defaults = array( + 'tag' => 'a', + 'attributes' => array( + 'id' => 'wpmem_login_link', + 'class' => 'wpmem-login-link', + 'href' => wpmem_login_url( wpmem_current_url() ), + ), + 'content' => __( 'Log In' ) + ); + $args = rktgk_wp_parse_args( $args, $defaults ); + return rktgk_build_html_tag( $args ); +} + +/** + * Echos a login link using wpmem_get_login_link(). + * + * @since 3.5.6 + */ +function wpmem_login_link( $args = array() ) { + echo wpmem_get_login_link( $args ); +} + +/** + * Gets a link to the register page with a return link redirect_to value. + * + * @since 3.4.6 + * + * @param array $args { + * Additional attributes to be merged with defaults. + * + * @type string $tag The HTML tag to be used (default: a) + * @type array $attributes { + * Any valid attributes for the HTML tag. + * + * @type string $id + * @type string $class + * @type string $href + * } + * @type string $content The text used with the tag + * } + */ +function wpmem_get_reg_link( $args = array() ) { + $defaults = array( + 'tag' => 'a', + 'attributes' => array( + 'id' => 'wpmem_reg_link', + 'class' => 'wpmem-reg-link', + 'href' => add_query_arg( 'redirect_to', wpmem_current_url(), wpmem_register_url() ), + ), + 'content' => __( 'Register' ) + ); + $args = rktgk_wp_parse_args( $args, $defaults ); + return rktgk_build_html_tag( $args ); +} + +/** + * Echos a login link using wpmem_get_reg_link(). + * + * @since 3.5.6 + */ +function wpmem_reg_link( $args = array() ) { + echo wpmem_get_reg_link( $args ); +} + +/** + * Wrapper to get the login page location. + * + * @since 3.1.1 + * @since 3.1.2 Added redirect_to parameter. + * @since 3.4.0 If no login page is set, return the wp_login_url(). + * + * @global object $wpmem The WP_Members object. + * @param string $redirect_to URL to return to (optional). + * @return string $url The login page url. + */ +function wpmem_login_url( $redirect_to = false ) { + global $wpmem; + // If no login page is set, get WP login url. + $login_url = ( isset( $wpmem->user_pages['login'] ) ) ? $wpmem->user_pages['login'] : wp_login_url(); + if ( $redirect_to ) { + $url = add_query_arg( 'redirect_to', urlencode( $redirect_to ), $login_url ); + } else { + $url = $login_url; + } + return $url; +} + +/** + * Wrapper to get the register page location. + * + * @since 3.1.1 + * + * @global object $wpmem The WP_Members object. + * @return string The register page url. + */ +function wpmem_register_url() { + global $wpmem; + return $wpmem->user_pages['register']; +} + +/** + * Wrapper to get the profile page location. + * + * @since 3.1.1 + * @since 3.1.2 Added $a parameter. + * + * @global object $wpmem The WP_Members object. + * @param string $a Action (optional). + * @return string The profile page url. + */ +function wpmem_profile_url( $a = false ) { + global $wpmem; + return ( $a ) ? add_query_arg( 'a', $a, trailingslashit( $wpmem->user_pages['profile'] ) ) : $wpmem->user_pages['profile']; +} + +/** + * Alias of wpmem_profile_url() to return the password reset URL. + * + * @since 3.4.5 + * + * @return string The password reset url. + */ +function wpmem_pwd_reset_url() { + return wpmem_profile_url( 'pwdreset' ); +} + +/** + * Alias of wpmem_profile_url() to return the forgot username URL. + * + * @since 3.4.5 + * + * @return string The pforgot username url. + */ +function wpmem_forgot_username_url() { + return wpmem_profile_url( 'getusername' ); +} + +/** + * Returns an array of user pages. + * + * @since 3.1.2 + * @since 3.1.3 Added array keys. + * + * @return array $pages { + * The URLs of login, register, and user profile pages. + * + * @type string $login + * @type string $register + * @type string $profile + * } + */ +function wpmem_user_pages() { + $pages = array( + 'login' => trailingslashit( wpmem_login_url() ), + 'register' => trailingslashit( wpmem_register_url() ), + 'profile' => trailingslashit( wpmem_profile_url() ), + ); + return $pages; +} + +/** + * Returns the current full url. + * + * @since 3.1.1 + * @since 3.1.7 Added check for query string. + * + * @global object $wp + * @param boolean $slash Trailing slash the end of the url (default:true). + * @param boolean $getq Toggles getting the query string (default:true). + * @return string $url The current page full url path. + */ +function wpmem_current_url( $slash = true, $getq = true ) { + global $wp; + $url = home_url( add_query_arg( array(), $wp->request ) ); + $url = ( $slash ) ? trailingslashit( $url ) : $url; + $url = ( $getq && count( $_GET ) > 0 ) ? $url . '?' . $_SERVER['QUERY_STRING'] : $url; + return $url; +} + +/** + * Gets post ID of current URL. + * + * @since 3.1.7 + * + * @return int Post ID. + */ +function wpmem_current_post_id() { + return url_to_postid( wpmem_current_url() ); +} + +/** + * Returns or displays the user's login status. + * + * @since 2.0.0 + * @since 3.1.2 Moved to api.php, no longer pluggable. + * @since 3.1.6 Dependencies now loaded by object. + * @since 3.4.0 Added $tag for id'ing useage, to be passed through filter. + * + * @global string $user_login + * @param boolean $echo Determines whether function should print result or not (default: true). + * @return string $status The user status string produced by wpmem_inc_memberlinks(). + */ +function wpmem_login_status( $echo = true, $tag = false ) { + if ( is_user_logged_in() ) { + + global $user_login; + + $args = array( + 'wrapper_before' => '

    ', + 'wrapper_after' => '

    ', + 'user_login' => $user_login, + 'welcome' => wpmem_get_text( 'status_welcome' ), + 'logout_text' => wpmem_get_text( 'status_logout' ), + 'logout_link' => '
    %s', + 'separator' => ' | ', + ); + /** + * Filter the status message parts. + * + * @since 2.9.9 + * @since 3.4.0 Added $tag as a parameter (most often will be false). + * + * @param array $args { + * The components of the links. + * + * @type string $wrapper_before The wrapper opening tag (default:

    ). + * @type string $wrapper_after The wrapper closing tag (default:

    ). + * @type string $user_login + * @type string $welcome + * @type string $logout_text + * @type string $logout_link + * @type string $separator + * } + * @param string $tag + */ + $args = apply_filters( 'wpmem_status_msg_args', $args, $tag ); + + // Assemble the message string. + $status = $args['wrapper_before'] + . sprintf( $args['welcome'], $args['user_login'] ) + . $args['separator'] + . sprintf( $args['logout_link'], $args['logout_text'] ) + . $args['wrapper_after']; + } + + if ( $echo ) { + echo $status; + } else { + return $status; + } +} + +/** + * Utility function to validate $_POST, $_GET, and $_REQUEST. + * + * While this function retrieves data, remember that the data should generally be + * sanitized or escaped depending on how it is used. + * + * @since 3.1.3 + * @since 3.4.0 Now an alias for rktgk_get(). + * + * @param string $tag The form field or query string. + * @param string $default The default value (optional). + * @param string $type post|get|request (optional). + * @return string + */ +function wpmem_get( $tag, $default = '', $type = 'post' ) { + return rktgk_get( $tag, $default, $type ); +} + +/** + * Compares wpmem_reg_page value with the register page URL. + * + * @since 3.1.4 + * @since 3.1.7 Added default of current page ID. + * + * @param string|int $check_page + * @return bool + */ +function wpmem_is_reg_page( $check = false ) { + if ( ! $check ) { + $check = get_the_ID(); + } else { + if ( ! is_int( $check ) ) { + global $wpdb; + $sql = "SELECT ID FROM $wpdb->posts WHERE post_name = '$check' AND post_status = 'publish' LIMIT 1"; + $arr = $wpdb->get_results( $sql, ARRAY_A ); + $check = $arr[0]['ID']; + } + } + $reg_page = wpmem_get( 'wpmem_reg_page' ); + $check_page = get_permalink( $check ); + return ( $check_page == $reg_page ) ? true : false; +} + +/** + * Creates a login/logout link. + * + * @since 3.1.6 + * + * @param array $args { + * Array of arguments to customize output. + * + * @type string $login_redirect_to The url to redirect to after login (optional). + * @type string $logout_redirect_to The url to redirect to after logout (optional). + * @type string $login_text Text for the login link (optional). + * @type string $logout_text Text for the logout link (optional). + * } + * @param boolean $echo (default: false) + * @return string $link + */ +function wpmem_loginout( $args = array(), $echo = false ) { + global $wpmem; + return $wpmem->loginout_args( $args ); +} + +/** + * Returns a URL to log a user out. + * + * @since 3.4.0 + * + * @return string Logout link. + */ +function wpmem_logout_link() { + /** + * Filter the log out link. + * + * @since 2.8.3 + * + * @param string The default logout link. + */ + return apply_filters( 'wpmem_logout_link', add_query_arg( 'a', 'logout' ) ); +} + +/** + * Wrapper to return a string from the get_text function. + * + * @since 3.4.0 + * + * @global object $wpmem The WP_Members object. + * @param string $str The string to retrieve. + * @param bool $echo Print the string (default: false). + * @return string $str The localized string. + */ +function wpmem_get_text( $str, $echo = false ) { + global $wpmem; + if ( $echo ) { + echo $wpmem->dialogs->get_text( $str ); + } else { + return $wpmem->dialogs->get_text( $str ); + } +} + +/** + * Gets requested dialog. + * + * @since 3.4.0 + * + * @note It is being relased now as tentative. + * There may be some changes to how this is applied. + * + * @todo What about wpmem_use_custom_dialog()? + * + * @global stdClass $wpmem + * @param string $tag + * @param string $custom + * @return + */ +function wpmem_get_display_message( $tag, $custom = false ) { + global $wpmem; + return $wpmem->dialogs->get_message( $tag, $custom ); +} + +/** + * Dispalays requested dialog. + * + * @note It is being relased now as tentative. + * There may be some changes to how this is applied. + * + * @since 3.2.0 + * @since 3.4.0 Now echos the message. Added $custom argument + * + * @todo What about wpmem_use_custom_dialog()? + * + * @global stdClass $wpmem + * @param string $tag + * @param string $custom + * @return + */ +function wpmem_display_message( $tag, $custom = false ) { + echo wpmem_get_display_message( $tag, $custom ); +} + +/** + * Wrapper to use custom dialog. + * + * @since 3.1.1 + * + * @param array $defaults Dialog message defaults from the wpmem_msg_defaults filter. + * @param string $tag The dialog tag/name. + * @param array $dialogs The dialog settings array (passed through filter). + * @return array $dialogs The dialog settings array (filtered). + */ +function wpmem_use_custom_dialog( $defaults, $tag, $dialogs ) { + $msg_string = ( is_array( $dialogs[ $tag ] ) ) ? $dialogs[ $tag ]['value'] : $dialogs[ $tag ]; + $defaults['msg'] = __( $msg_string, 'wp-members' ); + return $defaults; +} + +/** + * Wrapper function for adding custom dialogs. + * + * @since 3.1.1 + * @since 3.3.0 Moved to main API. + * + * @param array $dialogs Dialog settings array. + * @param string $tag Slug for dialog to be added. + * @param string $msg The dialog message. + * @param string $label Label for admin panel. + * @return array $dialogs Dialog settings array with prepped custom dialog added. + */ +function wpmem_add_custom_dialog( $dialogs, $tag, $msg, $label ) { + $msg = ( ! isset( $dialogs[ $tag ] ) ) ? $msg : $dialogs[ $tag ]; + $dialogs[ $tag ] = array( + 'name' => $tag, + 'label' => $label, + 'value' => $msg, + ); + return $dialogs; +} + +/** + * Gets an array of hidden post IDs. + * + * @since 3.3.1 + * + * @global stdClass $wpmem + * @return array + */ +function wpmem_get_hidden_posts() { + global $wpmem; + return $wpmem->get_hidden_posts(); +} + +/** + * Updates the hiddent posts array. + * + * @since 3.3.5 + * + * @global stdClass $wpmem + */ +function wpmem_update_hidden_posts() { + global $wpmem; + $wpmem->update_hidden_posts(); +} + +/** + * Conditional if REST request. + * + * @since 3.3.2 + * + * @global stdClass $wpmem + * @return boolean + */ +function wpmem_is_rest() { + global $wpmem; + return $wpmem->is_rest; +} + +/** + * Gets registration type. + * + * @since 3.3.5 + * + * @global stdClass $wpmem + * @param string $type (wpmem|native|add_new|woo|woo_checkout) + * @return boolean + */ +function wpmem_is_reg_type( $type ) { + global $wpmem; + return $wpmem->user->reg_type[ 'is_' . $type ]; +} + +/** + * Displays the post restricted message. + * + * @since 3.4.0 + * + * @return string + */ +function wpmem_restricted_message() { + global $wpmem; + return $wpmem->forms->add_restricted_msg(); +} + +/** + * Gets plugin url. + * + * @since 3.4.1 + * + * @global stdClass $wpmem + * @return string $wpmem->url + */ +function wpmem_get_plugin_url() { + global $wpmem; + return $wpmem->url; +} + +/** + * Gets plugin version. + * + * @since 3.4.1 + * + * @global stdClass $wpmem + * @return string $wpmem->version + */ +function wpmem_get_plugin_version() { + global $wpmem; + return $wpmem->version; +} + +/** + * Checks whether a WooCommerce product is purchasable. + * + * If a product is blocked or requires a membership, this function + * will return false if the user lacks the wpmem criteria to access. + * + * @since 3.4.7 + * + * @param boolean $is_purchasable + * @param object $product The WooCommerce product object. + */ +function wpmem_woo_is_purchasable( $is_purchasable, $product ) { + + // If product is blocked and or membership required, + // check access and return appropriate boolean. + + if ( ! is_user_logged_in() ) { + return false; + } + + if ( ! wpmem_user_has_access( wpmem_get_post_memberships( $product->get_id() ) ) ) { + return false; + } + + return $is_purchasable; +} +// End of file. \ No newline at end of file diff --git a/includes/api/index.php b/includes/api/index.php new file mode 100644 index 00000000..dc051a13 --- /dev/null +++ b/includes/api/index.php @@ -0,0 +1 @@ + $field ) { + $field_keys[ $field[2] ] = $key; + } + return $field_keys; + } + + /** + * Get select field display values. + * + * @since 3.1.1 + * + * @param string $meta_key The field's meta key. + * @return array $display_values { + * The field's display values in an array. + * Elements are stored_value => display value + * + * @type string The display value. + * } + */ + function get_select_display_values( $meta_key ) { + global $wpmem; + $keys = $this->get_field_keys_by_meta(); + $fields = wpmem_fields(); + $raw = $fields[ $keys[ $meta_key ] ][7]; + $delimiter = ( isset( $fields[ $keys[ $meta_key ][8] ] ) ) ? $fields[ $keys[ $meta_key ][8] ] : '|'; + $display_values = array(); + foreach ( $raw as $value ) { + $pieces = explode( $delimiter, trim( $value ) ); + if ( $pieces[1] != '' ) { + $display_values[ $pieces[1] ] = $pieces[0]; + } + } + return $display_values; + } + + /** + * Gets the display/label value of a field. + * + * @since 3.1.8 + * + * @param string $meta The field meta key. + * @param string $user_id The user's ID. + * @param string $value The field's value, if given. + * @return string $value The display value. + */ + function get_field_display_value( $meta, $user_id, $value = null ) { + global $wpmem; + $fields = ( isset( $wpmem->fields ) ) ? $wpmem->fields : wpmem_fields(); + $field = $fields[ $meta ]; + $value = ( $value ) ? $value : get_user_meta( $user_id, $meta, true ); + switch ( $field['type'] ) { + case 'multiselect': + case 'multicheckbox': + break; + case 'select': + case 'radio': + $value = $fields[ $meta ]['options'][ $value ]; + break; + case 'image': + case 'file': + $value = wp_get_attachment_url( $value ); + break; + } + return $value; + } + + /** + * Checks that a given user field value is unique. + * + * @since 3.1.1 + * + * @param string $key The field being checked. + * @param string $val The value to check. + * @return bool True if value if is unique. + */ + function is_user_value_unique( $key, $val ) { + + $fields = array( 'ID','user_login','user_pass','user_nicename','user_email','user_url','user_registered','user_activation_key','user_status','display_name' ); + // Do we need a meta query or not? + $is_meta = ( ! in_array( $key, $fields ) ) ? true : false; + + if ( $is_meta ) { + $args = array( 'meta_query' => array( array( + 'key' => $key, + 'value' => $val, + 'compare' => '=', + ) ) ); + } else { + $args = array( 'search' => $val, 'fields' => 'ID' ); + } + + $users = get_users( $args ); + + // If there is data in $users, the value is not unique. + return ( $users ) ? false : true; + } + + /** + * Checks counter for next available number and updates the counter. + * + * @since 3.1.1 + * + * @param string $option The wp_options name for the counter setting (required). + * @param int $start Number to start with (optional, default 0). + * @param int $increment Number to increment by (optional, default 1). + * @return int $number Next number in the series. + */ + function get_incremental_number( $option, $start = 0, $increment = 1 ) { + + // Get current number from settings + $number = get_option( $option ); + + // If there is no number, start with $start. + if ( ! $number ) { + $number = ( $start <= 0 ) ? $start : $start - $increment; + } + + // Increment the number and save the setting. + $number = $number + $increment; + update_option( $option, $number ); + + // Return the number. + return $number; + } + + /** + * Generates a unique membership number based on settings. + * + * @since 3.1.1 + * @since 3.2.0 Changed "lead" value to "pad". + * + * @param array $args { + * @type string $option The wp_options name for the counter setting (required). + * @type string $meta_key The field's meta key (required). + * @type int $start Number to start with (optional, default 0). + * @type int $increment Number to increment by (optional, default 1). + * @type int $digits Number of digits for the number (optional). + * @type boolen $pad Pad leading zeros (optional, default true). + * } + * @return string $mem_number + */ + function generate_membership_number( $args ) { + $defaults = array( + 'start' => 0, + 'increment' => 1, + 'digits' => 8, + 'pad' => true, + ); + $args = wp_parse_args( $args, $defaults ); + do { + // Generate the appropriate next number + $number = $this->get_incremental_number( $args['option'], $args['start'], $args['increment'] ); + + // Cast as string, not integer. + $mem_number = (string)$number; + + // Add leading zeros if less than three digits. + if ( strlen( $mem_number ) < $args['digits'] ) { + $mem_number = ( $args['pad'] ) ? str_pad( $mem_number, $args['digits'], '0', STR_PAD_LEFT ) : $mem_number; + } + } while ( true !== $this->is_user_value_unique( $args['meta_key'], $mem_number ) ); + return $mem_number; + } + + /** + * Checks if a given setting is set and enabled. + * + * @since 3.1.7 + * + * @global object $wpmem + * @param string $setting + * @return boolean + */ + function is_enabled( $setting ) { + return ( isset( $wpmem->{$setting} ) && $wpmem->{$setting} ) ? true : false; + } + +} // End of WP_Members_Utilties class. \ No newline at end of file diff --git a/includes/class-wp-members-captcha.php b/includes/class-wp-members-captcha.php new file mode 100644 index 00000000..faeda6d4 --- /dev/null +++ b/includes/class-wp-members-captcha.php @@ -0,0 +1,411 @@ +captcha; + switch ( $value ) { + case 0: + return "Disabled"; + break; + case 1: + case 3: + return "recaptcha_v2"; + break; + case 4: + return "recaptcha_v3"; + break; + case 5: + return "hcaptcha"; + break; + case 2: + default: + return "rs_captcha"; + break; + } + } + + /** + * Display a CAPTCHA. + * + * @since 3.3.4 + * @since 3.3.6 $type defaults to false, so captcha defaults to $wpmem setting. + * + * @param string $type Type of captcha to display. + * @param array $keys Google reCAPTCHA keys (if used). + */ + static function show( $type = false, $key = false ) { + if ( false === $type ) { + $type = self::type(); + } + if ( 'rs_captcha' == $type ) { + return self::rs_captcha(); + } elseif ( 'hcaptcha' == $type ) { + return self::hcaptcha( $key ); + } else { + return self::recaptcha( $key ); + } + } + + /** + * Create a hCaptcha form. + * + * @since 3.3.5 + * + * @param string $key Your hCaptcha API key. + * @return string $html The form HTML. + */ + static function hcaptcha( $key = false ) { + + if ( false === $key ) { + $opts = get_option( 'wpmembers_captcha' ); + $key = $opts['hcaptcha']['api_key']; + } + $html = '
    '; + $html .= ''; + /** This filter is defined in /includes/class-wp-members-captcha.php */ + return apply_filters( 'wpmem_captcha', $html ); + } + + /** + * Create reCAPTCHA form. + * + * @since 3.3.0 Replaces wpmem_inc_recaptcha(). + * @since 3.3.5 Accepts API public key for static use. + * + * @global stdCalss $wpmem + * @param string $key Your reCAPTCHA public key. + * @return string $html HTML for reCAPTCHA display. + */ + static function recaptcha( $key = false ) { + + global $wpmem; + + if ( false == $key ) { + $opts = get_option( 'wpmembers_captcha' ); + $key = $opts['recaptcha']['public']; + } + + /** + * Filters the URL used for google recaptcha API. + * + * @since 3.4.2 + * + * @param string $url + */ + $wpmem_recaptcha_url = apply_filters( 'wpmem_recaptcha_url', 'https://www.google.com/recaptcha/api.js' ); + + if ( 3 == $wpmem->captcha ) { + $html = ' +
    '; + } else { + $html = ''; + $html.= ""; + $html.= ''; + } + + /** + * Filter the reCAPTCHA HTML. + * + * @since 2.7.4 + * @deprecated 3.3.5 Use wpmem_captcha instead. + * + * @param string $html A string of HTML for the reCAPTCHA. + */ + $html = apply_filters( 'wpmem_recaptcha', $html ); + + /** + * Filter the captcha HTML. + * + * @since 3.3.5 + * + * @param string $html A string of HTML for the registration captcha. + */ + return apply_filters( 'wpmem_captcha', $html ); + } + + /** + * Create Really Simple CAPTCHA. + * + * @since 3.3.0 Replaces wpmem_build_rs_captcha(). + * + * @global object $wpmem The WP_Members object. + * @return string|array { + * HTML string, OR array of form elements for Really Simple CAPTCHA. + * + * @type string label_text The raw text used for the label. + * @type string label The HTML for the label. + * @type string field The input tag and the CAPTCHA image. + * } + */ + static function rs_captcha( $return = 'string' ) { + + global $wpmem; + + if ( defined( 'REALLYSIMPLECAPTCHA_VERSION' ) ) { + // setup defaults + $defaults = array( + 'characters' => 'ABCDEFGHJKLMNPQRSTUVWXYZ23456789', + 'num_char' => '4', + 'dim_w' => '72', + 'dim_h' => '30', + 'font_color' => '0,0,0', + 'bg_color' => '255,255,255', + 'font_size' => '12', + 'kerning' => '14', + 'img_type' => 'png', + ); + $opts = get_option( 'wpmembers_captcha' ); + + $args = ( isset( $opts['really_simple'] ) && is_array( $opts['really_simple'] ) ) ? $opts['really_simple'] : array(); + $args = wp_parse_args( $args, $defaults ); + + $rs_captcha = new ReallySimpleCaptcha(); + $rs_captcha->chars = $args['characters']; + $rs_captcha->char_length = $args['num_char']; + $rs_captcha->img_size = array( $args['dim_w'], $args['dim_h'] ); + $rs_captcha->fg = explode( ",", $args['font_color'] ); + $rs_captcha->bg = explode( ",", $args['bg_color'] ); + $rs_captcha->font_size = $args['font_size']; + $rs_captcha->font_char_width = $args['kerning']; + $rs_captcha->img_type = $args['img_type']; + + $rs_captcha_word = $rs_captcha->generate_random_word(); + $rs_captcha_prefix = mt_rand(); + $rs_captcha_image_name = $rs_captcha->generate_image( $rs_captcha_prefix, $rs_captcha_word ); + + /** + * Filters the default Really Simple Captcha folder location. + * + * @since 3.0 + * + * @param string The default location of RS Captcha. + */ + $rs_captcha_image_url = apply_filters( 'wpmem_rs_captcha_folder', get_bloginfo( 'wpurl' ) . '/wp-content/plugins/really-simple-captcha/tmp/' ); + + $img_w = $rs_captcha->img_size[0]; + $img_h = $rs_captcha->img_size[1]; + $src = $rs_captcha_image_url . $rs_captcha_image_name; + $size = $rs_captcha->char_length; + $pre = $rs_captcha_prefix; + + /** + * Filter the RS CAPTCHA HTML. + * + * @since 3.3.5 + * + * @param array + */ + $rows = apply_filters( 'wpmem_rs_captcha_rows', array( + 'label_text' => wpmem_get_text( 'register_rscaptcha' ), + 'code_size' => esc_attr( $size ), + 'prefix' => $pre, + 'img_src' => esc_url( $src ), + 'img_w' => esc_attr( $img_w ), + 'img_h' => esc_attr( $img_h ), + 'label' => '', + 'field' => '', + 'hidden' => '', + 'img' => 'captcha', + ) ); + + if ( 'array' == $return ) { + return $rows; + } else { + $html = $rows['label'] . $rows['img'] . $rows['hidden'] . $rows['field']; + /** This filter is defined in /includes/class-wp-members-captcha.php */ + return apply_filters( 'wpmem_captcha', $html ); + } + } else { + return ( 'array' == $return ) ? array( 'field' => "Really Simple CAPTCHA is not enabled", 'label' => '', 'label_text' => '', 'img' => '', 'hidden' => '' ) : "Really Simple CAPTCHA is not enabled"; + } + } + + /** + * Process a captcha. + * + * @since 3.1.6 + * @since 3.3.0 Ported from wpmem_register_handle_captcha() in register.php. + * @since 3.3.4 Added argument to specify which captcha type to validate. + * + * @global $wpmem + * @global $wpmem_themsg + * @param $which_captcha + * @return $string + */ + static function validate( $which_captcha = false, $secret = false ) { + + global $wpmem, $wpmem_themsg; + + $captcha = ( ! $which_captcha ) ? self::type() : $which_captcha; + + if ( 'rs_captcha' == $captcha ) { + if ( defined( 'REALLYSIMPLECAPTCHA_VERSION' ) ) { + // Validate Really Simple Captcha. + $rs_captcha = new ReallySimpleCaptcha(); + // This variable holds the CAPTCHA image prefix, which corresponds to the correct answer. + $rs_captcha_prefix = ( isset( $_POST['captcha_prefix'] ) ) ? sanitize_text_field( $_POST['captcha_prefix'] ) : ''; + // This variable holds the CAPTCHA response, entered by the user. + $rs_captcha_code = ( isset( $_POST['captcha_code'] ) ) ? sanitize_text_field( $_POST['captcha_code'] ) : ''; + // Check CAPTCHA validity. + $rs_captcha_correct = ( $rs_captcha->check( $rs_captcha_prefix, $rs_captcha_code ) ) ? true : false; + // Clean up the tmp directory. + $rs_captcha->remove( $rs_captcha_prefix ); + $rs_captcha->cleanup(); + // If CAPTCHA validation fails (incorrect value entered in CAPTCHA field), return an error. + if ( ! $rs_captcha_correct ) { + $wpmem_themsg = __( 'You have entered an incorrect code value. Please try again.', 'wp-members' ); + return false; + } + } + + } elseif ( 'hcaptcha' == $captcha ) { + + // Get the captcha settings (api keys). + if ( ! $secret ) { + $opts = get_option( 'wpmembers_captcha' ); + $secret = $opts['hcaptcha']['secret']; + } + + $captcha = wpmem_get( 'h-captcha-response', false ); + + // If there is no captcha value, return error. + if ( false === $captcha ) { + $wpmem_themsg = wpmem_get_text( 'reg_empty_captcha' ); + return false; + } + + // Validate the captcha. + $response = wp_remote_post( 'https://hcaptcha.com/siteverify', array( + 'body' => array( + 'secret' => $secret, + 'response' => $captcha, + ) ) ); + + // Decode the json response. + $response = json_decode( wp_remote_retrieve_body( $response, true ) ); + + if ( $response->success ) { + // your success code goes here + } else { + $wpmem_themsg = wpmem_get_text( 'reg_invalid_captcha' ); + return false; + } + + } else { + + // It is reCAPTCHA. + $recaptcha_verify_url = 'https://www.google.com/recaptcha/api/siteverify?'; + + // Get the captcha settings (api keys). + if ( ! $secret ) { + $opts = get_option( 'wpmembers_captcha' ); + $secret = $opts['recaptcha']['private']; + } + + if ( 'recaptcha_v2' == $captcha ) { + + $captcha = wpmem_get( 'g-recaptcha-response', false ); + + // If there is no captcha value, return error. + if ( false === $captcha ) { + $wpmem_themsg = wpmem_get_text( 'reg_empty_captcha' ); + return false; + } + + // Build URL for captcha evaluation. + $url = $recaptcha_verify_url . http_build_query([ + 'secret' => $secret, + 'response' => $captcha, + 'remoteip' => wpmem_get_user_ip(), + ]); + + // Validate the captcha. + $response = wp_remote_fopen( $url ); + + // Decode the json response. + $response = json_decode( $response, true ); + + // If captcha validation was unsuccessful. + if ( false == $response['success'] ) { + $wpmem_themsg = wpmem_get_text( 'reg_invalid_captcha' ); + if ( WP_DEBUG && isset( $response['error-codes'] ) ) { + $wpmem_themsg.= '

    '; + foreach( $response['error-codes'] as $code ) { + $wpmem_themsg.= "Error code: " . $code . "
    "; + } + } + return false; + } + } elseif ( 'recaptcha_v3' == $captcha ) { + $captcha = wpmem_get( 'recaptcha_response', false ); + + if ( false === $captcha ) { + $wpmem_themsg = wpmem_get_text( 'reg_empty_captcha' ); + return false; + } + + if ( $_SERVER['REQUEST_METHOD'] === 'POST' && false !== $captcha ) { + + // Make and decode POST request: + $url = $recaptcha_verify_url . http_build_query([ + 'secret' => $secret, + 'response' => $captcha, + ]); + $recaptcha = file_get_contents( $url ); + $recaptcha = json_decode( $recaptcha ); + + /** + * Filters the reCAPTCHA v3 score. + * @link https://developers.google.com/recaptcha/docs/v3 + * + * @since 3.3.9 + * + * @param int $score + */ + $score = apply_filters( 'wpmem_recaptcha_score', 0.5 ); + // Take action based on the score returned: + if ( $recaptcha->score >= $score ) { + return true; + } else { + $wpmem_themsg = wpmem_get_text( 'reg_invalid_captcha' ); + return false; + } + } else { + return false; + } + } + } + + return true; + } +} \ No newline at end of file diff --git a/includes/class-wp-members-clone-menus.php b/includes/class-wp-members-clone-menus.php new file mode 100644 index 00000000..c5feedc7 --- /dev/null +++ b/includes/class-wp-members-clone-menus.php @@ -0,0 +1,98 @@ + '_wpmem_loggedin', 'menu' => '(Logged In)' ) ); + + $menus = get_registered_nav_menus(); + $wpmem_menus = array(); + foreach ( $menus as $slug => $name ) { + $wpmem_menus[ $slug . $settings['slug'] ] = $name . ' ' . $settings['menu']; + } + + /** + * Filter the cloned menus. + * + * @since 3.2.0 + * @since 3.3.0 Changed to stem "wpmem_clone_" + * + * @param array $wpmem_menus + */ + $wpmem_menus = apply_filters( 'wpmem_clone_menus', $wpmem_menus ); + + register_nav_menus( $wpmem_menus ); + } + + /** + * If there is a logged in theme location, show that if the user is logged in. + * + * @since 3.2.0 + * + * @param array $args + * @return array $args + */ + function serve_menu( $args ) { + + $theme_loc = $args['theme_location'] . '_wpmem_loggedin'; + $menu_locs = get_nav_menu_locations(); + + /** + * Filter the served menu. + * + * @since 3.2.6 + * + * @param boolean + * @param string $theme_loc + * @param $menu_locs + * @param array $args + */ + $serve_menu = apply_filters( 'wpmem_serve_menu', true, $theme_loc, $menu_locs, $args ); + + if ( is_user_logged_in( $menu_locs ) + && ! empty( $args['theme_location'] ) + && array_key_exists( $theme_loc, $menu_locs ) + && $serve_menu ) { + + if ( $menu_locs[ $theme_loc ] != 0 ) { + $args['theme_location'] = $args['theme_location'] . '_wpmem_loggedin'; + } + } + + return $args; + } + +} \ No newline at end of file diff --git a/includes/class-wp-members-dialogs.php b/includes/class-wp-members-dialogs.php new file mode 100644 index 00000000..6c59d7e4 --- /dev/null +++ b/includes/class-wp-members-dialogs.php @@ -0,0 +1,401 @@ + __( 'First Name', 'wp-members' ), + 'last_name' => __( 'Last Name', 'wp-members' ), + 'addr1' => __( 'Address 1', 'wp-members' ), + 'addr2' => __( 'Address 2', 'wp-members' ), + 'city' => __( 'City', 'wp-members' ), + 'thestate' => __( 'State', 'wp-members' ), + 'zip' => __( 'Zip', 'wp-members' ), + 'country' => __( 'Country', 'wp-members' ), + 'phone1' => __( 'Day Phone', 'wp-members' ), + 'user_email' => __( 'Email', 'wp-members' ), + 'confirm_email' => __( 'Confirm Email', 'wp-members' ), + 'user_url' => __( 'Website', 'wp-members' ), + 'description' => __( 'Biographical Info', 'wp-members' ), + 'password' => __( 'Password', 'wp-members' ), + 'confirm_password' => __( 'Confirm Password', 'wp-members' ), + 'tos' => __( 'TOS', 'wp-members' ), + ); + + /* + * Strings to be added or removed in future versions, included so they will + * be in the translation template. + * @todo Check whether any of these should be removed. + */ + $benign_strings = array( + __( 'No fields selected for deletion', 'wp-members' ), + __( 'You are not logged in.', 'wp-members' ), // Technically removed 3.5 + ); + + $defaults = array( + + // Login form. + 'login_heading' => __( 'Existing Users Log In', 'wp-members' ), + 'login_username' => __( 'Username or Email', 'wp-members' ), + 'login_password' => __( 'Password', 'wp-members' ), + 'login_button' => __( 'Log In', 'wp-members' ), + 'remember_me' => __( 'Remember Me', 'wp-members' ), + 'forgot_link_before' => __( 'Forgot password?', 'wp-members' ) . ' ', + 'forgot_link' => __( 'Click here to reset', 'wp-members' ), + 'register_link_before' => __( 'New User?', 'wp-members' ) . ' ', + 'register_link' => __( 'Click here to register', 'wp-members' ), + + // Password change form. + 'pwdchg_heading' => __( 'Change Password', 'wp-members' ), + 'pwdchg_password1' => __( 'New password', 'wp-members' ), + 'pwdchg_password2' => __( 'Confirm new password', 'wp-members' ), + 'pwdchg_button' => __( 'Update Password', 'wp-members' ), + 'pwdchg_update' => __( 'Password successfully changed!', 'wp-members' ), + + // Password reset form. + 'pwdreset_heading' => __( 'Reset Forgotten Password', 'wp-members' ), + 'pwdreset_username' => __( 'Username', 'wp-members' ), + 'pwdreset_email' => __( 'Email', 'wp-members' ), + 'pwdreset_button' => __( 'Reset Password' ), + 'username_link_before' => __( 'Forgot username?', 'wp-members' ) . ' ', + 'username_link' => __( 'Click here', 'wp-members' ), + + // Retrieve username form. + 'username_heading' => __( 'Retrieve username', 'wp-members' ), + 'username_email' => __( 'Email Address', 'wp-members' ), + 'username_button' => __( 'Retrieve username', 'wp-members' ), + + // Register form. + 'register_heading' => __( 'New User Registration', 'wp-members' ), + 'register_username' => __( 'Choose a Username', 'wp-members' ), + 'register_rscaptcha' => __( 'Input the code:', 'wp-members' ), + 'register_tos' => __( 'Please indicate that you agree to the %s Terms of Service %s', 'wp-members' ), // @note: if default changes, default check after wpmem_tos_link_txt must change. + 'register_clear' => __( 'Reset Form', 'wp-members' ), + 'register_submit' => __( 'Register', 'wp-members' ), + 'register_req_mark' => '*', + 'register_required' => '*' . __( 'Required field', 'wp-members' ), + + // User profile update form. + 'profile_heading' => __( 'Edit Your Information', 'wp-members' ), + 'profile_username' => __( 'Username', 'wp-members' ), + 'profile_submit' => __( 'Update Profile', 'wp-members' ), + 'profile_upload' => __( 'Update this file', 'wp-members' ), + + // Error messages and dialogs. + 'login_failed_heading' => __( 'Login Failed!', 'wp-members' ), // @deprecated 3.4.0 + 'login_failed' => __( 'You entered an invalid username or password.', 'wp-members' ), + 'login_failed_link' => __( 'Click here to continue.', 'wp-members' ), // @deprecated 3.4.0 + 'pwdchangempty' => __( 'Password fields cannot be empty', 'wp-members' ), + 'usernamefailed' => __( 'Sorry, that email address was not found.', 'wp-members' ), + 'usernamesuccess' => __( 'An email was sent to %s with your username.', 'wp-members' ), + 'reg_empty_field' => __( 'Sorry, %s is a required field.', 'wp-members' ), + 'reg_valid_email' => __( 'You must enter a valid email address.', 'wp-members' ), + 'reg_non_alphanumeric' => __( 'The username cannot include non-alphanumeric characters.', 'wp-members' ), + 'reg_empty_username' => __( 'Sorry, username is a required field', 'wp-members' ), + 'reg_username_taken' => __( 'Sorry, that username is taken, Please try another.', 'wp-members' ), + 'reg_email_taken' => __( 'Sorry, that email address already has an account. Please try another.', 'wp-members' ), + 'reg_password_match' => __( 'Passwords did not match.', 'wp-members' ), + 'reg_email_match' => __( 'Emails did not match.', 'wp-members' ), + 'reg_empty_captcha' => __( 'You must complete the CAPTCHA form.', 'wp-members' ), + 'reg_invalid_captcha' => __( 'CAPTCHA was not valid.', 'wp-members' ), + 'reg_generic' => __( 'There was an error processing the form.', 'wp-members' ), + 'reg_captcha_err' => __( 'There was an error with the CAPTCHA form.', 'wp-members' ), + 'reg_file_type' => __( 'Sorry, you can only upload the following file types for the %s field: %s.', 'wp-members' ), + 'profile_update' => __( 'Your information was updated!', 'wp-members' ), + + // Links. + 'profile_edit' => __( 'Edit My Information', 'wp-members' ), + 'profile_password' => __( 'Change Password', 'wp-members' ), + 'register_status' => __( 'You are logged in as %s', 'wp-members' ), + 'register_logout' => __( 'Log out', 'wp-members' ), + 'register_continue' => ( isset( $wpmem->user_pages['profile'] ) && '' != $wpmem->user_pages['profile'] ) ? __( 'Edit profile', 'wp-members' ) : __( 'Begin using the site.', 'wp-members' ), + 'login_welcome' => __( 'You are logged in as %s', 'wp-members' ), + 'login_logout' => __( 'Click to log out', 'wp-members' ), + 'status_welcome' => __( 'You are logged in as %s', 'wp-members' ), + 'status_logout' => __( 'click to log out', 'wp-members' ), + 'menu_logout' => __( 'Log Out', 'wp-members' ), + + // Widget. + 'widget_status' => __( 'You are logged in as %s', 'wp-members' ), + 'widget_logout' => __( 'click here to log out', 'wp-members' ), + 'widget_login_failed' => __( 'Login Failed!
    You entered an invalid username or password.', 'wp-members' ), + 'widget_login_failed_new' => __( 'Invalid username or password.', 'wp-members' ), // @todo New string replacement. Replace widget_login_failed when translated. + 'widget_not_logged_in' => '', + 'widget_login_username' => __( 'Username or Email', 'wp-members' ), + 'widget_login_password' => __( 'Password', 'wp-members' ), + 'widget_login_button' => __( 'log in', 'wp-members' ), + 'widget_login_forgot' => __( 'Forgot?', 'wp-members' ), + 'widget_login_register' => __( 'Register', 'wp-members' ), + + // Default Dialogs. + 'restricted_msg' => __( "This content is restricted to site members. If you are an existing user, please log in. New users may register below.", 'wp-members' ), + 'success' => __( "Congratulations! Your registration was successful.

    You may now log in using the password that was emailed to you.", 'wp-members' ), + + // @todo Under consideration for removal from the Dialogs tab. + 'user' => __( "Sorry, that username is taken, please try another.", 'wp-members' ), + 'email' => __( "Sorry, that email address already has an account.
    Please try another.", 'wp-members' ), + 'editsuccess' => __( "Your information was updated!", 'wp-members' ), + + // @todo These are defaults and are under consideration for removal from the dialogs tab, possibly as we change the password reset to a link based process. + 'pwdchangerr' => __( "Passwords did not match.", 'wp-members' ), + 'pwdchangesuccess' => __( "Password successfully changed.", 'wp-members' ), + 'pwdreseterr' => __( "Invalid username or email address.", 'wp-members' ), + 'pwdresetsuccess' => __( "Password successfully reset! An email containing a new password has been sent to the email address on file for your account.", 'wp-members' ), + 'pwdresetsuccess_alt' => __( "Reset request received. An email with instructions to complete the password reset has been sent.", 'wp-members' ), + + 'acct_not_approved' => __( "Your account request is still pending approval.", 'wp-members' ), + 'acct_not_validated' => __( "You have not completed account validation. Check your inbox for the valdation email.", 'wp-members' ), + + 'product_restricted_single' => __( "This content requires the following membership: ", 'wp-members' ), + 'product_restricted_multiple' => __( "This content requires one of the following memberships: ", 'wp-members' ), + + ); // End of $defaults array. + + /** + * Filter default terms. + * + * @since 3.1.0 + * @deprecated 3.2.7 Use wpmem_default_text instead. + */ + $text = apply_filters( 'wpmem_default_text_strings', '' ); + + // Merge filtered $terms with $defaults. + $text = wp_parse_args( $text, $defaults ); + + /** + * Filter the default terms. + * + * Replaces 'wpmem_default_text_strings' so that multiple filters could + * be run. This allows for custom filters when also running the Text + * String Editor extension. + * + * @since 3.2.7 + */ + $text = apply_filters( 'wpmem_default_text', $text ); + + // Manage legacy keys (i.e. sb_ to widget_ ). + // @todo Legacy keys to be obsolete by 3.5.0 + $str = ( false !== strpos( $str, 'sb_' ) ) ? str_replace( 'sb_', 'widget_', $str ) : $str; + foreach ( $text as $key => $value ) { + if ( false !== strpos( $key, 'sb_' ) ) { + $new_key = str_replace( 'sb_', 'widget_', $key ); + $text[ $new_key ] = $text[ $key ]; + } + } + + // Return the requested text string. + return $text[ $str ]; + } + + /** + * Login Failed Dialog. + * + * Returns the login failed error message. + * + * @since 1.8 + * @since 3.4.0 Removed "continue" (return) link (login form now displays by default under the error message). + * + * @todo 3.5.0 will fold this into the main message function and this functions associated filters will be obsolete. + * + * @global object $wpmem The WP_Members object. + * @return string $str The generated html for the login failed message. + */ + function login_failed() { + + global $wpmem; + + // Defaults. + $defaults = array( + 'div_before' => '', + 'div_after' => '', + 'heading_before' => '', + 'heading' => '', //wpmem_get_text( 'login_failed_heading' ), + 'heading_after' => '', + 'p_before' => '', + 'message' => ( $wpmem->error && wpmem_is_enabled( 'login_error' ) ) ? $wpmem->error : wpmem_get_text( 'login_failed' ), // @todo $this->error + 'p_after' => '', + //'link' => '' . wpmem_get_text( 'login_failed_link' ) . '', + ); + + /** + * Filter the login failed dialog arguments. + * + * @since 2.9.0 + * @since 3.3.3 Should pass defaults to filter. + * @deprecated 3.4.0 + * + * @param array An array of arguments to merge with defaults. + */ + $args = apply_filters( 'wpmem_login_failed_args', $defaults ); + + // Merge $args with defaults. + $args = wp_parse_args( $args, $defaults ); + + $str = $args['div_before'] + . $args['heading_before'] . $args['heading'] . $args['heading_after'] + . $args['p_before'] . $args['message'] . $args['p_after'] + //. $args['p_before'] . $args['link'] . $args['p_after'] + . $args['div_after']; + + /** + * Filter the login failed dialog. + * + * @since 2.7.3 + * + * @param string $str The login failed dialog. + */ + $str = apply_filters( 'wpmem_login_failed', $str ); + + return $str; + } + + /** + * Gets the message to display. + * + * @since 3.4.0 + * + * @todo This replaces some other functions and usage seems to be inconsistent. + * Review and replace useage as needed. + * + * @param $tag string + * @param $custom string + * @return $message string + */ + function get_message( $tag, $custom = false ) { + + // defaults + $defaults = array( + 'div_before' => '
    ', + 'div_after' => '
    ', + 'p_before' => '', // @deprecated 3.4.0 + 'p_after' => '', // @deprecated 3.4.0 + 'tags' => array( + 'user', + 'email', + 'success', + 'editsuccess', + 'pwdchangerr', + 'pwdchangesuccess', + 'pwdreseterr', + 'pwdresetsuccess', + 'loginfailed', + ), + ); + + /** + * Filter the message arguments. + * + * @since 2.9.0 + * @deprecated 3.3.0 Use wpmem_msg_defaults instead. + * @todo Obsolete in 3.5.0 + * + * @param array An array of arguments to merge with defaults. + */ + $args = apply_filters( 'wpmem_msg_args', '' ); + + /** This filter is documented in /includes/class-wp-members-admin-api.php */ + $dialogs = apply_filters( 'wpmem_dialogs', get_option( 'wpmembers_dialogs' ) ); + + // @todo Temporary(?) workaround for custom dialogs as an array (WP-Members Security). + if ( array_key_exists( $tag, $dialogs ) ) { + if ( is_array( $dialogs[ $tag ] ) ) { + $msg = stripslashes( $dialogs[ $tag ]['value'] ); + } else { + $msg = wpmem_get_text( $tag ); + $msg = ( $dialogs[ $tag ] == $msg ) ? $msg : __( stripslashes( $dialogs[ $tag ] ), 'wp-members' ); + } + } elseif ( 'loginfailed' == $tag ) { + $msg = $this->login_failed(); + } elseif ( $custom ) { + $msg = $custom; + } else { + // It must be a custom message ("custom" in that it is not included in the dialogs array). + $msg = $tag; + } + + $defaults['msg'] = $msg; + + /** + * Filter the message array + * + * @since 2.9.2 + * @since 3.1.1 added $dialogs parameter. + * @deprecated 3.3.0 Use wpmem_msg_defaults instead. + * @todo Obsolete in 3.5.0 + * + * @param array $defaults An array of the defaults. + * @param string $tag The tag that we are on, if any. + * @param array $dialogs + */ + $defaults = apply_filters( 'wpmem_msg_dialog_arr', $defaults, $tag, $dialogs ); + + // Merge $args with defaults. + $args = wp_parse_args( $args, $defaults ); + + // Backwards compatibility for 'toggles'. + if ( isset( $args['toggles'] ) ) { + $args['tags'] = $args['toggles']; + } + + /** + * Filter the message settings. + * + * @since 3.3.0 + * + * @param array $defaults An array of the defaults. + * @param string $tag The tag that we are on, if any. + * @param array $dialogs + */ + $args = apply_filters( 'wpmem_msg_defaults', $defaults, $tag, $dialogs ); + + // @todo Temporary(?) workaround for custom dialogs as an array (WP-Members Security). + $display_msg = ( is_array( $args['msg'] ) ) ? $args['msg']['value'] : $args['msg']; + + $str = $args['div_before'] . stripslashes( $display_msg ) . $args['div_after']; + + /** + * Filter the message. + * + * @since 2.7.4 + * @since 3.1.0 Added tag. + * + * @param string $str The message. + * @param string $tag The tag of the message being displayed. + */ + return apply_filters( 'wpmem_msg_dialog', $str, $tag ); + } +} \ No newline at end of file diff --git a/includes/class-wp-members-email.php b/includes/class-wp-members-email.php new file mode 100644 index 00000000..089479fd --- /dev/null +++ b/includes/class-wp-members-email.php @@ -0,0 +1,630 @@ +from = get_option( 'wpmembers_email_wpfrom', '' ); + $this->from_name = get_option( 'wpmembers_email_wpname', '' ); + $this->html = get_option( 'wpmembers_email_html', '' ); + } + + /** + * Load plugin HTML email setting. + * + * @since 3.4.0 + */ + private function load_format() { + $this->html = get_option( 'wpmembers_email_html', 0 ); + } + + /** + * Builds emails for the user. + * + * @since 1.8.0 + * @since 2.7.4 Added wpmem_email_headers and individual body/subject filters. + * @since 2.9.7 Major overhaul, added wpmem_email_filter filter. + * @since 3.1.0 Can filter in custom shortcodes with wpmem_email_shortcodes. + * @since 3.1.1 Added $custom argument for custom emails. + * @since 3.2.0 Changed wpmem_msurl key to wpmem_profile. + * @since 3.2.0 Changed toggle key to tag. + * @since 3.2.0 Moved to WP_Members_Email::to_user(). + * + * @global object $wpmem The WP_Members object. + * @global string $wpmem_mail_from The email from address. + * @global string $wpmem_mail_from_name The email from name. + * + * @param int $user_ID The User's ID. + * @param string $password Password from the registration process. + * @param string $tag Tag indicating the email being sent (newreg|newmod|appmod|repass|getuser). + * @param array $wpmem_fields Array of the WP-Members fields (defaults to null). + * @param array $fields Array of the registration data (defaults to null). + * @param array $custom Array of custom email information (defaults to null). + */ + public function to_user( $user_id, $password, $tag, $wpmem_fields = null, $field_data = null, $custom = null ) { + + global $wpmem; + + // Load settings. + $this->load_from(); + $this->load_format(); + + // Handle backward compatibility for customizations that may call the email function directly. + $wpmem_fields = wpmem_fields(); + + //Determine email to be sent. Stored option is an array with keys 'body' and 'subj'. + $tag_array = array( 'newreg', 'newmod', 'appmod', 'repass', 'getuser', 'validated' ); + switch ( $tag ) { + case 0: + case 1: + case 2: + case 3: + case 4: + $tag = $tag_array[ $tag ]; + $this->settings = get_option( 'wpmembers_email_' . $tag ); + $this->settings['tag'] = $tag; + break; + case 6: + $this->settings = get_option( 'wpmembers_email_validated' ); + $this->settings['tag'] = 'validated'; + break; + default: // case 5: + // This is a custom email. + $this->settings['subj'] = $custom['subj']; + $this->settings['body'] = $custom['body']; + $this->settings['tag'] = ( isset( $custom['tag'] ) ) ? $custom['tag'] : ''; + break; + } + + // wpautop() the content if we are doing HTML email. + if ( 1 == $this->html ) { + $this->settings['body'] = wpautop( $this->settings['body'] ); + } + + // Get the user ID. + $user = new WP_User( $user_id ); + + // Userdata for default shortcodes. + $this->settings['user_id'] = $user_id; + $this->settings['user_login'] = stripslashes( $user->user_login ); + $this->settings['user_email'] = stripslashes( $user->user_email ); + $this->settings['blogname'] = wp_specialchars_decode( get_option ( 'blogname' ), ENT_QUOTES ); + $this->settings['exp_type'] = ( defined( 'WPMEM_EXP_MODULE' ) && $wpmem->use_exp == 1 ) ? get_user_meta( $user_id, 'exp_type', true ) : ''; + $this->settings['exp_date'] = ( defined( 'WPMEM_EXP_MODULE' ) && $wpmem->use_exp == 1 ) ? get_user_meta( $user_id, 'expires', true ) : ''; + $this->settings['wpmem_profile'] = esc_url( $wpmem->user_pages['profile'] ); + $this->settings['wpmem_reg'] = esc_url( $wpmem->user_pages['register'] ); + $this->settings['wpmem_login'] = esc_url( $wpmem->user_pages['login'] ); + $this->settings['reg_link'] = esc_url( get_user_meta( $user_id, 'wpmem_reg_url', true ) ); + $this->settings['do_shortcodes'] = true; + $this->settings['add_footer'] = true; + $this->settings['footer'] = ( 1 == $this->html ) ? wpautop( get_option( 'wpmembers_email_footer' ) ) : get_option( 'wpmembers_email_footer' ); + $this->settings['disable'] = false; + $this->settings['toggle'] = $this->settings['tag']; // Deprecated since 3.2.0, but remains in the array for legacy reasons. + $this->settings['reset_link'] = esc_url_raw( add_query_arg( array( 'a' => 'pwdreset', 'key' => $password, 'id' => $user_id ), wpmem_profile_url() ) ); + $this->settings['line_break'] = ( 1 == $this->html ) ? "
    " : "\r\n"; + + // Apply filters (if set) for the sending email address. + $default_header = ( $this->from && $this->from_name ) ? 'From: "' . $this->from_name . '" <' . $this->from . '>' : ''; + + /** + * Filters the email headers. + * + * @since 2.7.4 + * @since 3.2.0 Changed toggle to tag. + * @since 3.4.2 Added user ID. + * + * @param mixed $default_header The email headers. + * @param string $this->settings['tag'] Tag to determine what email is being generated (newreg|newmod|appmod|repass|admin). + * @param int $user_id + */ + $this->settings['headers'] = apply_filters( 'wpmem_email_headers', $default_header, $this->settings['tag'], $this->settings['user_id'] ); + + /** + * Filters attachments. + * + * @since 3.4.1 + * @since 3.4.2 Added user ID. + * + * @param mixed $attachments Any file attachments as a string or array. (default per wp_mail() documentation is empty array). + * @param string $this->settings['tag'] Tag to determine what email is being generated (newreg|newmod|appmod|repass|admin). + * @param int $user_id + */ + $this->settings['attachments'] = apply_filters( 'wpmem_email_attachments', array(), $this->settings['tag'], $this->settings['user_id'] ); + + /** + * Filter the email. + * + * This filter passes the email subject, body, user ID, and several other + * settings and parameters for use in the filter function. It also passes an + * array of the WP-Members fields, and an array of the posted registration + * data from the register function. + * + * @since 2.9.7 + * @since 3.1.0 Added footer content to the array. + * @since 3.2.0 Changed wpmem_msurl key to wpmem_profile. + * @since 3.2.0 Change toggle to tag. + * @since 3.4.2 Added line_break optional param. + * + * @param array $this->settings { + * An array containing email body, subject, user id, and additional settings. + * + * @type string subj + * @type string body + * @type string tag + * @type int user_id + * @type string user_login + * @type string user_email + * @type string blogname + * @type string exp_type + * @type string exp_date + * @type string wpmem_profile + * @type string reg_link + * @type string do_shortcodes + * @type bool add_footer + * @type string footer + * @type bool disable + * @type mixed headers + * @type string toggle Deprecated since 3.2.0 + * @type string line_break + * } + * @param array $wpmem_fields An array of the WP-Members fields. + * @param array $field_data An array of the posted registration data. + */ + $this->settings = apply_filters( 'wpmem_email_filter', $this->settings, $wpmem_fields, $field_data ); + + // If emails are not disabled, continue the email process. + if ( ! $this->settings['disable'] ) { + + /** + * Filters the email body based on tag. + * + * @since 2.7.4 + * @deprecated 3.2.0 Use wpmem_email_filter instead. + * + * @param string $this->settings['body'] The body content of the new registration email. + * @param int $user_id + */ + $this->settings['body'] = apply_filters( 'wpmem_email_' . $this->settings['tag'], $this->settings['body'] ); + + // Get the email footer if needed. + $foot = ( $this->settings['add_footer'] ) ? $this->settings['footer'] : ''; + + // If doing shortcode replacements. + if ( $this->settings['do_shortcodes'] ) { + + $shortcodes = array( + 'blogname' => $this->settings['blogname'], + 'username' => $this->settings['user_login'], + 'password' => $password, + 'email' => $this->settings['user_email'], + 'reglink' => $this->settings['reg_link'], + 'members-area' => $this->settings['wpmem_profile'], + 'user-profile' => $this->settings['wpmem_profile'], + 'exp-type' => $this->settings['exp_type'], + 'exp-data' => $this->settings['exp_date'], + 'exp-date' => $this->settings['exp_date'], + 'login' => $this->settings['wpmem_login'], + 'register' => $this->settings['wpmem_reg'], + 'reset_link' => $this->settings['reset_link'], + ); + + // Add custom field shortcodes. + foreach ( $wpmem_fields as $meta_key => $field ) { + if ( ! array_key_exists( $meta_key, $shortcodes ) ) { + $val = ( is_array( $field_data ) && $field['register'] ) ? $field_data[ $meta_key ] : get_user_meta( $user_id, $meta_key, true ); + $shortcodes[ $meta_key ] = $val; + } + } + + /** + * Filter available email shortcodes. + * + * @since 3.1.0 + * @since 3.4.2 Added user ID. + * + * @param array $shortcodes + * @param string $tag + * @param int $user_id + */ + $shortcodes = apply_filters( 'wpmem_email_shortcodes', $shortcodes, $this->settings['tag'], $this->settings['user_id'] ); + + $shortcd = array(); + $replace = array(); + foreach ( $shortcodes as $key => $val ) { + // Shortcodes. + $shortcd[] = '[' . $key . ']'; + // Replacement values. + $replace[] = ( 'password' == $key ) ? $password : $val; + } + + // Do replacements for subject, body, and footer shortcodes. + $this->settings['subj'] = str_replace( $shortcd, $replace, $this->settings['subj'] ); + $this->settings['body'] = str_replace( $shortcd, $replace, $this->settings['body'] ); + $foot = ( $this->settings['add_footer'] ) ? str_replace( $shortcd, $replace, $foot ) : ''; + } + + // Append footer if needed. + $this->settings['body'] = ( $this->settings['add_footer'] ) ? $this->settings['body'] . $this->settings['line_break'] . $foot : $this->settings['body']; + + // Send message. + $this->send( 'user' ); + + } + return; + } + + /** + * Builds the email for admin notification of new user registration. + * + * @since 2.3 + * @since 3.2.0 Moved to WP_Members_Email::notify_admin(). + * + * @global object $wpmem The WP_Members object. + * @global string $wpmem_mail_from The email from address. + * @global string $wpmem_mail_from_name The email from name. + * + * @param int $user_id The User's ID. + * @param array $wpmem_fields Array of the WP-Members fields (defaults to null). + * @param array $field_data Array of the registration data (defaults to null). + */ + public function notify_admin( $user_id, $wpmem_fields = null, $field_data = null ) { + + global $wpmem; + + // Load from address. + $this->load_from(); + + // Handle backward compatibility for customizations that may call the email function directly. + $wpmem_fields = wpmem_fields( 'admin_notify' ); + + // WP default user fields. + $wp_user_fields = array( + 'user_login', + 'user_nicename', + 'user_url', + 'user_registered', + 'display_name', + 'first_name', + 'last_name', + 'nickname', + 'description', + ); + + // Get the user data. + $user = get_userdata( $user_id ); + + // Get the email stored values. + $this->settings = get_option( 'wpmembers_email_notify' ); + + // wpautop() the content if we are doing HTML email. + if ( 1 == $this->html ) { + $this->settings['body'] = wpautop( $this->settings['body'] ); + } + + // Userdata for default shortcodes. + $this->settings['user_id'] = $user_id; + $this->settings['user_login'] = stripslashes( $user->user_login ); + $this->settings['user_email'] = stripslashes( $user->user_email ); + $this->settings['blogname'] = wp_specialchars_decode( get_option ( 'blogname' ), ENT_QUOTES ); + $this->settings['user_ip'] = ( is_array( $field_data ) ) ? $field_data['wpmem_reg_ip'] : get_user_meta( $user_id, 'wpmem_reg_ip', true ); + $this->settings['reg_link'] = esc_url( get_user_meta( $user_id, 'wpmem_reg_url', true ) ); + $this->settings['act_link'] = esc_url( add_query_arg( 'user_id', $user_id, get_admin_url( '', 'user-edit.php' ) ) ); + $this->settings['exp_type'] = ( defined( 'WPMEM_EXP_MODULE' ) && $wpmem->use_exp == 1 ) ? get_user_meta( $user_id, 'exp_type', true ) : ''; + $this->settings['exp_date'] = ( defined( 'WPMEM_EXP_MODULE' ) && $wpmem->use_exp == 1 ) ? get_user_meta( $user_id, 'expires', true ) : ''; + $this->settings['do_shortcodes'] = true; + $this->settings['add_footer'] = true; + $this->settings['footer'] = ( 1 == $this->html ) ? wpautop( get_option( 'wpmembers_email_footer' ) ) : get_option( 'wpmembers_email_footer' ); + $this->settings['disable'] = false; + $this->settings['line_break'] = ( 1 == $this->html ) ? "
    " : "\r\n"; + + // Builds an array of the user data fields. + $field_arr = array(); + foreach ( $wpmem_fields as $meta_key => $field ) { + if ( $field['register'] ) { + if ( ! in_array( $meta_key, wpmem_get_excluded_meta( 'email' ) ) ) { + if ( ( 'user_email' != $meta_key ) && ( 'password' != $meta_key ) ) { + if ( 'user_url' == $meta_key ) { + $val = esc_url( $user->user_url ); + } elseif ( in_array( $meta_key, $wp_user_fields ) ) { + $val = esc_html( $user->{$meta_key} ); + } elseif ( 'file' == $field['type'] || 'image' == $field['type'] ) { + $val = wp_get_attachment_url( get_user_meta( $user_id, $meta_key, true ) ); + } else { + $val = ( is_array( $field_data ) ) ? esc_html( $field_data[ $meta_key ] ) : esc_html( get_user_meta( $user_id, $meta_key, true ) ); + } + $field_arr[ __( $field['label'], 'wp-members' ) ] = $val; + } + } + } + } + $this->settings['field_arr'] = $field_arr; + + // Apply filters (if set) for the sending email address. + $default_header = ( $this->from && $this->from_name ) ? 'From: "' . $this->from_name . '" <' . $this->from . '>' : ''; + + /** This filter is documented in class-wp-members-email.php */ + $this->settings['headers'] = apply_filters( 'wpmem_email_headers', $default_header, 'admin', $this->settings['user_id'] ); + + /** This filter is documented in class-wp-members-email.php */ + $this->settings['attachments'] = apply_filters( 'wpmem_email_attachments', array(), 'admin', $this->settings['user_id'] ); + + /** + * Filters the address the admin notification is sent to. + * + * @since 2.7.5 + * @since 3.4.2 Added user ID. + * + * @param string The email address of the admin to send to. + */ + $this->settings['admin_email'] = apply_filters( 'wpmem_notify_addr', get_option( 'admin_email' ), $this->settings['user_id'] ); + + /** + * Filter the email. + * + * This is a new and more powerful filter than was previously available for + * emails. This new filter passes the email subject, body, user ID, and several + * other settings and parameters for use in the filter function. It also passes + * an array of the WP-Members fields, and an array of the posted registration + * data from the register function. + * + * @since 2.9.8 + * @since 3.3.9 Added $user param. + * @since 3.4.2 Added optional line_break param. + * + * @param array $this->settings + * An array containing email body, subject, user id, and additional settings. + * + * @type string $subj + * @type string $body + * @type integer $user_id + * @type string $user_login + * @type string $user_email + * @type string $blogname + * @type string $user_ip + * @type string $reg_link + * @type string $act_link + * @type string $exp_type + * @type string $exp_date + * @type boolean $do_shortcodes + * @type boolean $add_footer + * @type boolean $footer + * @type boolean $disable + * @type array $field_arr + * @type string $headers + * @type string $admin_email + * @type string $line_break + * } + * @param array $wpmem_fields An array of the WP-Members fields. + * @param array $field_data An array of the posted registration data. + * @param stdClass $user WP user object for the specific user. + */ + $this->settings = apply_filters( 'wpmem_notify_filter', $this->settings, $wpmem_fields, $field_data, $user ); + + // If emails are not disabled, continue the email process. + if ( ! $this->settings['disable'] ) { + + // Split field_arr into field_str. + $field_str = ''; + foreach ( $this->settings['field_arr'] as $key => $val ) { + $field_str.= $key . ': ' . $val . $this->settings['line_break']; + } + + // Get the email footer if needed. + $foot = ( $this->settings['add_footer'] ) ? $this->settings['footer'] : ''; + + // If doing shortcode replacements. + if ( $this->settings['do_shortcodes'] ) { + + $shortcodes = array( + 'blogname' => $this->settings['blogname'], + 'username' => $this->settings['user_login'], + 'email' => $this->settings['user_email'], + 'reglink' => $this->settings['reg_link'], + 'exp-type' => $this->settings['exp_type'], + 'exp-data' => $this->settings['exp_date'], + 'exp-date' => $this->settings['exp_date'], + 'user-ip' => $this->settings['user_ip'], + 'activate-user' => $this->settings['act_link'], + 'fields' => $field_str, + ); + + // Add custom field shortcodes. + foreach ( $wpmem_fields as $meta_key => $field ) { + $val = ( is_array( $field_data ) && $field['register'] ) ? $field_data[ $meta_key ] : get_user_meta( $user_id, $meta_key, true ); + $shortcodes[ $meta_key ] = $val; + } + + /** + * Filter available email shortcodes. + * + * @since 3.1.0 + * @since 3.4.2 Added user ID. + * + * @param array $shortcodes + * @param string $toggle + * @param string $user_id + */ + $shortcodes = apply_filters( 'wpmem_email_shortcodes', $shortcodes, 'notify', $this->settings['user_id'] ); + + $shortcd = array(); + $replace = array(); + foreach ( $shortcodes as $key => $val ) { + // Shortcodes. + $shortcd[] = '[' . $key . ']'; + // Replacement values. + $replace[] = $val; + } + + // Create the custom field shortcodes. + foreach ( $wpmem_fields as $meta_key => $field ) { + $shortcd[] = '[' . $meta_key . ']'; + $replace[] = ( is_array( $field_data ) && $field['register'] ) ? $field_data[ $meta_key ] : get_user_meta( $user_id, $meta_key, true ); + } + + // Get the subject, body, and footer shortcodes. + $this->settings['subj'] = str_replace( $shortcd, $replace, $this->settings['subj'] ); + $this->settings['body'] = str_replace( $shortcd, $replace, $this->settings['body'] ); + $foot = ( $this->settings['add_footer'] ) ? str_replace( $shortcd, $replace, $foot ) : ''; + } + + // Append footer if needed. + $this->settings['body'] = ( $this->settings['add_footer'] ) ? $this->settings['body'] . $this->settings['line_break'] . $foot : $this->settings['body']; + + /** + * Filters the admin notification email. + * + * @since 2.8.2 + * @since 3.4.2 Added user ID. + * + * @param string $this->settings['body'] The admin notification email body. + */ + $this->settings['body'] = apply_filters( 'wpmem_email_notify', $this->settings['body'], $this->settings['user_id'] ); + + // Send the message. + $this->send( 'admin' ); + } + } + + /** + * Filters the wp_mail from address (if set). + * + * @since 2.7 + * @since 3.1.0 Converted to use email var in object. + * @since 3.2.0 Moved to WP_Members_Email::from(). + * + * @param string $email + * @return string $wpmem_mail_from|$email + */ + public function from( $email ) { + return ( $this->from ) ? $this->from : $email; + } + + /** + * Filters the wp_mail from name (if set). + * + * @since 2.7 + * @since 3.1.0 Converted to use email var in object. + * @since 3.2.0 Moved to WP_Members_Email::from_name(). + * + * @param string $name + * @return string $wpmem_mail_from_name|$name + */ + public function from_name( $name ) { + return ( $this->from_name ) ? stripslashes( $this->from_name ) : stripslashes( $name ); + } + + /** + * Returns HTML content type for email. + * + * @since 3.4.0 + * + * @return string Always returns "text/html" + */ + public function content_type( $content_type ) { + return ( 1 == $this->html ) ? 'text/html' : $content_type; + } + + /** + * Sends email. + * + * @since 3.2.0 + * + * @param string $to + * @return bool $result + */ + private function send( $to ) { + $args['to'] = ( 'user' == $to ) ? $this->settings['user_email'] : $this->settings['admin_email']; + $args['subject'] = $this->settings['subj']; + $args['message'] = $this->settings['body']; + $args['headers'] = $this->settings['headers']; + $args['attachments'] = $this->settings['attachments']; + + /** + * Filter email send arguments. + * + * @since 3.2.5 + * + * @param array $send_args + * @param string $to + * @param array $this->settings + */ + $args = apply_filters( 'wpmem_email_send_args', $args, $to, $this->settings ); + + // Apply filters. + add_filter( 'wp_mail_from', array( $this, 'from' ) ); + add_filter( 'wp_mail_from_name', array( $this, 'from_name' ) ); + add_filter( 'wp_mail_content_type', array( $this, 'content_type' ) ); + + // Send message. + $result = wp_mail( $args['to'], stripslashes( $args['subject'] ), stripslashes( $args['message'] ), $args['headers'], $args['attachments'] ); + + // Remove customizations. + remove_filter( 'wp_mail_from', array( $this, 'from' ) ); + remove_filter( 'wp_mail_from_name', array( $this, 'from_name' ) ); + remove_filter( 'wp_mail_content_type', array( $this, 'content_type' ) ); + + // Return result (does not necessarily indicate message was sent). + return $result; + } +} \ No newline at end of file diff --git a/includes/class-wp-members-forms.php b/includes/class-wp-members-forms.php new file mode 100644 index 00000000..ee8b8fe0 --- /dev/null +++ b/includes/class-wp-members-forms.php @@ -0,0 +1,2238 @@ +true ) ); + } + + // Add new field array keys + foreach ( $fields as $key => $val ) { + + // Key fields with meta key. + $meta_key = $val[2]; + + // Old format, new key. + foreach ( $val as $subkey => $subval ) { + $wpmem->fields[ $meta_key ][ $subkey ] = $subval; + } + + // Setup field properties. + $wpmem->fields[ $meta_key ]['label'] = $val[1]; + $wpmem->fields[ $meta_key ]['type'] = $val[3]; + $wpmem->fields[ $meta_key ]['register'] = ( 'y' == $val[4] ) ? true : false; + $wpmem->fields[ $meta_key ]['required'] = ( 'y' == $val[5] ) ? true : false; + $wpmem->fields[ $meta_key ]['profile'] = ( 'y' == $val[4] ) ? true : false;// ( isset( $val['profile'] ) ) ? $val['profile'] : true ; // // @todo Wait for profile fix + $wpmem->fields[ $meta_key ]['native'] = ( 'y' == $val[6] ) ? true : false; + + // Certain field types have additional properties. + switch ( $val[3] ) { + + case 'checkbox': + $wpmem->fields[ $meta_key ]['checked_value'] = $val[7]; + $wpmem->fields[ $meta_key ]['checked_default'] = ( 'y' == $val[8] ) ? true : false; + $wpmem->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' == $val[3] ) { + $val[7] = array( __( 'Choose membership', 'wp-members' ) . '|' ); + foreach( $wpmem->membership->products 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] ); + $wpmem->fields[ $meta_key ][7] = $val[7]; + } + $wpmem->fields[ $meta_key ]['values'] = $val[7]; + $wpmem->fields[ $meta_key ]['delimiter'] = ( isset( $val[8] ) ) ? $val[8] : '|'; + $wpmem->fields[ $meta_key ]['options'] = array(); + foreach ( $val[7] as $value ) { + $pieces = explode( '|', trim( $value ) ); + if ( isset( $pieces[1] ) && $pieces[1] != '' ) { + $wpmem->fields[ $meta_key ]['options'][ $pieces[1] ] = $pieces[0]; + } + } + break; + + case 'file': + case 'image': + $wpmem->fields[ $meta_key ]['file_types'] = $val[7]; + break; + + case 'hidden': + $wpmem->fields[ $meta_key ]['value'] = $val[7]; + break; + + } + } + } + + /** + * Filter custom fields for localization. + * + * @since 3.3.9 + * + * @param array $fields + */ + function localize_fields( $fields ) { + 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 ) { + + global $wpmem; + + // 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 = ""; + 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 = ""; + 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 = "'; + break; + + case "checkbox": + $class = ( 'textbox' == $class ) ? "checkbox" : wpmem_sanitize_class( $class ); + $str = ""; + 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 = ""; + break; + + case "hidden": + $str = ""; + break; + + case "option": + $str = ""; + 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 = ""; + 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 . "
    \n"; + } else { + $str = $str . '' . esc_html( __( $pieces[0], 'wp-members' ) ) . "
    \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 . " $label
    \n"; + $num++; + } else { + $str = $str . '' . esc_html( __( $pieces[0], 'wp-members' ) ) . "
    \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 ) { + global $wpmem; + + $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; + + //$req_mark = ( ! $req_mark ) ? wpmem_get_text( 'register_req_mark' ) : '*'; + + if ( ! $class ) { + $class = ( $type == 'password' || $type == 'email' || $type == 'url' ) ? 'text' : $type; + } + + $id = ( $id ) ? ' id="' . esc_attr( $id ) . '"' : ''; + + $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 ) { + + global $wpmem; + + $user_id = ( isset( $this->file_user_id ) ) ? $this->file_user_id : null; + + $args = array( + 'user_id' => $user_id, + 'wpmem_dir' => $wpmem->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' => '', + 'heading_after' => '', + 'fieldset_before' => '
    ', + 'fieldset_after' => '
    ', + 'main_div_before' => '
    ', + 'main_div_after' => '
    ', + 'row_before' => '', + 'row_after' => '', + 'buttons_before' => '
    ', + 'buttons_after' => '
    ', + 'link_before' => '', + 'link_span_before' => '', + 'link_span_after' => '', + + // 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, + + ); + + /** + * 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: '' + * @type string $heading_after Default: '' + * @type string $fieldset_before Default: '
    ' + * @type string $fieldset_after Default: '
    ' + * @type string $main_div_before Default: '
    ' + * @type string $main_div_after Default: '
    ' + * @type string $row_before Default: '' + * @type string $row_after Default: '' + * @type string $buttons_before Default: '
    ' + * @type string $buttons_after Default: '
    ' + * @type string $link_before Default: '' + * @type string $link_span_before Default: '' + * @type string $link_span_after Default: '' + * @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 = ''; + $field = wpmem_form_field( array( + 'name' => $input['tag'], + 'type' => $input['type'], + 'class' => $input['class'], + 'required' => true, + ) ); + $field_before = ( $args['wrap_inputs'] ) ? '
    ' : ''; + $field_after = ( $args['wrap_inputs'] ) ? '
    ' : ''; + $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' ) ) . ' ' . '  ' . $args['n'] : ''; + $buttons[] = $args['t'] . '' . $args['n']; + } else { + $buttons[] = '' . $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', + ), + ); + foreach ( $links_array as $key => $value ) { + $tag = $value['tag']; + if ( ( $wpmem->user_pages[ $value['page'] ] || 'profile' == $page ) && $value['action'] == $action ) { + /** + * Filters register, forgot password, and forgot username 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" ) . '' . wpmem_get_text( "{$key}_link" ) . ''; + $link_str = $args['link_before']; + $link_str.= ( '' != $args['link_span_before'] ) ? sprintf( $args['link_span_before'], $key ) : ''; + /** + * Filters the register, forgot password, and forgot username 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; + } + } + } + + // 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 = '
    ' . $args['n'] . $form . '
    '; + + // Apply anchor. + $form = '' . $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. + $defaults = array( + + // Wrappers. + 'heading_before' => '', + 'heading_after' => '', + 'fieldset_before' => '
    ', + 'fieldset_after' => '
    ', + 'main_div_before' => '
    ', + 'main_div_after' => '
    ', + 'row_before' => '', + 'row_after' => '', + 'buttons_before' => '
    ', + 'buttons_after' => '
    ', + + // 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' => '
    ', + 'req_label_after' => '
    ', + + // 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, + + ); + + /** + * 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 ); + + // 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( 'wpmem_register_fields_arr', $wpmem_fields, $tag ); + + $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. + // if ( ( 'new' == $tag && $field['register'] ) || ( 'edit' == $tag && $field['profile'] ) ) { // @todo Wait for profile fix + if ( $field['register'] ) { + + // 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'] + ) ); + + } + + // Gets the field value for edit profile. + if ( ( 'edit' == $tag ) && ( '' == $wpmem->regchk ) ) { + 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 = ( isset( $_POST[ $meta_key ] ) ) ? wpmem_sanitize_field( $_POST[ $meta_key ], $field['type'] ) : ''; + } + } + + // 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'] ) ? '
    ' : ''; + $field_after = ( $args['wrap_inputs'] ) ? '
    ' : ''; + + } 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 = '' . __( 'None' ) . ''; + if ( 'edit' == $tag ) { + if ( 'file' == $field['type'] ) { + $input = ( $attachment_url ) ? '' . get_the_title( $val ) . '' : $empty_file; + } else { + $input = ( $attachment_url ) ? '' : $empty_file; + } + $input.= '
    ' . wpmem_get_text( 'profile_upload' ) . '
    '; + } else { + if ( 'image' == $field['type'] ) { + $input = ''; + } + } + $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 . ' '; + $fields[ $meta_key ]['label'] = $field['label'] = $label = ''; + } + } + + // Determine input wrappers. + $field_before = ( $args['wrap_inputs'] ) ? '
    ' : ''; + $field_after = ( $args['wrap_inputs'] ) ? '
    ' : ''; + } + + } + + // If the row is set to display, add the row to the form array. + if ( ( 'new' == $tag && $field['register'] ) || ( 'edit' == $tag && $field['profile'] ) ) { + //if ( $field['register'] && 'hidden' != $field['type'] ) { + 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'] ) ? '
    ' : '', + 'field' => $row['img'] . $row['hidden'] . $row['field'], + 'field_after' => ( $args['wrap_inputs'] ) ? '
    ' : '', + '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 ] = ''; + } + } + // 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 = '
    ' . $row . '
    '; + } + + // 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'] = ''; + $hidden_rows['_wpmem_reg_page'] = ''; + if ( $redirect_to != get_permalink() ) { + $hidden_rows['_wpmem_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'] ) ? ' ' : '', + 'submit' => '', + ); + $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. + $enctype = ( $enctype == 'multipart/form-data' ) ? ' enctype="multipart/form-data"' : ''; + $form = '
    ' . $args['n'] . $form . $args['n'] . '
    '; + + // Apply anchor. + $form = '' . $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 . ' +' : $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->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 ) ? ' *' : ' ' . __( '(required)' ) . '' ) : ''; + + // 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 = ( isset( $_POST[ $meta_key ] ) ) ? esc_attr( $_POST[ $meta_key ] ) : ''; + $val = ( ! $_POST && $field['checked_default'] ) ? $field['checked_value'] : $val; + + $row_before = '

    '; + $label = ''; + $input = wpmem_form_field( $meta_key, $field['type'], $field['checked_value'], $val ); + $row_after = '

    '; + + } 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 ) ? '

    ' : '

    '; + $label = ''; + $label .= ( 'multicheckbox' == $field['type'] ) ? '
    ' : ''; + + // determine the field type and generate accordingly... + + switch ( $field['type'] ) { + + case( 'textarea' ): + $input = ''; + 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 : '

    '; + $valtochk = ( 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 = ''; + break; + } + + $row_after = '

    '; + + } + + // 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 = '

    '; + $row_after = '

    '; + $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 ''; + + $wpmem_fields = 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'] ) ? ' ' . __( '(required)' ) . '' : ''; + + $class = ( 'radio' == $field['type'] + || 'checkbox' == $field['type'] + || 'date' == $field['type'] ) ? '' : ' class="form-field" '; + echo ' + + + '; + + } + } + + // If moderated registration is enabled, add checkbox to set user as active. + if ( 1 == $wpmem->mod_reg ) { + echo ' + + + '; + } + + echo '
    + + '; + + // 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'] : ''; + + switch ( $field['type'] ) { + + case( 'select' ): + $val = ( 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'] = ( isset( $_POST[ $meta_key ] ) ) ? esc_textarea( $_POST[ $meta_key ] ) : ''; + echo wpmem_form_field( $args ); + break; + + case( 'checkbox' ): + $val = ( 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'] = ( 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'] = ( isset( $_POST[ $meta_key ] ) ) ? esc_attr( $_POST[ $meta_key ] ) : ''; + echo wpmem_form_field( $args ); + break; + } + + echo '
    + + ' . wpmem_form_field( array( 'name' => 'activate_user', 'type' => 'checkbox', 'value' => 1, 'compare' => '' ) ) . '
    '; + + } + + /** + * 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 = ' +
    + Powered by WP-Members +
    '; + + 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() ) { + + global $post, $wpmem; + + $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', + ), + ), + ); + + // @todo Temp until 3.5.0 removes old password reset. + if ( 1 != $wpmem->pwd_link ) { + $input_arrays['resetpassword'] = array( + array( + 'name' => wpmem_get_text( 'pwdreset_username' ), + 'type' => 'text', + 'tag' => 'user', + 'class' => 'username', + 'div' => 'div_text', + ), + array( + 'name' => wpmem_get_text( 'pwdreset_email' ), + 'type' => 'text', + 'tag' => 'email', + 'class' => 'textbox', + '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( 'wpmem_inc_' . $form . '_inputs', $input_arrays[ $form ] ); + + $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, + ), + ); + + /** + * 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( 'wpmem_inc_' . $form . '_args', '' ); + $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() { + + global $wpmem; + + $str = ''; + + if ( $wpmem->regchk != "success" ) { + + $dialogs = get_option( 'wpmembers_dialogs' ); + + // This shown above blocked content. + $msg = wpmem_get_text( 'restricted_msg' ); + $msg = ( $dialogs['restricted_msg'] == $msg ) ? $msg : __( stripslashes( $dialogs['restricted_msg'] ), 'wp-members' ); + $str = '

    ' . $msg . '

    '; + + /** + * Filter the post restricted message. + * + * @since 2.7.3 + * @since 3.2.0 Added raw message string and HTML as separate params. + * + * @param string $str The post restricted message with HTML. + * @param string $msg The raw message string. + * @param string The 'before' HTML wrapper. + * @param string The 'after' HTML wrapper. + */ + $str = apply_filters( 'wpmem_restricted_msg', $str, $msg, '

    ', '

    ' ); + } + + 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 = ''; + } else { + $tos_link_url = add_query_arg( 'tos', 'display' ); + $tos_link_tag = ""; + } + + /** + * 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, '' ); + } + + function get_reg_row_keys() { + return array( 'meta', 'type', 'value', 'values', 'label_text', 'row_before', 'label', 'field_before', 'field', 'field_after', 'row_after' ); + } +} // End of WP_Members_Forms class. \ No newline at end of file diff --git a/includes/class-wp-members-menus.php b/includes/class-wp-members-menus.php new file mode 100644 index 00000000..741c2213 --- /dev/null +++ b/includes/class-wp-members-menus.php @@ -0,0 +1,359 @@ +load_hooks(); + } + + /** + * Loads hooks. + * + * @since 3.3.0 + */ + public function load_hooks() { + + global $wp_version; + if ( version_compare( $wp_version, '5.4', '<' ) ) { + add_filter( 'wp_edit_nav_menu_walker', array( $this, 'edit_nav_menu_walker' ) ); + } + + add_action( 'wp_update_nav_menu_item', array( $this, 'update_nav_menu_item' ), 10, 2 ); + add_filter( 'wp_setup_nav_menu_item', array( $this, 'setup_nav_menu_item' ) ); + add_action( 'admin_enqueue_scripts' , array( $this, 'enqueue_scripts' ) ); + + add_action( 'wp_nav_menu_item_custom_fields', array( $this, 'nav_menu_item_fields' ), 5, 4 ); + // add_action( 'wp_nav_menu_item_custom_fields_customize_template', array( $this, 'nav_menu_item_fields' ), 5 ); // @todo Work this out. + + add_action( 'wpmem_nav_menu_logged_in_criteria', array( $this, 'add_product_criteria' ) ); + + // Handles removing front end menu items. + if ( ! is_admin() ) { + add_filter( 'wp_get_nav_menu_items', array( $this, 'exclude_menu_items' ), 20 ); + } + } + + /** + * Override the Admin Menu Walker + * + * @since 3.3.0 + * + * @global object $wpmem + * + * @return object WP_Members_Walker_Nav_Menu + */ + public function edit_nav_menu_walker( $walker ) { + global $wpmem; + require_once( $wpmem->path . 'includes/walkers/class-wp-members-walker-nav-menu.php' ); + return 'WP_Members_Walker_Nav_Menu'; + } + + /** + * Add fields to hook added in Walker + * + * @since 3.3.0 + * + * @global object $wpmem + * + * @param string $item_id + * @param object $item + * @param $depth + * @param array $args + */ + public function nav_menu_item_fields( $item_id, $item, $depth, $args ) { + + global $wpmem; + + $restrictions = get_post_meta( $item->ID, $this->post_meta, true ); + + $logged_in_out = ''; + if ( is_array( $restrictions ) || $restrictions == 'in' ) { + $logged_in_out = 'in'; + } else if ( $restrictions == 'out' ){ + $logged_in_out = 'out'; + } + + $hidden = $logged_in_out == 'in' ? '' : 'display: none;'; + ?> + + +
    + +
    + + + +
    + value="in" /> + +
    + +
    + value="out" /> + +
    + +
    + value="" /> + +
    + +
    + + enable_products ) { + $display_products = $wpmem->membership->products; + $checked_products = ( isset( $restrictions['products'] ) && is_array( $restrictions['products'] ) ) ? $restrictions['products'] : false; + ?> +
    + + ', '' ); ?> + + +
    + $product ) { + + /* If the role has been selected, make sure it's checked. */ + $checked = checked( true, ( is_array( $checked_products ) && in_array( $key, $checked_products ) ), false ); + ?> + +
    + value="" /> + +
    + + +
    + + url . 'assets/js/wpmem-nav-menu' . wpmem_get_suffix() . '.js', array( 'jquery' ), $wpmem->version, true ); + } + } + + /** + * Save custom menu fields. + * + * @since 3.3.0 + * + * @global object $wpmem + */ + public function update_nav_menu_item( $menu_id, $menu_item_db_id ) { + global $wpmem; + $product_names = array(); + foreach ( $wpmem->membership->products as $key => $value ) { + $product_names[ $key ] = $value['title']; + } + + // Verify this came from our screen and with proper authorization. + if ( ! isset( $_POST[ $this->nonce_name ] ) || ! wp_verify_nonce( $_POST[ $this->nonce_name ], $this->nonce_field ) ){ + return; + } + + $saved_data = false; + + if ( isset( $_POST['wpmem_logged_in_out'][ $menu_item_db_id ] ) && 'in' == $_POST['wpmem_logged_in_out'][ $menu_item_db_id ] && isset( $_POST['wpmem_product'][ $menu_item_db_id ] ) ) { + + $custom_fields = array(); + + foreach( (array) $_POST['wpmem_product'][ $menu_item_db_id ] as $product ) { + + if ( array_key_exists ( $product, $product_names ) ) { + $custom_fields['products'][] = sanitize_text_field( $product ); + } + } + if ( ! empty ( $custom_fields ) ) { + $saved_data = $custom_fields; + } + } elseif ( isset( $_POST['wpmem_logged_in_out'][ $menu_item_db_id ] ) && in_array( $_POST['wpmem_logged_in_out'][ $menu_item_db_id ], array( 'in', 'out' ) ) ) { + $saved_data = sanitize_text_field( $_POST['wpmem_logged_in_out'][ $menu_item_db_id ] ); + } + + if ( $saved_data ) { + update_post_meta( $menu_item_db_id, $this->post_meta, $saved_data ); + } else { + delete_post_meta( $menu_item_db_id, $this->post_meta ); + } + } + + /** + * Add custom field to $item object. + * + * @since 3.3.0 + * + * @global object $wpmem + * + * @param object $menu_item + * @return object $menu_item + */ + public function setup_nav_menu_item( $menu_item ) { + global $wpmem; + if ( is_object( $menu_item ) && isset( $menu_item->ID ) ) { + + $restrictions = get_post_meta( $menu_item->ID, $this->post_meta, true ); + + // If there are any restrictions, set them in the menu item. + if ( ! empty( $restrictions ) ) { + $menu_item->restrictions = $restrictions; + } + } + return $menu_item; + } + + /** + * Exclude menu items based on custom criteria. + * + * @since 3.3.0 + * + * @global object $wpmem + * + * @param array $items + * @return array $items + */ + public function exclude_menu_items( $items ) { + global $wpmem; + $hide_children_of = array(); + + if ( ! empty( $items ) ) { + + // Iterate and remove set items. + foreach ( $items as $key => $item ) { + + $visible = true; + + // Hide any item that is the child of a hidden item. + if ( isset( $item->menu_item_parent ) && in_array( $item->menu_item_parent, $hide_children_of ) ) { + $visible = false; + } + + // Check items that have products. + if ( $visible && isset( $item->restrictions ) ) { + + // Check all logged in, all logged out, or role. + switch( $item->restrictions ) { + case 'in' : + $visible = ( is_user_logged_in() ) ? true : false; + break; + case 'out' : + $visible = ( ! is_user_logged_in() ) ? true : false; + break; + default: + if ( 1 == $wpmem->enable_products ) { + $visible = false; + if ( is_array( $item->restrictions ) && ! empty( $item->restrictions ) ) { + foreach ( $item->restrictions['products'] as $product ) { + if ( wpmem_user_has_access( $product ) ) { + $visible = true; + } + } + } + } else { + $visible = true; + } + break; + } + } + + /** + * Filters item visibility value. + * + * @since 3.3.0 + * + * @param bool $visible + * @param object $item + */ + $visible = apply_filters( 'wpmem_menu_item_visibility', $visible, $item ); + + // Unset non-visible item. + if ( ! $visible ) { + if ( isset( $item->ID ) ) { + $hide_children_of[] = $item->ID; + } + unset( $items[ $key ] ) ; + } + + } + + } + + return $items; + } + +} \ No newline at end of file diff --git a/includes/class-wp-members-products.php b/includes/class-wp-members-products.php new file mode 100644 index 00000000..34960744 --- /dev/null +++ b/includes/class-wp-members-products.php @@ -0,0 +1,673 @@ +load_products(); + + add_filter( 'wpmem_securify', array( $this, 'product_access' ) ); + add_filter( 'wpmem_product_restricted_msg', array( $this, 'apply_custom_access_message' ), 10, 2 ); + add_filter( 'wpmem_restricted_msg', array( $this, 'apply_custom_access_message' ), 10, 4 ); + add_filter( 'wpmem_email_shortcodes', array( $this, 'email_shortcodes' ), 10, 3 ); + + add_shortcode( 'wpmem_user_memberships', array( $this, 'sc_show_memberships' ) ); + add_shortcode( 'wpmem_user_membership_posts', array( $this, 'sc_show_membership_posts' ) ); + } + + /** + * Loads product settings. + * + * @since 3.2.0 + * + * @global object $wpdb The WPDB object class. + */ + function load_products() { + global $wpdb; + $sql = "SELECT ID, post_title, post_name FROM " + . $wpdb->prefix + . "posts WHERE post_type = 'wpmem_product' AND post_status = 'publish';"; + $result = $wpdb->get_results( $sql ); + foreach ( $result as $plan ) { + $this->product_by_id[ $plan->ID ] = $plan->post_name; + $this->products[ $plan->post_name ]['title'] = $plan->post_title; + $post_meta = get_post_meta( $plan->ID ); + foreach ( $post_meta as $key => $meta ) { + if ( false !== strpos( $key, 'wpmem_product' ) ) { + if ( 'wpmem_product_expires' == $key ) { + $meta[0] = unserialize( $meta[0] ); + } + if ( 'wpmem_product_fixed_period' == $key ) { + $meta[0] = $this->explode_fixed_period( $meta[0] ); + } + $this->products[ $plan->post_name ][ str_replace( 'wpmem_product_', '', $key ) ] = $meta[0]; + } + } + } + } + + /** + * Gets products assigned to a post. + * + * @since 3.2.4 + * + * @param integer $post_id + * @return array $products { + * Membership product slugs the post is restricted to. + * + * @type string $slug + * } + */ + function get_post_products( $post_id ) { + $products = get_post_meta( $post_id, $this->post_meta, true ); + /** + * Filter product access by post ID. + * + * @since 3.3.5 + * + * @param array $post_products + * @param int $post_id + */ + $products = apply_filters( 'wpmem_post_products', $products, $post_id ); + return $products; + } + + /** + * Gets default membership products. + * + * @since 3.3.0 + * + * @return array $defaults + */ + function get_default_products() { + // Get any default membership products. + $args = array( + 'numberposts' => -1, + 'post_type' => $this->post_type, + 'meta_key' => 'wpmem_product_default', + 'meta_value' => 1, + 'fields' => array( 'post_name' ), + ); + $default_products = get_posts( $args ); + $defaults = array(); + if ( $default_products ) { + foreach ( $default_products as $product ) { + $defaults[] = $product->post_name; + } + } + return $defaults; + } + + /** + * Sets up custom access restriction by product. + * + * @since 3.2.0 + * @since 3.2.2 Merged check_product_access() logic for better messaging. + * + * @global object $post The WordPress Post object. + * @global object $wpmem The WP_Members object class. + * @param string $content + * @return string $content + */ + function product_access( $content ) { + + global $post, $wpmem; + // Is the user logged in and is this blocked content? + if ( ! is_admin() && is_user_logged_in() && wpmem_is_blocked() && 1 == $wpmem->enable_products ) { // @todo Should is_admin() check be run on securify in general? + + // Get the post access products. + $post_products = $this->get_post_products( $post->ID ); + // If the post is restricted to a product. + if ( is_array( $post_products ) && ! empty( $post_products ) ) { + $access = ( wpmem_user_has_access( $post_products ) ) ? true : false; + } else { + $access = true; + } + + // Only produce the product restricted message if access is false. + if ( false === $access ) { + + // Set up excerpt if excerpts are set to display. + $excerpt = ''; + if ( isset( $wpmem->show_excerpt[ $post->post_type ] ) && 1 == $wpmem->show_excerpt[ $post->post_type ] ) { + + // @todo Can this be condensed or eliminated? + $len = strpos( $content, '', + 'message' => $message, + 'wrapper_after' => '
    ', + ), $post_products ); + + $content = $product_restricted['excerpt'] . $product_restricted['wrapper_before'] . $product_restricted['message'] . $product_restricted['wrapper_after']; + + // Handle comments. + add_filter( 'wpmem_securify_comments', '__return_false' ); + } + + } + + return $content; + } + + /** + * Gets the access message if user does not have required membership. + * + * @since 3.4.0 + * + * @param array $post_products + * @return string $message + */ + function get_access_message( $post_products ) { + // Singular message if post only has one membership, otherwise multiple. + if ( 1 == count( $post_products ) ) { + $message = wpmem_get_text( 'product_restricted_single' ) + . "
    " . wpmem_get_membership_name( $post_products[0] ); + } else { + $message = wpmem_get_text( 'product_restricted_multiple' ) . "
    "; + foreach ( $post_products as $post_product ) { + $message .= wpmem_get_membership_name( $post_product ) . "
    "; + } + } + /** + * Filter the product restricted message. + * + * @since 3.2.3 + * + * @param string The message. + * @param array $post_products { + * Membership product slugs the post is restricted to. + * + * @type string $slug + * } + */ + $message = apply_filters( 'wpmem_product_restricted_msg', $message, $post_products ); + return $message; + } + + /** + * Filters the access message if the user does not have + * access to this membership. + * + * @since 3.3.4 + * @since 3.4.0 Renamed from access_message(). + * + * @global stdClass $post + * @param string $msg + * @return string $msg + */ + function apply_custom_access_message( $msg, $mixed, $before = false, $after = false ) { + global $post; + // If this is "wpmem_restricted_msg", second arg is the raw msg string, not post products + $post_products = ( ! is_array( $mixed ) && false != $before && false != $after ) ? $this->get_post_products( $post->ID ) : $mixed; + if ( $post_products ) { + $product_message = false; + $count = count( $post_products ); + foreach( $post_products as $post_product ) { + $membership_id = array_search( $post_product, $this->product_by_id ); + $message = get_post_meta( $membership_id, 'wpmem_product_message', true ); + if ( $message ) { + $product_message = ( isset( $product_message ) ) ? $product_message . wpautop( $message ) : wpautop( $message ); + } + } + if ( false !== $product_message ) { + $msg = ( $before ) ? '
    ' : ''; + $msg.= do_shortcode( $product_message ); + $msg.= ( $after ) ? '
    ' : ''; + } + } + return $msg; + } + + /** + * Register Membership Plans Custom Post Type + * + * @since 3.2.0 + * + * @global object $wpmem The WP_Members object class. + */ + function add_cpt() { + + global $wpmem; + + $args = array( 'capabilities' => 'manage_options', ); + /** + * Filter customizable elements of the membership custom post type. + * + * @since 3.3.5 + * + * @param array + */ + $args = apply_filters( 'wpmem_membership_cpt_args', $args ); + + $singular = __( 'Membership', 'wp-members' ); + $plural = __( 'Memberships', 'wp-members' ); + + $labels = array( + 'name' => $plural, + 'singular_name' => $singular, + 'menu_name' => __( 'Memberships', 'wp-members' ), + 'all_items' => sprintf( __( 'All %s', 'wp-members' ), $plural ), + 'add_new_item' => sprintf( __( 'Add New %s', 'wp-members' ), $singular ), + 'add_new' => __( 'Add New', 'wp-members' ), + 'new_item' => sprintf( __( 'New %s', 'wp-members' ), $singular ), + 'edit_item' => sprintf( __( 'Edit %s', 'wp-members' ), $singular ), + 'update_item' => sprintf( __( 'Update %s', 'wp-members' ), $singular ), + 'view_item' => sprintf( __( 'View %s', 'wp-members' ), $singular ), + 'view_items' => sprintf( __( 'View %s', 'wp-members' ), $plural ), + 'search_items' => sprintf( __( 'Search %s', 'wp-members' ), $plural ), + 'not_found' => __( 'Not found', 'wp-members' ), + 'not_found_in_trash' => __( 'Not found in Trash', 'wp-members' ), + 'insert_into_item' => __( 'Insert into item', 'wp-members' ), + 'publish' => sprintf( __( 'Save %s Details', 'wp-members' ), $singular ), + 'attributes' => __( 'Membership Attributes', 'wp-members' ), + ); + $args = array( + 'label' => __( 'Membership Product', 'wp-members' ), + 'description' => __( 'WP-Members Membership Products', 'wp-members' ), + 'labels' => $labels, + 'supports' => array( 'title', 'page-attributes' ), + 'hierarchical' => true, + 'public' => false, + 'show_ui' => ( $wpmem->enable_products ) ? true : false, + 'show_in_menu' => ( $wpmem->enable_products ) ? true : false, + 'menu_position' => 58, + 'menu_icon' => 'dashicons-groups', + 'show_in_admin_bar' => false, + 'show_in_nav_menus' => false, + 'can_export' => true, + 'has_archive' => false, + 'exclude_from_search' => true, + 'publicly_queryable' => false, + 'query_var' => 'membership_product', + 'rewrite' => false, + 'capability_type' => 'page', + 'capabilities' => array( + 'publish_posts' => $args['capabilities'], + 'edit_posts' => $args['capabilities'], + 'delete_posts' => $args['capabilities'], + 'edit_post' => $args['capabilities'], + 'delete_post' => $args['capabilities'], + 'read_post' => $args['capabilities'], + ), + 'show_in_rest' => false, + //'register_meta_box_cb' => '', // callback for meta box + ); + register_post_type( $this->post_type, $args ); + } + + /** + * Get all posts tagged to a specified product. + * + * @since 3.3.0 + * + * @global stdClass $wpdb + * + * @param string $product_meta + * @return array|boolean $post_ids if not empty, otherwise false + */ + function get_all_posts( $product_meta ) { + global $wpdb; + $results = $wpdb->get_results( $wpdb->prepare( " + SELECT post_id + FROM {$wpdb->postmeta} + WHERE meta_key = %s + ", $this->post_stem . $product_meta ), ARRAY_N ); + foreach ( $results as $result ) { + $post_ids[] = $result[0]; + } + return ( ! empty( $post_ids ) ) ? $post_ids : false; + } + + /** + * Utility to explode fixed period. + * + * @since 3.3.5 + */ + function explode_fixed_period( $array ) { + $period_parts = explode( "-", $array ); + $period['start'] = ( $period_parts ) ? $period_parts[0] . '-' . $period_parts[1] : ''; + $period['end'] = ( $period_parts ) ? $period_parts[2] . '-' . $period_parts[3] : ''; + $period['grace']['num'] = ( $period_parts && isset( $period_parts[4] ) ) ? $period_parts[4] : ''; + $period['grace']['per'] = ( $period_parts && isset( $period_parts[5] ) ) ? $period_parts[5] : ''; + return $period; + } + + /** + * Set an expiration date. + * + * @since 3.3.5 + * + * @param string $product + * @param int $user_id + * @param mixed $set_date + * @param mixed $pre_value + * @param boolean $renew + * @return mixed $new_value + */ + function set_product_expiration( $product, $user_id, $set_date, $prev_value, $renew ) { + // If this is setting a specific date. + if ( $set_date ) { + $new_value = strtotime( $set_date ); + } else { + // Either setting initial expiration based on set time period, or adding to the existing date (renewal/extending). + $raw_add = explode( "|", $this->products[ $product ]['expires'][0] ); + $add_period = ( 1 < $raw_add[0] ) ? $raw_add[0] . " " . $raw_add[1] . "s" : $raw_add[0] . " " . $raw_add[1]; + + if ( $prev_value ) { + if ( isset( $this->products[ $product ]['no_gap'] ) && 1 == $this->products[ $product ]['no_gap'] ) { + // Add to the user's existing date (no gap). + $new_value = strtotime( $add_period, $prev_value ); + } else { + // Add to the user either from end or now (whichever is later; i.e. allow gaps (default)). + if ( wpmem_user_has_access( $product, $user_id ) ) { + // if not expired, set from when they expire. + $new_value = strtotime( $add_period, $prev_value ); + } else { + // if expired, set from today. + $new_value = strtotime( $add_period ); + } + } + } else { + // User doesn't have this membershp. Go ahead and add it. + + // If we are using fixed period expiration, calculate the expiration date + if ( isset( $this->products[ $product ] ) && isset( $this->products[ $product ]['fixed_period'] ) ) { + // Calculate the fixed period expiration. + $new_value = $this->calculate_fixed_period ( $product ); + } else { + // Just add to the existing expiration. + $new_value = strtotime( $add_period ); + } + } + } + + /** + * Filter the expiration date. + * + * @since 3.3.2 + * + * @param int|boolean $new_value Unix timestamp of new expiration, true|false if not an expiry product. + * @param int|boolean $prev_value The user's current value (prior to updating). + * @param boolean $renew Is this a renewal transaction? + */ + $new_value = apply_filters( 'wpmem_user_product_set_expiration', $new_value, $prev_value, $renew ); + + return $new_value; + } + + /** + * Calculate a fixed period expiration. + * + * @since 3.3.5 + * + * @param string $product + * @return string $timestamp + */ + function calculate_fixed_period( $product ) { + // Use fixed period expiration. + $end = $this->products[ $product ]['fixed_period']['end']; + + // Get the current year. + $current_year = date( 'Y' ); + + // Format period end date for current year. + $cur_date = DateTime::createFromFormat( 'd-m-Y', $end . '-' . $current_year ); //DateTime( $start_date ); + + // Where are we now? + $now = new DateTime(); + + // If date is past, set next period. + if ( $cur_date < $now ) { + // Date is past. + $next_year = date( 'Y', strtotime( '+1 year' ) ); + $next_date = DateTime::createFromFormat( 'd-m-Y', $end . '-' . $next_year ); + $new_value = $next_date->format( 'U' ); + } else { + // Date is not past. + // Are we using a grace period? + if ( isset( $this->products[ $product ]['fixed_period']['grace'] ) && $this->products[ $product ]['fixed_period']['grace']['num'] > 0 ) { + // Are we in the grace period? + $grace_period = "-" . $this->products[ $product ]['fixed_period']['grace']['num'] . " " . $this->products[ $product ]['fixed_period']['grace']['per']; + $grace_date = DateTime::createFromFormat( 'U', strtotime( $grace_period, strtotime( $cur_date->format( 'd-m-Y' ) ) ) ); + if ( $grace_date < $now ) { + // We are in grace period, set expiration as next year. + $next_year = date( 'Y', strtotime( '+1 year' ) ); + $next_date = DateTime::createFromFormat( 'd-m-Y', $end . '-' . $next_year ); + $new_value = $next_date->format( 'U' ); + } else { + // Not in grace period, set the current year. + $new_value = $cur_date->format( 'U' ); + } + } else { + // No grace period, and date is not past. Use current year. + $new_value = $cur_date->format( 'U' ); + } + } + + return $new_value; + } + + /** + * Adds [user_memberships] shortcode for use in the admin email + * + * @since 3.4.4 + * + * @param array $shortcodes + * @param string $tag + * @param int $user_id + * @return array $shortcodes + */ + function email_shortcodes( $shortcodes, $tag, $user_id ) { + global $wpmem; + if ( 'notify' == $tag ) { + $user_memberships = wpmem_get_user_memberships( $user_id ); + $site_memberships = wpmem_get_memberships(); + $email_memberships = ( $wpmem->email->html ) ? '

      ' : ""; + foreach ( $user_memberships as $meta_key => $membership ) { + $email_memberships .= ( $wpmem->email->html ) ? "
    • " . $site_memberships[ $meta_key ]['title'] . '
    • ' : $site_memberships[ $meta_key ]['title'] . "\r\n"; + } + $email_memberships .= ( $wpmem->email->html ) ? '
    ' : ""; + + $shortcodes['memberships'] = $email_memberships; + } + return $shortcodes; + } + + public function sc_show_memberships( $atts, $content, $tag ) { + + $pairs = array( + 'title_before' => '

    ', + 'title_after' => '

    ', + 'title' => __( 'Memberships', 'wp-members' ), + 'list_before' => '
      ', + 'list_after' => '
    ', + 'item_before' => '
  • ', + 'item_after' => '
  • ', + 'date_format' => 'default', + 'no_expire' => __( 'Does not expire', 'wp-members' ), + ); + + $args = shortcode_atts( $pairs, $atts, $tag ); + + $content = $args['title_before'] . $args['title'] . $args['title_after']; + $content .= $args['list_before']; + foreach ( wpmem_get_user_memberships() as $key => $value ) { + + $exp_date = wpmem_get_user_expiration( $key ); + if ( $exp_date > 1 ) { + $exp_formatted = ( 'default' == $args['date_format'] ) ? wpmem_format_date( $exp_date ) : date( $args['date_format'], $exp_date ); + } else { + $exp_formatted = $args['no_expire']; + } + + if ( $value ) { + $content .= $args['item_before'] . wpmem_get_membership_name( $key ) . " - " . $exp_formatted . $args['item_after']; + } + } + $content .= $args['list_after']; + return $content; + } + + public function sc_show_membership_posts( $atts, $content, $tag ) { + + $pairs = array( + 'title_before' => '

    ', + 'title_after' => '

    ', + 'list_before' => '
      ', + 'list_after' => '
    ', + 'item_before' => '
  • ', + 'item_after' => '
  • ', + ); + + $args = shortcode_atts( $pairs, $atts, $tag ); + + // Go through each membership the user has. + foreach ( wpmem_get_user_memberships() as $key => $value ) { + + // Get a list of content for this membership. + $ids = wpmem_get_membership_post_list( $key ); + + if ( $ids ) { + + $title = $args['title_before'] . wpmem_get_membership_name( $key ) . $args['title_after']; + $post_list = $args['list_before']; + foreach ( $ids as $id ) { + $title = get_the_title( $id ); + $link = '' . $title . ''; + $post_list .= $args['item_before'] . $link . $args['item_after']; + } + $post_list .= $args['list_after']; + + $content .= $title . $post_list; + } + } + + return $content; + } +} \ No newline at end of file diff --git a/includes/class-wp-members-pwd-reset.php b/includes/class-wp-members-pwd-reset.php new file mode 100644 index 00000000..a3b71001 --- /dev/null +++ b/includes/class-wp-members-pwd-reset.php @@ -0,0 +1,240 @@ + __( "Invalid key." ), + 'invalid_user' => __( "Invalid user.", 'wp-members' ), + 'key_is_expired' => __( "Sorry, the password reset key is expired.", 'wp-members' ), + 'request_new_key' => __( "Request a new reset key.", 'wp-members' ), + ); + + /** + * Filter default dialogs. + * + * @since 3.3.8 + * + * @param array $defaults { + * + * } + */ + $defaults = apply_filters( 'wpmem_pwd_reset_default_dialogs', $defaults ); + + foreach ( $defaults as $key => $value ) { + $this->{$key} = $value; + } + + add_filter( 'wpmem_email_filter', array( $this, 'add_reset_key_to_email' ), 10, 3 ); + add_action( 'template_redirect', array( $this, 'handle_reset' ), 20 ); + //add_filter( 'the_content', array( $this, 'display_content' ), 100 ); + } + + function handle_reset() { + + // User has to be not logged in and action needs to be 'set_password_from_key' + if ( ! is_user_logged_in() && $this->action == wpmem_get( 'a', false, 'request' ) && ! is_admin() ) { + + $key = sanitize_text_field( wpmem_get( 'key', false, 'request' ) ); + $login = sanitize_text_field( wpmem_get( 'login', false, 'request' ) ); + $pass1 = wpmem_get( 'pass1', false ); + + $form_submitted = ( 1 == wpmem_get( 'formsubmit' ) && $this->action == wpmem_get( 'a', false ) ) ? true : false; + + // Set an error container. + $errors = new WP_Error(); + + // Check the user. get_user_by() will return false if user_login does not exist. + $is_user = get_user_by( 'login', $login ); + if ( false == $is_user ) { + $errors->add( 'invalid_user', $this->error_msg( 'invalid_user', $this->invalid_user ) ); + } + + /** + * Validate the key. + * + * WP_Error will be invalid_key or expired_key. Process triggers password_reset_expiration filter + * filtering DAY_IN_SECONDS default. Filter password_reset_key_expired is also triggered filtering + * the return value (which can be used to override the expired/invalid check based on user_id). + * + * WP filter/actions triggered: + * - password_reset_expiration + * - password_reset_key_expired + * + * @see https://developer.wordpress.org/reference/functions/check_password_reset_key/ + * @param string Hash to validate sending user's password. + * @param string The user login. + * @return WP_User|WP_Error WP_User object on success, WP_Error object for invalid or expired keys (invalid_key|expired_key). + */ + $user = check_password_reset_key( $key, $login ); + + if ( $user->has_errors() ) { + $errors->add( 'invalid_key', $this->error_msg( 'invalid_key', $this->invalid_key ) ); + } + + // If the password change form was submitted, validate the result. + if ( $form_submitted ) { + + // Verify nonce. + if ( ! wp_verify_nonce( $_REQUEST['_wpmem_pwdchange_nonce'], 'wpmem_shortform_nonce' ) ) { + $errors->add( 'reg_generic', $this->error_msg( 'reg_generic', wpmem_get_text( 'reg_generic' ) ) ); + } + + // Can't have an empty pass1. + if ( '' == $pass1 || false == $pass1 ) { + $errors->add( 'password_empty', $this->error_msg( 'password_empty', wpmem_get_text( 'pwdchangempty' ) ) ); + } + + // Make sure submitted passwords match. + if ( $pass1 != wpmem_get( 'pass2', false ) ) { + $errors->add( 'password_reset_mismatch', $this->error_msg( 'password_reset_mismatch', wpmem_get_text( 'pwdchangerr' ) ) ); + } + + /** This action is documented in wp-login.php */ + // do_action( 'validate_password_reset', $errors, $user ); + } + + /** + * Filter validation result. + * + * @since 3.4.7 + * + * @param stdClass $errors + * @param stdClass $user + * @param boolean $form_submitted + */ + $errors = apply_filters( 'wpmem_validate_password_reset', $errors, $user, $form_submitted ); + + // If form was submitted. + if ( $form_submitted ) { + if ( ! $errors->has_errors() ) { + reset_password( $user, $pass1 ); + $this->content = wpmem_get_display_message( 'pwdchangesuccess', $this->error_msg( 'pwdchangesuccess' ) ) . wpmem_login_form( 'pwdreset' ); + } else { + $this->content = $errors->get_error_message() . wpmem_change_password_form(); + } + } else { + // Password change form has not been submitted yet. + if ( ! $errors->has_errors() ) { + $this->content = wpmem_change_password_form(); + } else { + $this->content = $errors->get_error_message(); + } + } + } + } + + /** + * Add reset key to the email. + * + * @since 3.3.5 + * + * @param array $arr + * @param array $wpmem_fields + * @param array $field_data + * @return array $arr + */ + function add_reset_key_to_email( $arr, $wpmem_fields, $field_data ) { + + if ( $arr['toggle'] == 'repass' ) { + + $user = get_user_by( 'ID', $arr['user_id'] ); + + // Get the stored key. + $key = get_password_reset_key( $user ); + $query_args = array( + 'a' => $this->action, + 'key' => $key, + 'login' => $user->user_login, + ); + + // urlencode, primarily for user_login with a space. + $query_args = array_map( 'rawurlencode', $query_args ); + + // Generate reset link. + $link = add_query_arg( $query_args, trailingslashit( wpmem_profile_url() ) ); + + /** + * Filter the password reset URL in the email. + * + * @since 3.4.5 + * + * @param string $link + * @param array $query_args + * @param object $user + */ + $link = apply_filters( 'wpmem_pwd_reset_email_link', $link, $query_args, $user ); + + // Does email body have the [reset_link] shortcode? + if ( strpos( $arr['body'], '[reset_link]' ) ) { + $arr['body'] = str_replace( '[reset_link]', $link, $arr['body'] ); + } else { + // Add text and link to the email body. + $arr['body'] = $arr['body'] . "\r\n" + . $link; + } + } + return $arr; + } + + /** + * Display page content to user. + * + * @since 3.3.5 + * + * @param string $content + * @return string $content + */ + function display_content( $content ) { + return ( false != $this->content ) ? $this->content : $content; + } + + + function error_msg( $code, $message = false ) { + if ( $message ) { + $error = wpmem_get_display_message( $code, $message . '
    ' . $this->request_new_key . '' ); + } else { + $error = wpmem_get_display_message( $code ); + } + /** + * Filters the password reset error message. + * + * @since 3.4.4 + * + * @param string $error The generated HTML error message. + * @param string $code The error code generated. + * @param string $message The plain text error message. + */ + return apply_filters( 'wpmem_pwd_reset_error_msg', $error, $code, $message ); + } +} \ No newline at end of file diff --git a/includes/class-wp-members-shortcodes.php b/includes/class-wp-members-shortcodes.php new file mode 100644 index 00000000..962a65d4 --- /dev/null +++ b/includes/class-wp-members-shortcodes.php @@ -0,0 +1,1383 @@ + '', + 'redirect_to' => null, + 'texturize' => false, + 'form_id' => false, + ); + $atts = wp_parse_args( $atts, $defaults ); + + $atts['form'] = ( isset( $atts[0] ) ) ? $atts[0] : 'login'; + unset( $atts[0] ); + + $customizer = ( is_customize_preview() ) ? get_theme_mod( 'wpmem_show_logged_out_state', false ) : false; + + // If $atts is an array, get the tag from the array so we know what form to render. + switch ( $atts['form'] ) { + + case 'wp_login': + if ( is_user_logged_in() && '1' != $customizer ) { + // If the user is logged in, return any nested content (if any) or the default bullet links if no nested content. + $content = ( $content ) ? $content : $this->render_links( 'login' ); + } else { + $atts['echo'] = false; + $atts['redirect'] = ( isset( $atts['redirect'] ) ) ? $atts['redirect'] : ( ( isset( $atts['redirect_to'] ) ) ? $atts['redirect_to'] : wpmem_current_url() ); + $content = wpmem_wp_login_form( $atts ); + } + break; + + case 'register': + + // Set up register form args. + $reg_form_args = array( 'tag' => 'new' ); + if ( isset( $redirect_to ) ) { + $reg_form_args['redirect_to'] = $redirect_to; + } + + if ( is_user_logged_in() && '1' != $customizer ) { + /* + * If the user is logged in, return any nested content (if any) + * or the default bullet links if no nested content. + */ + $content = ( $content ) ? $content : $this->render_links( 'register' ); + } elseif ( is_user_logged_in() && is_customize_preview() && get_theme_mod( 'wpmem_show_form_message_dialog', false ) ) { + $wpmem_themsg = __( "This is a generic message to display the form message dialog in the Customizer.", 'wp-members' ); + $content = wpmem_get_display_message( $wpmem->regchk, $wpmem_themsg ); + $content .= wpmem_register_form( $reg_form_args ); + } else { + if ( $wpmem->regchk == 'loginfailed' ) { + $content = $wpmem->dialogs->login_failed() . wpmem_login_form(); + break; + } + // @todo Can this be moved into another function? Should $wpmem get an error message handler? + if ( $wpmem->regchk == 'captcha' ) { + global $wpmem_captcha_err; + $wpmem_themsg = wpmem_get_text( 'reg_captcha_err' ) . '

    ' . $wpmem_captcha_err; + } + $content = ( $wpmem_themsg || $wpmem->regchk == 'success' ) ? wpmem_get_display_message( $wpmem->regchk, $wpmem_themsg ) : ''; + $content .= ( $wpmem->regchk == 'success' ) ? wpmem_login_form() : wpmem_register_form( $reg_form_args ); + } + break; + + case 'password': + $content = $this->render_pwd_reset( $wpmem->regchk, $content ); + break; + + case 'user_edit': + $content = $this->render_user_edit( $wpmem->regchk, $content, $atts ); + break; + + case 'forgot_username': + $content = $this->render_forgot_username( $wpmem->regchk, $content ); + break; + + // @todo Review - is this actually ever triggered? + case 'customizer_login': + $content = wpmem_login_form(); + break; + + // @todo Review - is this actually ever triggered? + case 'customizer_register': + $content = wpmem_register_form( 'new' ); + break; + + case 'login': + default: + if ( is_user_logged_in() && '1' != $customizer ) { + // If the user is logged in, return any nested content (if any) or the default bullet links if no nested content. + $content = ( $content ) ? $content : $this->render_links( 'login' ); + } else { + $content = ''; + if ( $wpmem->regchk == 'loginfailed' || ( is_customize_preview() && get_theme_mod( 'wpmem_show_form_message_dialog', false ) ) ) { + $content = wpmem_get_display_message( 'loginfailed' ); + } + $form_id = ( $atts['form_id'] ) ? $atts['form_id'] : 'wpmem_login_form'; + $content .= wpmem_login_form( array( 'redirect_to'=>$atts['redirect_to'], 'form_id'=>$form_id ) ); + } + break; + + } + + return do_shortcode( $content ); + } + + /** + * Restricts content to logged in users using the shortcode [wpmem_logged_in]. + * + * There are several attributes that can be used with the shortcode: + * in|out, sub for subscription only info, id, and role. IDs and roles + * can be comma separated values for multiple users and roles. + * + * @since 3.0.0 + * @since 3.2.0 Moved to WP_Members_Shortcodes::logged_in(). + * @since 3.2.0 Added attributes for meta key/value pairs. + * @since 3.2.3 Added product attribute. + * @since 3.3.0 Added compare attribute for meta key/value compare (=|!=). + * + * @global object $wpmem The WP_Members object. + * + * @param array $atts { + * Attributes of the wpmem_logged_in shortcode. + * + * @type string $status User status to check (in|out) (optional). + * @type int $id The user's ID. Restricts to a specified user by ID (optional). + * @type string $role The user's role. Restrictes to a specific role (optional). + * @type string $sub If the user is a current subscriber (for use with the PayPal extension) (optional). + * @type string $meta_key If the user has a specified meta key (use with meta_value) (optional). + * @type string $meta_value If the user has a specific meta key value (use with meta_key) (optional). + * @tryp string $compare Can specify a comparison operator when using meta_key/meta_value (optional). + * @type string $product If the user has a specific product/membership (optional). + * @type string $membership If the user has a specific product/membership (optional). + * @type string $wrap_id Adds a div wrapper with specified id. + * @type string $wrap_class Adds a div wrapper with specified class. + * @type string $wrap_tag Specifies wrapper tag (default: div) + * } + * @param string $content Shortcode content. + * @param string $tag The shortcode's tag (wpmem_logged_in). + * @return string|void The restricted content to display if the user meets the criteria. + */ + function logged_in( $atts, $content, $tag ) { + + global $wpmem; + + // Handles the 'status' attribute. + if ( ( isset( $atts['status'] ) ) || $tag == 'wpmem_logged_in' ) { + + $do_return = false; + + // If there is a status attribute of "out" and the user is not logged in. + $do_return = ( isset( $atts['status'] ) && $atts['status'] == 'out' && ! is_user_logged_in() ) ? true : $do_return; + + if ( is_user_logged_in() ) { + + // In case $current_user is not already global + $current_user = wp_get_current_user(); + + // If there is a status attribute of "in" and the user is logged in. + $do_return = ( isset( $atts['status'] ) && $atts['status'] == 'in' ) ? true : $do_return; + + // If using the wpmem_logged_in tag with no attributes & the user is logged in. + $do_return = ( $tag == 'wpmem_logged_in' && ( ! $atts ) ) ? true : $do_return; + + // If there is an "id" attribute and the user ID is in it. + if ( isset( $atts['id'] ) ) { + $ids = explode( ',', $atts['id'] ); + foreach ( $ids as $id ) { + if ( trim( $id ) == $current_user->ID ) { + $do_return = true; + } + } + } + + // If there is a "role" attribute and the user has a matching role. + if ( isset( $atts['role'] ) ) { + $roles = explode( ',', $atts['role'] ); + if ( wpmem_user_has_role( $roles ) ) { + $do_return = true; + } + } + + // If there is a status attribute of "sub" and the user is logged in. + if ( ( isset( $atts['status'] ) ) && $atts['status'] == 'sub' ) { + if ( defined( 'WPMEM_EXP_MODULE' ) && $wpmem->use_exp == 1 ) { + if ( ! wpmem_is_user_current() ) { + $do_return = true; + } elseif ( $atts['msg'] == "true" ) { + $do_return = true; + $content = wpmem_sc_expmessage(); + } + } + } + + // If there is a meta key attribute. + if ( isset( $atts['meta_key'] ) ) { + $do_return = false; + $value = ( isset( $atts['meta_value'] ) ) ? $atts['meta_value'] : false; + if ( ! isset( $atts['compare'] ) || "=" == $atts['compare'] ) { + if ( wpmem_user_has_meta( $atts['meta_key'], $value ) ) { + $do_return = true; + } + } + if ( isset( $atts['compare'] ) && "!=" == $atts['compare'] ) { + if ( ! wpmem_user_has_meta( $atts['meta_key'], $value ) ) { + $do_return = true; + } + } + } + + // If there is a product attribute. + if ( isset( $atts['product'] ) || isset( $atts['membership'] ) ) { + // @todo What if attribute is comma separated/multiple? + $membership = ( isset( $atts['membership'] ) ) ? $atts['membership'] : $atts['product']; + $message = ( isset( $atts['msg'] ) && ( true === $atts['msg'] || "true" === strtolower( $atts['msg'] ) ) ) ? true : false; + $not_in = ( isset( $atts['not_in'] ) && "false" != $atts['not_in'] ) ? true : false; + if ( true == $not_in ) { + $do_return = ( wpmem_user_has_access( $membership ) || ! is_user_logged_in() ) ? false : true; + } else { + if ( wpmem_user_has_access( $membership ) ) { + $do_return = true; + } elseif ( true === $message ) { + $do_return = true; + $settings = array( + 'wrapper_before' => '
    ', + 'msg' => sprintf( wpmem_get_text( 'product_restricted' ), wpmem_get_membership_name( $membership ) ), + 'wrapper_after' => '
    ', + ); + /** + * Filter the access failed message. + * + * @since 3.3.0 + * @since 3.3.3 Changed from 'wpmem_sc_product_access_denied' + * + * @param array $settings. + */ + $settings = apply_filters( 'wpmem_sc_product_restricted', $settings ); + $content = $settings['wrapper_before'] . $settings['msg'] . $settings['wrapper_after']; + } + } + } + + // Prevents display if the current page is the user profile and an action is being handled. + if ( ( wpmem_current_url( true, false ) == wpmem_profile_url() ) && isset( $_GET['a'] ) ) { + $do_return = false; + } + + // Adds optional wrapper. + if ( isset( $atts['wrap_id'] ) || isset( $atts['wrap_class'] ) ) { + $tag = ( isset( $atts['wrap_tag'] ) ) ? $atts['wrap_tag'] : 'div'; + $wrapper = '<' . $tag; + $wrapper .= ( isset( $atts['wrap_id'] ) ) ? ' id="' . $atts['wrap_id'] . '"' : ''; + $wrapper .= ( isset( $atts['wrap_class'] ) ) ? ' class="' . $atts['wrap_class'] . '"' : ''; + $wrapper .= '>'; + $content = $wrapper . $content . ''; + } + + } + + // Return content (or empty content) depending on the result of the above logic. + return ( $do_return ) ? do_shortcode( $content ) : ''; + } + } + + /** + * Renders the [wpmem_logged_out] shortcode. + * + * @since 3.0.0 + * @since 3.2.0 Moved to WP_Members_Shortcodes::logged_out(). + * + * @param array $atts There are no attributes for this shortcode. + * @param string $content Conent to display if user is logged out. + * @param string $tag The shortcode tab (wpmem_logged_out). + * @return string $content The content, if the user is logged out, otherwise an empty string. + */ + function logged_out( $atts, $content, $tag ) { + return ( ! is_user_logged_in() ) ? do_shortcode( $content ) : ''; + } + + /** + * Displays the user count shortcode [wpmem_show_count]. + * + * User count displays a total user count or a count of users by specific + * role (role="some_role"). It also accepts attributes for counting users + * by a meta field (key="meta_key" value="meta_value"). A label can be + * displayed using the attribute label (label="Some label:"). + * + * @since 3.0.0 + * @since 3.1.5 Added total user count features. + * @since 3.2.0 Moved to WP_Members_Shortcodes::user_count(). + * + * @global object $wpdb The WordPress database object. + * @param array $atts { + * The shortcode attributes. + * + * @type string $key The user meta key, if displaying count by meta key. + * @type string $value The user meta value, if displaying count by meta key. + * @type string $role The user role, if displaying count by role. + * @type string $label Label to display with the count (optional). + * } + * @param string $content Does not accept nested content. + * @param string $tag The shortcode's tag (wpmem_show_count). + * @return string $content The user count. + */ + function user_count( $atts, $content, $tag ) { + if ( isset( $atts['key'] ) && isset( $atts['value'] ) ) { + // If by meta key. + global $wpdb; + $user_count = $wpdb->get_var( $wpdb->prepare( + "SELECT COUNT(*) FROM $wpdb->usermeta WHERE meta_key = %s AND meta_value = %s", + $atts['key'], + $atts['value'] + ) ); + } else { + // If no meta, it's a total count. + $users = count_users(); + $user_count = ( isset( $atts['role'] ) ) ? $users['avail_roles'][ $atts['role'] ] : $users['total_users']; + } + + // Assemble the output and return. + $content = ( isset( $atts['label'] ) ) ? $atts['label'] . ' ' . $user_count : $content . ' ' . $user_count; + return do_shortcode( $content ); + } + + /** + * Creates the user profile dashboard area [wpmem_profile]. + * + * @since 3.1.0 + * @since 3.1.2 Added function arguments. + * @since 3.2.0 Moved to WP_Members_Shortcodes::user_profile(). + * + * @global object $wpmem The WP_Members object. + * @global string $wpmem_themsg The WP-Members message container. + * @param string $atts { + * The shortcode attributes (filter with 'shortcode_atts_wpmem_profile'). + * + * @type string $redirect_to + * @type string $register "hide" removes registration form, any other value is false. + * } + * @param string $content + * @param string $tag + * @return string $content + */ + function user_profile( $atts, $content, $tag ) { + + global $wpmem, $wpmem_themsg; + + $pairs = array( + 'register' => 'show', + 'redirect_to' => '', + ); + + $args = shortcode_atts( $pairs, $atts, $tag ); + + // @todo $redirect_to is not currently used in the user profile. + $redirect_to = $args['redirect_to']; + $hide_register = ( isset( $args['register'] ) && 'hide' == $args['register'] ) ? true : false; + + $content = ''; + + if ( $wpmem->regchk == "captcha" ) { + global $wpmem_captcha_err; + $wpmem_themsg = wpmem_get_text( 'reg_captcha_err' ) . '

    ' . $wpmem_captcha_err; + } + + if ( is_user_logged_in() ) { + + switch( $wpmem->action ) { + + case "edit": + $content = $content . wpmem_register_form( 'edit' ); + break; + + case "update": + // Determine if there are any errors/empty fields. + if ( $wpmem->regchk == "updaterr" || $wpmem->regchk == "email" ) { + $content = $content . wpmem_get_display_message( $wpmem->regchk, $wpmem_themsg ); + $content = $content . wpmem_register_form( 'edit' ); + } else { + //Case "editsuccess". + $content = $content . wpmem_get_display_message( $wpmem->regchk, $wpmem_themsg ); + $content = $content . $this->render_links(); + } + break; + + case "pwdchange": + $content = $this->render_pwd_reset( $wpmem->regchk, $content ); + $content = ( 'pwdchangesuccess' == $wpmem->regchk ) ? $content . $this->render_links() : $content; + break; + + case "renew": + if ( function_exists( 'wpmem_renew' ) ) { + $content = wpmem_renew(); + } else { + $content = ''; + } + break; + + default: + $content = $this->render_links(); + break; + } + + } else { + + if ( ( 'login' == $wpmem->action ) || ( 'register' == $wpmem->action && ! $hide_register ) ) { + + $content = wpmem_get_display_message( $wpmem->regchk, $wpmem_themsg ); + $content.= ( 'loginfailed' == $wpmem->regchk || 'success' == $wpmem->regchk ) ? wpmem_login_form() : wpmem_register_form(); + + } elseif ( 'pwdreset' == $wpmem->action ) { + + $content = $this->render_pwd_reset( $wpmem->regchk, $content ); + + } elseif ( 'set_password_from_key' == $wpmem->action ) { + + $content = ( false != $wpmem->pwd_reset->content ) ? $wpmem->pwd_reset->content : $content; + + } elseif ( 'getusername' == $wpmem->action ) { + + $content = $this->render_forgot_username( $wpmem->regchk, $content ); + + } else { + + $content = $content . wpmem_login_form( 'profile' ); + $content = ( ! $hide_register ) ? $content . wpmem_register_form() : $content; + } + } + + return $content; + } + + /** + * Log in/out shortcode [wpmem_loginout]. + * + * @since 3.1.1 + * @since 3.1.6 Uses wpmem_loginout(). + * @since 3.2.0 Moved to WP_Members_Shortcodes::loginout(). + * + * @param array $atts { + * The shortcode attributes. + * + * @type string $login_redirect_to The url to redirect to after login (optional). + * @type string $logout_redirect_to The url to redirect to after logout (optional). + * @type string $login_text Text for the login link (optional). + * @type string $logout_text Text for the logout link (optional). + * } + * @param string $content + * @param string $tag + * @return string $content + */ + function loginout( $atts, $content, $tag ) { + $link = wpmem_loginout( $atts ); + return do_shortcode( $link ); + } + + /** + * Function to handle field shortcodes [wpmem_field]. + * + * Shortcode to display the data for a given user field. Requires + * that a field meta key be passed as an attribute. Can either of + * the following: + * - [wpmem_field field="meta_key"] + * - [wpmem_field meta_key] + * + * Other attributes: + * + * - id (numeric user ID or "get" to retrieve uid from query string. + * - underscores="true" strips underscores from the displayed value. + * - display="raw" displays the stored value for dropdowns, radios, files. + * - size(thumbnail|medium|large|full|w,h): image field only. + * - clickable + * - label + * + * Filter the end result with `wpmem_field_shortcode`. + * + * @since 3.1.2 + * @since 3.1.4 Changed to display value rather than stored value for dropdown/multicheck/radio. + * @since 3.1.5 Added display attribute, meta key as a direct attribute, and image/file display. + * @since 3.2.0 Moved to WP_Members_Shortcodes::fields(). + * @since 3.2.0 Added clickable attribute. + * @since 3.2.5 Added label attribute. + * + * @global object $wpmem The WP_Members object. + * @param array $atts { + * The shortcode attributes. + * + * @type string {meta_key} + * @type string $field + * @type int $id + * @type string $underscores + * @type string $display + * @type string $size + * @type string $clickable default:false + * @type string $label default:false + * } + * @param string $content Any content passed with the shortcode (default:null). + * @param string $tag The shortcode tag (wpmem_form). + * @return string $content Content to return. + */ + function fields( $atts, $content, $tag ) { + + // What field? + if ( isset( $atts[0] ) ) { + $field = $atts[0]; + } elseif ( isset( $atts['field'] ) ) { + $field = $atts['field']; + } else { + return; // If the field is not directly set in the attributes array, or keyed as "field", then it's not used correctly so return void. + } + + // What user? + if ( isset( $atts['id'] ) ) { + if ( 'author' == $atts['id'] ) { + global $post; + $field_user_id = get_post_field( 'post_author', $post->ID ); + + // Alternate method: + // $field_user_id = get_the_author_meta( 'ID' ); + } else { + $field_user_id = ( $atts['id'] == 'get' ) ? wpmem_get( 'uid', '', 'get' ) : $atts['id']; + } + } else { + $field_user_id = get_current_user_id(); + } + + // Sanitize the result. + $sanitized_user_id = intval( $field_user_id ); + + // Get the user data. + $user_info = get_userdata( $sanitized_user_id ); + + // If there is userdata. + if ( $user_info && isset( $user_info->{$field} ) ) { + + global $wpmem; + $fields = wpmem_fields(); + + $field_type = ( 'user_login' == $field || ! isset( $fields[ $field ] ) ) ? 'text' : $fields[ $field ]['type']; + $user_info_field = ( isset( $field ) && is_object( $user_info ) ) ? $user_info->{$field} : ''; + $result = false; + + // Handle each field type. + switch ( $field_type ) { + + // Select and radio groups have single selections. + case 'select': + case 'radio': + $result = ( isset( $atts['display'] ) && 'raw' == $atts['display'] ) ? $user_info_field : wpmem_select_field_display( $field, $user_info_field ); + break; + + // Multiple select and multiple checkbox have multiple selections. + case 'multiselect': + case 'multicheckbox': + case 'membership': + if ( isset( $atts['display'] ) && 'raw' == $atts['display'] ) { + $result = $user_info_field; + } else { + $saved_vals = explode( $fields[ $field ]['delimiter'], $user_info_field ); + $result = ''; $x = 1; + if ( 'list' == $atts['display'] ) { + /** + * Filter list multi field list display HTML parts. + * + * @since 3.4.5 + * + * @param array { + * The HTML parts (defaults as a bulleted list) + * + * @type string $wrapper_before + * @type string $item_before + * @type string $item_after + * @type string $wrapper_after + * } + * @param string $field + * / + $multi_args = apply_filters( 'wpmem_field_shortcode_multi_args', array( + 'wrapper_before' => '
      ', + 'item_id' => 'wpmem-sc-multi-' . $field, + 'item_class' => 'wpmem-sc-multi', + 'item_before' => '
    • ', + 'item_after' => '
    • ', + 'wrapper_after' => '
    ', + ), $field ); + + foreach ( $saved_vals as $value ) { + $rows[ $value ] = array( + 'item_before' => $multi_args['item_before'], + 'id' => $multi_args['item_id'] . '-' . $value, + 'class' => $multi_args['item_class'], + 'value' => $value, + 'title' => $value, + 'item_after' => $multi_args['item_after'], + ); + } + /** + * Filter the row parts + * + * @since 3.4.5 + * + * @param array $rows + * @param string $field + * / + $rows = apply_filters( 'wpmem_field_shortcode_multi_rows', $rows, $field ); + $row_items = ''; + foreach ( $rows as $value => $row ) { + $row_items .= sprintf( $row['item_before'], esc_attr( $row['id'] . '-' . $row['value'] ), esc_attr( $row['class'] ) ) . esc_attr( $row['title'] ) . $row['item_after']; + } + + $result = $multi_args['wrapper_before'] . $row_items . $multi_args['wrapper_after']; + */ + + $args = array( + 'wrapper' => array( + 'tag' => ( isset( $atts['wrapper_tag'] ) ) ? $atts['wrapper_tag'] : 'ul', + 'atts' => array( + 'id' => ( isset( $atts['wrapper_id'] ) ) ? $atts['wrapper_id'] : 'wpmem_field_' . $field, + 'class' => ( isset( $atts['wrapper_class'] ) ) ? $atts['wrapper_class'] : 'wpmem-field-multi-list', + ), + ), + ); + foreach ( $saved_vals as $value ) { + $args['item'][ $value ] = array( + 'tag' => ( isset( $atts['item_tag'] ) ) ? $atts['item_tag'] : 'li', + 'atts' => array( + 'id' => 'wpmem_field_' . $field . '_' . $value, + 'class' => 'wpmem-field-' . $field . '-item-' . $value, + ), + 'content' => $value + ); + } + /** + * Filter list multi field list display HTML parts. + * + * @since 3.4.5 + * + * @param array { + * The HTML parts (defaults as a bulleted list) + * + * @type array $wrapper { + * The wrapper parts. + * + * @type string $tag The HTML tag (default: ul) + * @type array $atts The HTML tag attributes + * @type string $content The content wrapped by the tag (default: list items) + * } + * @type array $item { + * An item for each list item. + * + * @type string $tag The HTML tag (default: li) + * @type array $atts The HTML tag attributes + * @type string $content The list item value + * } + * } + * @param string $field + */ + $multi_args = apply_filters( 'wpmem_field_sc_multi_html', $args, $field ); + + $list = ''; + foreach ( $multi_args['item'] as $item ) { + $list .= rktgk_build_html_tag( $item ); + } + $multi_args['wrapper']['content'] = $list; + $result = rktgk_build_html_tag( $multi_args['wrapper'] ); + + } else { + foreach ( $saved_vals as $value ) { + $result.= ( $x > 1 ) ? ', ' : ''; $x++; + $result.= wpmem_select_field_display( $field, $value );; + } + } + } + break; + + case 'file': + case 'image': + if ( isset( $atts['display'] ) ) { + switch ( $atts['display'] ) { + case "url": + $result = wp_get_attachment_url( $user_info_field ); + break; + case "raw": + default: + $result = $user_info_field; + break; + } + + } else { + if ( 'file' == $field_type ) { + $attachment_url = wp_get_attachment_url( $user_info_field ); + /** + * Filter the file html tag parts. + * + * @since 3.4.5 + * + * @param array $args + * @param string $field + */ + $html_args = apply_filters( 'wpmem_field_sc_file_html', array( + 'tag' => 'a', + 'atts' => array( + 'href' => esc_url( $attachment_url ), + 'id' => ( isset( $atts['id'] ) ) ? esc_attr( $atts['id'] ) : esc_attr( 'wpmem_field_file_' . $field ), + 'class' => ( isset( $atts['class'] ) ) ? esc_attr( $atts['class'] ) : esc_attr( 'wpmem-field-file-' . $field ), + ), + 'content' => get_the_title( $user_info_field ), + ), $field ); + $result = ( $attachment_url ) ? rktgk_build_html_tag( $html_args ) : ''; + } else { + $size = 'thumbnail'; + if ( isset( $atts['size'] ) ) { + $sizes = array( 'thumbnail', 'medium', 'large', 'full' ); + $size = ( ! in_array( $atts['size'], $sizes ) ) ? explode( ",", $atts['size'] ) : $atts['size']; + } + $image = wp_get_attachment_image_src( $user_info_field, $size ); + /** + * Filter the image html tag parts. + * + * @since 3.4.5 + * + * @param array $args + * @param string $field + */ + $html_args = apply_filters( 'wpmem_field_sc_image_html', array( + 'tag' => 'img', + 'atts' => array( + 'src' => esc_url( $image[0] ), + 'width' => esc_attr( $image[1] ), + 'height' => esc_attr( $image[2] ), + 'id' => ( isset( $atts['id'] ) ) ? esc_attr( $atts['id'] ) : esc_attr( 'wpmem_field_img_' . $field ), + 'class' => ( isset( $atts['class'] ) ) ? esc_attr( $atts['class'] ) : esc_attr( 'wpmem-field-img-' . $field ) + ), + ), $field ); + $result = ( $image ) ? rktgk_build_html_tag( $html_args ) : ''; + } + } + break; + + case 'textarea': + // Handle line breaks for textarea fields + $result = ( isset( $atts['display'] ) && 'raw' == $atts['display'] ) ? $user_info_field : nl2br( $user_info_field ); + break; + + case 'date': + if ( isset( $atts['format'] ) ) { + // Formats date: https://secure.php.net/manual/en/function.date.php + $result = ( '' != $user_info_field ) ? date( $atts['format'], strtotime( $user_info_field ) ) : ''; + } else { + // Formats date to whatever the WP setting is. + $result = ( '' != $user_info_field ) ? date_i18n( get_option( 'date_format' ), strtotime( $user_info_field ) ) : ''; + } + break; + + // Handle all other fields. + default: + $result = ( ! $result ) ? $user_info_field : $result; + break; + } + + // Remove underscores from value if requested (default: on). + if ( isset( $atts['underscores'] ) && 'off' == $atts['underscores'] && $user_info ) { + $result = str_replace( '_', ' ', $result ); + } + + $content = ( $content ) ? $result . $content : $result; + + // Make it clickable? + $content = ( isset( $atts['clickable'] ) && ( true == $atts['clickable'] || 'true' == $atts['clickable'] ) ) ? make_clickable( $content ) : $content; + + // Display field label? + $content = ( isset( $fields[ $field ] ) && isset( $atts['label'] ) && ( true == $atts['label'] ) ) ? $fields[ $field ]['label'] . ": " . $content : $content; + } + + /** + * Filters the field shortcode before returning value. + * + * @since 3.2.5 + * @since 3.4.5 Added $field + * + * @param string $content + * @param array $atts + * @param string $field + */ + $content = apply_filters( 'wpmem_field_shortcode', $content, $atts, $field ); + + return do_shortcode( $content ); + } + + /** + * Logout link shortcode [wpmem_logout]. + * + * @since 3.1.2 + * @since 3.2.0 Moved to WP_Members_Shortcodes::logout(). + * + * @param array $atts { + * The shortcode attributes. + * + * @type string $url + * } + * @param string $content + * @param string $tag + * @retrun string $content + */ + function logout( $atts, $content, $tag ) { + // Logout link shortcode. + if ( is_user_logged_in() && $tag == 'wpmem_logout' ) { + $link = ( isset( $atts['url'] ) ) ? add_query_arg( array( 'a'=>'logout', 'redirect_to'=>$atts['url'] ) ) : add_query_arg( 'a', 'logout' ); + $text = ( $content ) ? $content : __( 'Click here to log out.', 'wp-members' ); + return do_shortcode( '' . $text . '' ); + } + } + + /** + * TOS shortcode [wpmem_tos]. + * + * @since 3.1.2 + * @since 3.2.0 Moved to WP_Members_Shortcodes::tos(). + * @since 3.2.5 Now can use page slug (without full url). + * + * @param array $atts { + * The shortcode attributes. + * + * @type string $url + * } + * @param string $content + * @param string $tag + * @retrun string $content + */ + function tos( $atts, $content, $tag ) { + $url = ( strpos( $atts['url'], 'http://' ) || strpos( $atts['url'], 'https://' ) ) ? $atts['url'] : home_url( $atts['url'] ); + return esc_url( $url ); + } + + /** + * Display user avatar. + * + * @since 3.1.7 + * @since 3.2.0 Moved to WP_Members_Shortcodes::avatar(). + * + * @param array $atts { + * The shortcode attributes. + * + * @type string $id The user email or id. + * @type int $size Avatar size (square) in pixels. + * } + * @param string $content + * @param string $tag + * @retrun string $content + */ + function avatar( $atts, $content, $tag ) { + $content = ''; + $size = ( isset( $atts['size'] ) ) ? $atts['size'] : ''; + if ( isset( $atts['id'] ) ) { + $content = get_avatar( $atts['id'], $size ); + } elseif ( is_user_logged_in() ) { + // If the user is logged in and this isn't specifying a user ID, return the current user avatar. + global $current_user; + wp_get_current_user(); + $content = get_avatar( $current_user->ID, $size ); + } + return do_shortcode( $content ); + } + + /** + * Generates a login link with a return url. + * + * @since 3.1.7 + * @since 3.2.0 Moved to WP_Members_Shortcodes::login_link(). + * @since 3.4.6 Using wpmem_get_login_link() and wpmem_get_reg_link() adds id and class attributes to HTML tag. + * + * @param array $atts { + * The shortcode attributes. + * } + * @param string $content + * @param string $tag + * @return string $content + */ + function login_link( $atts, $content, $tag ) { + if ( isset( $atts ) ) { + $args['attributes'] = $atts; + } + if ( 'wpmem_reg_link' == $tag ) { + $args['content'] = ( isset( $content ) && '' != $content ) ? $content : __( 'Register' ); + return do_shortcode( wpmem_get_reg_link( $args ) ); + } else { + $args['content'] = ( isset( $content ) && '' != $content ) ? $content : __( 'Log In' ); + return do_shortcode( wpmem_get_login_link( $args ) ); + } + } + + /** + * Generages a login link formatted as a button. + * + * @since 3.3.5 + * + * @param array $atts { + * The shortcode attributes. + * } + * @param string $content + * @param string $tag + * @return string $content + */ + function login_button( $atts, $content, $tag ) { + $content = wpmem_loginout( array( 'format'=>'button' ) ); + return do_shortcode( $content ); + } + + /** + * Generate a nonce for a WP-Members form. + * + * For situations where a hardcoded form may exist, this shortcode + * can output the appropriate nonce. + * + * @since 3.3.0 + * + * @param array $atts { + * The shortcode attributes. + * + * $form string The form to generate the nonce for (register|update|login) + * } + * $param string $content + * @param string $tag + * @return string $content + */ + function form_nonce( $atts, $content, $tag ) { + $nonce = ( isset( $atts['form'] ) ) ? $atts['form'] : 'register'; + $content = wpmem_form_nonce( $nonce, false ); + return do_shortcode( $content ); + } + + /** + * Password reset forms. + * + * This function creates both password reset and forgotten + * password forms for page=password shortcode. + * + * @since 2.7.6 + * @since 3.2.6 Added nonce validation. + * @since 3.4.0 Moved to shortcodes as private function, renamed from wpmem_page_pwd_reset(). + * + * @global object $wpmem + * @param string $wpmem_regchk + * @param string $content + * @return string $content + */ + function render_pwd_reset( $wpmem_regchk, $content ) { + + global $wpmem; + + if ( is_user_logged_in() ) { + + switch ( $wpmem_regchk ) { + + case "pwdchangesuccess": + $content = $content . wpmem_get_display_message( $wpmem_regchk ); + break; + + default: + if ( isset( $wpmem_regchk ) && '' != $wpmem_regchk ) { + $content .= wpmem_get_display_message( $wpmem_regchk, wpmem_get_text( $wpmem_regchk ) ); + } + $content = $content . wpmem_change_password_form(); + break; + } + + } else { + + // If the password shortcode page is set as User Profile page. + if ( 'getusername' == $wpmem->action ) { + + return $this->render_forgot_username( $wpmem_regchk, $content ); + + } elseif ( 'set_password_from_key' == $wpmem->action ) { + + return ( false != $wpmem->pwd_reset->content ) ? $wpmem->pwd_reset->content : $content; + + } else { + + switch( $wpmem_regchk ) { + + case "pwdresetsuccess": + $content = $content . wpmem_get_display_message( $wpmem_regchk ); + $wpmem_regchk = ''; // Clear regchk. + break; + + default: + if ( $wpmem->has_errors() ) { + $errors = $wpmem->error->get_error_messages(); + if ( sizeof( $errors ) > 1 ) { + $error_string = ""; + foreach ( $errors as $error ) { + $error_string .= $error . '
    '; + } + } else { + $error_string = $errors[0]; + } + $content = wpmem_get_display_message( $error_string ); + } elseif ( isset( $wpmem_regchk ) && '' != $wpmem_regchk ) { + $content = wpmem_get_display_message( $wpmem_regchk, wpmem_get_text( $wpmem_regchk ) ); + } + $content = $content . wpmem_reset_password_form(); + break; + } + + } + + } + + return $content; + + } + + /** + * Creates a user edit page. + * + * @since 2.7.6 + * @since 3.3.9 Added $atts + * @since 3.4.0 Moved to shortcodes as private function, renamed from wpmem_page_user_edit + * + * @global object $wpmem + * @global string $wpmem_a + * @global string $wpmem_themsg + * @param string $wpmem_regchk + * @param string $content + * @return string $content + */ + function render_user_edit( $wpmem_regchk, $content, $atts = false ) { + + global $wpmem, $wpmem_a, $wpmem_themsg; + /** + * Filter the default User Edit heading for shortcode. + * + * @since 2.7.6 + * + * @param string The default edit mode heading. + */ + $heading = apply_filters( 'wpmem_user_edit_heading', wpmem_get_text( 'profile_heading' ) ); + + if ( $wpmem_a == "update") { + $content.= wpmem_get_display_message( $wpmem_regchk, $wpmem_themsg ); + } + + $args['tag'] = 'edit'; + $args['heading'] = $heading; + if ( false !== $atts && isset( $atts['fields'] ) ) { + $args['fields'] = $atts['fields']; + } + + $content = $content . wpmem_register_form( $args ); + + return $content; + } + + /** + * Forgot username form. + * + * This function creates a form for retrieving a forgotten username. + * + * @since 3.0.8 + * @since 3.4.0 Moved to shortcodes as private function, renamed from wpmem_page_forgot_username(). + * + * @param string $wpmem_regchk + * @param string $content + * @return string $content + */ + function render_forgot_username( $wpmem_regchk, $content ) { + + if ( ! is_user_logged_in() ) { + + global $wpmem; + switch( $wpmem->regchk ) { + + case "usernamefailed": + $msg = wpmem_get_text( 'usernamefailed' ); + $content = $content + . wpmem_get_display_message( 'usernamefailed', $msg ) + . wpmem_forgot_username_form(); + $wpmem->regchk = ''; // Clear regchk. + break; + + case "usernamesuccess": + $email = ( isset( $_POST['user_email'] ) ) ? sanitize_email( $_POST['user_email'] ) : ''; + $msg = sprintf( wpmem_get_text( 'usernamesuccess' ), $email ); + $content = $content . wpmem_get_display_message( 'usernamesuccess', $msg ); + $wpmem->regchk = ''; // Clear regchk. + break; + + default: + $content = $content . wpmem_forgot_username_form(); + break; + } + + } + + return $content; + + } + + /** + * Member Links Dialog. + * + * Outputs the links used on the members area. + * + * @since 2.0 + * @since 3.4.0 Replaces wpmem_inc_memberlinks(). + * + * @gloabl $user_login + * @global object $wpmem + * @param string $page + * @return string $str + */ + function render_links( $page = 'member' ) { + + global $user_login, $wpmem; + + $logout = wpmem_logout_link(); + + switch ( $page ) { + + case 'register': + + $url = ( isset( $wpmem->user_pages['profile'] ) && '' != $wpmem->user_pages['profile'] ) ? $wpmem->user_pages['profile'] : get_option( 'home' ); + + // NOTE: DO NOT EDIT THESE. Use the filter below. + $arr = array( + 'before_wrapper' => '

    ' . sprintf( wpmem_get_text( 'register_status' ), $user_login ) . '

    ', + 'wrapper_before' => '', + 'rows' => array( + '
  • ' . wpmem_get_text( 'register_logout' ) . '
  • ', + '
  • ' . wpmem_get_text( 'register_continue' ) . '
  • ', + ), + 'after_wrapper' => '', + ); + + /** + * Filter the register links array. + * + * @since 3.0.9 + * @since 3.1.0 Added after_wrapper + * + * @param array $arr { + * The components of the links. + * + * @type string $before_wrapper HTML before the wrapper (default: login status). + * @type string $wrapper_before The wrapper opening tag (default:
      ). + * @type string $wrapper_after The wrapper closing tag (default:
    ). + * @type array $rows Row items HTML. + * @type string $after_wrapper Anything that comes after the wrapper. + * } + */ + $arr = apply_filters( "wpmem_{$page}_links_args", $arr ); + + $str = $arr['before_wrapper']; + $str.= $arr['wrapper_before']; + foreach ( $arr['rows'] as $row ) { + $str.= $row; + } + $str.= $arr['wrapper_after']; + $str.= $arr['after_wrapper']; + + /** + * Filter the links displayed on the Register page (logged in state). + * + * @since 2.8.3 + * + * @param string $str The default links. + */ + $str = apply_filters( "wpmem_{$page}_links", $str ); + break; + + case 'login': + + $logout = urldecode( $logout ); + // NOTE: DO NOT EDIT THESE. Use the filter hook below. + $args = array( + 'wrapper_before' => '', + 'user_login' => $user_login, + 'welcome' => wpmem_get_text( 'login_welcome' ), + 'logout_text' => wpmem_get_text( 'login_logout' ), + 'logout_link' => '%s', + 'separator' => '
    ', + ); + /** + * Filter the status message parts. + * + * @since 2.9.9 + * + * @param array $args { + * The components of the links. + * + * @type string $wrapper_before The wrapper opening tag (default:

    ). + * @type string $wrapper_after The wrapper closing tag (default:

    ). + * @type string $user_login + * @type string $welcome + * @type string $logout_text + * @type string $logout_link + * @type string $separator + * } + */ + $args = apply_filters( "wpmem_{$page}_links_args", $args ); + + // Assemble the message string. + $str = $args['wrapper_before'] + . sprintf( $args['welcome'], $args['user_login'] ) + . $args['separator'] + . sprintf( $args['logout_link'], $args['logout_text'] ) + . $args['wrapper_after']; + + /** + * Filter the links displayed on the Log In page (logged in state). + * + * @since 2.8.3 + * + * @param string $str The default links. + */ + $str = apply_filters( "wpmem_{$page}_links", $str ); + break; + + case 'member': + default: + + // NOTE: DO NOT EDIT. Use the filter below. + $arr = array( + 'before_wrapper' => '', + 'wrapper_before' => '
      ', + 'wrapper_after' => '
    ', + 'rows' => array( + '
  • ' . wpmem_get_text( 'profile_edit' ) . '
  • ', + '
  • ' . wpmem_get_text( 'profile_password' ) . '
  • ', + ), + 'after_wrapper' => '', + ); + + if ( defined( 'WPMEM_EXP_MODULE' ) && $wpmem->use_exp == 1 && function_exists( 'wpmem_user_page_detail' ) ) { + $arr['rows'][] = wpmem_user_page_detail(); + } + + /** + * Filter the member links array. + * + * @since 3.0.9 + * @since 3.1.0 Added after_wrapper + * + * @param array $arr { + * The components of the links. + * + * @type string $before_wrapper Anything that comes before the wrapper. + * @type string $wrapper_before The wrapper opening tag (default:
      ). + * @type string $wrapper_after The wrapper closing tag (default:
    ). + * @type array $rows Row items HTML. + * @type string $after_wrapper Anything that comes after the wrapper. + * } + */ + $arr = apply_filters( "wpmem_{$page}_links_args", $arr ); + + $str = $arr['before_wrapper']; + $str.= $arr['wrapper_before']; + foreach ( $arr['rows'] as $row ) { + $str.= $row; + } + $str.= $arr['wrapper_after']; + $str.= $arr['after_wrapper']; + + /** + * Filter the links displayed on the User Profile page (logged in state). + * + * @since 2.8.3 + * + * @param string $str The default links. + */ + $str = apply_filters( "wpmem_{$page}_links", $str ); + break; + } + + return $str; + } + + function render_links_filter_args( $page, $args ) { + + } +} + +// End of file. \ No newline at end of file diff --git a/includes/class-wp-members-user-export.php b/includes/class-wp-members-user-export.php new file mode 100644 index 00000000..3d008cf4 --- /dev/null +++ b/includes/class-wp-members-user-export.php @@ -0,0 +1,309 @@ + 'heading value'. + * The array can include fields in the Fields tab, plus the following: + * + * @type int $ID ID from wp_users + * @type string $username user_login from wp_users + * @type string $user_nicename user_nicename + * @type string $user_url user_url + * @type string $display_name display_name + * @type int $active Whether the user is active/deactivated. + * @type string $exp_type If the PayPal extension is installed pending|subscrption (optional) + * @type string $expires If the PayPal extension is installed MM/DD/YYYY (optional) + * @type string $user_registered user_registered + * @type string $user_ip The IP of the user when they registered. + * @type string $role The user's role (or roles, if multiple). + * } + * @type array $exclude_fields @deprecated 3.4.0 + * @type boolean $entity_decode Whether HTML entities should be decoded (default: false) + * @type string $date_format A PHP readable date format (default: Y-m-d which results in YYYY-MM-DD) + * @type string $required_caps The user capability required to export. + * } + * @param array $users Array of user IDs to export. + * @param string $tag + */ + public static function export_users( $args = array(), $users = array(), $tag = 'default' ) { + + $export_fields = ( ! isset( $args['fields'] ) ) ? self::get_export_fields() : $args['fields']; + + /** + * Filter the export fields. + * + * @since 3.2.5 + * @since 3.4.0 Added $tag. + * + * @param array $export_fields { + * The array of export fields is keyed as 'meta_key' => 'heading value'. + * The array will include all fields in the Fields tab, plus the following: + * + * @type int $ID ID from wp_users + * @type string $username user_login from wp_users + * @type string $user_nicename user_nicename + * @type string $user_url user_url + * @type string $display_name display_name + * @type int $active Whether the user is active/deactivated. + * @type string $exp_type If the PayPal extension is installed pending|subscrption (optional) + * @type string $expires If the PayPal extension is installed MM/DD/YYYY (optional) + * @type string $user_registered user_registered + * @type string $user_ip The IP of the user when they registered. + * @type string $role The user's role (or roles, if multiple). + * } + * @param string $tag + */ + $export_fields = apply_filters( 'wpmem_export_fields', $export_fields, $tag ); + + $today = date( "Y-m-d" ); + + // Setup defaults. + $defaults = array( + 'export' => 'all', + 'filename' => 'wp-members-user-export-' . $today . '.csv', + 'fields' => $export_fields, + 'entity_decode' => false, + 'date_format' => 'Y-m-d', + 'required_caps' => 'list_users', + ); + // Merge args with default (in case any were missing). + $args = wp_parse_args( $args, $defaults ); + + /** + * Filter the default export arguments. + * + * @since 2.9.7 + * @since 3.4.0 Filter all defaults (like other _args changes), then wp_parse_args() in case any are missing. + * @since 3.4.0 Added $tag. + * @since 3.4.0 Deprecated 'exclude_fields' (unset using wpmem_export_fields instead). + * @since 3.4.0 Deprecated 'export_fields' use "fields" instead. + * + * @param array $args { + * Array of defaults for export. + * + * @type string $export + * @type string $filename + * @type array $fields + * @type array $exclude_fields @deprecated 3.4.0 + * @type boolean $entity_decode + * @type string $date_format + * @type string $required_caps + * } + * @param string $tag + */ + $args = apply_filters( 'wpmem_export_args', $args, $tag ); + + // Merge args with default (in case any were missing). + $args = wp_parse_args( $args, $defaults ); + + if ( current_user_can( $args['required_caps'] ) ) { + // Output needs to be buffered, start the buffer. + ob_start(); + + // If exporting all, get all of the users. + $export_users = ( 'all' == $args['export'] ) ? get_users( array( 'fields' => 'ID' ) ) : $users; + + // Generate headers and a filename based on date of export. + header( "Content-Description: File Transfer" ); + header( "Content-type: application/octet-stream" ); + header( "Content-Disposition: attachment; filename=" . $args['filename'] ); + header( "Content-Type: text/csv; charset=" . get_option( 'blog_charset' ), true ); + + $handle = fopen( 'php://output', 'w' ); + fputs( $handle, "\xEF\xBB\xBF" ); // UTF-8 BOM + + // Remove excluded fields from $export_fields while setting up $header array. + $header = array(); + foreach ( $args['fields'] as $meta => $field ) { + $header[ $meta ] = $field; + } + + /** + * Filters user export header row before assembly. + * + * As of 3.4.0, this really isn't a necessary filter. You can specify the header + * value in wpmem_export_fields instead and just use one filter. + * + * @since 3.2.1 + * @since 3.4.0 Added $tag. + * + * @param array $header The header column values + * @param string $tag + */ + $header = apply_filters( 'wpmem_user_export_header', $header, $tag ); + + fputcsv( $handle, $header ); + + // Loop through the array of users, assemble csv. + // $fields only includes fields to be exported at this point. + foreach ( $export_users as $user ) { + + $user_info = get_userdata( $user ); + + $wp_user_fields = array( 'ID', 'user_login', 'user_pass', 'user_nicename', 'user_email', 'user_url', 'user_registered', 'user_activation_key', 'user_status', 'display_name' ); + foreach ( $args['fields'] as $meta => $field ) { + + switch ( $meta ) { + case 'ID': + case 'user_login': + case 'user_pass': + case 'user_nicename': + case 'user_email': + case 'user_url': + case 'user_registered': + case 'user_activation_key': + case 'user_status': + case 'display_name': + $row[ $meta ] = $user_info->{$meta}; + break; + case 'username': + $row['username'] = $user_info->user_login; + break; + case 'password': + $row['password'] = $user_info->user_pass; + break; + case 'active': + $row['active'] = wpmem_get_user_meta( $user, 'active' ) ? __( 'Yes' ) : __( 'No' ); + break; + case 'exp_type': + $exp_type = wpmem_get_user_meta( $user, 'exp_type' ); + $row['exp_type'] = ( false !== $exp_type ) ? $exp_type : ''; + break; + case 'expires': + $expires = wpmem_get_user_meta( $user, 'expires' ); + $row['expires'] = ( false !== $expires ) ? $expires : ''; + break; + case 'wpmem_reg_ip': + $reg_ip = wpmem_get_user_meta( $user, 'wpmem_reg_ip' ); + $row['wpmem_reg_ip'] = ( false !== $reg_ip ) ? $reg_ip : ''; + break; + case 'role': + $role = wpmem_get_user_role( $user, true ); // As of 3.4, wpmem_get_user_role() can get all roles. + $row['role'] = ( is_array( $role ) ) ? implode( ",", $role ) : $role; + break; + case ( self::$membership_product_stem === substr( $meta, 0, strlen( self::$membership_product_stem ) ) ): + $product = str_replace( self::$membership_product_stem, '', $meta ); + $row[ $meta ] = wpmem_get_user_meta( $user, $meta ); + // If value is a date and false is not the format_date option... + if ( false !== $args['date_format'] && '' != $row[ $meta ] && $row[ $meta ] > 2 ) { + $date_format = ( 'wp' == $args['date_format'] ) ? get_option('date_format') : $args['date_format']; + $row[ $meta ] = date( $date_format, $row[ $meta ] ); + } + break; + default: + if ( in_array( $meta, $wp_user_fields ) ) { + $row[ $meta ] = ( 'username' == $meta ) ? $user_info->user_login : $user_info->{$meta}; + } else { + $raw_data = wpmem_get_user_meta( $user, $meta ); + $raw_data = ( $raw_data ) ? $raw_data : ''; + $row[ $meta ] = ( $args['entity_decode'] ) ? html_entity_decode( $raw_data ) : $raw_data; + } + break; + } + } + + /** + * Filter the user data before assembly. + * + * @since 3.2.1 + * @since 3.4.0 Added user ID (it may not be included in the $row array if the field were filtered out). + * @since 3.4.0 Added $tag. + * + * @param array $row The user data row. + * @param int $user_id The user ID. + * @param string $tag + */ + $row = apply_filters( 'wpmem_user_export_row', $row, $user_info->ID, $tag ); + + fputcsv( $handle, $row ); + + // Update the user record as being exported. + if ( 'all' != $args['export'] ) { + update_user_meta( $user, 'exported', 1 ); + } + } + + fclose( $handle ); + print( ob_get_clean() ); + + exit(); + } else { + wp_die( __( 'You do not have the required user capabilities to export users.', 'wp-members' ) ); + } + } + + private static function get_export_fields() { + + $wpmem_fields = wpmem_fields(); + + // Fields to exclude. + $exclude_fields = array( 'user_pass', 'password', 'confirm_password', 'confirm_email' ); + + // Prepare fields, add additional "special" fields. + $export_fields = array( + 'ID' => __( 'User ID', 'wp-members' ), + ); + foreach( $wpmem_fields as $meta_key => $value ) { + if ( ! in_array( $meta_key, $exclude_fields ) ) { + $export_fields[ $meta_key ] = $value['label']; + } + } + $export_fields['username'] = __( 'Username', 'wp-members' ); + if ( wpmem_is_enabled( 'mod_reg' ) ) { + $export_fields['active'] = __( 'Activated?', 'wp-members' ); + } + if ( wpmem_is_enabled( 'act_link' ) ) { + $export_fields['_wpmem_user_confirmed'] = __( 'Confirmed?', 'wp-members' ); + } + if ( defined( 'WPMEM_EXP_MODULE' ) && wpmem_is_enabled( 'use_exp' ) ) { + $export_fields['exp_type'] = __( 'Subscription', 'wp-members' ); + $export_fields['expires'] = __( 'Expires', 'wp-members' ); + } + $export_fields['user_registered'] = __( 'Registered', 'wp-members' ); + $export_fields['wpmem_reg_ip'] = __( 'IP', 'wp-members' ); + $export_fields['role'] = __( 'Role', 'wp-members' ); + if ( wpmem_is_enabled( 'enable_products' ) ) { + $membership_products = wpmem_get_memberships(); + foreach( $membership_products as $product_key => $product ) { + $export_fields[ self::$membership_product_stem . $product_key ] = $membership_products[ $product_key ]['title']; + } + } + + return $export_fields; + } +} \ No newline at end of file diff --git a/includes/class-wp-members-user-profile.php b/includes/class-wp-members-user-profile.php new file mode 100644 index 00000000..da223afc --- /dev/null +++ b/includes/class-wp-members-user-profile.php @@ -0,0 +1,618 @@ + $field ) { + if ( false == $field['profile'] ) { + unset( $fields[ $key ] ); + } + } + } + return $fields; + } + + /** + * Static function to display WP-Members fields on the admin/dashboard user profile. + * + * Function was created in 3.1.9 as a merge of wpmem_admin_fields() + * and wpmem_user_profile(). + * + * @since 3.1.9 + * + * @global object $current_screen + * @global string $user_ID + * @global object $wpmem + * @param object $user_obj + */ + static function profile( $user_obj ) { + + global $current_screen, $user_ID, $wpmem; + $user_id = ( 'profile' == $current_screen->id ) ? $user_ID : filter_var( $_REQUEST['user_id'], FILTER_SANITIZE_NUMBER_INT ); + $display = ( 'profile' == $current_screen->base ) ? 'user' : 'admin'; + $display = ( current_user_can( 'edit_users' ) ) ? 'admin' : $display; ?> + +

    + + $field ) { + + $valtochk = ''; $values = ''; + + // Determine which fields to show in the additional fields area. + $show = ( ! $field['native'] && ! in_array( $meta, $exclude ) ) ? true : false; + //$show = ( 'tos' == $meta && $field['register'] ) ? null : $show; + + if ( $show ) { + + $val = get_user_meta( $user_id, $meta, true ); + $val = ( $field['type'] == 'multiselect' || $field['type'] == 'multicheckbox' ) ? $val : htmlspecialchars( $val ); + if ( $field['type'] == 'checkbox' ) { + $valtochk = $val; + $val = $field['checked_value']; + } + + if ( 'multicheckbox' == $field['type'] || 'select' == $field['type'] || 'multiselect' == $field['type'] || 'radio' == $field['type'] ) { + $values = $field['values']; + $valtochk = $val; + } + + // Is this an image or a file? + if ( 'file' == $field['type'] || 'image' == $field['type'] ) { + $empty_file = '' . __( 'None' ) . ''; + if ( 'file' == $field['type'] ) { + $attachment_url = wp_get_attachment_url( $val ); + $input = ( $attachment_url ) ? '' . $attachment_url . '' : $empty_file; + } else { + $attachment_url = wp_get_attachment_image( $val, 'medium' ); + if ( 'admin' == $display ) { + $edit_url = admin_url( 'upload.php?item=' . $val ); + $input = ( $attachment_url ) ? '' . $attachment_url . '' : $empty_file; + } else { + $input = ( $attachment_url ) ? $attachment_url : $empty_file; + } + } + $input.= '
    ' . wpmem_get_text( 'profile_upload' ) . '
    '; + $input.= wpmem_form_field( array( + 'name' => $meta, + 'type' => $field['type'], + 'value' => $val, + 'compare' => $valtochk, + ) ); + } else { + if ( 'select' == $field['type'] || 'radio' == $field['type'] ) { + $input = wpmem_form_field( $meta, $field['type'], $values, $valtochk ); + } elseif( 'multicheckbox' == $field['type'] || 'multiselect' == $field['type'] ) { + $input = wpmem_form_field( array( 'name'=>$meta, 'type'=>$field['type'], 'value'=>$values, 'compare'=>$valtochk, 'delimiter'=>$field['delimiter'] ) ); + } else { + $field['type'] = ( 'hidden' == $field['type'] ) ? 'text' : $field['type']; + + $formfield_args = array( + 'name' => $meta, + 'type' => $field['type'], + 'value' => $val, + 'compare' => $valtochk, + 'required' => $field['required'], + 'class' => 'regular-text', + '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, + ); + + $input = wpmem_form_field( $formfield_args ); + } + } + + // Is the field required? + $req = ( $field['required'] ) ? ' ' . __( '(required)' ) . '' : ''; + $label = ''; + + // Build the form rows for filtering. + $rows[ $meta ] = array( + 'meta' => $meta, + 'type' => $field['type'], + 'value' => $val, + 'values' => $values, + 'label_text' => __( $field['label'], 'wp-members' ), + 'row_before' => '', + 'label' => '', + 'field_before' => '', + 'row_after' => '', + ); + } + } + + /** + * Filter for rows. + * + * Filter is applied for the admin user edit ("wpmem_register_form_rows_admin") + * and the user profile edit ("wpmem_register_form_rows_user"). + * + * @since 3.1.0 + * @since 3.1.6 Deprecated $order. + * + * @param array $rows { + * An array of the profile rows. + * + * @type string $meta The meta key. + * @type string $type The field type. + * @type string $value Value if set. + * @type string $values Possible values (select, multiselect, multicheckbox, radio). + * @type string $label_text Raw label text (no HTML). + * @type string $row_before HTML before the row. + * @type string $label HTML label. + * @type string $field_before HTML before the field input tag. + * @type string $field HTML for field input. + * @type string $field_after HTML after the field. + * @type string $row_after HTML after the row. + * } + * @param string $tag adminprofile|userprofile + */ + $rows = apply_filters( 'wpmem_register_form_rows_' . $display, $rows, $display . 'profile' ); + + // Handle form rows display from array. + foreach ( $rows as $row ) { + $show_field = + $row['row_before'] . + $row['label'] . + $row['field_before'] . $row['field'] . $row['field_after'] . + $row['row_after']; + + /** + * Filter the profile field. + * + * Filter is applied for the admin user edit ("wpmem_admin_profile_field") + * and the user profile edit ("wpmem_user_profile_field"). + * + * @since 2.8.2 + * @since 3.1.1 Added $user_id and $row + * + * @param string $show_field The HTML string for the additional profile field. + * @param string $user_id + * @param array $row + */ + echo apply_filters( 'wpmem_' . $display . '_profile_field', $show_field, $user_id, $row ); + } + + /** + * Fires after generating the WP-Members fields in the user profile. + * + * Action fires for the admin user edit ("wpmem_admin_after_profile") + * and the user profile edit ("wpmem_user_after_profile"). + * + * @since 2.9.3 + * + * @param int $user_id The user's ID. + * @param array $wpmem_fields The WP-Members fields. + */ + do_action( 'wpmem_' . $display . '_after_profile', $user_id, $wpmem_fields ); ?> + +
    ' . $label . '', + 'field' => $input, + 'field_after' => '
    base ) ? 'user' : 'admin'; + + if ( ! $user_id ) { + $user_id = filter_var( wpmem_get( 'user_id', -1, 'request' ), FILTER_SANITIZE_NUMBER_INT ); + if ( 1 > $user_id ) { + // Still no user id? User cannot be updated. + return; + } + } + + $wpmem_fields = ( 'admin' == $display ) ? self::get_fields( 'profile_admin' ) : self::get_fields( 'profile_dashboard' ); + + // Check for password field before exclusions, just in case we are activating a user (otherwise password is removed on user/admin profiles). + $chk_pass = ( array_key_exists( 'password', $wpmem_fields ) && true === $wpmem_fields['password']['register'] ) ? true : false; + + $exclude = wpmem_get_excluded_meta( $display . '-profile' ); + + foreach ( $exclude as $excluded ) { + unset( $wpmem_fields[ $excluded ] ); + } + + // If tos is an active field, this is the dashboard profile, and user has current field value. + if ( isset( $wpmem_fields['tos'] ) + && 'user' == $display + && get_user_meta( $user_id, 'tos', true ) == $wpmem_fields['tos']['checked_value'] ) { + unset( $wpmem_fields['tos'] ); + } + + /** + * Fires before the user profile is updated. + * + * Action fires for the admin user edit ("wpmem_admin_pre_user_update") + * and the user profile edit ("wpmem_user_pre_user_update"). + * + * @since 2.9.2 Added for admin profile update. + * @since 3.1.9 Added for user profile update. + * + * @param int $user_id The user ID. + * @param array $wpmem_fields Array of the custom fields. + */ + do_action( 'wpmem_' . $display . '_pre_user_update', $user_id, $wpmem_fields ); + + $fields = array(); + foreach ( $wpmem_fields as $meta => $field ) { + if ( ! $field['native'] + && $field['type'] != 'password' + && $field['type'] != 'checkbox' + && $field['type'] != 'multiselect' + && $field['type'] != 'multicheckbox' + && $field['type'] != 'file' + && $field['type'] != 'image' + && $field['type'] != 'textarea' ) { + ( isset( $_POST[ $meta ] ) && 'password' != $field['type'] ) ? $fields[ $meta ] = sanitize_text_field( $_POST[ $meta ] ) : false; + + // For user profile (not admin). + $chk = false; + if ( 'admin' != $display ) { + // Check for required fields. + if ( ! $field['required'] ) { + $chk = 'ok'; + } + if ( $field['required'] && $_POST[ $meta ] != '' ) { + $chk = 'ok'; + } + } + } elseif ( $field['type'] == 'checkbox' ) { + $fields[ $meta ] = ( isset( $_POST[ $meta ] ) ) ? sanitize_text_field( $_POST[ $meta ] ) : ''; + } elseif ( $field['type'] == 'multiselect' || $field['type'] == 'multicheckbox' ) { + $fields[ $meta ] = ( isset( $_POST[ $meta ] ) ) ? implode( $field['delimiter'], wp_unslash( $_POST[ $meta ] ) ) : ''; + } elseif ( $field['type'] == 'textarea' ) { + $fields[ $meta ] = ( isset( $_POST[ $meta ] ) ) ? sanitize_textarea_field( $_POST[ $meta ] ) : ''; + } + } + + /** + * Filter the submitted field values for backend profile update. + * + * Filters is applied for the admin user edit ("wpmem_admin_profile_update") + * and the user profile edit ("wpmem_user_profile_update"). + * + * @since 2.8.2 Added for Admin profile update. + * @since 3.1.9 Added for User profile update. + * + * @param array $fields An array of the posted form values. + * @param int $user_id The ID of the user being updated. + */ + $fields = apply_filters( 'wpmem_' . $display . '_profile_update', $fields, $user_id ); + + // Handle meta update, skip excluded fields. + foreach ( $fields as $key => $val ) { + if ( ! in_array( $key, $exclude ) ) { + if ( ( 'admin' != $display && 'ok' == $chk ) || 'admin' == $display ) { + update_user_meta( $user_id, $key, $val ); + } + } + } + + if ( ! empty( $_FILES ) ) { + $wpmem->user->upload_user_files( $user_id, $wpmem->fields ); + } + + if ( 'admin' == $display || current_user_can( 'edit_users' ) ) { + if ( $wpmem->mod_reg == 1 ) { + + $wpmem_activate_user = ( isset( $_POST['activate_user'] ) == '' ) ? -1 : filter_var( $_POST['activate_user'], FILTER_SANITIZE_NUMBER_INT ); + + if ( $wpmem_activate_user == 1 ) { + wpmem_activate_user( $user_id ); + } elseif ( $wpmem_activate_user == 0 ) { + wpmem_deactivate_user( $user_id ); + } + } + + if ( defined( 'WPMEM_EXP_MODULE' ) && $wpmem->use_exp == 1 ) { + if ( function_exists( 'wpmem_a_extenduser' ) ) { + wpmem_a_extenduser( $user_id ); + } + } + + if ( 1 == $wpmem->enable_products ) { + // Update products. + if ( isset( $_POST['_wpmem_membership_product'] ) ) { + foreach ( $_POST['_wpmem_membership_product'] as $product_key => $product_value ) { + // Sanitize. + $product_key = sanitize_text_field( $product_key ); + // Enable or Disable? + if ( 'enable' == $product_value ) { + // Does product require a role? + if ( false !== $wpmem->membership->products[ $product_key ]['role'] ) { + wpmem_update_user_role( $user_id, $wpmem->membership->products[ $product_key ]['role'], 'add' ); + } + // Do we need to set a specific date? + if ( isset( $_POST[ '_wpmem_membership_expiration_' . $product_key ] ) ) { + wpmem_set_user_product( $product_key, $user_id, sanitize_text_field( $_POST[ '_wpmem_membership_expiration_' . $product_key ] ) ); + } else { + wpmem_set_user_product( $product_key, $user_id ); + } + } + if ( 'disable' == $product_value ) { + $wpmem->user->remove_user_product( $product_key, $user_id ); + } + } + } + } + } + + /** + * Fires after the user profile is updated. + * + * Action fires for the admin user edit ("wpmem_admin_after_user_update") + * and the user profile edit ("wpmem_user_after_user_update"). + * + * @since 2.9.2 + * + * @param int $user_id The user ID. + */ + do_action( 'wpmem_' . $display . '_after_user_update', $user_id ); + + return; + } + + /** + * Sets user profile update to multipart form data. + * + * If the fields array has a file or image field, this will echo the + * necessary "multipart/form-data" enctype for the form tag. + * + * @since 3.1.8 (as wpmem_profile_multipart()). + * @since 3.1.9 Moved to User Profile object. + */ + public static function add_multipart() { + $has_file = false; + foreach ( wpmem_fields() as $field ) { + if ( $field['type'] == 'file' || $field['type'] == 'image' ) { + $has_file = true; + break; + } + } + echo ( $has_file ) ? " enctype=\"multipart/form-data\"" : ''; + } + + /** + * Adds user activation to the user profile. + * + * @since 3.1.1 + * @since 3.2.0 Moved to WP_Members_User_Profile object + * + * @global object $wpmem + * @param int $user_id + */ + public static function _show_activate( $user_id ) { + global $wpmem; + // See if reg is moderated, and if the user has been activated. + if ( $wpmem->mod_reg == 1 ) { + // Make sure this isn't an admin looking at their own profile. + if ( current_user_can( 'edit_users' ) && $user_id != get_current_user_id() ) { + $user_active_flag = get_user_meta( $user_id, 'active', true ); + switch( $user_active_flag ) { + + case "0": + $label = __( 'Reactivate this user?', 'wp-members' ); + $action = 1; + break; + + case "1": + $label = __( 'Deactivate this user?', 'wp-members' ); + $action = 0; + break; + + default: + $label = __( 'Activate this user?', 'wp-members' ); + $action = 1; + break; + } ?> + + + + + use_exp == 1 ) { + if ( ( $wpmem->mod_reg == 1 && get_user_meta( $user_id, 'active', true ) == 1 ) || ( $wpmem->mod_reg != 1 ) ) { + if ( function_exists( 'wpmem_a_extend_user' ) ) { + wpmem_a_extend_user( $user_id ); + } + } + } + } + + + /** + * Adds user registration IP to the user profile. + * + * @since 3.1.1 + * @since 3.2.0 Moved to WP_Members_User_Profile object + * + * @param int $user_id + */ + public static function _show_ip( $user_id ) { ?> + + + + + + +'; + echo ''; + foreach ( $tabs as $key => $value ) { + echo '
    '; + echo ( isset( $value['content'] ) ) ? $value['content'] : ''; + do_action( 'wpmem_user_profile_tabs_content', $key ); + echo '
    '; + } + echo ''; + } + } + } +} \ No newline at end of file diff --git a/includes/class-wp-members-user.php b/includes/class-wp-members-user.php new file mode 100644 index 00000000..3a56763c --- /dev/null +++ b/includes/class-wp-members-user.php @@ -0,0 +1,1345 @@ +enable_products ) { + add_action( 'user_register', array( $this, 'set_default_product' ), 6 ); + } + } + + /** + * Loads the current user's membership products on init. + * + * @since 3.4.0 + */ + function load_user_products() { + if ( is_user_logged_in() ) { + $this->access = wpmem_get_user_products( get_current_user_id() ); + } + } + + /** + * Handle user login. + * + * Built from, but replaces, the original wpmem_login() function + * from core.php. wpmem_login() is currently maintained as a + * wrapper and is the direct function called for login. + * + * @since 3.1.7 + * @since 3.2.3 Removed wpmem_login_fields filter. + * @since 3.2.3 Replaced form collection with WP script to facilitate login with username OR email. + * @since 3.2.3 Changed to wp_safe_redirect(). + * @since 3.3.9 Added wpmem_set_as_logged_in() to make sure user is set. + * + * @return string Returns "loginfailed" if failed login. + */ + function login() { + + global $wpmem; + + $user = wp_signon( array(), is_ssl() ); + + if ( is_wp_error( $user ) ) { + $wpmem->error = $user->get_error_message(); + return "loginfailed"; + } else { + + // Make sure current user is set. + wpmem_set_as_logged_in( $user->ID ); + + $redirect_to = wpmem_get( 'redirect_to', false ); + $redirect_to = ( $redirect_to ) ? esc_url_raw( trim( $redirect_to ) ) : esc_url_raw( wpmem_current_url() ); + /** This filter defined in wp-login.php */ + $redirect_to = apply_filters( 'login_redirect', $redirect_to, '', $user ); + /** + * Filter the redirect url. + * + * This is the plugin's original redirect filter. In 3.1.7, + * WP's login_redirect filter hook was added to provide better + * integration support for other plugins and also for users + * who may already be using WP's filter(s). login_redirect + * comes first, then wpmem_login_redirect. So wpmem_login_redirect + * can be used to override a default in login_redirect. + * + * @since 2.7.7 + * @since 2.9.2 Added $user_id + * + * @param string $redirect_to The url to direct to. + * @param int $user->ID The user's primary key ID. + */ + $redirect_to = apply_filters( 'wpmem_login_redirect', $redirect_to, $user->ID ); + wp_safe_redirect( $redirect_to ); + exit(); + } + } + + /** + * Handle user logout. + * + * Built from, but replaces, the original wpmem_logout() function + * from core.php. wpmem_logout() is currently maintained as a + * wrapper and is the direct function called for logout. + * + * @since 3.1.7 + * @since 3.2.0 Added logout_redirect filter + * @since 3.4.0 Added $user_id for wp_logout action (to match WP, which added this in 5.5.0). + * + * @param string $redirect_to URL to redirect the user to (default: false). + */ + function logout( $redirect_to = false ) { + + // Get the user ID for when the action is fired. + $user_id = get_current_user_id(); + + // Default redirect URL. + $redirect_to = ( $redirect_to ) ? $redirect_to : home_url(); + + /** This filter is documented in /wp-login.php */ + $redirect_to = apply_filters( 'logout_redirect', $redirect_to, $redirect_to, wp_get_current_user() ); + /** + * Filter where the user goes when logged out. + * + * @since 2.7.1 + * @since 3.1.7 Moved to WP_Members_Users Class. + * @since 3.4.0 Added $user_id param. + * + * @param string The blog home page. + */ + $redirect_to = apply_filters( 'wpmem_logout_redirect', $redirect_to, $user_id ); + + wp_destroy_current_session(); + wp_clear_auth_cookie(); + wp_set_current_user( 0 ); + + /** This action is defined in /wp-includes/pluggable.php. */ + do_action( 'wp_logout', $user_id ); + + wp_safe_redirect( $redirect_to ); + exit(); + } + + /** + * Sets the registration type. + * + * @since 3.3.0 + */ + function set_reg_type() { + // Is this a WP-Members registration? + $this->reg_type['is_wpmem'] = ( 'register' == wpmem_get( 'a' ) ) ? true : false; + // Is this WP's native registration? Checks the native submit button. + $this->reg_type['is_native'] = ( __( 'Register' ) == wpmem_get( 'wp-submit' ) ) ? true : false; + // Is this a Users > Add New process? Checks the post action. + $this->reg_type['is_add_new'] = ( 'createuser' == wpmem_get( 'action' ) ) ? true : false; + // Is this a WooCommerce my account registration? Checks for WC fields. + $this->reg_type['is_woo'] = ( wpmem_get( 'woocommerce-register-nonce' ) ) ? true : false; + // Is this a WooCommerce checkout? + $this->reg_type['is_woo_checkout'] = ( wpmem_get( 'woocommerce_checkout_place_order' ) ) ? true : false; + } + + /** + * Validate user registration. + * + * @since 3.3.0 + * + * @global int $user_ID + * @global string $wpmem_themsg + * @global array $userdata + * + * @param string $tag + */ + function register_validate( $tag ) { + + // Get the globals. + global $user_ID, $wpmem, $wpmem_themsg, $userdata; + + // Check the nonce. + if ( empty( $_POST ) || ! wp_verify_nonce( $_REQUEST[ '_wpmem_' . $tag . '_nonce' ], 'wpmem_longform_nonce' ) ) { + $wpmem_themsg = wpmem_get_text( 'reg_generic' ); + return; + } + + // Make sure fields are loaded. + wpmem_fields( $tag ); + + // Is this a registration or a user profile update? + if ( 'register' == $tag ) { + $this->post_data['username'] = sanitize_user( wpmem_get( 'username' ) ); + } + + // Add the user email to the $this->post_data array for _data hooks. + if ( isset( $wpmem->fields['user_email'] ) ) { + $this->post_data['user_email'] = sanitize_email( wpmem_get( 'user_email' ) ); + } + + // If this is an update, and tos is a field, and the user has the correct saved value, remove tos. + if ( 'update' == $tag && isset( $wpmem->fields['tos'] ) ) { + if ( get_user_meta( $user_ID, 'tos', true ) == $wpmem->fields['tos']['checked_value'] ) { + unset( $wpmem->fields['tos'] ); + } + } + + // Build the $this->post_data array from $_POST data. + foreach ( $wpmem->fields as $meta_key => $field ) { + if ( ( 'register' == $tag && true == $field['register'] ) || ( 'update' == $tag && true == $field['profile'] ) ) { + if ( 'password' != $meta_key && 'confirm_password' != $meta_key && 'username' != $meta_key ) { + if ( isset( $_POST[ $meta_key ] ) ) { + switch ( $field['type'] ) { + case 'checkbox': + $this->post_data[ $meta_key ] = sanitize_text_field( $_POST[ $meta_key ] ); + break; + case 'multiselect': + case 'multicheckbox': + $delimiter = ( isset( $field['delimiter'] ) ) ? $field['delimiter'] : '|'; + $this->post_data[ $meta_key ] = ( isset( $_POST[ $meta_key ] ) ) ? implode( $delimiter, wpmem_sanitize_array( $_POST[ $meta_key ] ) ) : ''; + break; + case 'textarea': + $this->post_data[ $meta_key ] = sanitize_textarea_field( $_POST[ $meta_key ] ); + break; + case 'email': + $this->post_data[ $meta_key ] = sanitize_email( $_POST[ $meta_key ] ); + break; + case 'timestamp': + $this->post_data[ $meta_key ] = strtotime( $_POST[ $meta_key ] ); + break; + default: + $this->post_data[ $meta_key ] = sanitize_text_field( $_POST[ $meta_key ] ); + break; + } + } else { + $this->post_data[ $meta_key ] = ''; + } + } else { + // We do have password as part of the registration form. + if ( isset( $_POST['password'] ) ) { + $this->post_data['password'] = $_POST['password']; // wp_insert_user() hashes this, so sanitizing is unnessary (and undesirable). + } + if ( isset( $_POST['confirm_password'] ) ) { + $this->post_data['confirm_password'] = $_POST['confirm_password']; + } + } + } + } + + /** + * Filter the submitted form fields prior to validation. + * + * @since 2.8.2 + * @since 3.1.7 Added $tag + * @since 3.2.0 Moved to regiser_validate() method in user object class. + * + * @param array $this->post_data An array of the posted form field data. + * @param string $tag + */ + $this->post_data = apply_filters( 'wpmem_pre_validate_form', $this->post_data, $tag ); + + // Adds integration for custom error codes triggered by "register_post" or contained in "registration_errors" + // @todo This will move towards integrating all WP-Members registration errors into the "registration_errors" filter + // and allow for more standardized custom validation. + /* $errors = new WP_Error(); + do_action( 'register_post', $sanitized_user_login, $user_email, $errors ); + $errors = apply_filters( 'registration_errors', $errors, $this->post_data['username'], $this->post_data['user_email'] ); + if ( count( $errors->get_error_messages() ) > 0 ) { + $wpmem_themsg = $errors->get_error_message(); + return; + } */ + + if ( 'update' == $tag ) { + $pass_arr = array( 'username', 'password', 'confirm_password', 'password_confirm' ); + foreach ( $pass_arr as $pass ) { + unset( $wpmem->fields[ $pass ] ); + } + } + + // Check for required fields, reverse the array for logical error message order. + foreach ( array_reverse( $wpmem->fields ) as $meta_key => $field ) { + // Validation if the field is required. + if ( true == $field['required'] ) { + if ( 'file' == $field['type'] || 'image' == $field['type'] ) { + // If this is a new registration. + if ( 'register' == $tag ) { + // If the required field is a file type. + if ( empty( $_FILES[ $meta_key ]['name'] ) ) { + $wpmem_themsg = sprintf( wpmem_get_text( 'reg_empty_field' ), __( $field['label'], 'wp-members' ) ); + } + } + } else { + // If the required field is any other field type. + if ( ( 'register' == $tag && true == $field['register'] ) || ( 'update' == $tag && true == $field['profile'] ) ) { + if ( null == $this->post_data[ $meta_key ] ) { + $wpmem_themsg = sprintf( wpmem_get_text( 'reg_empty_field' ), __( $field['label'], 'wp-members' ) ); + } + } + } + } + + // Validate file field type. + if ( 'file' == $field['type'] || 'image' == $field['type'] ) { + if ( '' == $field['file_types'] ) { + $field['file_types'] = ( 'image' == $field['type'] ) ? 'gif|png|jpg|jpeg|bmp' : 'doc|docx|pdf|zip'; + } + $allowed_file_types = explode( '|', $field['file_types'] ); + $msg_types = implode( ', ', $allowed_file_types ); + if ( ! empty( $_FILES[ $meta_key ]['name'] ) ) { + $extension = pathinfo( $_FILES[ $meta_key ]['name'], PATHINFO_EXTENSION ); + if ( ! in_array( $extension, $allowed_file_types ) ) { + $wpmem_themsg = sprintf( wpmem_get_text( 'reg_file_type' ), __( $field['label'], 'wp-members' ), str_replace( '|', ',', $msg_types ) ); + } + } + } + } + + if ( 'register' == $tag ) { + if ( is_multisite() ) { + // Multisite has different requirements. + $result = wpmu_validate_user_signup( $this->post_data['username'], $this->post_data['user_email'] ); + $errors = $result['errors']; + if ( $errors->errors ) { + $wpmem_themsg = $errors->get_error_message(); + return $wpmem_themsg; + exit(); + } + + } else { + // Validate username and email fields. + $wpmem_themsg = ( email_exists( $this->post_data['user_email'] ) ) ? "email" : $wpmem_themsg; + $wpmem_themsg = ( username_exists( $this->post_data['username'] ) ) ? "user" : $wpmem_themsg; + $wpmem_themsg = ( ! is_email( $this->post_data['user_email']) ) ? wpmem_get_text( 'reg_valid_email' ) : $wpmem_themsg; + $wpmem_themsg = ( ! validate_username( $this->post_data['username'] ) ) ? wpmem_get_text( 'reg_non_alphanumeric' ) : $wpmem_themsg; + $wpmem_themsg = ( ! $this->post_data['username'] ) ? wpmem_get_text( 'reg_empty_username' ) : $wpmem_themsg; + + // If there is an error from username, email, or required field validation, stop registration and return the error. + if ( $wpmem_themsg ) { + return $wpmem_themsg; + exit(); + } + } + + // If form contains password and email confirmation, validate that they match. + if ( array_key_exists( 'confirm_password', $this->post_data ) && $this->post_data['confirm_password'] != $this->post_data ['password'] ) { + $wpmem_themsg = wpmem_get_text( 'reg_password_match' ); + } + if ( array_key_exists( 'confirm_email', $this->post_data ) && $this->post_data['confirm_email'] != $this->post_data ['user_email'] ) { + $wpmem_themsg = wpmem_get_text( 'reg_email_match' ); + } + + // Process CAPTCHA. + if ( 0 != $wpmem->captcha ) { + $check_captcha = WP_Members_Captcha::validate(); + if ( false === $check_captcha ) { + return "empty"; // @todo Return and/or set error object. For now changed to return original value. + } + } + + // Check for user defined password. + $this->post_data['password'] = wpmem_get( 'password', wp_generate_password() ); + + // Add for _data hooks + $this->post_data['user_registered'] = current_time( 'mysql', 1 ); + $this->post_data['user_role'] = get_option( 'default_role' ); + $this->post_data['wpmem_reg_ip'] = wpmem_get_user_ip(); + $this->post_data['wpmem_reg_url'] = esc_url_raw( wpmem_get( 'wpmem_reg_page', wpmem_get( 'redirect_to', false, 'request' ), 'request' ) ); + + /* + * These native fields are not installed by default, but if they + * are added, use the $_POST value - otherwise, default to username. + * Value can be filtered with wpmem_register_data. + */ + $this->post_data['user_nicename'] = sanitize_title( wpmem_get( 'user_nicename', $this->post_data['username'] ) ); + $this->post_data['display_name'] = sanitize_text_field( wpmem_get( 'display_name', $this->post_data['username'] ) ); + $this->post_data['nickname'] = sanitize_text_field( wpmem_get( 'nickname', $this->post_data['username'] ) ); + } + } + + /** + * Validates registration fields in the native WP registration. + * + * @since 2.8.3 + * @since 3.3.0 Ported from wpmem_wp_reg_validate() in wp-registration.php. + * + * @global object $wpmem The WP-Members object class. + * + * @param array $errors A WP_Error object containing any errors encountered during registration. + * @param string $sanitized_user_login User's username after it has been sanitized. + * @param string $user_email User's email. + * @return array $errors A WP_Error object containing any errors encountered during registration. + */ + function wp_register_validate( $errors, $sanitized_user_login, $user_email ) { + + global $wpmem; + + // Get any meta fields that should be excluded. + $exclude = wpmem_get_excluded_meta( 'wp-register' ); + + foreach ( wpmem_fields( 'register_wp' ) as $meta_key => $field ) { + $is_error = false; + if ( true == $field['required'] && true == $field['register'] && $meta_key != 'user_email' && ! in_array( $meta_key, $exclude ) ) { + if ( ( $field['type'] == 'checkbox' || $field['type'] == 'multicheckbox' || $field['type'] == 'multiselect' || $field['type'] == 'radio' ) && ( ! isset( $_POST[ $meta_key ] ) ) ) { + $is_error = true; + } + if ( ( $field['type'] != 'checkbox' && $field['type'] != 'multicheckbox' && $field['type'] != 'multiselect' && $field['type'] != 'radio' ) && ( ! $_POST[ $meta_key ] ) ) { + $is_error = true; + } + if ( $is_error ) { + $errors->add( 'wpmem_error', sprintf( wpmem_get_text( 'reg_empty_field' ), __( $field['label'], 'wp-members' ) ) ); + } + } + } + + // Process CAPTCHA. + if ( $wpmem->captcha > 0 ) { + $check_captcha = WP_Members_Captcha::validate(); + if ( false === $check_captcha ) { + $errors->add( 'wpmem_captcha_error', sprintf( wpmem_get_text( 'reg_captcha_err' ), __( $field['label'], 'wp-members' ) ) ); + } + } + + return $errors; + } + + /** + * User registration functions. + * + * @since 3.1.7 + * @since 3.2.6 Added handler for membership field type. + * @since 3.3.0 Changed from register() to register_finalize(). + * + * @global object $wpmem + * @param int $user_id + */ + function register_finalize( $user_id ) { + + global $wpmem; + + // If this is WP-Members registration. + if ( $this->reg_type['is_wpmem'] ) { + // Put user ID into post_data array. + $this->post_data['ID'] = $user_id; + + // Set remaining fields to wp_usermeta table. + $new_user_fields_meta = array( 'user_url', 'first_name', 'last_name', 'description' ); + foreach ( $wpmem->fields as $meta_key => $field ) { + // If the field is not excluded, update accordingly. + if ( ! in_array( $meta_key, wpmem_get_excluded_meta( 'register' ) ) && ! in_array( $meta_key, $new_user_fields_meta ) ) { + if ( $field['register'] && 'user_email' != $meta_key ) { + // Assign memberships, if applicable. + if ( 'membership' == $field['type'] && 1 == $wpmem->enable_products ) { + wpmem_set_user_product( $this->post_data[ $meta_key ], $user_id ); + } else { + update_user_meta( $user_id, $meta_key, $this->post_data[ $meta_key ] ); + } + } + } + } + + // Store the registration url. + update_user_meta( $user_id, 'wpmem_reg_url', $this->post_data['wpmem_reg_url'] ); + + // Handle file uploads, if any. + if ( ! empty( $_FILES ) ) { + $this->upload_user_files( $user_id, $wpmem->fields ); + } + } + + // If this is native WP (wp-login.php), Users > Add New, or WooCommerce registration. + if ( $this->reg_type['is_native'] || $this->reg_type['is_add_new'] || $this->reg_type['is_woo'] ) { + // Get any excluded meta fields. + $exclude = wpmem_get_excluded_meta( 'wp-register' ); + foreach ( wpmem_fields( 'register_wp' ) as $meta_key => $field ) { + $value = wpmem_get( $meta_key, false ); + if ( false !== $value && ! in_array( $meta_key, $exclude ) && 'file' != $field['type'] && 'image' != $field['type'] ) { + if ( 'multiselect' == $field['type'] || 'multicheckbox' == $field['type'] ) { + $value = implode( $field['delimiter'], $value ); + } + $sanitized_value = sanitize_text_field( $value ); + update_user_meta( $user_id, $meta_key, $sanitized_value ); + } + } + } + + // If this is Users > Add New. + if ( is_admin() && $this->reg_type['is_add_new'] ) { + // If moderated registration and activate is checked, set active flags. + if ( 1 == $wpmem->mod_reg && isset( $_POST['activate_user'] ) ) { + update_user_meta( $user_id, 'active', 1 ); + wpmem_set_user_status( $user_id, 0 ); + } + } + + // Capture IP address of all users at registration. + $user_ip = ( $this->reg_type['is_wpmem'] ) ? $this->post_data['wpmem_reg_ip'] : wpmem_get_user_ip(); + update_user_meta( $user_id, 'wpmem_reg_ip', $user_ip ); + + } + + /** + * Fires wpmem_post_register_data action. + * + * @since 3.3.2 + * + * @param int $user_id + */ + function post_register_data( $user_id ) { + $this->post_data['ID'] = $user_id; + /** + * Fires after user insertion but before email. + * + * @since 2.7.2 + * @since 3.3.2 Hooked to user_register. + * + * @param array $this->post_data The user's submitted registration data. + */ + do_action( 'wpmem_post_register_data', $this->post_data ); + } + + /** + * Sends emails on registration. + * + * @since 3.3.0 + * + * @global object $wpmem + * + * @param int $user_id + */ + function register_email_to_user( $user_id ) { + global $wpmem; + if ( $this->reg_type['is_wpmem'] ) { + // @todo Work out a better method for this so that it is optional and can be turned on/off for native reg + // Send a notification email to the user. + wpmem_email_to_user( $user_id, $this->post_data['password'], $wpmem->mod_reg, $wpmem->fields, $this->post_data ); + } + } + + /** + * Sends admin notifiction on registration. + * + * @since 3.3.0 + * + * @global object $wpmem + * + * @param int $user_id + */ + function register_email_to_admin( $user_id ) { + global $wpmem; + if ( $this->reg_type['is_wpmem'] ) { + // @todo Work out a better method for this so that it is optional and can be turned on/off for native reg + // Notify admin of new reg, if needed. + if ( 1 == $wpmem->notify ) { + $wpmem->email->notify_admin( $user_id, $wpmem->fields, $this->post_data ); + } + } + } + + /** + * Redirects user on registration. + * + * @since 3.1.7 + */ + function register_redirect() { + $redirect_to = wpmem_get( 'redirect_to', false ); + if ( $redirect_to ) { + $nonce_url = wp_nonce_url( $redirect_to, 'register_redirect', 'reg_nonce' ); + wp_safe_redirect( $nonce_url ); + exit(); + } + } + + /** + * Password change or reset. + * + * @since 3.1.7 + * + * @param string $action + * @return string $result + */ + function password_update( $action ) { + if ( isset( $_POST['formsubmit'] ) ) { + if ( 'reset' == $action ) { + $args = array( + 'user' => sanitize_user( wpmem_get( 'user', false ) ), + 'email' => sanitize_email( wpmem_get( 'email', false ) ), + ); + return $this->password_reset( $args ); + } elseif( 'link' == $action ) { + $user = wpmem_get( 'user', false ); + $user = ( strpos( $user, '@' ) ) ? sanitize_email( $user ) : sanitize_user( $user ); + $args = array( 'user' => $user ); + return $this->password_link( $args ); + } else { + $args = array( + 'pass1' => wpmem_get( 'pass1', false ), + 'pass2' => wpmem_get( 'pass2', false ), + ); + return $this->password_change( $args ); + } + } + return; + } + + /** + * Change a user's password() + * + * @since 3.1.7 + * + * @return + */ + function password_change( $args ) { + global $user_ID; + $is_error = false; + // Check for both fields being empty. + $is_error = ( ! $args['pass1'] && ! $args['pass2'] ) ? "pwdchangempty" : $is_error; + // Make sure the fields match. + $is_error = ( $args['pass1'] != $args['pass2'] ) ? "pwdchangerr" : $is_error; + /** + * Filters the password change error. + * + * @since 3.1.5 + * @since 3.1.7 Moved to user object. + * + * @param string $is_error + * @param int $user_ID The user's numeric ID. + * @param string $args['pass1'] The user's new plain text password. + */ + $is_error = apply_filters( 'wpmem_pwd_change_error', $is_error, $user_ID, $args['pass1'] ); + // User must be logged in OR must be resetting a forgotten password. + $is_error = ( ! is_user_logged_in() && 'set_password_from_key' != wpmem_get( 'a', false, 'request' ) ) ? "loggedin" : $is_error; + // Verify nonce. + $is_error = ( ! wp_verify_nonce( $_REQUEST['_wpmem_pwdchange_nonce'], 'wpmem_shortform_nonce' ) ) ? "reg_generic" : $is_error; + if ( $is_error ) { + return $is_error; + } + /** + * Fires after password change. + * + * @since 2.9.0 + * @since 3.0.5 Added $args['pass1'] to arguments passed. + * @since 3.1.7 Moved to user object. + * + * @param int $user_ID The user's numeric ID. + * @param string $args['pass1'] The user's new plain text password. + */ + do_action( 'wpmem_pwd_change', $user_ID, $args['pass1'] ); + return "pwdchangesuccess"; + } + + /** + * Reset a user's password. + * + * @since 3.1.7 + * + */ + function password_reset( $args ) { + global $wpmem; + /** + * Filter the password reset arguments. + * + * @since 2.7.1 + * @since 3.1.7 Moved to user object. + * + * @param array The username and email. + */ + $arr = apply_filters( 'wpmem_pwdreset_args', $args ); + if ( ! $arr['user'] || ! $arr['email'] ) { + // There was an empty field. + return "pwdreseterr"; + + } else { + + if ( ! wp_verify_nonce( $_REQUEST['_wpmem_pwdreset_nonce'], 'wpmem_shortform_nonce' ) ) { + return "reg_generic"; + } + if ( username_exists( $arr['user'] ) ) { + $user = get_user_by( 'login', $arr['user'] ); + if ( strtolower( $user->user_email ) !== strtolower( $arr['email'] ) || ( ( $wpmem->mod_reg == 1 ) && ( get_user_meta( $user->ID, 'active', true ) != 1 ) ) ) { + // The username was there, but the email did not match OR the user hasn't been activated. + return "pwdreseterr"; + } else { + // Generate a new password. + $new_pass = wp_generate_password(); + // Update the users password. + wp_set_password( $new_pass, $user->ID ); + // Send it in an email. + wpmem_email_to_user( $user->ID, $new_pass, 3 ); + /** + * Fires after password reset. + * + * @since 2.9.0 + * @since 3.0.5 Added $new_pass to arguments passed. + * @since 3.1.7 Moved to user object. + * + * @param int $user_ID The user's numeric ID. + * @param string $new_pass The new plain text password. + */ + do_action( 'wpmem_pwd_reset', $user->ID, $new_pass ); + return "pwdresetsuccess"; + } + } else { + // Username did not exist. + return "pwdreseterr"; + } + } + return; + } + + function password_link( $args ) { + global $wpmem; + /** + * Filter the password reset arguments. + * + * @since 3.4.2 + * + * @param array The username or email. + */ + $arr = apply_filters( 'wpmem_pwdreset_args', $args ); + + $errors = new WP_Error(); + + if ( ! isset( $arr['user'] ) || '' == $arr['user'] ) { + // There was an empty field. + return "pwdreseterr"; + + } else { + + if ( ! wp_verify_nonce( $_REQUEST['_wpmem_pwdreset_nonce'], 'wpmem_shortform_nonce' ) ) { + return "reg_generic"; + } + + $user_to_check = ( strpos( $arr['user'], '@' ) ) ? sanitize_email( $arr['user'] ) : sanitize_user( $arr['user'] ); + + if ( username_exists( $user_to_check ) ) { + $user = get_user_by( 'login', $user_to_check ); + } elseif ( email_exists( $user_to_check ) ) { + $user = get_user_by( 'email', $user_to_check ); + } else { + $user = false; + } + + if ( $user ) { + + $has_error = false; + + // Check if user is approved. + if ( ( wpmem_is_mod_reg() ) && ( ! wpmem_is_user_activated( $user->ID ) ) ) { + $errors->add( 'acct_not_approved', wpmem_get_text( 'acct_not_approved' ) ); + $has_error = true; + } + + // Check if user is validated. + if ( ( wpmem_is_act_link() ) && ( ! wpmem_is_user_confirmed( $user->ID ) ) ) { + $errors->add( 'acct_not_validated', wpmem_get_text( 'acct_not_validated' ) ); + $has_error = true; + } + + // If either of these are an error, dump the user object. + $user = ( $has_error ) ? false : $user; + } + + if ( $user ) { + wpmem_email_to_user( $user->ID, '', 3 ); + /** This action is documented in /includes/class-wp-members-user.php */ + do_action( 'wpmem_pwd_reset', $user->ID, '' ); + return "pwdresetsuccess"; + + } else { + // Username did not exist, or cannot reset password. + if ( $errors->has_errors() ) { + $wpmem->error = $errors; + } + return "pwdreseterr"; + } + } + return; + } + + /** + * Handles retrieving a forgotten username. + * + * @since 3.0.8 + * @since 3.1.6 Dependencies now loaded by object. + * @since 3.1.8 Moved to user object. + * + * @global object $wpmem + * @return string $regchk The regchk value. + */ + function retrieve_username() { + global $wpmem; + if ( isset( $_POST['formsubmit'] ) ) { + + if ( ! wp_verify_nonce( $_REQUEST['_wpmem_getusername_nonce'], 'wpmem_shortform_nonce' ) ) { + return "reg_generic"; + } + + $email = sanitize_email( $_POST['user_email'] ); + $user = ( isset( $_POST['user_email'] ) ) ? get_user_by( 'email', $email ) : false; + if ( $user ) { + // Send it in an email. + wpmem_email_to_user( $user->ID, '', 4 ); + /** + * Fires after retrieving username. + * + * @since 3.0.8 + * + * @param int $user_ID The user's numeric ID. + */ + do_action( 'wpmem_get_username', $user->ID ); + return 'usernamesuccess'; + } else { + return 'usernamefailed'; + } + } + return; + } + + /** + * Handle user file uploads for registration and profile update. + * + * @since 3.1.8 + * @since 3.2.6 Add file's post ID to $this->post_data. + * + * @param string $user_id + * @param array $fields + */ + function upload_user_files( $user_id, $fields ) { + global $wpmem; + foreach ( $fields as $meta_key => $field ) { + if ( ( 'file' == $field['type'] || 'image' == $field['type'] ) && isset( $_FILES[ $meta_key ] ) && is_array( $_FILES[ $meta_key ] ) ) { + if ( ! empty( $_FILES[ $meta_key ]['name'] ) ) { + // Upload the file and save it as an attachment. + $file_post_id = $wpmem->forms->do_file_upload( $_FILES[ $meta_key ], $user_id ); + // Save the attachment ID as user meta. + update_user_meta( $user_id, $meta_key, $file_post_id ); + // Add attachment ID to post data array. + $this->post_data[ $meta_key ] = $file_post_id; + /** + * User uploaded file. + * + * @since 3.4.7 + * + * @param int $user_id + * @param string $meta_key + * @param string $file_post_id + */ + do_action( 'wpmem_file_uploaded', $user_id, $meta_key, $file_post_id ); + } + } + } + } + + /** + * Get user data for all fields in WP-Members. + * + * Retrieves user data for all WP-Members fields (and WP default fields) + * in an array keyed by WP-Members field meta keys. + * + * @since 3.2.0 + * @since 3.2.6 Added option for "all" fields (default:false). + * + * @param string $user_id optional (defaults to current user) + * @param string $all optional (default to false) + * @return array $user_fields + */ + function user_data( $user_id = false, $all = false ) { + $user_id = ( $user_id ) ? $user_id : get_current_user_id(); + if ( true == $all ) { + $user_info = get_user_meta( $user_id ); + foreach( $user_info as $key => $value ) { + $formatted = maybe_unserialize( $value[0] ); + $user_fields[ $key ] = $formatted; + } + } else { + $fields = wpmem_fields(); + $user_data = get_userdata( $user_id ); + $excludes = array( 'first_name', 'last_name', 'description', 'nickname' ); + foreach ( $fields as $meta => $field ) { + $meta = ( 'username' == $meta ) ? 'user_login' : $meta; + if ( $field['native'] == 1 && ! in_array( $meta, $excludes ) ) { + $user_fields[ $meta ] = $user_data->data->{$meta}; + } else { + $user_fields[ $meta ] = get_user_meta( $user_id, $meta, true ); + } + } + } + return $user_fields; + } + + /** + * Sets the role for the specified user. + * + * @since 3.2.0 + * + * @param integer $user_id + * @param string $role + * @param string $action (set|add|remove) + */ + public function update_user_role( $user_id, $role, $action = 'set' ) { + $user = new WP_User( $user_id ); + switch ( $action ) { + case 'add': + $user->add_role( $role ); + break; + case 'remove': + $user->remove_role( $role ); + break; + default: + $user->set_role( $role ); + break; + } + } + + /** + * Sets a user's password. + * + * @since 3.2.3 + * + * @param int $user_id + * @param string $password + */ + function set_password( $user_id, $password ) { + wp_set_password( $password, $user_id ); + } + + /** + * Sets user as logged on password change. + * + * (Hooked to wpmem_pwd_change) + * + * @since 3.2.0 + * + * @param int $user_id + * @param string $password + */ + function set_as_logged_in( $user_id ) { + $user = get_user_by( 'id', $user_id ); + wp_set_current_user( $user_id, $user->user_login ); + wp_set_auth_cookie( $user_id, wpmem_get( 'rememberme', false, 'request' ) ); + } + + /** + * Validates user access to content. + * + * @since 3.2.0 + * @todo Currently checks in this order: expiration, role, "other". If expiration product, + * and the user is current, then access is granted. This doesn't consider if the + * user is current but does not have a required role (if BOTH an expiration and role + * product). Maybe add role checking to the expiration block if both exist. + * + * @global object $wpmem + * @param mixed $product Accepts a single membership slug/meta, or an array of multiple memberships. + * @param int $user_id (optional) + * @return bool $access + */ + function has_access( $product, $user_id = false ) { + global $wpmem; + if ( ! is_user_logged_in() ) { + return false; + } + + // Product must be an array. + $product_array = ( ! is_array( $product ) ) ? explode( ",", $product ) : $product; + + $product_array = $this->get_membership_stack( $product_array ); + + // Current user or requested user. + $user_id = ( ! $user_id ) ? get_current_user_id() : $user_id; + + // Load user memberships array. + $memberships = ( false == $user_id ) ? $this->access : wpmem_get_user_memberships( $user_id ); + + // Start by assuming no access. + $access = false; + + foreach ( $product_array as $prod ) { + $expiration_product = false; + $role_product = false; + if ( isset( $memberships[ $prod ] ) ) { + // Is this an expiration product? + if ( isset( $wpmem->membership->products[ $prod ]['expires'][0] ) && ! is_bool( $memberships[ $prod ] ) ) { + $expiration_product = true; + if ( $this->is_current( $memberships[ $prod ] ) ) { + $access = true; + break; + } + } + // Is this a role product? + if ( '' != $wpmem->membership->products[ $prod ]['role'] ) { + $role_product = true; + if ( $memberships[ $prod ] && wpmem_user_has_role( $wpmem->membership->products[ $prod ]['role'] ) ) { + if ( $expiration_product && ! $this->is_current( $memberships[ $prod ] ) ) { + $access = false; + break; + } + $access = true; + break; + } + } + if ( ! $expiration_product && ! $role_product && $memberships[ $prod ] ) { + $access = true; + break; + } + } + } + + /** + * Filter the access result. + * + * @since 3.2.0 + * @since 3.2.3 Added $product argument. + * + * @param boolean $access + * @param array $product + * @param integer $user_id + * @param array $args + */ + return apply_filters( 'wpmem_user_has_access', $access, $product_array, $user_id ); + + } + + /** + * Gets membership hierarchy (if any). + * + * Replaces original get_product_children() from 3.4.0 which was not as scalable. + * + * @since 3.4.1 + * + * @global stdClass $wpmem + * @param array $product_array + * $return array $product_array Product array with child products added. + */ + function get_membership_stack( $product_array ) { + + global $wpmem; + $membership_ids = wpmem_get_memberships_ids(); + foreach ( $product_array as $product ) { + // Do we need child access? + $child_access = get_post_meta( $membership_ids[ $product ], 'wpmem_product_child_access', true ); + if ( 1 == $child_access ) { + $args = array( + 'post_type' => $wpmem->membership->post_type, + 'post_parent' => $membership_ids[ $product ], // Current post's ID + ); + $children = get_children( $args ); + if ( ! empty( $children ) ) { + foreach ( $children as $child ) { + $product_array[] = $child->post_name; + } + } + } + // Ancestor access is by default. + $ancestors = get_post_ancestors( $membership_ids[ $product ] ); + if ( ! empty( $ancestors ) ) { + foreach ( $ancestors as $ancestor ) { + $product_array[] = get_post_field( 'post_name', $ancestor );; + } + } + } + + return $product_array; + } + + /** + * Loads anything the user has access to. + * + * @since 3.2.0 + * @since 3.2.6 Updated to return empty array if no products exist for this user. + * @since 3.3.0 Updated to use individual meta for product access. + * + * @global object $wpmem + * + * @param int $user_id + * @param stdClass $obj + * @return array $products { + * Memberships the user has as an array keyed by the membership slug. + * Memberships the user does not have enabled are not in the array. + * If a memberships is an expiration product, the expiration is the + * value as a timestamp (epoch time). Note that access can be checked + * with wpmem_user_has_access() or wpmem_user_is_expired(). + * + * @type mixed 1|timestamp + * } + */ + function get_user_products( $user_id = false, $obj = false ) { + global $wpmem; + $product_array = ( $obj ) ? $obj->membership->products : ( ( isset( $wpmem->membership->products ) ) ? $wpmem->membership->products : array() ); + $user_id = ( ! $user_id ) ? get_current_user_id() : $user_id; + foreach ( $product_array as $product_meta => $product ) { + $user_product = get_user_meta( $user_id, '_wpmem_products_' . $product_meta, true ); + if ( $user_product ) { + $products[ $product_meta ] = $user_product; + } + $user_product = ''; + } + return ( isset( $products ) ) ? $products : array(); + } + + /** + * Sets a product as active for a user. + * + * If the product expires, it sets an expiration date + * based on the time period. Otherwise the value is + * set to "true" (which does not expire). + * + * @since 3.2.0 + * @since 3.2.6 Added $date to set a specific expiration date. + * @since 3.3.0 Updated to new single meta, keeps legacy array for rollback. + * @since 3.3.1 Added no gap renewal option. + * + * @param string $product + * @param int $user_id + * @param string $set_date Formatted date should be MySQL timestamp, or simply YYYY-MM-DD. + */ + function set_user_product( $product, $user_id = false, $set_date = false ) { + + global $wpmem; + + $user_id = ( ! $user_id ) ? get_current_user_id() : $user_id; + + // New single meta format. @todo This remains when legacy array is removed. + $prev_value = get_user_meta( $user_id, '_wpmem_products_' . $product, true ); + + // Convert date to add. + $expiration_period = ( isset( $wpmem->membership->products[ $product ]['expires'] ) ) ? $wpmem->membership->products[ $product ]['expires'] : false; + + $renew = ( $prev_value ) ? true : false; + + // If membership is an expiration product. + if ( is_array( $expiration_period ) ) { + $new_value = $wpmem->membership->set_product_expiration( $product, $user_id, $set_date, $prev_value, $renew ); + } else { + $new_value = true; + } + + // Update product setting. + update_user_meta( $user_id, '_wpmem_products_' . $product, $new_value ); + + // Update the legacy setting. + $user_products = get_user_meta( $user_id, '_wpmem_products', true ); + $user_products = ( $user_products ) ? $user_products : array(); + $user_products[ $product ] = ( true === $new_value ) ? true : date( 'Y-m-d H:i:s', $new_value ); + update_user_meta( $user_id, '_wpmem_products', $user_products ); + + /** + * Fires when a user product has been set. + * + * @since 3.3.0 + * + * @param int $user_id + * @param string $product + * @param mixed $new_value + * @param string $prev_value + * @param bool $renew + */ + do_action( 'wpmem_user_product_set', $user_id, $product, $new_value, $prev_value, $renew ); + + } + + /** + * Removes a product from a user. + * + * @since 3.2.0 + * @since 3.3.0 Updated for new single meta, keeps legacy array for rollback. + * + * @param string $product + * @param int $user_id + */ + function remove_user_product( $product, $user_id = false ) { + global $wpmem; + $user_id = ( ! $user_id ) ? get_current_user_id() : $user_id; + + // @todo Legacy version. + $user_products = get_user_meta( $user_id, '_wpmem_products', true ); + $user_products = ( $user_products ) ? $user_products : array(); + if ( $user_products ) { + unset( $user_products[ $product ] ); + update_user_meta( $user_id, '_wpmem_products', $user_products ); + } + + // @todo New version. + return delete_user_meta( $user_id, '_wpmem_products_' . $product ); + } + + /** + * Utility for expiration validation. + * + * @since 3.2.0 + * @since 3.3.0 Validates date or epoch time. + * + * @param date $date + */ + function is_current( $date ) { + $date = ( is_numeric( $date ) ) ? $date : strtotime( $date ); + return ( time() < $date ) ? true : false; + } + + /** + * Check if a user is activated. + * + * @since 3.2.2 + * + * @param int $user_id + * @return bool $active + */ + function is_user_activated( $user_id = false ) { + $user_id = ( ! $user_id ) ? get_current_user_id() : $user_id; + $active = get_user_meta( $user_id, 'active', true ); + $is_activated = ( 1 == $active ) ? true : false; + /** + * Filter whether the user is active or not. + * + * @since 3.3.5 + * + * @param bool $is_activated + * @param int $user_id + */ + return apply_filters( 'wpmem_is_user_activated', $is_activated, $user_id ); + } + + /** + * Checks if a user is activated during user authentication. + * + * @since 2.7.1 + * @since 3.2.0 Moved from core to user object. + * + * @param object $user The WordPress User object. + * @param string $username The user's username (user_login). + * @param string $password The user's password. + * @return object $user The WordPress User object. + */ + function check_activated( $user, $username, $password ) { + if ( ! is_wp_error( $user ) && ! is_null( $user ) && false == $this->is_user_activated( $user->ID ) ) { + $user = new WP_Error( 'authentication_failed', __( 'ERROR: User has not been activated.', 'wp-members' ) ); + } + /** + * Filters the check_validated result. + * + * @since 3.4.2 + * + * @param mixed $user + * @param string $username + * @param string $password + */ + return apply_filters( 'wpmem_check_activated', $user, $username, $password ); + } + + /** + * Prevents users not activated from resetting their password. + * + * @since 2.5.1 + * @since 3.2.0 Moved to user object, renamed no_reset(). + * + * @return bool Returns false if the user is not activated, otherwise true. + */ + function no_reset() { + global $wpmem; + $raw_val = wpmem_get( 'user_login', false ); + if ( $raw_val ) { + if ( strpos( $raw_val, '@' ) ) { + $user = get_user_by( 'email', sanitize_email( $raw_val ) ); + } else { + $username = sanitize_user( $raw_val ); + $user = get_user_by( 'login', $username ); + } + if ( $wpmem->mod_reg == 1 ) { + if ( get_user_meta( $user->ID, 'active', true ) != 1 ) { + return false; + } + } + } + + return true; + } + + /** + * Set expiration for PayPal Subscriptions extension. + * + * @since 3.3.0 + * + * @global object $wpmem + * + * @param int $user_id + */ + function set_user_exp( $user_id ) { + global $wpmem; + // Set user expiration, if used. + if ( 1 == $wpmem->use_exp && 1 != $wpmem->mod_reg ) { + if ( function_exists( 'wpmem_set_exp' ) ) { + wpmem_set_exp( $user_id ); + } + } + } + + /** + * Sets default membership product access (if applicable). + * + * @since 3.3.0 + * + * @global object $wpmem + * + * @param int $user_id + */ + function set_default_product( $user_id ) { + global $wpmem; + + // Get default memberships. + $default_products = $wpmem->membership->get_default_products(); + + // Assign any default memberships to user. + foreach ( $default_products as $product ) { + wpmem_set_user_product( $product, $user_id ); + } + } +} \ No newline at end of file diff --git a/includes/class-wp-members-validation-link.php b/includes/class-wp-members-validation-link.php new file mode 100644 index 00000000..96c64062 --- /dev/null +++ b/includes/class-wp-members-validation-link.php @@ -0,0 +1,387 @@ + __( 'Click to validate your account: ', 'wp-members' ), + 'success_message' => __( 'Thank you for validating your account.', 'wp-members' ), + 'invalid_message' => __( 'Validation key was expired or invalid', 'wp-members' ), + 'moderated_message' => __( 'Your account is now pending approval', 'wp-members' ), + ); + + /** + * Filter default dialogs. + * + * @since 3.3.8 + * + * @param array $defaults + */ + $defaults = apply_filters( 'wpmem_validation_link_default_dialogs', $defaults ); + + foreach ( $defaults as $key => $value ) { + $this->{$key} = $value; + } + + add_action( 'template_redirect', array( $this, 'validate_key' ) ); + add_filter( 'authenticate', array( $this, 'check_validated' ), 99, 3 ); + add_filter( 'wpmem_email_filter', array( $this, 'add_key_to_email' ), 10, 3 ); + add_filter( 'the_content', array( $this, 'validation_success' ), 100 ); + + add_action( 'wpmem_account_validation_success', array( $this, 'send_welcome' ) ); + add_action( 'wpmem_account_validation_success', array( $this, 'notify_admin' ) ); + } + + /** + * Include the validation key in the new user registration email as a validation link. + * + * @since 3.3.5 + * + * @global stdClass $wpmem + * @param array $arr + * @param array $wpmem_fields + * @param array $field_data + * @return array + */ + public function add_key_to_email( $arr, $wpmem_fields, $field_data ) { + + global $wpmem; + + // Only do this for new registrations. + $email_type = ( 1 == $wpmem->mod_reg ) ? 'newmod' : 'newreg'; + if ( $arr['toggle'] == $email_type ) { + + $user = get_user_by( 'ID', $arr['user_id'] ); + + /** + * Gets the user based on the password key. + * + * WP filters/actions triggered: + * - retrieve_password + * - allow_password_reset + * - retrieve_password_key + * + * @see: https://developer.wordpress.org/reference/functions/get_password_reset_key/ + * @param WP_User User to retrieve password reset key for. + * @return string|WP_Error Password reset key on success. WP_Error on error. + */ + $key = $this->set_validation_key( $user ); + + // Generate confirm link. + /** + * Filter the return url + * + * @since 3.3.5 + * @since 3.3.9 Added $user object + * + * @param string The link URL (trailing slash recommended). + * @param object $user + */ + $url = apply_filters( 'wpmem_validation_link_return_url', trailingslashit( wpmem_profile_url() ), $user ); + $query_args = array( + 'a' => 'confirm', + 'key' => $key, + 'login' => $user->user_login, + ); + + // urlencode, primarily for user_login with a space. + $query_args = array_map( 'rawurlencode', $query_args ); + + $link = add_query_arg( $query_args, trailingslashit( $url ) ); + + /** + * Filter the confirmation link. + * + * @since 3.3.9 + * + * @param string $link + * @param string $url + * @param array $query_args + */ + $link = apply_filters( 'wpmem_validation_link', $link, $url, $query_args ); + + // Does email body have the [confirm_link] shortcode? + if ( strpos( $arr['body'], '[confirm_link]' ) ) { + $arr['body'] = str_replace( '[confirm_link]', $link, $arr['body'] ); + } else { + // Add text and link to the email body. + $arr['body'] = $arr['body'] . "\r\n" + . $this->email_text . ' ' . $link; + } + } + + return $arr; + } + + /** + * Check for a validation key and if one exists, validate and log in user. + * + * @since 3.3.5 + */ + public function validate_key() { + + global $wpmem; + + // Check for validation key. + $key = ( 'confirm' == wpmem_get( 'a', false, 'get' ) ) ? wpmem_get( 'key', false, 'get' ) : false; + $login = ( 'confirm' == wpmem_get( 'a', false, 'get' ) ) ? wpmem_get( 'login', false, 'get' ) : false; + + if ( false !== $key ) { + + // Set an error container. + $errors = new WP_Error(); + + /** + * Validate the key. + * + * WP_Error will be invalid_key or expired_key. Process triggers password_reset_expiration filter + * filtering DAY_IN_SECONDS default. Filter password_reset_key_expired is also triggered filtering + * the return value (which can be used to override the expired/invalid check based on user_id). + * + * WP filter/actions triggered: + * - password_reset_expiration + * - password_reset_key_expired + * + * @see https://developer.wordpress.org/reference/functions/check_password_reset_key/ + * @param string Hash to validate sending user's password. + * @param string The user login. + * @return WP_User|WP_Error WP_User object on success, WP_Error object for invalid or expired keys (invalid_key|expired_key). + */ + $user = check_password_reset_key( $key, $login ); + + if ( ! is_wp_error( $user ) ) { + + $this->validated = true; + + // If registration is not moderated, set the user as logged in. + if ( 1 != $wpmem->mod_reg ) { + /** + * Sets the WP auth cookie. + * + * May trigger the following WP filter/actions: + * - auth_cookie_expiration + * - secure_auth_cookie + * - secure_logged_in_cookie + * - set_auth_cookie + * - set_logged_in_cookie + * - send_auth_cookies + * + * @see https://developer.wordpress.org/reference/functions/wp_set_auth_cookie/ + */ + wp_set_auth_cookie( $user->ID, true ); + + /** + * Sets the user as logged in. + * + * May trigger the folloiwng WP filter/actions: + * - set_current_user + * + * @see https://developer.wordpress.org/reference/functions/wp_set_current_user/ + */ + wp_set_current_user( $user->ID ); + } + + // Delete validation_key meta and set active. + $this->clear_activation_key( $user->ID ); + $this->set_as_confirmed( $user->ID ); + + /** + * Fires when a user has successfully validated their account. + * + * @since 3.3.5 + * + * @param int $user_id + */ + do_action( 'wpmem_account_validation_success', $user->ID ); + + } else { + $this->validated = false; + } + } + } + + /** + * Display messaging. + * + * Shows success if key validates, expired if it does not. + * + * @since 3.3.5 + * + * @param string $content + * @return string $content + */ + public function validation_success( $content ) { + + if ( $this->show_success && 'confirm' == wpmem_get( 'a', false, 'get' ) && isset( $this->validated ) ) { + + if ( true === $this->validated ) { + $msg = $this->success_message; + + if ( wpmem_is_mod_reg() ) { + $user = get_user_by( 'login', sanitize_user( wpmem_get( 'login', false, 'get' ) ) ); + if ( ! wpmem_is_user_activated( $user->ID ) ) { + $msg = $msg . ' ' . $this->moderated_message; + } + } + } elseif ( false === $this->validated ) { + $msg = $this->invalid_message; + } else { + $msg = ''; + } + + $content = wpmem_get_display_message( 'custom', $msg ) . $content; + } + + return $content; + } + + /** + * Checks if a user is activated during user authentication. + * + * This prevents access via login if the user has not confirmed their email. + * + * @since 3.3.5 Moved from core to user object. + * + * @param object $user The WordPress User object. + * @param string $username The user's username (user_login). + * @param string $password The user's password. + * @return object $user The WordPress User object. + */ + function check_validated( $user, $username, $password ) { + if ( ! is_wp_error( $user ) && ! is_null( $user ) && false == wpmem_is_user_confirmed( $user->ID ) ) { + $user = new WP_Error( 'authentication_failed', __( 'ERROR: User has not confirmed their account.', 'wp-members' ) ); + } + /** + * Filters the check_validated result. + * + * @since 3.4.2 + * + * @param mixed $user + * @param string $username + * @param string $password + */ + return apply_filters( 'wpmem_check_validated', $user, $username, $password ); + } + + /** + * Sends the welcome email to the user upon validation of their email. + * + * @since 3.3.5 + * @since 3.3.8 Sends email specific to email validation (previously was moderated approved email). + * + * @param int $user_id + */ + public function send_welcome( $user_id ) { + if ( $this->send_welcome ) { + $email_to_send = ( get_option( 'wpmembers_email_validated' ) ) ? 6 : 2; + wpmem_email_to_user( $user_id, '', $email_to_send ); + } + } + + /** + * Sends notification email to the admin upon validation of the user's email. + * + * @since 3.3.5 + * + * @param int $user_id + */ + public function notify_admin( $user_id ) { + if ( $this->send_notify ) { + // global $wpmem; + wpmem_notify_admin( $user_id ); //, $wpmem->fields ); + } + } + + /** + * Clears user_activation_key. + * + * @since 3.3.8 + * + * @param int $user_id + */ + public function clear_activation_key( $user_id ) { + global $wpdb; + $result = $wpdb->update( $wpdb->users, array( 'user_activation_key' => '', ), array( 'ID' => $user_id ) ); + //clean_user_cache( $user_id ); + } + + /** + * Sets a user activation key. + * + * @since 3.3.8 + * + * @param mixed $user user ID (int)|WP_User (object). + */ + public function set_validation_key( $user ) { + $user = ( is_object( $user ) ) ? $user : get_user_by( 'ID', $user ); + return get_password_reset_key( $user ); + } + + /** + * Sets user as having validated their email. + * + * @since 3.3.8 + * + * @param int $user_id + */ + public function set_as_confirmed( $user_id ) { + update_user_meta( $user_id, $this->validation_confirm, time() ); + /** + * Fires when user is set as confirmed (either manually or by user). + * + * @since 3.3.9 + * + * @param int $user_id + * @param string time() + */ + do_action( 'wpmem_user_set_as_confirmed', $user_id, time() ); + } + + /** + * Sets user as NOT having validated their email. + * + * @since 3.3.8 + * + * @param int $user_id + */ + public function set_as_unconfirmed( $user_id ) { + delete_user_meta( $user_id, $this->validation_confirm ); + $validation_key = $this->set_validation_key( $user_id ); + /** + * Fires when user is set as confirmed (either manually or by user). + * + * @since 3.3.9 + * + * @param int $user_id + * @param string time() + * @param string $key + */ + do_action( 'wpmem_user_set_as_unconfirmed', $user_id, time(), $validation_key ); + } +} \ No newline at end of file diff --git a/includes/class-wp-members-widget.php b/includes/class-wp-members-widget.php new file mode 100644 index 00000000..37248ed7 --- /dev/null +++ b/includes/class-wp-members-widget.php @@ -0,0 +1,490 @@ + 'wp-members', + 'description' => __( 'Displays the WP-Members sidebar login.', 'wp-members' ), + ) + ); + } + + /** + * Displays the WP-Members login widget settings + * controls on the widget panel. + * + * @param array $instance + */ + function form( $instance ) { + + // Default widget settings. + $defaults = array( + 'title' => __( 'Login Status', 'wp-members' ), + 'redirect_to' => '', + ); + $instance = wp_parse_args( ( array ) $instance, $defaults ); + + // Title input. ?> +

    + + +

    +

    + + +

    + id_base ); + /** + * Filter the widget title. + * + * @since Unknown + * @since 3.2.0 Added instance and id_base params. + * + * @param string $title The widget title. + * @param array $instance Array of settings for the current widget. + * @param mixed $id_base The widget ID. + */ + $title = apply_filters( 'wpmem_widget_title', $title, $instance, $this->id_base ); + + /** + * Filter the widget ID. + * + * @since Unknown + * @since 3.2.0 Added instance and id_base params. + * + * @param string The ID for the sidebar widget. + * @param array $instance Array of settings for the current widget. + * @param mixed $id_base The widget ID. + */ + $id = apply_filters( 'wpmem_widget_id', 'wp-members', $instance, $this->id_base ); + + echo $args['before_widget']; + echo '
    '; + echo $args['before_title'] . $title . $args['after_title']; + // The Widget + $this->do_sidebar( $redirect_to, $customizer ); + echo '
    '; + echo $args['after_widget']; + } + + /** + * Creates the sidebar login form and status. + * + * This function determines if the user is logged in and displays either + * a login form, or the user's login status. Typically used for a sidebar. + * You can call this directly, or with the widget. + * + * @since 2.4.0 + * @since 3.0.0 Added $post_to argument. + * @since 3.1.0 Changed $post_to to $redirect_to. + * @since 3.2.0 Moved to widget_wpmemwidget class as do_sidebar(). + * @since 3.4.0 Revise form for consitency with main body form. + * + * @param string $redirect_to A URL to redirect to upon login, default null. + * @param bool $customizer Whether to show the form for the customizer. + * @global string $wpmem_regchk + * @global string $user_login + */ + function do_sidebar( $redirect_to = null, $customizer = false ) { + + global $wpmem, $wpmem_regchk; + + // Used here and in the logout. + $url = get_bloginfo('url'); + + if ( isset( $_REQUEST['redirect_to'] ) ) { + $post_to = $_REQUEST['redirect_to']; + } elseif ( is_home() || is_front_page() ) { + $post_to = $_SERVER['REQUEST_URI']; + } elseif ( is_single() || is_page() ) { + $post_to = get_permalink(); + } elseif ( is_category() ) { + global $wp_query; + $cat_id = get_query_var( 'cat' ); + $post_to = get_category_link( $cat_id ); + } elseif ( is_search() ) { + $post_to = add_query_arg( 's', get_search_query(), $url ); + } else { + $post_to = $_SERVER['REQUEST_URI']; + } + + // Clean whatever the url is. + $post_to = esc_url( $post_to ); + + if ( ! is_user_logged_in() || ( '1' == $customizer && is_customize_preview() ) ) { + + // If the user is not logged in, we need the form. + + // Defaults. + $defaults = array( + // Wrappers. + 'error_before' => '

    ', + 'error_after' => '

    ', + 'fieldset_before' => '
    ', + 'fieldset_after' => '
    ', + 'row_before' => '', + 'row_after' => '', + 'inputs_before' => '
    ', + 'inputs_after' => '
    ', + 'buttons_before' => '
    ', + 'buttons_after' => '
    ', + + // Messages. + 'error_msg' => wpmem_get_text( 'widget_login_failed' ), + 'status_msg' => wpmem_get_text( 'widget_not_logged_in' ) . '
    ', + + 'form_id' => 'wpmem_login_widget_form', + 'form_class' => 'widget_form', + 'button_id' => '', + 'button_class' => 'buttons', + + // Other. + 'strip_breaks' => true, + 'wrap_inputs' => true, + 'n' => "\n", + 't' => "\t", + 'login_form_action' => true, + ); + + /** + * Filter arguments for the sidebar defaults. + * + * @since 2.9.0 + * @deprecated 3.3.0 Use wpmem_login_widget_args instead. + * + * @param array An array of the defaults to be changed. + */ + $args = apply_filters( 'wpmem_sb_login_args', '' ); + + // Merge $args with defaults. + $args = wp_parse_args( $args, $defaults ); + + /** + * Filter the defaults for the login widget. + * + * @since 3.3.0 + * + * @param array And array of the defaults to be changed. + */ + $args = apply_filters( 'wpmem_login_widget_args', $args ); + + $inputs = array( + array( + 'name' => wpmem_get_text( 'widget_login_username' ), + 'type' => 'text', + 'tag' => 'log', + 'class' => 'username', + 'div' => 'div_text' + ), + array( + 'name' => wpmem_get_text( 'widget_login_password' ), + 'type' => 'password', + 'tag' => 'pwd', + 'class' => 'password', + 'div' => 'div_text', + ), + ); + + // Build the input rows. + foreach ( $inputs as $input ) { + $label = ''; + $field = wpmem_form_field( array( + 'name' => $input['tag'], + 'type' => $input['type'], + 'class' => $input['class'], + 'required' => true, + ) ); + $field_before = ( $args['wrap_inputs'] ) ? '
    ' : ''; + $field_after = ( $args['wrap_inputs'] ) ? '
    ' : ''; + $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. Works like wpmem_login_form_rows. + * + * @since 3.4.0 + * + * @param array $rows An array containing the form rows. + */ + $rows = apply_filters( 'wpmem_login_widget_form_rows', $rows ); + + // 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 ( $args['login_form_action'] ) { + ob_start(); + do_action( 'login_form' ); + $add_to_form = ob_get_contents(); + ob_end_clean(); + $form.= $add_to_form; + } + + $hidden = '' . $args['n'] . + '' . $args['n'] . + '' . $args['n'] . + ''; + /** + * Filter sidebar login form hidden fields. + * + * @since 2.9.0 + * @deprecated 3.4.0 Use wpmem_login_widget_hidden_fields instead. + * + * @param string $hidden The HTML for the hidden fields. + */ + $hidden = apply_filters( 'wpmem_sb_hidden_fields', $hidden ); + /** + * Filter sidebar login form hidden fields. + * + * @since 3.4.0 + * + * @param string $hidden The HTML for the hidden fields. + */ + $form = $form . apply_filters( 'wpmem_login_widget_hidden_fields', $hidden ); + + $buttons = ''; + + if ( $wpmem->user_pages['profile'] != null ) { + /** This filter is documented in wp-members/includes/class-wp-members-forms.php */ + $link = apply_filters( 'wpmem_forgot_link', wpmem_profile_url( 'pwdreset' ) ); + $link_html = ' ' . wpmem_get_text( 'widget_login_forgot' ) . ' '; + /** + * Filter the sidebar forgot password. + * + * @since 3.0.9 + * @deprecated 3.4.0 Use wpmem_login_widget_forgot_link_str instead. + * + * @param string $link_html + * @param string $link + */ + $link_html = apply_filters( 'wpmem_sb_forgot_link_str', $link_html, $link ); + /** + * Filter the sidebar forgot password. + * + * @since 3.4.0 + * + * @param string $link_html + * @param string $link + */ + $link_html = apply_filters( 'wpmem_login_widget_forgot_link_str', $link_html, $link ); + $buttons.= $link_html; + } + + if ( $wpmem->user_pages['register'] != null ) { + /** This filter is documented in wp-members/includes/class-wp-members-forms.php */ + $link = apply_filters( 'wpmem_reg_link', $wpmem->user_pages['register'] ); + $link_html = ' ' . wpmem_get_text( 'widget_login_register' ) . ''; + /** + * Filter the sidebar register link. + * + * @since 3.0.9 + * @deprecated 3.4.0 Use wpmem_login_widget_reg_link_str instead. + * + * @param string $link_html + * @param string $link + */ + $link_html = apply_filters( 'wpmem_sb_reg_link_str', $link_html, $link ); + /** + * Filter the sidebar register link. + * + * @since 3.4.0 + * + * @param string $link_html + * @param string $link + */ + $link_html = apply_filters( 'wpmem_login_widget_reg_link_str', $link_html, $link ); + $buttons.= $link_html; + } + + $form = $form . $args['n'] . $args['buttons_before'] . $buttons . $args['n'] . $args['buttons_after']; + + $form = $args['fieldset_before'] . $args['n'] . $form . $args['n'] . $args['fieldset_after']; + + $form = '
    ' . $args['n'] . $form . $args['n'] . '
    '; + + // Add status message, if one exists. + if ( '' == $args['status_msg'] ) { + $args['status_msg'] . $args['n'] . $form; + } + + // Strip breaks. + $form = ( $args['strip_breaks'] ) ? str_replace( array( "\n", "\r", "\t" ), array( '','','' ), $form ) : $form; + + /** + * Filter the sidebar form. + * + * @since unknown + * @deprecated 3.3.9 Use wpmem_login_widget_form instead. + * + * @param string $form The HTML for the sidebar login form. + */ + $form = apply_filters( 'wpmem_sidebar_form', $form ); + /** + * Filter the sidebar form. + * + * @since 3.3.9 + * + * @param string $form The HTML for the sidebar login form. + */ + $form = apply_filters( 'wpmem_login_widget_form', $form ); + + $do_error_msg = ''; + $error_msg = $args['error_before'] . $args['error_msg'] . $args['error_after']; + + if ( isset( $_POST['slog'] ) && $wpmem_regchk == 'loginfailed' ) { + $do_error_msg = true; + } elseif( is_customize_preview() && get_theme_mod( 'wpmem_show_form_message_dialog', false ) ) { + $do_error_msg = true; + } + + if ( $do_error_msg ) { + /** + * Filter the sidebar login failed message. + * + * @since unknown + * @deprecated 3.4.0 Use wpmem_login_widget_login_failed instead. + * + * @param string $error_msg The error message. + */ + $error_msg = apply_filters( 'wpmem_login_failed_sb', $error_msg ); + /** + * Filter the sidebar login failed message. + * + * @since 3.4.0 + * + * @param string $error_msg The error message. + */ + $error_msg = apply_filters( 'wpmem_login_widget_login_failed', $error_msg ); + $form = $error_msg . $form; + } + + echo $form; + + } else { + + global $user_login; + + /** This filter is defined in /includes/api/api.php */ + $logout = apply_filters( 'wpmem_logout_link', add_query_arg( 'a', 'logout', $url ) ); + + // Defaults. + $defaults = array( + 'user_login' => $user_login, + 'wrapper_before' => '', + ); + + /** + * Filter sidebar login status arguments. + * + * @since 3.1.0 + * @since 3.1.2 Pass default args. + * @deprecated 3.4.0 Use wpmem_login_widget_status_args instead. + * + * @param array $defaults + * @return array + */ + $args = apply_filters( 'wpmem_sidebar_status_args', $defaults ); + /** + * Filter sidebar login status arguments. + * + * @since 3.4.0 + * + * @param array $defaults + * @return array + */ + $args = apply_filters( 'wpmem_login_widget_status_args', $defaults ); + + // Merge $args with $defaults. + $args = wp_parse_args( $args, $defaults ); + + // Generate the message string. + $str = $args['wrapper_before'] . $args['status_text'] . "" . $args['link_text'] . '' . $args['wrapper_after']; + + /** + * Filter the sidebar user login status. + * + * @since unknown + * @deprecated 3.4.0 Use wpmem_login_widget_status instead. + * + * @param string $str The login status for the user. + */ + $str = apply_filters( 'wpmem_sidebar_status', $str ); + /** + * Filter the sidebar user login status. + * + * @since 3.4.0 + * + * @param string $str The login status for the user. + */ + $str = apply_filters( 'wpmem_login_widget_status', $str ); + + echo $str; + } + } +} \ No newline at end of file diff --git a/includes/class-wp-members-woocommerce-integration.php b/includes/class-wp-members-woocommerce-integration.php new file mode 100644 index 00000000..edab15ac --- /dev/null +++ b/includes/class-wp-members-woocommerce-integration.php @@ -0,0 +1,40 @@ +woo as $key => $value ) { + $this->{$key} = $value; + } + + // Handle "My Account" page registration. + if ( wpmem_is_enabled( 'woo/add_my_account_fields' ) ) { + add_action( 'woocommerce_register_form', 'wpmem_woo_register_form' ); + add_action( 'woocommerce_register_post', 'wpmem_woo_reg_validate', 10, 3 ); + } + // Handle Registration checkout + if ( wpmem_is_enabled( 'woo/add_checkout_fields' ) ) { + add_filter( 'woocommerce_checkout_fields', 'wpmem_woo_checkout_form' ); + add_action( 'woocommerce_checkout_update_order_meta', 'wpmem_woo_checkout_update_meta' ); + //add_action( 'woocommerce_save_account_details_errors', 'wpmem_woo_reg_validate' ); + add_action( 'woocommerce_form_field_multicheckbox', 'wpmem_form_field_wc_custom_field_types', 10, 4 ); + add_action( 'woocommerce_form_field_multiselect', 'wpmem_form_field_wc_custom_field_types', 10, 4 ); + add_action( 'woocommerce_form_field_radio', 'wpmem_form_field_wc_custom_field_types', 10, 4 ); + add_action( 'woocommerce_form_field_select', 'wpmem_form_field_wc_custom_field_types', 10, 4 ); + add_action( 'woocommerce_form_field_checkbox', 'wpmem_form_field_wc_custom_field_types', 10, 4 ); + } + + if ( wpmem_is_enabled( 'woo/add_update_fields' ) ) { + add_action( 'woocommerce_edit_account_form', 'wpmem_woo_edit_account_form' ); + } + + if ( wpmem_is_enabled( 'woo/product_restrict' ) ) { + add_filter( 'woocommerce_is_purchasable', 'wpmem_woo_is_purchasable', PHP_INT_MAX, 2 ); + } + } +} \ No newline at end of file diff --git a/includes/class-wp-members.php b/includes/class-wp-members.php new file mode 100644 index 00000000..16a9449d --- /dev/null +++ b/includes/class-wp-members.php @@ -0,0 +1,2005 @@ +path = plugin_dir_path( __DIR__ ); + $this->name = $this->path . 'wp-members.php'; + $this->slug = substr( basename( $this->name ), 0, -4 ); + $this->url = plugin_dir_url ( __DIR__ ); + + $settings = get_option( 'wpmembers_settings' ); + + // Validate that v3 settings are loaded. + if ( ! isset( $settings['version'] ) + || $settings['version'] != $this->version + || ! isset( $settings['db_version'] ) + || $settings['db_version'] != $this->db_version ) { + // Load installation routine and pdate settings. + require_once $this->path . 'includes/install.php'; + $settings = wpmem_do_install(); + } + + /** + * Filter the options before they are loaded into constants. + * + * @since 2.9.0 + * @since 3.0.0 Moved to the WP_Members class. + * + * @param array $this->settings An array of the WP-Members settings. + */ + $settings = apply_filters( 'wpmem_settings', $settings ); + + // Assemble settings. + foreach ( $settings as $key => $val ) { + $this->$key = $val; + } + + // Load dependent files. + $this->load_dependencies(); + + // @todo Until I think of a better place to put this. + $this->optin = get_option( 'wpmembers_optin' ); + + $this->load_user_pages(); + $this->set_style(); + + $this->forms = new WP_Members_Forms; // Load forms. + $this->api = new WP_Members_API; // Load api. + $this->shortcodes = new WP_Members_Shortcodes(); // Load shortcodes. + $this->membership = new WP_Members_Products(); // Load membership plans + $this->email = new WP_Members_Email; // Load email functions + $this->user = new WP_Members_User( $this ); // Load user functions. + $this->menus = new WP_Members_Menus(); + $this->dialogs = new WP_Members_Dialogs(); + + // @deprecated Clone menus are technically deprecated, but kept in the plugin for legacy users. + if ( $this->clone_menus ) { + $this->menus_clone = new WP_Members_Clone_Menus(); // Load clone menus. + } + + if ( 1 == $this->pwd_link ) { + $this->pwd_reset = new WP_Members_Pwd_Reset; + } + if ( 1 == $this->act_link ) { + $this->act_newreg = new WP_Members_Validation_Link; + } + + // @todo Is this a temporary fix? + $this->email->load_from(); + + /** + * Fires after main settings are loaded. + * + * @since 3.0 + * @deprecated 3.2.0 Use wpmem_after_init instead. + */ + do_action( 'wpmem_settings_loaded' ); + + // Preload the expiration module, if available. + $exp_active = ( function_exists( 'wpmem_exp_init' ) || function_exists( 'wpmem_set_exp' ) ) ? true : false; + define( 'WPMEM_EXP_MODULE', $exp_active ); + + // Load actions and filters. + $this->load_hooks(); + + // Load contants. + $this->load_constants(); + + // Load dropins. + if ( $this->dropins ) { + $this->load_dropins(); + } + + // Check for anything that we should stop execution for (currently just the default tos). + if ( 'display' == wpmem_get( 'tos', false, 'get' ) ) { + // If themes are not loaded, we don't need them. + $user_themes = ( ! defined( 'WP_USE_THEMES' ) ) ? define( 'WP_USE_THEMES', false ) : ''; + $this->load_default_tos(); + die(); + } + } + + /** + * Plugin initialization function to load hooks. + * + * @since 3.0.0 + */ + function load_hooks() { + + /** + * Fires before action and filter hooks load. + * + * @since 3.0.0 + * @since 3.1.6 Fires before hooks load. + */ + do_action( 'wpmem_load_hooks' ); + + // Add actions. + + add_action( 'init', array( $this, 'load_textdomain' ) ); + add_action( 'init', array( $this->membership, 'add_cpt' ), 0 ); // Adds membership plans custom post type. + add_action( 'init', array( $this, 'load_dependent_classes' ) ); + add_action( 'widgets_init', array( $this, 'widget_init' ) ); // initializes the widget + add_action( 'rest_api_init', array( $this, 'rest_init' ) ); + add_action( 'pre_get_posts', array( $this, 'do_hide_posts' ), 20 ); + add_action( 'template_redirect', array( $this, 'get_action' ) ); + add_action( 'login_enqueue_scripts', array( $this, 'enqueue_style_wp_login' ) ); // styles the native registration + add_action( 'wp_enqueue_scripts', array( $this, 'enqueue_style' ) ); // Enqueues the stylesheet. + add_action( 'wp_enqueue_scripts', array( $this, 'loginout_script' ) ); + add_action( 'customize_register', array( $this, 'customizer_settings' ) ); + add_action( 'wp_footer', array( $this, 'invisible_captcha' ) ); + + if ( is_admin() ) { + add_action( 'init', array( $this, 'load_admin' ) ); // @todo Check user role to load correct dashboard + } + + if ( is_user_logged_in() ) { + add_action( 'wpmem_pwd_change', array( $this->user, 'set_password' ), 9, 2 ); + add_action( 'wpmem_pwd_change', array( $this->user, 'set_as_logged_in' ), 10 ); + } + + add_action( 'register_form', 'wpmem_wp_register_form' ); // Adds fields to the default wp registration + + // Add filters. + add_filter( 'the_content', array( $this, 'do_securify' ), 99 ); + add_filter( 'comments_open', array( $this, 'do_securify_comments' ), 99, 2 ); // securifies the comments + add_filter( 'wpmem_securify', array( $this, 'reg_securify' ) ); // adds success message on login form if redirected + add_filter( 'rest_prepare_post', array( $this, 'do_securify_rest' ), 10, 3 ); + add_filter( 'rest_prepare_page', array( $this, 'do_securify_rest' ), 10, 3 ); + foreach( $this->post_types as $post_type ) { + add_filter( "rest_prepare_{$post_type}", array( $this, 'do_securify_rest' ), 10, 3 ); + } + + //add_filter( 'query_vars', array( $this, 'add_query_vars' ), 10, 2 ); // adds custom query vars + add_filter( 'get_pages', array( $this, 'filter_get_pages' ) ); + add_filter( 'wp_get_nav_menu_items', array( $this, 'filter_nav_menu_items' ), null, 3 ); + add_filter( 'get_previous_post_where', array( $this, 'filter_get_adjacent_post_where' ) ); + add_filter( 'get_next_post_where', array( $this, 'filter_get_adjacent_post_where' ) ); + add_filter( 'allow_password_reset', array( $this->user, 'no_reset' ) ); // no password reset for non-activated users + + // If registration is moderated, check for activation (blocks backend login by non-activated users). + if ( 1 == $this->mod_reg ) { + add_filter( 'authenticate', array( $this->user, 'check_activated' ), 99, 3 ); + } + + // Replace login error object, if profile page is set, AND it is not the wp-login.php page. + if ( 1 == $this->login_error + && isset( $this->user_pages['profile'] ) + && '' != $this->user_pages['profile'] + && 'wp-login.php' !== $GLOBALS['pagenow'] + && ! wpmem_is_woo_active() ) { + add_filter( 'lostpassword_url', array( $this, 'lost_pwd_url' ), 10, 2 ); + } + + if ( function_exists( 'wpmem_custom_translation_strings' ) ) { + add_filter( 'wpmem_fields', array( $this->forms, 'localize_fields' ), 9 ); + } + /** + * Fires after action and filter hooks load. + * + * @since 3.0.0 + * @since 3.1.6 Was wpmem_load_hooks, now wpmem_hooks_loaded. + */ + do_action( 'wpmem_hooks_loaded' ); + } + + /** + * Load drop-ins. + * + * @since 3.0.0 + * + * @todo This is experimental. The function and its operation is subject to change. + */ + function load_dropins() { + + /** + * Fires before dropins load (for adding additional drop-ins). + * + * @since 3.0.0 + * @since 3.1.6 Fires before dropins. + */ + do_action( 'wpmem_load_dropins' ); + + /** + * Filters the drop-in file directory. + * + * @since 3.0.0 + * @since 3.3.0 Filter previously unpublished, changed hook name. + * + * @param string $wpmem->dropin_dir The drop-in file directory. + */ + $dir = apply_filters( 'wpmem_dropin_dir', $this->dropin_dir ); + + // Load any drop-ins. + $settings = get_option( 'wpmembers_dropins' ); + $this->dropins_enabled = ( $settings ) ? $settings : array(); + if ( ! empty( $this->dropins_enabled ) ) { + foreach ( $this->dropins_enabled as $filename ) { + $dropin = $dir . $filename; + if ( file_exists( $dropin ) ) { + include_once $dropin; + } + } + } + + /** + * Fires before dropins load (for adding additional drop-ins). + * + * @since 3.0.0 + * @since 3.1.6 Was wpmem_load_dropins, now wpmem_dropins_loaded. + */ + do_action( 'wpmem_dropins_loaded' ); + } + + /** + * Loads pre-3.0 constants (included primarily for add-on compatibility). + * + * @since 3.0.0 + * @since 3.3.0 Deprecated all but exp and trl constants. + */ + function load_constants() { + ( ! defined( 'WPMEM_MOD_REG' ) ) ? define( 'WPMEM_MOD_REG', $this->mod_reg ) : ''; + ( ! defined( 'WPMEM_USE_EXP' ) ) ? define( 'WPMEM_USE_EXP', $this->use_exp ) : ''; + ( ! defined( 'WPMEM_USE_TRL' ) ) ? define( 'WPMEM_USE_TRL', $this->use_trial ) : ''; + } + + /** + * Load dependent files. + * + * @since 3.1.6 + */ + function load_dependencies() { + + /** + * Filter the location and name of the pluggable file. + * + * @since 2.9.0 + * @since 3.1.6 Moved in load order to come before dependencies. + * + * @param string The path to WP-Members plugin functions file. + */ + $wpmem_pluggable = apply_filters( 'wpmem_plugins_file', WP_PLUGIN_DIR . '/wp-members-pluggable.php' ); + + // Preload any custom functions, if available. + if ( file_exists( $wpmem_pluggable ) ) { + include( $wpmem_pluggable ); + } + + require_once $this->path . 'includes/vendor/rocketgeek-utilities/loader.php'; + require_once $this->path . 'includes/class-wp-members-api.php'; + require_once $this->path . 'includes/class-wp-members-clone-menus.php'; + require_once $this->path . 'includes/class-wp-members-captcha.php'; + require_once $this->path . 'includes/class-wp-members-dialogs.php'; + require_once $this->path . 'includes/class-wp-members-email.php'; + require_once $this->path . 'includes/class-wp-members-forms.php'; + require_once $this->path . 'includes/class-wp-members-menus.php'; + require_once $this->path . 'includes/class-wp-members-products.php'; + require_once $this->path . 'includes/class-wp-members-pwd-reset.php'; + require_once $this->path . 'includes/class-wp-members-shortcodes.php'; + require_once $this->path . 'includes/class-wp-members-user.php'; + require_once $this->path . 'includes/class-wp-members-user-profile.php'; + require_once $this->path . 'includes/class-wp-members-validation-link.php'; + require_once $this->path . 'includes/class-wp-members-widget.php'; + require_once $this->path . 'includes/class-wp-members-woocommerce-integration.php'; + require_once $this->path . 'includes/api/api.php'; + require_once $this->path . 'includes/api/api-email.php'; + require_once $this->path . 'includes/api/api-forms.php'; + require_once $this->path . 'includes/api/api-products.php'; + require_once $this->path . 'includes/api/api-settings.php'; + require_once $this->path . 'includes/api/api-users.php'; + require_once $this->path . 'includes/api/api-utilities.php'; + + //require_once $this->path . 'includes/blocks/class-wp-members-blocks.php'; + + if ( defined( 'WP_CLI' ) && WP_CLI ) { + require_once $this->path . 'includes/cli/class-wp-members-cli.php'; + require_once $this->path . 'includes/cli/class-wp-members-cli-user.php'; + require_once $this->path . 'includes/cli/class-wp-members-cli-settings.php'; + } + + require_once $this->path . 'includes/deprecated.php'; + require_once $this->path . 'includes/legacy/dialogs.php'; // File is totally deprecated at this point; eval for removal. + } + + /** + * Load classes that depend on the $wpmem object class to be fully loaded. + * + * @since 3.4.7 + */ + public function load_dependent_classes() { + if ( wpmem_is_woo_active() ) { + $this->woo = new WP_Members_WooCommerce_Integration( $this ); + } + } + + /** + * Load admin API and dependencies. + * + * Determines which scripts to load and actions to use based on the + * current users capabilities. + * + * @since 2.5.2 + * @since 3.1.0 Added admin api object. + * @since 3.1.7 Moved from main plugin file as wpmem_chk_admin() to main object. + */ + function load_admin() { + + /** + * Fires before initialization of admin options. + * + * @since 2.9.0 + */ + do_action( 'wpmem_pre_admin_init' ); + + /** + * Load the admin api class. + * + * @since 3.1.0 + */ + require_once $this->path . 'includes/admin/class-wp-members-admin-api.php'; + $this->admin = new WP_Members_Admin_API; + + /** + * Fires after initialization of admin options. + * + * @since 2.9.0 + */ + do_action( 'wpmem_after_admin_init' ); + } + + /** + * Gets the requested action. + * + * @since 3.0.0 + * + * @global string $wpmem_a The WP-Members action variable. + */ + function get_action() { + + // Get the action being done (if any). + $this->action = sanitize_text_field( wpmem_get( 'a', '', 'request' ) ); + + // For backward compatibility with processes that check $wpmem_a. + global $wpmem_a; + $wpmem_a = $this->action; + + /** + * Fires when the wpmem action is retrieved. + * + * @since 3.1.7 + * @since 3.4.2 Added action as a param. + */ + do_action( 'wpmem_get_action', $this->action ); + + // Get the regchk value (if any). + $this->regchk = $this->get_regchk( $this->action ); + } + + /** + * Gets the regchk value. + * + * regchk is a legacy variable that contains information about the current + * action being performed. Login, logout, password, registration, profile + * update functions all return a specific value that is stored in regchk. + * This value and information about the current action can then be used to + * determine what content is to be displayed by the securify function. + * + * @since 3.0.0 + * + * @global string $wpmem_a The WP-Members action variable. + * + * @param string $action The current action. + * @return string The regchk value. + */ + function get_regchk( $action ) { + + switch ( $action ) { + + case 'login': + $regchk = $this->user->login(); + break; + + case 'logout': + $regchk = $this->user->logout(); + break; + + case 'pwdchange': + case 'set_password_from_key': + $regchk = $this->user->password_update( 'change' ); + break; + + case 'pwdreset': + global $wpmem; + if ( 1 == $wpmem->pwd_link ) { + $regchk = $this->user->password_update( 'link' ); + } else { + $regchk = $this->user->password_update( 'reset' ); + } + break; + + case 'getusername': + $regchk = $this->user->retrieve_username(); + break; + + case 'register': + case 'update': + $regchk = wpmem_user_register( $action ); + break; + + default: + $regchk = ( isset( $regchk ) ) ? $regchk : ''; + break; + } + + /** + * Filter wpmem_regchk. + * + * The value of regchk is determined by functions that may be run in the get_regchk function. + * This value determines what happens in the wpmem_securify() function. + * + * @since 2.9.0 + * @since 3.0.0 Moved to get_regchk() in WP_Members object. + * + * @param string $this->regchk The value of wpmem_regchk. + * @param string $this->action The $wpmem_a action. + */ + $regchk = apply_filters( 'wpmem_regchk', $regchk, $action ); + + // Legacy global variable for use with older extensions. + global $wpmem_regchk; + $wpmem_regchk = $regchk; + + return $regchk; + } + + /** + * Determines if content should be blocked. + * + * This function was originally stand alone in the core file and + * was moved to the WP_Members class in 3.0. + * + * @since 3.0.0 + * @since 3.3.0 Added $post_id + * @since 3.4.0 Added $is_post_check to allow for individual post checking. + * + * @global object $post The WordPress Post object. + * + * @param int $post_id + * @return bool $block true|false + */ + function is_blocked( $post_id = false ) { + + global $post; + + $is_post_check = ( false == $post_id ) ? false : true; + + if ( $post || $post_id ) { + + $the_post = ( false == $post_id ) ? $post : get_post( $post_id ); + + $meta = wpmem_get_block_setting( $the_post->ID ); + + // Backward compatibility for old block/unblock meta. + if ( ! $meta ) { + // Check for old meta. + $old_block = get_post_meta( $the_post->ID, 'block', true ); + $old_unblock = get_post_meta( $the_post->ID, 'unblock', true ); + $meta = ( $old_block ) ? 1 : ( ( $old_unblock ) ? 0 : $meta ); + } + + // Setup defaults. + $defaults = array( + 'post_id' => $the_post->ID, + 'post_type' => $the_post->post_type, + 'block' => ( isset( $this->block[ $the_post->post_type ] ) && $this->block[ $the_post->post_type ] == 1 ) ? true : false, + 'block_meta' => $meta, + 'block_type' => ( isset( $this->block[ $the_post->post_type ] ) ) ? $this->block[ $the_post->post_type ] : 0, + ); + + /** + * Filter the block arguments. + * + * @since 2.9.8 + * @since 3.0.0 Moved to is_blocked() in WP_Members object. + * @since 3.3.0 Passes $defaults, second argument deprecated. + * + * @param array $args $defaults. + * @param array $defaults Deprecated 3.3.0. @todo Obsolete in 3.5.0 + */ + $args = apply_filters( 'wpmem_block_args', $defaults, $defaults ); + + // Merge $args with defaults. + $args = ( wp_parse_args( $args, $defaults ) ); + + if ( $is_post_check || is_single() || is_page() || wpmem_is_rest() ) { + switch( $args['block_type'] ) { + case 1: // If content is blocked by default. + $args['block'] = ( $args['block_meta'] == '0' ) ? false : $args['block']; + break; + case 0 : // If content is unblocked by default. + $args['block'] = ( $args['block_meta'] == '1' ) ? true : $args['block']; + break; + } + + } else { + $args['block'] = false; + } + + } else { + $args = array( 'block' => false ); + } + + // Don't block user pages. + $args['block'] = ( in_array( get_permalink(), $this->user_pages ) ) ? false : $args['block']; + + /** + * Filter the block boolean. + * + * @since 2.7.5 + * + * @param bool $args['block'] + * @param array $args { + * An array of arguments used in the function. + * + * @type string $post_id + * @type string $post_type + * @type string $block + * @type string $block_meta + * @tyep string $block_type + * } + */ + return apply_filters( 'wpmem_block', $args['block'], $args ); + } + + /** + * The Securify Content Filter. + * + * This is the primary function that picks up where get_action() leaves off. + * Determines whether content is shown or hidden for both post and pages. This + * is a filter function for the_content. + * + * @link https://developer.wordpress.org/reference/functions/the_content/ + * @link https://developer.wordpress.org/reference/hooks/the_content/ + * + * @since 3.0.0 + * + * @global object $post The WordPress Post object. + * @global string $wpmem_themsg Contains messages to be output. + * @param string $content + * @return string $content + */ + function do_securify( $content = null ) { + + global $post, $wpmem_themsg; + + $orig_content = $content; + + $content = ( is_single() || is_page() ) ? $content : wpmem_do_excerpt( $content ); + + if ( $this->regchk == "captcha" ) { + global $wpmem_captcha_err; + $wpmem_themsg = wpmem_get_text( 'reg_captcha_err' ) . '

    ' . $wpmem_captcha_err; + } + + // Block/unblock Posts. + if ( ! is_user_logged_in() && true == $this->is_blocked() ) { + + // If there is a regchk action, show the login and/or registration forms. + if ( $this->regchk ) { + + $content = wpmem_get_display_message( $this->regchk, $wpmem_themsg ); + $content .= ( 'loginfailed' == $this->regchk || 'success' == $this->regchk ) ? wpmem_login_form() : wpmem_register_form(); + + } else { + + // Toggle shows excerpt above login/reg on posts/pages. + global $wp_query; + if ( isset( $wp_query->query_vars['page'] ) && $wp_query->query_vars['page'] > 1 ) { + + // Shuts down excerpts on multipage posts if not on first page. + $content = ''; + + } elseif ( isset( $this->show_excerpt[ $post->post_type ] ) && 1 == $this->show_excerpt[ $post->post_type ] ) { + + // @todo Can this be condensed or eliminated? + $len = strpos( $content, 'post_type}_drop_response_data", array(), $response, $post, $request ); + + foreach ( $drop as $dropped_key ) { + $response->data[ $dropped_key ] = array(); + } + + if ( isset( $response->data['content']['rendered'] ) ) { + /** + * Filters restricted content message. + * + * @since 3.3.2 + * @since 3.3.4 Added $response, $post, and $request + * + * @param string $message + */ + $response->data['content']['rendered'] = apply_filters( "wpmem_securify_rest_{$post->post_type}_content", __( "You must be logged in to view this content.", 'wp-members' ), $response, $post, $request ); + } + if ( isset( $response->data['excerpt']['rendered'] ) ) { + /** + * Filters restricted excerpt message. + * + * @since 3.3.2 + * @since 3.3.4 Added $response, $post, and $request + * + * @param string $message + */ + $response->data['excerpt']['rendered'] = apply_filters( "wpmem_securify_rest_{$post->post_type}_excerpt", __( "You must be logged in to view this content.", 'wp-members' ), $response, $post, $request ); + } + } + + // Response for hidden content. @todo This needs to be changed to check for whether the user has access (for internal requests). + if ( ! is_admin() && in_array( $post->ID, $this->hidden_posts() ) ) { + return new WP_REST_Response( __( 'The page you are looking for does not exist', 'wp-members' ), 404 ); + } + } + return $response; + } + + /** + * Adds the successful registration message on the login page if reg_nonce validates. + * + * @since 3.1.7 + * @since 3.2.0 Moved to wpmem object, renamed reg_securify() + * + * @param string $content + * @return string $content + */ + function reg_securify( $content ) { + global $wpmem, $wpmem_themsg; + $nonce = wpmem_get( 'reg_nonce', false, 'get' ); + if ( $nonce && wp_verify_nonce( $nonce, 'register_redirect' ) ) { + $content = wpmem_get_display_message( 'success', $wpmem_themsg ); + $content = $content . wpmem_login_form(); + } + return $content; + } + + /** + * Runs if the REST API is initialized. + * + * @since 3.3.2 + */ + function rest_init() { + $this->is_rest = true; + } + + /** + * Gets an array of hidden post IDs. + * + * @since 3.2.0 + * + * @global object $wpdb + * @return array $hidden + */ + function hidden_posts() { + global $wpdb; + $hidden = get_option( 'wpmem_hidden_posts' ); + if ( false === $hidden ) { + $hidden = $this->update_hidden_posts(); + } + return $hidden; + } + + /** + * Updates the hidden post array transient. + * + * @since 3.2.0 + * @since 3.3.3 Don't include posts from post types not set as handled by WP-Members. + * + * @global object $wpdb + * @return array $hidden + */ + function update_hidden_posts() { + global $wpdb; + $hidden = array(); + $default_post_types = array( 'post'=>'Posts', 'page'=>'Page' ); + $post_types = array_merge( $this->post_types, $default_post_types ); + // $results = $wpdb->get_results( "SELECT post_id FROM " . $wpdb->prefix . "postmeta WHERE meta_key = '_wpmem_block' AND meta_value = 2" ); + $results = $wpdb->get_results( + "SELECT + p1.id, + p1.post_type, + m1.meta_key AS _wpmem_block + FROM " . $wpdb->prefix . "posts p1 + JOIN " . $wpdb->prefix . "postmeta m1 ON (m1.post_id = p1.id AND m1.meta_key = '_wpmem_block') + WHERE m1.meta_value = '2';" + ); + foreach( $results as $result ) { + if ( array_key_exists( $result->post_type, $post_types ) ) { + $hidden[] = $result->id; + } + } + update_option( 'wpmem_hidden_posts', $hidden ); + return $hidden; + } + + /** + * Gets an array of hidden post IDs. + * + * @since 3.2.0 + * + * @global stdClass $wpdb + * @return array $hidden + */ + function get_hidden_posts() { + $hidden = array(); + + // Return empty array if this is the admin and user can edit posts. + if ( is_admin() && current_user_can( 'edit_posts' ) ) { + return $hidden; + } + + // If the user is not logged in, return all hidden posts. + if ( ! is_user_logged_in() ) { + $hidden = $this->hidden_posts(); + } else { + // If the user is logged in. + if ( 1 == $this->enable_products ) { + // Get user product access. + $hidden = $this->hidden_posts(); + $hidden = ( is_array( $hidden ) ) ? $hidden : array(); + + // Remove posts with a product the user has access to. + foreach ( $this->membership->products as $key => $value ) { + if ( isset( $this->user->access[ $key ] ) && ( true == $this->user->access[ $key ] || $this->user->is_current( $this->user->access[ $key ] ) ) ) { + foreach ( $hidden as $post_id ) { + if ( 1 == get_post_meta( $post_id, wpmem_get_membership_meta( $key ), true ) ) { + $hidden_key = array_search( $post_id, $hidden ); + unset( $hidden[ $hidden_key ] ); + } + } + } + } + + // Remove posts that don't have a product assignment (general login). + foreach( $hidden as $hidden_key ) { + $unattached = get_post_meta( $hidden_key, '_wpmem_products', true ); + if ( false == $unattached ) { + $hidden_key = array_search( $hidden_key, $hidden ); + unset( $hidden[ $hidden_key ] ); + } + } + } + } + /** + * Filter the hidden posts array. + * + * @since 3.3.4 + * + * @param array $hidden + */ + return apply_filters( 'wpmem_hidden_posts', $hidden ); + } + + /** + * Hides posts based on settings and meta. + * + * @since 3.2.0 + * + * @param array $query + * @return array $query + */ + function do_hide_posts( $query ) { + $hidden_posts = $this->get_hidden_posts(); + if ( ! empty( $hidden_posts ) ) { + // Add hidden posts to post__not_in while maintaining any existing exclusions. + $post__not_in = ( ! isset( $query->query_vars['post__not_in'] ) ) ? $hidden_posts : array_merge( $query->query_vars['post__not_in'], $hidden_posts ); + /** + * Filter post__not_in. + * + * @since 3.3.4 + * + * @param array $post__not_in + */ + $post__not_in = apply_filters( 'wpmem_post__not_in', $post__not_in ); + $query->set( 'post__not_in', $post__not_in ); + } + return $query; + } + + /** + * Filter to hide pages for get_pages(). + * + * @since 3.2.0 + * + * @global object $wpdb + * @param array $pages + * @return array $pages + */ + function filter_get_pages( $pages ) { + $hidden_posts = $this->get_hidden_posts(); + if ( ! empty ( $hidden_posts ) ) { + $new_pages = array(); + foreach ( $pages as $key => $page ) { + if ( ! in_array( $page->ID, $hidden_posts ) ) { + $new_pages[ $key ] = $page; + } + } + $pages = $new_pages; + } + return $pages; + } + + /** + * Filter to hide menu items. + * + * @since 3.2.0 + * + * @param array $items + * @param $menu + * @param array $args + * @return array $items + */ + function filter_nav_menu_items( $items, $menu, $args ) { + $hidden_posts = $this->get_hidden_posts(); + if ( ! empty( $hidden_posts ) ) { + foreach ( $items as $key => $item ) { + if ( in_array( $item->object_id, $hidden_posts ) ) { + unset( $items[ $key ] ); + } + } + } + return $items; + } + + /** + * Filter to remove hidden posts from prev/next links. + * + * @since 3.2.4 + * + * @global object $wpmem + * @param string $where + * @return string $where + */ + function filter_get_adjacent_post_where( $where ) { + global $wpmem; + if ( ! is_user_logged_in() ) { + $hidden_posts = $this->get_hidden_posts(); + if ( ! empty( $hidden_posts ) ) { + $hidden = implode( ",", $hidden_posts ); + $where = $where . " AND p.ID NOT IN ( $hidden )"; + } + } + return $where; + } + + /** + * Set page locations. + * + * Handles numeric page IDs while maintaining + * compatibility with old full url settings. + * + * @since 3.0.8 + */ + function load_user_pages() { + foreach ( $this->user_pages as $key => $val ) { + if ( is_numeric( $val ) ) { + if ( false !== get_post_status( $val ) ) { + $this->user_pages[ $key ] = get_page_link( $val ); + } else { + $notice = sprintf( __( 'You have a linked page in the WP-Members page settings that corresponds to a post ID that no longer exists. Please %s review and update the %s page settings %s.', 'wp-members' ), '', $key, '' ); + $this->admin_notices[] = array( + 'type'=>'error', + 'notice'=>$notice + ); + } + } + } + } + + /** + * Sets the stylesheet URL. + * + * @since 3.3.0 + */ + function set_style() { + $this->cssurl = ( 'use_custom' == $this->select_style ) ? $this->cssurl : $this->url . 'assets/css/forms/' . $this->select_style . wpmem_get_suffix() . '.css'; // Set the stylesheet. + } + + /** + * Returns a requested text string. + * + * This function manages all of the front-end facing text. + * All defaults can be filtered using wpmem_default_text_strings. + * + * @since 3.1.0 + * + * @global object $wpmem + * + * @param string $str + * @return string $text + */ + function get_text( $str ) { + global $wpmem; + return $wpmem->dialogs->get_text( $str ); + } // End of get_text(). + + /** + * Initializes the WP-Members widget. + * + * @since 3.2.0 Replaces widget_wpmemwidget_init + */ + public function widget_init() { + // Register the WP-Members widget. + register_widget( 'widget_wpmemwidget' ); + } + + /** + * Adds WP-Members query vars to WP's public query vars. + * + * @since 3.2.0 + * + * @see https://codex.wordpress.org/Plugin_API/Filter_Reference/query_vars + * + * @param array $qvars + */ + public function add_query_vars ( $qvars ) { + $qvars[] = 'a'; // The WP-Members action variable. + return $qvars; + } + + /** + * Enqueues login/out script for the footer. + * + * @since 3.2.0 + */ + public function loginout_script() { + if ( is_user_logged_in() ) { + wp_enqueue_script( 'jquery' ); + add_action( 'wp_footer', array( $this, 'do_loginout_script' ), 50 ); + } + } + + /** + * Outputs login/out script for the footer. + * + * @since 3.2.0 + * + * @global object $wpmem + */ + public function do_loginout_script() { + global $wpmem; + /** This filter is defined in /includes/api/api.php */ + $logout = apply_filters( 'wpmem_logout_link', add_query_arg( 'a', 'logout' ) ); + ?>add_section( 'wp_members' , array( + 'title' => 'WP-Members', + 'priority' => 190, + ) ); + + // Add settings for output description + $wp_customize->add_setting( 'wpmem_show_logged_out_state', array( + 'default' => '1', + 'type' => 'theme_mod', //'option' + 'capability' => 'edit_theme_options', + 'transport' => 'refresh', + ) ); + + // Add settings for output description + $wp_customize->add_setting( 'wpmem_show_form_message_dialog', array( + 'default' => '1', + 'type' => 'theme_mod', //'option' + 'capability' => 'edit_theme_options', + 'transport' => 'refresh', + ) ); + + // Add control and output for select field + $wp_customize->add_control( 'wpmem_show_form_logged_out', array( + 'label' => __( 'Show forms as logged out', 'wp-members' ), + 'section' => 'wp_members', + 'settings' => 'wpmem_show_logged_out_state', + 'type' => 'checkbox', + 'std' => '1' + ) ); + + // Add control for showing dialog + $wp_customize->add_control( 'wpmem_show_form_dialog', array( + 'label' => __( 'Show form message dialog', 'wp-members' ), + 'section' => 'wp_members', + 'settings' => 'wpmem_show_form_message_dialog', + 'type' => 'checkbox', + 'std' => '0' + ) ); + } + + /** + * Loads the stylesheet for tableless forms. + * + * @since 2.6 + * @since 3.2.3 Moved to WP_Members class. + * + * @global object $wpmem The WP_Members object. + */ + function enqueue_style() { + global $wpmem; + wp_enqueue_style ( 'wp-members', wpmem_force_ssl( $wpmem->cssurl ), false, $wpmem->version ); + } + + /** + * Loads the wp-login.php stylesheet. + * + * @since 3.3.0 + * + * @global stdClass $wpmem + */ + function enqueue_style_wp_login() { + global $wpmem; + wp_enqueue_style( 'wp-members', $wpmem->url . 'assets/css/wp-login' . wpmem_get_suffix() . '.css', false, $wpmem->version ); + } + + /** + * Creates an excerpt on the fly if there is no 'more' tag. + * + * @since 2.6 + * @since 3.2.3 Moved to WP_Members class. + * @since 3.2.5 Check if post object exists. + * + * @global object $post The post object. + * @global object $wpmem The WP_Members object. + * + * @param string $content + * @return string $content + */ + function do_excerpt( $content ) { + + global $post, $more, $wpmem; + + if ( is_object( $post ) ) { + + $post_id = $post->ID; + $post_type = $post->post_type; + + $autoex = ( isset( $wpmem->autoex[ $post->post_type ] ) && 1 == $wpmem->autoex[ $post->post_type ]['enabled'] ) ? $wpmem->autoex[ $post->post_type ] : false; + + // Is there already a 'more' link in the content? + $has_more_link = ( stristr( $content, 'class="more-link"' ) ) ? true : false; + + // If auto_ex is on. + if ( $autoex ) { + + // Build an excerpt if one does not exist. + if ( ! $has_more_link ) { + + $is_singular = ( is_singular( $post->post_type ) ) ? true : false; + + if ( $is_singular ) { + // If it's a single post, we don't need the 'more' link. + $more_link_text = ''; + $more_link = ''; + } else { + // The default $more_link_text. + if ( isset( $wpmem->autoex[ $post->post_type ]['text'] ) && '' != $wpmem->autoex[ $post->post_type ]['text'] ) { + $more_link_text = __( $wpmem->autoex[ $post->post_type ]['text'], 'wp-members' ); + } else { + $more_link_text = __( '(more…)' ); + } + // The default $more_link. + $more_link = ' ' . $more_link_text . ''; + } + + // Apply the_content_more_link filter if one exists (will match up all 'more' link text). + /** This filter is documented in /wp-includes/post-template.php */ + $more_link = apply_filters( 'the_content_more_link', $more_link, $more_link_text ); + + $defaults = array( + 'length' => $autoex['length'], + 'more_link' => $more_link, + 'blocked_only' => false, + ); + /** + * Filter auto excerpt defaults. + * + * @since 3.0.9 + * @since 3.1.5 Deprecated add_ellipsis, strip_tags, close_tags, parse_shortcodes, strip_shortcodes. + * + * @param array { + * An array of settings to override the function defaults. + * + * @type int $length The default length of the excerpt. + * @type string $more_link The more link HTML. + * @type boolean $blocked_only Run autoexcerpt only on blocked content. default: false. + * } + * @param string $post->ID The post ID. + * @param string $post->post_type The content's post type. + */ + $args = apply_filters( 'wpmem_auto_excerpt_args', $defaults, $post->ID, $post->post_type ); + + // Merge settings. + $args = wp_parse_args( $args, $defaults ); + + // Are we only excerpting blocked content? + if ( $args['blocked_only'] ) { + $post_meta = get_post_meta( $post->ID, '_wpmem_block', true ); + if ( 1 == $wpmem->block[ $post->post_type ] ) { + // Post type is blocked, if post meta unblocks it, don't do excerpt. + $do_excerpt = ( "0" == $post_meta ) ? false : true; + } else { + // Post type is unblocked, if post meta blocks it, do excerpt. + $do_excerpt = ( "1" == $post_meta ) ? true : false; + } + } else { + $do_excerpt = true; + } + + if ( true === $do_excerpt ) { + $content = ( $args['length'] > 0 ) ? wp_trim_words( $content, $args['length'], $args['more_link'] ) : ''; + // Check if the more link was added (note: singular has no more_link): + if ( ! $is_singular && ! strpos( $content, $args['more_link'] ) ) { + $content = $content . $args['more_link']; + } + } + } + } + } else { + $post_id = false; + $post_type = false; + } + + /** + * Filter the auto excerpt. + * + * @since 2.8.1 + * @since 3.0.9 Added post ID and post type parameters. + * @since 3.2.5 Post ID and post type may be false if there is no post object. + * + * @param string $content The content excerpt. + * @param string $post_id The post ID. + * @param string $post_type The content's post type. + */ + $content = apply_filters( 'wpmem_auto_excerpt', $content, $post_id, $post_type ); + + // Return the excerpt. + return $content; + } + + /** + * Convert form tag. + * + * @todo This is temporary to handle form tag conversion. + * + * @since 3.1.7 + * @since 3.2.3 Moved to WP_Members class. + * @since 3.3.0 Removed unnecessary tags. + * + * @param string $tag + * @return string $tag + */ + function convert_tag( $tag ) { + switch ( $tag ) { + case 'new': + return 'register'; + break; + case 'edit': + case 'update': + return 'profile'; + break; + default: + return $tag; + break; + } + return $tag; + } + + /** + * Loads translation files. + * + * @since 3.0.0 + * @since 3.2.5 Moved to main object, dropped wpmem_ stem. + */ + function load_textdomain() { + + // Plugin textdomain. + $domain = 'wp-members'; + + // Wordpress locale. + /** This filter is documented in wp-includes/l10n.php */ + $locale = apply_filters( 'plugin_locale', get_locale(), $domain ); + + /** + * Filter translation file. + * + * If the translate.wordpress.org language pack is available, it will + * be /wp-content/languages/plugins/wp-members-{locale}.mo by default. + * You can filter this if you want to load a language pack from a + * different location (or different file name). + * + * @since 3.0.0 + * @since 3.2.0 Added locale as a parameter. + * + * @param string $file The translation file to load. + * @param string $locale The current locale. + */ + $file = apply_filters( 'wpmem_localization_file', trailingslashit( WP_LANG_DIR ) . 'plugins/' . $domain . '-' . $locale . '.mo', $locale ); + + $loaded = load_textdomain( $domain, $file ); + if ( true == $loaded ) { + return $loaded; + } else { + /** + * Filter translation directory. + * + * @since 3.0.3 + * @since 3.2.0 Added locale as a parameter. + * + * @param string $dir The translation directory. + * @param string $locale The current locale. + */ + $dir = apply_filters( 'wpmem_localization_dir', basename( $this->path ) . '/i18n/languages/', $locale ); + load_plugin_textdomain( $domain, FALSE, $dir ); + } + return; + } + + /** + * Load default tos template. + * + * @since 3.2.8 + */ + function load_default_tos() { + // Check for custom template or load default. + $custom_template = get_stylesheet_directory() . '/wp-members/templates/tos.php'; + if ( file_exists( $custom_template ) ) { + require_once $custom_template; + } else { + require_once $this->path . 'templates/tos.php'; + } + } + + /** + * Builds defaults for login/out links/buttons. + * + * @since 3.3.5 + * + * @param array $args + * @return string $html + */ + function loginout_args( $args = array() ) { + $defaults = array( + 'format' => ( isset( $args['format'] ) ) ? $args['format'] : 'link', + 'login_redirect_to' => ( isset( $args['login_redirect_to'] ) ) ? $args['login_redirect_to'] : wpmem_current_url(), + 'logout_redirect_to' => ( isset( $args['logout_redirect_to'] ) ) ? $args['logout_redirect_to'] : wpmem_current_url(), // @todo - This is not currently active. + 'login_text' => ( isset( $args['login_text'] ) ) ? $args['login_text'] : __( 'log in', 'wp-members' ), + 'logout_text' => ( isset( $args['logout_text'] ) ) ? $args['logout_text'] : __( 'log out', 'wp-members' ), + 'class' => ( isset( $args['class'] ) ) ? $args['class'] : 'wpmem_loginout_link', + 'id' => ( isset( $args['id'] ) ) ? $args['id'] : 'wpmem_loginout_link', + ); + $args = wp_parse_args( $args, $defaults ); + $redirect = ( is_user_logged_in() ) ? $args['logout_redirect_to'] : $args['login_redirect_to']; + $text = ( is_user_logged_in() ) ? $args['logout_text'] : $args['login_text']; + if ( is_user_logged_in() ) { + /** This filter is defined in /includes/api/api.php */ + $link = apply_filters( 'wpmem_logout_link', add_query_arg( 'a', 'logout' ) ); + } else { + $link = wpmem_login_url( $redirect ); + } + + if ( 'button' == $args['format'] ) { + $html = '
    '; + $html.= ( is_user_logged_in() ) ? '' : ''; + $html.= '
    '; + } else { + $html = sprintf( '%s', $link, $args['id'], $args['class'], $text ); + } + return $html; + } + + /** + * Filters the password URL to point to the WP-Members process. + * + * @since 3.3.5 + */ + function lost_pwd_url( $lostpwd_url, $redirect ) { + return wpmem_profile_url( 'pwdreset' ); + } + + /** + * Google recaptcha v3 (invisible) gives more accurate user scores + * if it is loaded on all pages. + * + * @since 3.4.0 + */ + function invisible_captcha() { + if ( 4 == $this->captcha && true !== wpmem_is_reg_form_showing() ) { + echo WP_Members_Captcha::show(); + } + } + + /** + * Check for errors. + * + * @since 3.4.6 + */ + public function has_errors() { + return ( isset( $this->error ) && $this->error->has_errors() ) ? true : false; + } +} // End of WP_Members class. \ No newline at end of file diff --git a/includes/cli/class-wp-members-cli-settings.php b/includes/cli/class-wp-members-cli-settings.php new file mode 100644 index 00000000..f9a481bf --- /dev/null +++ b/includes/cli/class-wp-members-cli-settings.php @@ -0,0 +1,310 @@ +admin ) ) { + $wpmem->load_admin(); + } + } + + /** + * List the WP-Members content settings. + * + * @since 3.3.5 + */ + public function content() { + $this->list_settings( array( 'content' ), array() ); + } + + /** + * List the WP-Members option settings. + * + * @since 3.3.5 + */ + public function options() { + $this->list_settings( array( 'options' ), array() ); + } + + /** + * Lists WP-Members settings. + * + * @since 3.3.5 + * + * @param array $args + * @param array $assoc_args + */ + private function list_settings( $args, $assoc_args ) { + + global $wpmem; + + if ( 'content' == $args[0] ) { + $settings = $wpmem->admin->settings( 'content' ); + } else { + $settings = $wpmem->admin->settings( 'options' ); + } + if ( 'content' == $args[0] ) { + + // @todo Add custom post types, and look for admin where all possible post types are assembled. + $post_types = array_merge( array( 'post', 'page' ), $wpmem->post_types ); + + foreach( $post_types as $post_type ) { + foreach ( $settings as $setting => $description ) { + if ( 'autoex' != $setting ) { + $list[] = array( + 'Setting' => $setting . ' ' . $post_type, + 'Description' => $description . ' ' . $post_type, + 'Value' => $wpmem->{$setting}[ $post_type ], + 'Option' => ( 0 == $wpmem->{$setting}[ $post_type ] ) ? 'Disabled' : 'Enabled', + ); + } else { + $list[] = array( + 'Setting' => $setting . ' ' . $post_type, + 'Description' => $description . ' ' . $post_type, + 'Value' => $wpmem->{$setting}[ $post_type ]['enabled'], + 'Option' => ( 0 == $wpmem->{$setting}[ $post_type ]['enabled'] ) ? 'Disabled' : 'Enabled', + ); + $list[] = array( + 'Setting' => '', + 'Description' => $post_type . ' excerpt word length:', + 'Value' => $wpmem->{$setting}[ $post_type ]['length'], + 'Option' => '', + ); + + } + } + + $list[] = array( 'Setting' => '', 'Description' => '', 'Value' => '', 'Option' => '' ); + } + + } else { + foreach ( $settings as $setting => $description ) { + if ( 'captcha' == $setting ) { + $option = WP_Members_Captcha::type( $wpmem->{$setting} ); + } else { + $option = ( 0 == $wpmem->{$setting} ) ? 'Disabled' : 'Enabled'; + } + $list[] = array( + 'Setting' => $setting, + 'Description' => $description, + 'Value' => $wpmem->{$setting}, + 'Option' => $option, + ); + + } + } + + $formatter = new \WP_CLI\Formatter( $assoc_args, array( 'Description', 'Setting', 'Value', 'Option' ) ); + $formatter->display_items( $list ); + } + + /** + * List custom post types for WP-Members management. + * + * @since 3.3.5 + */ + public function post_types() { + global $wpmem; + $post_types = $wpmem->admin->post_types(); + foreach ( $post_types as $post_type ) { + $enabled = ( array_key_exists( $post_type, $wpmem->post_types ) ) ? "Enabled" : "Disabled"; + $list[] = array( + 'Post Type' => $post_type, + 'Value' => $enabled, + ); + } + WP_CLI::line( 'Custom post type settings for WP-Members:' ); + $formatter = new \WP_CLI\Formatter( $assoc_args, array( 'Post Type', 'Value' ) ); + $formatter->display_items( $list ); + } + + /** + * Manage post type. + * + * ## OPTIONS + * + * [--enable=] + * : enable the specified post type. + * + * [--disable=] + * : disable the specified post type. + * + * @since 3.3.5 + */ + public function post_type( $args, $assoc_args ) { + global $wpmem; + if ( isset( $assoc_args['enable'] ) || isset( $assoc_args['disable'] ) ) { + $post_types = $wpmem->admin->post_types(); + if ( ( isset( $assoc_args['enable'] ) && ! array_key_exists( $assoc_args['enable'], $post_types ) ) || ( isset( $assoc_args['disable'] ) && ! array_key_exists( $assoc_args['disable'], $post_types ) ) ) { + WP_CLI::error( 'Not an available post type. Try wp mem settings post_types' ); + } + // Handle disable. + if ( isset( $assoc_args['disable'] ) ) { + unset( $wpmem->post_types[ $assoc_args['disable'] ] ); + wpmem_update_option( 'wpmembers_settings', 'post_types', $wpmem->post_types ); + WP_CLI::success( 'Disabled ' . $assoc_args['disable'] . ' post type.' ); + } + if ( isset( $assoc_args['enable'] ) ) { + $cpt_obj = get_post_type_object( $assoc_args['enable'] ); + $new_post_types = array_merge($wpmem->post_types, array( $cpt_obj->name => $cpt_obj->labels->name ) ); + wpmem_update_option( 'wpmembers_settings', 'post_types', $new_post_types ); + WP_CLI::success( 'Enabled ' . $assoc_args['enable'] . ' post type.' ); + } + } else { + WP_CLI::error( 'Must specify an option: --enable= or --disable=' ); + } + } + + /** + * Enable a WP-Members setting. + * + * ## OPTIONS + * + *
    ');return e.attr("dir",this.options.get("dir")),this.$container=e,this.$container[0].classList.add("select2-container--"+this.options.get("theme")),o.StoreData(e[0],"element",this.$element),e},r}),u.define("select2/dropdown/attachContainer",[],function(){function e(e,t,n){e.call(this,t,n)}return e.prototype.position=function(e,t,n){n.find(".dropdown-wrapper").append(t),t[0].classList.add("select2-dropdown--below"),n[0].classList.add("select2-container--below")},e}),u.define("select2/dropdown/stopPropagation",[],function(){function e(){}return e.prototype.bind=function(e,t,n){e.call(this,t,n);this.$dropdown.on(["blur","change","click","dblclick","focus","focusin","focusout","input","keydown","keyup","keypress","mousedown","mouseenter","mouseleave","mousemove","mouseover","mouseup","search","touchend","touchstart"].join(" "),function(e){e.stopPropagation()})},e}),u.define("select2/selection/stopPropagation",[],function(){function e(){}return e.prototype.bind=function(e,t,n){e.call(this,t,n);this.$selection.on(["blur","change","click","dblclick","focus","focusin","focusout","input","keydown","keyup","keypress","mousedown","mouseenter","mouseleave","mousemove","mouseover","mouseup","search","touchend","touchstart"].join(" "),function(e){e.stopPropagation()})},e}),a=function(u){var d,p,e=["wheel","mousewheel","DOMMouseScroll","MozMousePixelScroll"],t="onwheel"in document||9<=document.documentMode?["wheel"]:["mousewheel","DomMouseScroll","MozMousePixelScroll"],h=Array.prototype.slice;if(u.event.fixHooks)for(var n=e.length;n;)u.event.fixHooks[e[--n]]=u.event.mouseHooks;var f=u.event.special.mousewheel={version:"3.1.12",setup:function(){if(this.addEventListener)for(var e=t.length;e;)this.addEventListener(t[--e],s,!1);else this.onmousewheel=s;u.data(this,"mousewheel-line-height",f.getLineHeight(this)),u.data(this,"mousewheel-page-height",f.getPageHeight(this))},teardown:function(){if(this.removeEventListener)for(var e=t.length;e;)this.removeEventListener(t[--e],s,!1);else this.onmousewheel=null;u.removeData(this,"mousewheel-line-height"),u.removeData(this,"mousewheel-page-height")},getLineHeight:function(e){var t=u(e),e=t["offsetParent"in u.fn?"offsetParent":"parent"]();return e.length||(e=u("body")),parseInt(e.css("fontSize"),10)||parseInt(t.css("fontSize"),10)||16},getPageHeight:function(e){return u(e).height()},settings:{adjustOldDeltas:!0,normalizeOffset:!0}};function s(e){var t,n=e||window.event,s=h.call(arguments,1),i=0,o=0,r=0,a=0,l=0,c=0;if(e=u.event.fix(n),e.type="mousewheel","detail"in n&&(r=-1*n.detail),"wheelDelta"in n&&(r=n.wheelDelta),"wheelDeltaY"in n&&(r=n.wheelDeltaY),"wheelDeltaX"in n&&(o=-1*n.wheelDeltaX),"axis"in n&&n.axis===n.HORIZONTAL_AXIS&&(o=-1*r,r=0),i=0===r?o:r,"deltaY"in n&&(i=r=-1*n.deltaY),"deltaX"in n&&(o=n.deltaX,0===r&&(i=-1*o)),0!==r||0!==o)return 1===n.deltaMode?(i*=t=u.data(this,"mousewheel-line-height"),r*=t,o*=t):2===n.deltaMode&&(i*=t=u.data(this,"mousewheel-page-height"),r*=t,o*=t),a=Math.max(Math.abs(r),Math.abs(o)),(!p||a 0) { + name.splice(i - 1, 2); + i -= 2; + } + } + } + //end trimDots + + name = name.join('/'); + } + + //Apply map config if available. + if ((baseParts || starMap) && map) { + nameParts = name.split('/'); + + for (i = nameParts.length; i > 0; i -= 1) { + nameSegment = nameParts.slice(0, i).join("/"); + + if (baseParts) { + //Find the longest baseName segment match in the config. + //So, do joins on the biggest to smallest lengths of baseParts. + for (j = baseParts.length; j > 0; j -= 1) { + mapValue = map[baseParts.slice(0, j).join('/')]; + + //baseName segment has config, find if it has one for + //this name. + if (mapValue) { + mapValue = mapValue[nameSegment]; + if (mapValue) { + //Match, update name to the new value. + foundMap = mapValue; + foundI = i; + break; + } + } + } + } + + if (foundMap) { + break; + } + + //Check for a star map match, but just hold on to it, + //if there is a shorter segment match later in a matching + //config, then favor over this star map. + if (!foundStarMap && starMap && starMap[nameSegment]) { + foundStarMap = starMap[nameSegment]; + starI = i; + } + } + + if (!foundMap && foundStarMap) { + foundMap = foundStarMap; + foundI = starI; + } + + if (foundMap) { + nameParts.splice(0, foundI, foundMap); + name = nameParts.join('/'); + } + } + + return name; + } + + function makeRequire(relName, forceSync) { + return function () { + //A version of a require function that passes a moduleName + //value for items that may need to + //look up paths relative to the moduleName + var args = aps.call(arguments, 0); + + //If first arg is not require('string'), and there is only + //one arg, it is the array form without a callback. Insert + //a null so that the following concat is correct. + if (typeof args[0] !== 'string' && args.length === 1) { + args.push(null); + } + return req.apply(undef, args.concat([relName, forceSync])); + }; + } + + function makeNormalize(relName) { + return function (name) { + return normalize(name, relName); + }; + } + + function makeLoad(depName) { + return function (value) { + defined[depName] = value; + }; + } + + function callDep(name) { + if (hasProp(waiting, name)) { + var args = waiting[name]; + delete waiting[name]; + defining[name] = true; + main.apply(undef, args); + } + + if (!hasProp(defined, name) && !hasProp(defining, name)) { + throw new Error('No ' + name); + } + return defined[name]; + } + + //Turns a plugin!resource to [plugin, resource] + //with the plugin being undefined if the name + //did not have a plugin prefix. + function splitPrefix(name) { + var prefix, + index = name ? name.indexOf('!') : -1; + if (index > -1) { + prefix = name.substring(0, index); + name = name.substring(index + 1, name.length); + } + return [prefix, name]; + } + + //Creates a parts array for a relName where first part is plugin ID, + //second part is resource ID. Assumes relName has already been normalized. + function makeRelParts(relName) { + return relName ? splitPrefix(relName) : []; + } + + /** + * Makes a name map, normalizing the name, and using a plugin + * for normalization if necessary. Grabs a ref to plugin + * too, as an optimization. + */ + makeMap = function (name, relParts) { + var plugin, + parts = splitPrefix(name), + prefix = parts[0], + relResourceName = relParts[1]; + + name = parts[1]; + + if (prefix) { + prefix = normalize(prefix, relResourceName); + plugin = callDep(prefix); + } + + //Normalize according + if (prefix) { + if (plugin && plugin.normalize) { + name = plugin.normalize(name, makeNormalize(relResourceName)); + } else { + name = normalize(name, relResourceName); + } + } else { + name = normalize(name, relResourceName); + parts = splitPrefix(name); + prefix = parts[0]; + name = parts[1]; + if (prefix) { + plugin = callDep(prefix); + } + } + + //Using ridiculous property names for space reasons + return { + f: prefix ? prefix + '!' + name : name, //fullName + n: name, + pr: prefix, + p: plugin + }; + }; + + function makeConfig(name) { + return function () { + return (config && config.config && config.config[name]) || {}; + }; + } + + handlers = { + require: function (name) { + return makeRequire(name); + }, + exports: function (name) { + var e = defined[name]; + if (typeof e !== 'undefined') { + return e; + } else { + return (defined[name] = {}); + } + }, + module: function (name) { + return { + id: name, + uri: '', + exports: defined[name], + config: makeConfig(name) + }; + } + }; + + main = function (name, deps, callback, relName) { + var cjsModule, depName, ret, map, i, relParts, + args = [], + callbackType = typeof callback, + usingExports; + + //Use name if no relName + relName = relName || name; + relParts = makeRelParts(relName); + + //Call the callback to define the module, if necessary. + if (callbackType === 'undefined' || callbackType === 'function') { + //Pull out the defined dependencies and pass the ordered + //values to the callback. + //Default to [require, exports, module] if no deps + deps = !deps.length && callback.length ? ['require', 'exports', 'module'] : deps; + for (i = 0; i < deps.length; i += 1) { + map = makeMap(deps[i], relParts); + depName = map.f; + + //Fast path CommonJS standard dependencies. + if (depName === "require") { + args[i] = handlers.require(name); + } else if (depName === "exports") { + //CommonJS module spec 1.1 + args[i] = handlers.exports(name); + usingExports = true; + } else if (depName === "module") { + //CommonJS module spec 1.1 + cjsModule = args[i] = handlers.module(name); + } else if (hasProp(defined, depName) || + hasProp(waiting, depName) || + hasProp(defining, depName)) { + args[i] = callDep(depName); + } else if (map.p) { + map.p.load(map.n, makeRequire(relName, true), makeLoad(depName), {}); + args[i] = defined[depName]; + } else { + throw new Error(name + ' missing ' + depName); + } + } + + ret = callback ? callback.apply(defined[name], args) : undefined; + + if (name) { + //If setting exports via "module" is in play, + //favor that over return value and exports. After that, + //favor a non-undefined return value over exports use. + if (cjsModule && cjsModule.exports !== undef && + cjsModule.exports !== defined[name]) { + defined[name] = cjsModule.exports; + } else if (ret !== undef || !usingExports) { + //Use the return value from the function. + defined[name] = ret; + } + } + } else if (name) { + //May just be an object definition for the module. Only + //worry about defining if have a module name. + defined[name] = callback; + } + }; + + requirejs = require = req = function (deps, callback, relName, forceSync, alt) { + if (typeof deps === "string") { + if (handlers[deps]) { + //callback in this case is really relName + return handlers[deps](callback); + } + //Just return the module wanted. In this scenario, the + //deps arg is the module name, and second arg (if passed) + //is just the relName. + //Normalize module name, if it contains . or .. + return callDep(makeMap(deps, makeRelParts(callback)).f); + } else if (!deps.splice) { + //deps is a config object, not an array. + config = deps; + if (config.deps) { + req(config.deps, config.callback); + } + if (!callback) { + return; + } + + if (callback.splice) { + //callback is an array, which means it is a dependency list. + //Adjust args if there are dependencies + deps = callback; + callback = relName; + relName = null; + } else { + deps = undef; + } + } + + //Support require(['a']) + callback = callback || function () {}; + + //If relName is a function, it is an errback handler, + //so remove it. + if (typeof relName === 'function') { + relName = forceSync; + forceSync = alt; + } + + //Simulate async callback; + if (forceSync) { + main(undef, deps, callback, relName); + } else { + //Using a non-zero value because of concern for what old browsers + //do, and latest browsers "upgrade" to 4 if lower value is used: + //http://www.whatwg.org/specs/web-apps/current-work/multipage/timers.html#dom-windowtimers-settimeout: + //If want a value immediately, use require('id') instead -- something + //that works in almond on the global level, but not guaranteed and + //unlikely to work in other AMD implementations. + setTimeout(function () { + main(undef, deps, callback, relName); + }, 4); + } + + return req; + }; + + /** + * Just drops the config on the floor, but returns req in case + * the config return value is used. + */ + req.config = function (cfg) { + return req(cfg); + }; + + /** + * Expose module registry for debugging and tooling + */ + requirejs._defined = defined; + + define = function (name, deps, callback) { + if (typeof name !== 'string') { + throw new Error('See almond README: incorrect module build, no module name'); + } + + //This module may not have dependencies + if (!deps.splice) { + //deps is not an array, so probably means + //an object literal or factory function for + //the value. Adjust args. + callback = deps; + deps = []; + } + + if (!hasProp(defined, name) && !hasProp(waiting, name)) { + waiting[name] = [name, deps, callback]; + } + }; + + define.amd = { + jQuery: true + }; +}()); + +S2.requirejs = requirejs;S2.require = require;S2.define = define; +} +}()); +S2.define("almond", function(){}); + +/* global jQuery:false, $:false */ +S2.define('jquery',[],function () { + var _$ = jQuery || $; + + if (_$ == null && console && console.error) { + console.error( + 'Select2: An instance of jQuery or a jQuery-compatible library was not ' + + 'found. Make sure that you are including jQuery before Select2 on your ' + + 'web page.' + ); + } + + return _$; +}); + +S2.define('select2/utils',[ + 'jquery' +], function ($) { + var Utils = {}; + + Utils.Extend = function (ChildClass, SuperClass) { + var __hasProp = {}.hasOwnProperty; + + function BaseConstructor () { + this.constructor = ChildClass; + } + + for (var key in SuperClass) { + if (__hasProp.call(SuperClass, key)) { + ChildClass[key] = SuperClass[key]; + } + } + + BaseConstructor.prototype = SuperClass.prototype; + ChildClass.prototype = new BaseConstructor(); + ChildClass.__super__ = SuperClass.prototype; + + return ChildClass; + }; + + function getMethods (theClass) { + var proto = theClass.prototype; + + var methods = []; + + for (var methodName in proto) { + var m = proto[methodName]; + + if (typeof m !== 'function') { + continue; + } + + if (methodName === 'constructor') { + continue; + } + + methods.push(methodName); + } + + return methods; + } + + Utils.Decorate = function (SuperClass, DecoratorClass) { + var decoratedMethods = getMethods(DecoratorClass); + var superMethods = getMethods(SuperClass); + + function DecoratedClass () { + var unshift = Array.prototype.unshift; + + var argCount = DecoratorClass.prototype.constructor.length; + + var calledConstructor = SuperClass.prototype.constructor; + + if (argCount > 0) { + unshift.call(arguments, SuperClass.prototype.constructor); + + calledConstructor = DecoratorClass.prototype.constructor; + } + + calledConstructor.apply(this, arguments); + } + + DecoratorClass.displayName = SuperClass.displayName; + + function ctr () { + this.constructor = DecoratedClass; + } + + DecoratedClass.prototype = new ctr(); + + for (var m = 0; m < superMethods.length; m++) { + var superMethod = superMethods[m]; + + DecoratedClass.prototype[superMethod] = + SuperClass.prototype[superMethod]; + } + + var calledMethod = function (methodName) { + // Stub out the original method if it's not decorating an actual method + var originalMethod = function () {}; + + if (methodName in DecoratedClass.prototype) { + originalMethod = DecoratedClass.prototype[methodName]; + } + + var decoratedMethod = DecoratorClass.prototype[methodName]; + + return function () { + var unshift = Array.prototype.unshift; + + unshift.call(arguments, originalMethod); + + return decoratedMethod.apply(this, arguments); + }; + }; + + for (var d = 0; d < decoratedMethods.length; d++) { + var decoratedMethod = decoratedMethods[d]; + + DecoratedClass.prototype[decoratedMethod] = calledMethod(decoratedMethod); + } + + return DecoratedClass; + }; + + var Observable = function () { + this.listeners = {}; + }; + + Observable.prototype.on = function (event, callback) { + this.listeners = this.listeners || {}; + + if (event in this.listeners) { + this.listeners[event].push(callback); + } else { + this.listeners[event] = [callback]; + } + }; + + Observable.prototype.trigger = function (event) { + var slice = Array.prototype.slice; + var params = slice.call(arguments, 1); + + this.listeners = this.listeners || {}; + + // Params should always come in as an array + if (params == null) { + params = []; + } + + // If there are no arguments to the event, use a temporary object + if (params.length === 0) { + params.push({}); + } + + // Set the `_type` of the first object to the event + params[0]._type = event; + + if (event in this.listeners) { + this.invoke(this.listeners[event], slice.call(arguments, 1)); + } + + if ('*' in this.listeners) { + this.invoke(this.listeners['*'], arguments); + } + }; + + Observable.prototype.invoke = function (listeners, params) { + for (var i = 0, len = listeners.length; i < len; i++) { + listeners[i].apply(this, params); + } + }; + + Utils.Observable = Observable; + + Utils.generateChars = function (length) { + var chars = ''; + + for (var i = 0; i < length; i++) { + var randomChar = Math.floor(Math.random() * 36); + chars += randomChar.toString(36); + } + + return chars; + }; + + Utils.bind = function (func, context) { + return function () { + func.apply(context, arguments); + }; + }; + + Utils._convertData = function (data) { + for (var originalKey in data) { + var keys = originalKey.split('-'); + + var dataLevel = data; + + if (keys.length === 1) { + continue; + } + + for (var k = 0; k < keys.length; k++) { + var key = keys[k]; + + // Lowercase the first letter + // By default, dash-separated becomes camelCase + key = key.substring(0, 1).toLowerCase() + key.substring(1); + + if (!(key in dataLevel)) { + dataLevel[key] = {}; + } + + if (k == keys.length - 1) { + dataLevel[key] = data[originalKey]; + } + + dataLevel = dataLevel[key]; + } + + delete data[originalKey]; + } + + return data; + }; + + Utils.hasScroll = function (index, el) { + // Adapted from the function created by @ShadowScripter + // and adapted by @BillBarry on the Stack Exchange Code Review website. + // The original code can be found at + // http://codereview.stackexchange.com/q/13338 + // and was designed to be used with the Sizzle selector engine. + + var $el = $(el); + var overflowX = el.style.overflowX; + var overflowY = el.style.overflowY; + + //Check both x and y declarations + if (overflowX === overflowY && + (overflowY === 'hidden' || overflowY === 'visible')) { + return false; + } + + if (overflowX === 'scroll' || overflowY === 'scroll') { + return true; + } + + return ($el.innerHeight() < el.scrollHeight || + $el.innerWidth() < el.scrollWidth); + }; + + Utils.escapeMarkup = function (markup) { + var replaceMap = { + '\\': '\', + '&': '&', + '<': '<', + '>': '>', + '"': '"', + '\'': ''', + '/': '/' + }; + + // Do not try to escape the markup if it's not a string + if (typeof markup !== 'string') { + return markup; + } + + return String(markup).replace(/[&<>"'\/\\]/g, function (match) { + return replaceMap[match]; + }); + }; + + // Cache objects in Utils.__cache instead of $.data (see #4346) + Utils.__cache = {}; + + var id = 0; + Utils.GetUniqueElementId = function (element) { + // Get a unique element Id. If element has no id, + // creates a new unique number, stores it in the id + // attribute and returns the new id with a prefix. + // If an id already exists, it simply returns it with a prefix. + + var select2Id = element.getAttribute('data-select2-id'); + + if (select2Id != null) { + return select2Id; + } + + // If element has id, use it. + if (element.id) { + select2Id = 'select2-data-' + element.id; + } else { + select2Id = 'select2-data-' + (++id).toString() + + '-' + Utils.generateChars(4); + } + + element.setAttribute('data-select2-id', select2Id); + + return select2Id; + }; + + Utils.StoreData = function (element, name, value) { + // Stores an item in the cache for a specified element. + // name is the cache key. + var id = Utils.GetUniqueElementId(element); + if (!Utils.__cache[id]) { + Utils.__cache[id] = {}; + } + + Utils.__cache[id][name] = value; + }; + + Utils.GetData = function (element, name) { + // Retrieves a value from the cache by its key (name) + // name is optional. If no name specified, return + // all cache items for the specified element. + // and for a specified element. + var id = Utils.GetUniqueElementId(element); + if (name) { + if (Utils.__cache[id]) { + if (Utils.__cache[id][name] != null) { + return Utils.__cache[id][name]; + } + return $(element).data(name); // Fallback to HTML5 data attribs. + } + return $(element).data(name); // Fallback to HTML5 data attribs. + } else { + return Utils.__cache[id]; + } + }; + + Utils.RemoveData = function (element) { + // Removes all cached items for a specified element. + var id = Utils.GetUniqueElementId(element); + if (Utils.__cache[id] != null) { + delete Utils.__cache[id]; + } + + element.removeAttribute('data-select2-id'); + }; + + Utils.copyNonInternalCssClasses = function (dest, src) { + var classes; + + var destinationClasses = dest.getAttribute('class').trim().split(/\s+/); + + destinationClasses = destinationClasses.filter(function (clazz) { + // Save all Select2 classes + return clazz.indexOf('select2-') === 0; + }); + + var sourceClasses = src.getAttribute('class').trim().split(/\s+/); + + sourceClasses = sourceClasses.filter(function (clazz) { + // Only copy non-Select2 classes + return clazz.indexOf('select2-') !== 0; + }); + + var replacements = destinationClasses.concat(sourceClasses); + + dest.setAttribute('class', replacements.join(' ')); + }; + + return Utils; +}); + +S2.define('select2/results',[ + 'jquery', + './utils' +], function ($, Utils) { + function Results ($element, options, dataAdapter) { + this.$element = $element; + this.data = dataAdapter; + this.options = options; + + Results.__super__.constructor.call(this); + } + + Utils.Extend(Results, Utils.Observable); + + Results.prototype.render = function () { + var $results = $( + '
      ' + ); + + if (this.options.get('multiple')) { + $results.attr('aria-multiselectable', 'true'); + } + + this.$results = $results; + + return $results; + }; + + Results.prototype.clear = function () { + this.$results.empty(); + }; + + Results.prototype.displayMessage = function (params) { + var escapeMarkup = this.options.get('escapeMarkup'); + + this.clear(); + this.hideLoading(); + + var $message = $( + '' + ); + + var message = this.options.get('translations').get(params.message); + + $message.append( + escapeMarkup( + message(params.args) + ) + ); + + $message[0].className += ' select2-results__message'; + + this.$results.append($message); + }; + + Results.prototype.hideMessages = function () { + this.$results.find('.select2-results__message').remove(); + }; + + Results.prototype.append = function (data) { + this.hideLoading(); + + var $options = []; + + if (data.results == null || data.results.length === 0) { + if (this.$results.children().length === 0) { + this.trigger('results:message', { + message: 'noResults' + }); + } + + return; + } + + data.results = this.sort(data.results); + + for (var d = 0; d < data.results.length; d++) { + var item = data.results[d]; + + var $option = this.option(item); + + $options.push($option); + } + + this.$results.append($options); + }; + + Results.prototype.position = function ($results, $dropdown) { + var $resultsContainer = $dropdown.find('.select2-results'); + $resultsContainer.append($results); + }; + + Results.prototype.sort = function (data) { + var sorter = this.options.get('sorter'); + + return sorter(data); + }; + + Results.prototype.highlightFirstItem = function () { + var $options = this.$results + .find('.select2-results__option--selectable'); + + var $selected = $options.filter('.select2-results__option--selected'); + + // Check if there are any selected options + if ($selected.length > 0) { + // If there are selected options, highlight the first + $selected.first().trigger('mouseenter'); + } else { + // If there are no selected options, highlight the first option + // in the dropdown + $options.first().trigger('mouseenter'); + } + + this.ensureHighlightVisible(); + }; + + Results.prototype.setClasses = function () { + var self = this; + + this.data.current(function (selected) { + var selectedIds = selected.map(function (s) { + return s.id.toString(); + }); + + var $options = self.$results + .find('.select2-results__option--selectable'); + + $options.each(function () { + var $option = $(this); + + var item = Utils.GetData(this, 'data'); + + // id needs to be converted to a string when comparing + var id = '' + item.id; + + if ((item.element != null && item.element.selected) || + (item.element == null && selectedIds.indexOf(id) > -1)) { + this.classList.add('select2-results__option--selected'); + $option.attr('aria-selected', 'true'); + } else { + this.classList.remove('select2-results__option--selected'); + $option.attr('aria-selected', 'false'); + } + }); + + }); + }; + + Results.prototype.showLoading = function (params) { + this.hideLoading(); + + var loadingMore = this.options.get('translations').get('searching'); + + var loading = { + disabled: true, + loading: true, + text: loadingMore(params) + }; + var $loading = this.option(loading); + $loading.className += ' loading-results'; + + this.$results.prepend($loading); + }; + + Results.prototype.hideLoading = function () { + this.$results.find('.loading-results').remove(); + }; + + Results.prototype.option = function (data) { + var option = document.createElement('li'); + option.classList.add('select2-results__option'); + option.classList.add('select2-results__option--selectable'); + + var attrs = { + 'role': 'option' + }; + + var matches = window.Element.prototype.matches || + window.Element.prototype.msMatchesSelector || + window.Element.prototype.webkitMatchesSelector; + + if ((data.element != null && matches.call(data.element, ':disabled')) || + (data.element == null && data.disabled)) { + attrs['aria-disabled'] = 'true'; + + option.classList.remove('select2-results__option--selectable'); + option.classList.add('select2-results__option--disabled'); + } + + if (data.id == null) { + option.classList.remove('select2-results__option--selectable'); + } + + if (data._resultId != null) { + option.id = data._resultId; + } + + if (data.title) { + option.title = data.title; + } + + if (data.children) { + attrs.role = 'group'; + attrs['aria-label'] = data.text; + + option.classList.remove('select2-results__option--selectable'); + option.classList.add('select2-results__option--group'); + } + + for (var attr in attrs) { + var val = attrs[attr]; + + option.setAttribute(attr, val); + } + + if (data.children) { + var $option = $(option); + + var label = document.createElement('strong'); + label.className = 'select2-results__group'; + + this.template(data, label); + + var $children = []; + + for (var c = 0; c < data.children.length; c++) { + var child = data.children[c]; + + var $child = this.option(child); + + $children.push($child); + } + + var $childrenContainer = $('
        ', { + 'class': 'select2-results__options select2-results__options--nested', + 'role': 'none' + }); + + $childrenContainer.append($children); + + $option.append(label); + $option.append($childrenContainer); + } else { + this.template(data, option); + } + + Utils.StoreData(option, 'data', data); + + return option; + }; + + Results.prototype.bind = function (container, $container) { + var self = this; + + var id = container.id + '-results'; + + this.$results.attr('id', id); + + container.on('results:all', function (params) { + self.clear(); + self.append(params.data); + + if (container.isOpen()) { + self.setClasses(); + self.highlightFirstItem(); + } + }); + + container.on('results:append', function (params) { + self.append(params.data); + + if (container.isOpen()) { + self.setClasses(); + } + }); + + container.on('query', function (params) { + self.hideMessages(); + self.showLoading(params); + }); + + container.on('select', function () { + if (!container.isOpen()) { + return; + } + + self.setClasses(); + + if (self.options.get('scrollAfterSelect')) { + self.highlightFirstItem(); + } + }); + + container.on('unselect', function () { + if (!container.isOpen()) { + return; + } + + self.setClasses(); + + if (self.options.get('scrollAfterSelect')) { + self.highlightFirstItem(); + } + }); + + container.on('open', function () { + // When the dropdown is open, aria-expended="true" + self.$results.attr('aria-expanded', 'true'); + self.$results.attr('aria-hidden', 'false'); + + self.setClasses(); + self.ensureHighlightVisible(); + }); + + container.on('close', function () { + // When the dropdown is closed, aria-expended="false" + self.$results.attr('aria-expanded', 'false'); + self.$results.attr('aria-hidden', 'true'); + self.$results.removeAttr('aria-activedescendant'); + }); + + container.on('results:toggle', function () { + var $highlighted = self.getHighlightedResults(); + + if ($highlighted.length === 0) { + return; + } + + $highlighted.trigger('mouseup'); + }); + + container.on('results:select', function () { + var $highlighted = self.getHighlightedResults(); + + if ($highlighted.length === 0) { + return; + } + + var data = Utils.GetData($highlighted[0], 'data'); + + if ($highlighted.hasClass('select2-results__option--selected')) { + self.trigger('close', {}); + } else { + self.trigger('select', { + data: data + }); + } + }); + + container.on('results:previous', function () { + var $highlighted = self.getHighlightedResults(); + + var $options = self.$results.find('.select2-results__option--selectable'); + + var currentIndex = $options.index($highlighted); + + // If we are already at the top, don't move further + // If no options, currentIndex will be -1 + if (currentIndex <= 0) { + return; + } + + var nextIndex = currentIndex - 1; + + // If none are highlighted, highlight the first + if ($highlighted.length === 0) { + nextIndex = 0; + } + + var $next = $options.eq(nextIndex); + + $next.trigger('mouseenter'); + + var currentOffset = self.$results.offset().top; + var nextTop = $next.offset().top; + var nextOffset = self.$results.scrollTop() + (nextTop - currentOffset); + + if (nextIndex === 0) { + self.$results.scrollTop(0); + } else if (nextTop - currentOffset < 0) { + self.$results.scrollTop(nextOffset); + } + }); + + container.on('results:next', function () { + var $highlighted = self.getHighlightedResults(); + + var $options = self.$results.find('.select2-results__option--selectable'); + + var currentIndex = $options.index($highlighted); + + var nextIndex = currentIndex + 1; + + // If we are at the last option, stay there + if (nextIndex >= $options.length) { + return; + } + + var $next = $options.eq(nextIndex); + + $next.trigger('mouseenter'); + + var currentOffset = self.$results.offset().top + + self.$results.outerHeight(false); + var nextBottom = $next.offset().top + $next.outerHeight(false); + var nextOffset = self.$results.scrollTop() + nextBottom - currentOffset; + + if (nextIndex === 0) { + self.$results.scrollTop(0); + } else if (nextBottom > currentOffset) { + self.$results.scrollTop(nextOffset); + } + }); + + container.on('results:focus', function (params) { + params.element[0].classList.add('select2-results__option--highlighted'); + params.element[0].setAttribute('aria-selected', 'true'); + }); + + container.on('results:message', function (params) { + self.displayMessage(params); + }); + + if ($.fn.mousewheel) { + this.$results.on('mousewheel', function (e) { + var top = self.$results.scrollTop(); + + var bottom = self.$results.get(0).scrollHeight - top + e.deltaY; + + var isAtTop = e.deltaY > 0 && top - e.deltaY <= 0; + var isAtBottom = e.deltaY < 0 && bottom <= self.$results.height(); + + if (isAtTop) { + self.$results.scrollTop(0); + + e.preventDefault(); + e.stopPropagation(); + } else if (isAtBottom) { + self.$results.scrollTop( + self.$results.get(0).scrollHeight - self.$results.height() + ); + + e.preventDefault(); + e.stopPropagation(); + } + }); + } + + this.$results.on('mouseup', '.select2-results__option--selectable', + function (evt) { + var $this = $(this); + + var data = Utils.GetData(this, 'data'); + + if ($this.hasClass('select2-results__option--selected')) { + if (self.options.get('multiple')) { + self.trigger('unselect', { + originalEvent: evt, + data: data + }); + } else { + self.trigger('close', {}); + } + + return; + } + + self.trigger('select', { + originalEvent: evt, + data: data + }); + }); + + this.$results.on('mouseenter', '.select2-results__option--selectable', + function (evt) { + var data = Utils.GetData(this, 'data'); + + self.getHighlightedResults() + .removeClass('select2-results__option--highlighted') + .attr('aria-selected', 'false'); + + self.trigger('results:focus', { + data: data, + element: $(this) + }); + }); + }; + + Results.prototype.getHighlightedResults = function () { + var $highlighted = this.$results + .find('.select2-results__option--highlighted'); + + return $highlighted; + }; + + Results.prototype.destroy = function () { + this.$results.remove(); + }; + + Results.prototype.ensureHighlightVisible = function () { + var $highlighted = this.getHighlightedResults(); + + if ($highlighted.length === 0) { + return; + } + + var $options = this.$results.find('.select2-results__option--selectable'); + + var currentIndex = $options.index($highlighted); + + var currentOffset = this.$results.offset().top; + var nextTop = $highlighted.offset().top; + var nextOffset = this.$results.scrollTop() + (nextTop - currentOffset); + + var offsetDelta = nextTop - currentOffset; + nextOffset -= $highlighted.outerHeight(false) * 2; + + if (currentIndex <= 2) { + this.$results.scrollTop(0); + } else if (offsetDelta > this.$results.outerHeight() || offsetDelta < 0) { + this.$results.scrollTop(nextOffset); + } + }; + + Results.prototype.template = function (result, container) { + var template = this.options.get('templateResult'); + var escapeMarkup = this.options.get('escapeMarkup'); + + var content = template(result, container); + + if (content == null) { + container.style.display = 'none'; + } else if (typeof content === 'string') { + container.innerHTML = escapeMarkup(content); + } else { + $(container).append(content); + } + }; + + return Results; +}); + +S2.define('select2/keys',[ + +], function () { + var KEYS = { + BACKSPACE: 8, + TAB: 9, + ENTER: 13, + SHIFT: 16, + CTRL: 17, + ALT: 18, + ESC: 27, + SPACE: 32, + PAGE_UP: 33, + PAGE_DOWN: 34, + END: 35, + HOME: 36, + LEFT: 37, + UP: 38, + RIGHT: 39, + DOWN: 40, + DELETE: 46 + }; + + return KEYS; +}); + +S2.define('select2/selection/base',[ + 'jquery', + '../utils', + '../keys' +], function ($, Utils, KEYS) { + function BaseSelection ($element, options) { + this.$element = $element; + this.options = options; + + BaseSelection.__super__.constructor.call(this); + } + + Utils.Extend(BaseSelection, Utils.Observable); + + BaseSelection.prototype.render = function () { + var $selection = $( + '' + ); + + this._tabindex = 0; + + if (Utils.GetData(this.$element[0], 'old-tabindex') != null) { + this._tabindex = Utils.GetData(this.$element[0], 'old-tabindex'); + } else if (this.$element.attr('tabindex') != null) { + this._tabindex = this.$element.attr('tabindex'); + } + + $selection.attr('title', this.$element.attr('title')); + $selection.attr('tabindex', this._tabindex); + $selection.attr('aria-disabled', 'false'); + + this.$selection = $selection; + + return $selection; + }; + + BaseSelection.prototype.bind = function (container, $container) { + var self = this; + + var resultsId = container.id + '-results'; + + this.container = container; + + this.$selection.on('focus', function (evt) { + self.trigger('focus', evt); + }); + + this.$selection.on('blur', function (evt) { + self._handleBlur(evt); + }); + + this.$selection.on('keydown', function (evt) { + self.trigger('keypress', evt); + + if (evt.which === KEYS.SPACE) { + evt.preventDefault(); + } + }); + + container.on('results:focus', function (params) { + self.$selection.attr('aria-activedescendant', params.data._resultId); + }); + + container.on('selection:update', function (params) { + self.update(params.data); + }); + + container.on('open', function () { + // When the dropdown is open, aria-expanded="true" + self.$selection.attr('aria-expanded', 'true'); + self.$selection.attr('aria-owns', resultsId); + + self._attachCloseHandler(container); + }); + + container.on('close', function () { + // When the dropdown is closed, aria-expanded="false" + self.$selection.attr('aria-expanded', 'false'); + self.$selection.removeAttr('aria-activedescendant'); + self.$selection.removeAttr('aria-owns'); + + self.$selection.trigger('focus'); + + self._detachCloseHandler(container); + }); + + container.on('enable', function () { + self.$selection.attr('tabindex', self._tabindex); + self.$selection.attr('aria-disabled', 'false'); + }); + + container.on('disable', function () { + self.$selection.attr('tabindex', '-1'); + self.$selection.attr('aria-disabled', 'true'); + }); + }; + + BaseSelection.prototype._handleBlur = function (evt) { + var self = this; + + // This needs to be delayed as the active element is the body when the tab + // key is pressed, possibly along with others. + window.setTimeout(function () { + // Don't trigger `blur` if the focus is still in the selection + if ( + (document.activeElement == self.$selection[0]) || + ($.contains(self.$selection[0], document.activeElement)) + ) { + return; + } + + self.trigger('blur', evt); + }, 1); + }; + + BaseSelection.prototype._attachCloseHandler = function (container) { + + $(document.body).on('mousedown.select2.' + container.id, function (e) { + var $target = $(e.target); + + var $select = $target.closest('.select2'); + + var $all = $('.select2.select2-container--open'); + + $all.each(function () { + if (this == $select[0]) { + return; + } + + var $element = Utils.GetData(this, 'element'); + + $element.select2('close'); + }); + }); + }; + + BaseSelection.prototype._detachCloseHandler = function (container) { + $(document.body).off('mousedown.select2.' + container.id); + }; + + BaseSelection.prototype.position = function ($selection, $container) { + var $selectionContainer = $container.find('.selection'); + $selectionContainer.append($selection); + }; + + BaseSelection.prototype.destroy = function () { + this._detachCloseHandler(this.container); + }; + + BaseSelection.prototype.update = function (data) { + throw new Error('The `update` method must be defined in child classes.'); + }; + + /** + * Helper method to abstract the "enabled" (not "disabled") state of this + * object. + * + * @return {true} if the instance is not disabled. + * @return {false} if the instance is disabled. + */ + BaseSelection.prototype.isEnabled = function () { + return !this.isDisabled(); + }; + + /** + * Helper method to abstract the "disabled" state of this object. + * + * @return {true} if the disabled option is true. + * @return {false} if the disabled option is false. + */ + BaseSelection.prototype.isDisabled = function () { + return this.options.get('disabled'); + }; + + return BaseSelection; +}); + +S2.define('select2/selection/single',[ + 'jquery', + './base', + '../utils', + '../keys' +], function ($, BaseSelection, Utils, KEYS) { + function SingleSelection () { + SingleSelection.__super__.constructor.apply(this, arguments); + } + + Utils.Extend(SingleSelection, BaseSelection); + + SingleSelection.prototype.render = function () { + var $selection = SingleSelection.__super__.render.call(this); + + $selection[0].classList.add('select2-selection--single'); + + $selection.html( + '' + + '' + + '' + + '' + ); + + return $selection; + }; + + SingleSelection.prototype.bind = function (container, $container) { + var self = this; + + SingleSelection.__super__.bind.apply(this, arguments); + + var id = container.id + '-container'; + + this.$selection.find('.select2-selection__rendered') + .attr('id', id) + .attr('role', 'textbox') + .attr('aria-readonly', 'true'); + this.$selection.attr('aria-labelledby', id); + this.$selection.attr('aria-controls', id); + + this.$selection.on('mousedown', function (evt) { + // Only respond to left clicks + if (evt.which !== 1) { + return; + } + + self.trigger('toggle', { + originalEvent: evt + }); + }); + + this.$selection.on('focus', function (evt) { + // User focuses on the container + }); + + this.$selection.on('blur', function (evt) { + // User exits the container + }); + + container.on('focus', function (evt) { + if (!container.isOpen()) { + self.$selection.trigger('focus'); + } + }); + }; + + SingleSelection.prototype.clear = function () { + var $rendered = this.$selection.find('.select2-selection__rendered'); + $rendered.empty(); + $rendered.removeAttr('title'); // clear tooltip on empty + }; + + SingleSelection.prototype.display = function (data, container) { + var template = this.options.get('templateSelection'); + var escapeMarkup = this.options.get('escapeMarkup'); + + return escapeMarkup(template(data, container)); + }; + + SingleSelection.prototype.selectionContainer = function () { + return $(''); + }; + + SingleSelection.prototype.update = function (data) { + if (data.length === 0) { + this.clear(); + return; + } + + var selection = data[0]; + + var $rendered = this.$selection.find('.select2-selection__rendered'); + var formatted = this.display(selection, $rendered); + + $rendered.empty().append(formatted); + + var title = selection.title || selection.text; + + if (title) { + $rendered.attr('title', title); + } else { + $rendered.removeAttr('title'); + } + }; + + return SingleSelection; +}); + +S2.define('select2/selection/multiple',[ + 'jquery', + './base', + '../utils' +], function ($, BaseSelection, Utils) { + function MultipleSelection ($element, options) { + MultipleSelection.__super__.constructor.apply(this, arguments); + } + + Utils.Extend(MultipleSelection, BaseSelection); + + MultipleSelection.prototype.render = function () { + var $selection = MultipleSelection.__super__.render.call(this); + + $selection[0].classList.add('select2-selection--multiple'); + + $selection.html( + '
          ' + ); + + return $selection; + }; + + MultipleSelection.prototype.bind = function (container, $container) { + var self = this; + + MultipleSelection.__super__.bind.apply(this, arguments); + + var id = container.id + '-container'; + this.$selection.find('.select2-selection__rendered').attr('id', id); + + this.$selection.on('click', function (evt) { + self.trigger('toggle', { + originalEvent: evt + }); + }); + + this.$selection.on( + 'click', + '.select2-selection__choice__remove', + function (evt) { + // Ignore the event if it is disabled + if (self.isDisabled()) { + return; + } + + var $remove = $(this); + var $selection = $remove.parent(); + + var data = Utils.GetData($selection[0], 'data'); + + self.trigger('unselect', { + originalEvent: evt, + data: data + }); + } + ); + + this.$selection.on( + 'keydown', + '.select2-selection__choice__remove', + function (evt) { + // Ignore the event if it is disabled + if (self.isDisabled()) { + return; + } + + evt.stopPropagation(); + } + ); + }; + + MultipleSelection.prototype.clear = function () { + var $rendered = this.$selection.find('.select2-selection__rendered'); + $rendered.empty(); + $rendered.removeAttr('title'); + }; + + MultipleSelection.prototype.display = function (data, container) { + var template = this.options.get('templateSelection'); + var escapeMarkup = this.options.get('escapeMarkup'); + + return escapeMarkup(template(data, container)); + }; + + MultipleSelection.prototype.selectionContainer = function () { + var $container = $( + '
        • ' + + '' + + '' + + '
        • ' + ); + + return $container; + }; + + MultipleSelection.prototype.update = function (data) { + this.clear(); + + if (data.length === 0) { + return; + } + + var $selections = []; + + var selectionIdPrefix = this.$selection.find('.select2-selection__rendered') + .attr('id') + '-choice-'; + + for (var d = 0; d < data.length; d++) { + var selection = data[d]; + + var $selection = this.selectionContainer(); + var formatted = this.display(selection, $selection); + + var selectionId = selectionIdPrefix + Utils.generateChars(4) + '-'; + + if (selection.id) { + selectionId += selection.id; + } else { + selectionId += Utils.generateChars(4); + } + + $selection.find('.select2-selection__choice__display') + .append(formatted) + .attr('id', selectionId); + + var title = selection.title || selection.text; + + if (title) { + $selection.attr('title', title); + } + + var removeItem = this.options.get('translations').get('removeItem'); + + var $remove = $selection.find('.select2-selection__choice__remove'); + + $remove.attr('title', removeItem()); + $remove.attr('aria-label', removeItem()); + $remove.attr('aria-describedby', selectionId); + + Utils.StoreData($selection[0], 'data', selection); + + $selections.push($selection); + } + + var $rendered = this.$selection.find('.select2-selection__rendered'); + + $rendered.append($selections); + }; + + return MultipleSelection; +}); + +S2.define('select2/selection/placeholder',[ + +], function () { + function Placeholder (decorated, $element, options) { + this.placeholder = this.normalizePlaceholder(options.get('placeholder')); + + decorated.call(this, $element, options); + } + + Placeholder.prototype.normalizePlaceholder = function (_, placeholder) { + if (typeof placeholder === 'string') { + placeholder = { + id: '', + text: placeholder + }; + } + + return placeholder; + }; + + Placeholder.prototype.createPlaceholder = function (decorated, placeholder) { + var $placeholder = this.selectionContainer(); + + $placeholder.html(this.display(placeholder)); + $placeholder[0].classList.add('select2-selection__placeholder'); + $placeholder[0].classList.remove('select2-selection__choice'); + + var placeholderTitle = placeholder.title || + placeholder.text || + $placeholder.text(); + + this.$selection.find('.select2-selection__rendered').attr( + 'title', + placeholderTitle + ); + + return $placeholder; + }; + + Placeholder.prototype.update = function (decorated, data) { + var singlePlaceholder = ( + data.length == 1 && data[0].id != this.placeholder.id + ); + var multipleSelections = data.length > 1; + + if (multipleSelections || singlePlaceholder) { + return decorated.call(this, data); + } + + this.clear(); + + var $placeholder = this.createPlaceholder(this.placeholder); + + this.$selection.find('.select2-selection__rendered').append($placeholder); + }; + + return Placeholder; +}); + +S2.define('select2/selection/allowClear',[ + 'jquery', + '../keys', + '../utils' +], function ($, KEYS, Utils) { + function AllowClear () { } + + AllowClear.prototype.bind = function (decorated, container, $container) { + var self = this; + + decorated.call(this, container, $container); + + if (this.placeholder == null) { + if (this.options.get('debug') && window.console && console.error) { + console.error( + 'Select2: The `allowClear` option should be used in combination ' + + 'with the `placeholder` option.' + ); + } + } + + this.$selection.on('mousedown', '.select2-selection__clear', + function (evt) { + self._handleClear(evt); + }); + + container.on('keypress', function (evt) { + self._handleKeyboardClear(evt, container); + }); + }; + + AllowClear.prototype._handleClear = function (_, evt) { + // Ignore the event if it is disabled + if (this.isDisabled()) { + return; + } + + var $clear = this.$selection.find('.select2-selection__clear'); + + // Ignore the event if nothing has been selected + if ($clear.length === 0) { + return; + } + + evt.stopPropagation(); + + var data = Utils.GetData($clear[0], 'data'); + + var previousVal = this.$element.val(); + this.$element.val(this.placeholder.id); + + var unselectData = { + data: data + }; + this.trigger('clear', unselectData); + if (unselectData.prevented) { + this.$element.val(previousVal); + return; + } + + for (var d = 0; d < data.length; d++) { + unselectData = { + data: data[d] + }; + + // Trigger the `unselect` event, so people can prevent it from being + // cleared. + this.trigger('unselect', unselectData); + + // If the event was prevented, don't clear it out. + if (unselectData.prevented) { + this.$element.val(previousVal); + return; + } + } + + this.$element.trigger('input').trigger('change'); + + this.trigger('toggle', {}); + }; + + AllowClear.prototype._handleKeyboardClear = function (_, evt, container) { + if (container.isOpen()) { + return; + } + + if (evt.which == KEYS.DELETE || evt.which == KEYS.BACKSPACE) { + this._handleClear(evt); + } + }; + + AllowClear.prototype.update = function (decorated, data) { + decorated.call(this, data); + + this.$selection.find('.select2-selection__clear').remove(); + this.$selection[0].classList.remove('select2-selection--clearable'); + + if (this.$selection.find('.select2-selection__placeholder').length > 0 || + data.length === 0) { + return; + } + + var selectionId = this.$selection.find('.select2-selection__rendered') + .attr('id'); + + var removeAll = this.options.get('translations').get('removeAllItems'); + + var $remove = $( + '' + ); + $remove.attr('title', removeAll()); + $remove.attr('aria-label', removeAll()); + $remove.attr('aria-describedby', selectionId); + Utils.StoreData($remove[0], 'data', data); + + this.$selection.prepend($remove); + this.$selection[0].classList.add('select2-selection--clearable'); + }; + + return AllowClear; +}); + +S2.define('select2/selection/search',[ + 'jquery', + '../utils', + '../keys' +], function ($, Utils, KEYS) { + function Search (decorated, $element, options) { + decorated.call(this, $element, options); + } + + Search.prototype.render = function (decorated) { + var searchLabel = this.options.get('translations').get('search'); + var $search = $( + '' + + '' + + '' + ); + + this.$searchContainer = $search; + this.$search = $search.find('textarea'); + + this.$search.prop('autocomplete', this.options.get('autocomplete')); + this.$search.attr('aria-label', searchLabel()); + + var $rendered = decorated.call(this); + + this._transferTabIndex(); + $rendered.append(this.$searchContainer); + + return $rendered; + }; + + Search.prototype.bind = function (decorated, container, $container) { + var self = this; + + var resultsId = container.id + '-results'; + var selectionId = container.id + '-container'; + + decorated.call(this, container, $container); + + self.$search.attr('aria-describedby', selectionId); + + container.on('open', function () { + self.$search.attr('aria-controls', resultsId); + self.$search.trigger('focus'); + }); + + container.on('close', function () { + self.$search.val(''); + self.resizeSearch(); + self.$search.removeAttr('aria-controls'); + self.$search.removeAttr('aria-activedescendant'); + self.$search.trigger('focus'); + }); + + container.on('enable', function () { + self.$search.prop('disabled', false); + + self._transferTabIndex(); + }); + + container.on('disable', function () { + self.$search.prop('disabled', true); + }); + + container.on('focus', function (evt) { + self.$search.trigger('focus'); + }); + + container.on('results:focus', function (params) { + if (params.data._resultId) { + self.$search.attr('aria-activedescendant', params.data._resultId); + } else { + self.$search.removeAttr('aria-activedescendant'); + } + }); + + this.$selection.on('focusin', '.select2-search--inline', function (evt) { + self.trigger('focus', evt); + }); + + this.$selection.on('focusout', '.select2-search--inline', function (evt) { + self._handleBlur(evt); + }); + + this.$selection.on('keydown', '.select2-search--inline', function (evt) { + evt.stopPropagation(); + + self.trigger('keypress', evt); + + self._keyUpPrevented = evt.isDefaultPrevented(); + + var key = evt.which; + + if (key === KEYS.BACKSPACE && self.$search.val() === '') { + var $previousChoice = self.$selection + .find('.select2-selection__choice').last(); + + if ($previousChoice.length > 0) { + var item = Utils.GetData($previousChoice[0], 'data'); + + self.searchRemoveChoice(item); + + evt.preventDefault(); + } + } + }); + + this.$selection.on('click', '.select2-search--inline', function (evt) { + if (self.$search.val()) { + evt.stopPropagation(); + } + }); + + // Try to detect the IE version should the `documentMode` property that + // is stored on the document. This is only implemented in IE and is + // slightly cleaner than doing a user agent check. + // This property is not available in Edge, but Edge also doesn't have + // this bug. + var msie = document.documentMode; + var disableInputEvents = msie && msie <= 11; + + // Workaround for browsers which do not support the `input` event + // This will prevent double-triggering of events for browsers which support + // both the `keyup` and `input` events. + this.$selection.on( + 'input.searchcheck', + '.select2-search--inline', + function (evt) { + // IE will trigger the `input` event when a placeholder is used on a + // search box. To get around this issue, we are forced to ignore all + // `input` events in IE and keep using `keyup`. + if (disableInputEvents) { + self.$selection.off('input.search input.searchcheck'); + return; + } + + // Unbind the duplicated `keyup` event + self.$selection.off('keyup.search'); + } + ); + + this.$selection.on( + 'keyup.search input.search', + '.select2-search--inline', + function (evt) { + // IE will trigger the `input` event when a placeholder is used on a + // search box. To get around this issue, we are forced to ignore all + // `input` events in IE and keep using `keyup`. + if (disableInputEvents && evt.type === 'input') { + self.$selection.off('input.search input.searchcheck'); + return; + } + + var key = evt.which; + + // We can freely ignore events from modifier keys + if (key == KEYS.SHIFT || key == KEYS.CTRL || key == KEYS.ALT) { + return; + } + + // Tabbing will be handled during the `keydown` phase + if (key == KEYS.TAB) { + return; + } + + self.handleSearch(evt); + } + ); + }; + + /** + * This method will transfer the tabindex attribute from the rendered + * selection to the search box. This allows for the search box to be used as + * the primary focus instead of the selection container. + * + * @private + */ + Search.prototype._transferTabIndex = function (decorated) { + this.$search.attr('tabindex', this.$selection.attr('tabindex')); + this.$selection.attr('tabindex', '-1'); + }; + + Search.prototype.createPlaceholder = function (decorated, placeholder) { + this.$search.attr('placeholder', placeholder.text); + }; + + Search.prototype.update = function (decorated, data) { + var searchHadFocus = this.$search[0] == document.activeElement; + + this.$search.attr('placeholder', ''); + + decorated.call(this, data); + + this.resizeSearch(); + if (searchHadFocus) { + this.$search.trigger('focus'); + } + }; + + Search.prototype.handleSearch = function () { + this.resizeSearch(); + + if (!this._keyUpPrevented) { + var input = this.$search.val(); + + this.trigger('query', { + term: input + }); + } + + this._keyUpPrevented = false; + }; + + Search.prototype.searchRemoveChoice = function (decorated, item) { + this.trigger('unselect', { + data: item + }); + + this.$search.val(item.text); + this.handleSearch(); + }; + + Search.prototype.resizeSearch = function () { + this.$search.css('width', '25px'); + + var width = '100%'; + + if (this.$search.attr('placeholder') === '') { + var minimumWidth = this.$search.val().length + 1; + + width = (minimumWidth * 0.75) + 'em'; + } + + this.$search.css('width', width); + }; + + return Search; +}); + +S2.define('select2/selection/selectionCss',[ + '../utils' +], function (Utils) { + function SelectionCSS () { } + + SelectionCSS.prototype.render = function (decorated) { + var $selection = decorated.call(this); + + var selectionCssClass = this.options.get('selectionCssClass') || ''; + + if (selectionCssClass.indexOf(':all:') !== -1) { + selectionCssClass = selectionCssClass.replace(':all:', ''); + + Utils.copyNonInternalCssClasses($selection[0], this.$element[0]); + } + + $selection.addClass(selectionCssClass); + + return $selection; + }; + + return SelectionCSS; +}); + +S2.define('select2/selection/eventRelay',[ + 'jquery' +], function ($) { + function EventRelay () { } + + EventRelay.prototype.bind = function (decorated, container, $container) { + var self = this; + var relayEvents = [ + 'open', 'opening', + 'close', 'closing', + 'select', 'selecting', + 'unselect', 'unselecting', + 'clear', 'clearing' + ]; + + var preventableEvents = [ + 'opening', 'closing', 'selecting', 'unselecting', 'clearing' + ]; + + decorated.call(this, container, $container); + + container.on('*', function (name, params) { + // Ignore events that should not be relayed + if (relayEvents.indexOf(name) === -1) { + return; + } + + // The parameters should always be an object + params = params || {}; + + // Generate the jQuery event for the Select2 event + var evt = $.Event('select2:' + name, { + params: params + }); + + self.$element.trigger(evt); + + // Only handle preventable events if it was one + if (preventableEvents.indexOf(name) === -1) { + return; + } + + params.prevented = evt.isDefaultPrevented(); + }); + }; + + return EventRelay; +}); + +S2.define('select2/translation',[ + 'jquery', + 'require' +], function ($, require) { + function Translation (dict) { + this.dict = dict || {}; + } + + Translation.prototype.all = function () { + return this.dict; + }; + + Translation.prototype.get = function (key) { + return this.dict[key]; + }; + + Translation.prototype.extend = function (translation) { + this.dict = $.extend({}, translation.all(), this.dict); + }; + + // Static functions + + Translation._cache = {}; + + Translation.loadPath = function (path) { + if (!(path in Translation._cache)) { + var translations = require(path); + + Translation._cache[path] = translations; + } + + return new Translation(Translation._cache[path]); + }; + + return Translation; +}); + +S2.define('select2/diacritics',[ + +], function () { + var diacritics = { + '\u24B6': 'A', + '\uFF21': 'A', + '\u00C0': 'A', + '\u00C1': 'A', + '\u00C2': 'A', + '\u1EA6': 'A', + '\u1EA4': 'A', + '\u1EAA': 'A', + '\u1EA8': 'A', + '\u00C3': 'A', + '\u0100': 'A', + '\u0102': 'A', + '\u1EB0': 'A', + '\u1EAE': 'A', + '\u1EB4': 'A', + '\u1EB2': 'A', + '\u0226': 'A', + '\u01E0': 'A', + '\u00C4': 'A', + '\u01DE': 'A', + '\u1EA2': 'A', + '\u00C5': 'A', + '\u01FA': 'A', + '\u01CD': 'A', + '\u0200': 'A', + '\u0202': 'A', + '\u1EA0': 'A', + '\u1EAC': 'A', + '\u1EB6': 'A', + '\u1E00': 'A', + '\u0104': 'A', + '\u023A': 'A', + '\u2C6F': 'A', + '\uA732': 'AA', + '\u00C6': 'AE', + '\u01FC': 'AE', + '\u01E2': 'AE', + '\uA734': 'AO', + '\uA736': 'AU', + '\uA738': 'AV', + '\uA73A': 'AV', + '\uA73C': 'AY', + '\u24B7': 'B', + '\uFF22': 'B', + '\u1E02': 'B', + '\u1E04': 'B', + '\u1E06': 'B', + '\u0243': 'B', + '\u0182': 'B', + '\u0181': 'B', + '\u24B8': 'C', + '\uFF23': 'C', + '\u0106': 'C', + '\u0108': 'C', + '\u010A': 'C', + '\u010C': 'C', + '\u00C7': 'C', + '\u1E08': 'C', + '\u0187': 'C', + '\u023B': 'C', + '\uA73E': 'C', + '\u24B9': 'D', + '\uFF24': 'D', + '\u1E0A': 'D', + '\u010E': 'D', + '\u1E0C': 'D', + '\u1E10': 'D', + '\u1E12': 'D', + '\u1E0E': 'D', + '\u0110': 'D', + '\u018B': 'D', + '\u018A': 'D', + '\u0189': 'D', + '\uA779': 'D', + '\u01F1': 'DZ', + '\u01C4': 'DZ', + '\u01F2': 'Dz', + '\u01C5': 'Dz', + '\u24BA': 'E', + '\uFF25': 'E', + '\u00C8': 'E', + '\u00C9': 'E', + '\u00CA': 'E', + '\u1EC0': 'E', + '\u1EBE': 'E', + '\u1EC4': 'E', + '\u1EC2': 'E', + '\u1EBC': 'E', + '\u0112': 'E', + '\u1E14': 'E', + '\u1E16': 'E', + '\u0114': 'E', + '\u0116': 'E', + '\u00CB': 'E', + '\u1EBA': 'E', + '\u011A': 'E', + '\u0204': 'E', + '\u0206': 'E', + '\u1EB8': 'E', + '\u1EC6': 'E', + '\u0228': 'E', + '\u1E1C': 'E', + '\u0118': 'E', + '\u1E18': 'E', + '\u1E1A': 'E', + '\u0190': 'E', + '\u018E': 'E', + '\u24BB': 'F', + '\uFF26': 'F', + '\u1E1E': 'F', + '\u0191': 'F', + '\uA77B': 'F', + '\u24BC': 'G', + '\uFF27': 'G', + '\u01F4': 'G', + '\u011C': 'G', + '\u1E20': 'G', + '\u011E': 'G', + '\u0120': 'G', + '\u01E6': 'G', + '\u0122': 'G', + '\u01E4': 'G', + '\u0193': 'G', + '\uA7A0': 'G', + '\uA77D': 'G', + '\uA77E': 'G', + '\u24BD': 'H', + '\uFF28': 'H', + '\u0124': 'H', + '\u1E22': 'H', + '\u1E26': 'H', + '\u021E': 'H', + '\u1E24': 'H', + '\u1E28': 'H', + '\u1E2A': 'H', + '\u0126': 'H', + '\u2C67': 'H', + '\u2C75': 'H', + '\uA78D': 'H', + '\u24BE': 'I', + '\uFF29': 'I', + '\u00CC': 'I', + '\u00CD': 'I', + '\u00CE': 'I', + '\u0128': 'I', + '\u012A': 'I', + '\u012C': 'I', + '\u0130': 'I', + '\u00CF': 'I', + '\u1E2E': 'I', + '\u1EC8': 'I', + '\u01CF': 'I', + '\u0208': 'I', + '\u020A': 'I', + '\u1ECA': 'I', + '\u012E': 'I', + '\u1E2C': 'I', + '\u0197': 'I', + '\u24BF': 'J', + '\uFF2A': 'J', + '\u0134': 'J', + '\u0248': 'J', + '\u24C0': 'K', + '\uFF2B': 'K', + '\u1E30': 'K', + '\u01E8': 'K', + '\u1E32': 'K', + '\u0136': 'K', + '\u1E34': 'K', + '\u0198': 'K', + '\u2C69': 'K', + '\uA740': 'K', + '\uA742': 'K', + '\uA744': 'K', + '\uA7A2': 'K', + '\u24C1': 'L', + '\uFF2C': 'L', + '\u013F': 'L', + '\u0139': 'L', + '\u013D': 'L', + '\u1E36': 'L', + '\u1E38': 'L', + '\u013B': 'L', + '\u1E3C': 'L', + '\u1E3A': 'L', + '\u0141': 'L', + '\u023D': 'L', + '\u2C62': 'L', + '\u2C60': 'L', + '\uA748': 'L', + '\uA746': 'L', + '\uA780': 'L', + '\u01C7': 'LJ', + '\u01C8': 'Lj', + '\u24C2': 'M', + '\uFF2D': 'M', + '\u1E3E': 'M', + '\u1E40': 'M', + '\u1E42': 'M', + '\u2C6E': 'M', + '\u019C': 'M', + '\u24C3': 'N', + '\uFF2E': 'N', + '\u01F8': 'N', + '\u0143': 'N', + '\u00D1': 'N', + '\u1E44': 'N', + '\u0147': 'N', + '\u1E46': 'N', + '\u0145': 'N', + '\u1E4A': 'N', + '\u1E48': 'N', + '\u0220': 'N', + '\u019D': 'N', + '\uA790': 'N', + '\uA7A4': 'N', + '\u01CA': 'NJ', + '\u01CB': 'Nj', + '\u24C4': 'O', + '\uFF2F': 'O', + '\u00D2': 'O', + '\u00D3': 'O', + '\u00D4': 'O', + '\u1ED2': 'O', + '\u1ED0': 'O', + '\u1ED6': 'O', + '\u1ED4': 'O', + '\u00D5': 'O', + '\u1E4C': 'O', + '\u022C': 'O', + '\u1E4E': 'O', + '\u014C': 'O', + '\u1E50': 'O', + '\u1E52': 'O', + '\u014E': 'O', + '\u022E': 'O', + '\u0230': 'O', + '\u00D6': 'O', + '\u022A': 'O', + '\u1ECE': 'O', + '\u0150': 'O', + '\u01D1': 'O', + '\u020C': 'O', + '\u020E': 'O', + '\u01A0': 'O', + '\u1EDC': 'O', + '\u1EDA': 'O', + '\u1EE0': 'O', + '\u1EDE': 'O', + '\u1EE2': 'O', + '\u1ECC': 'O', + '\u1ED8': 'O', + '\u01EA': 'O', + '\u01EC': 'O', + '\u00D8': 'O', + '\u01FE': 'O', + '\u0186': 'O', + '\u019F': 'O', + '\uA74A': 'O', + '\uA74C': 'O', + '\u0152': 'OE', + '\u01A2': 'OI', + '\uA74E': 'OO', + '\u0222': 'OU', + '\u24C5': 'P', + '\uFF30': 'P', + '\u1E54': 'P', + '\u1E56': 'P', + '\u01A4': 'P', + '\u2C63': 'P', + '\uA750': 'P', + '\uA752': 'P', + '\uA754': 'P', + '\u24C6': 'Q', + '\uFF31': 'Q', + '\uA756': 'Q', + '\uA758': 'Q', + '\u024A': 'Q', + '\u24C7': 'R', + '\uFF32': 'R', + '\u0154': 'R', + '\u1E58': 'R', + '\u0158': 'R', + '\u0210': 'R', + '\u0212': 'R', + '\u1E5A': 'R', + '\u1E5C': 'R', + '\u0156': 'R', + '\u1E5E': 'R', + '\u024C': 'R', + '\u2C64': 'R', + '\uA75A': 'R', + '\uA7A6': 'R', + '\uA782': 'R', + '\u24C8': 'S', + '\uFF33': 'S', + '\u1E9E': 'S', + '\u015A': 'S', + '\u1E64': 'S', + '\u015C': 'S', + '\u1E60': 'S', + '\u0160': 'S', + '\u1E66': 'S', + '\u1E62': 'S', + '\u1E68': 'S', + '\u0218': 'S', + '\u015E': 'S', + '\u2C7E': 'S', + '\uA7A8': 'S', + '\uA784': 'S', + '\u24C9': 'T', + '\uFF34': 'T', + '\u1E6A': 'T', + '\u0164': 'T', + '\u1E6C': 'T', + '\u021A': 'T', + '\u0162': 'T', + '\u1E70': 'T', + '\u1E6E': 'T', + '\u0166': 'T', + '\u01AC': 'T', + '\u01AE': 'T', + '\u023E': 'T', + '\uA786': 'T', + '\uA728': 'TZ', + '\u24CA': 'U', + '\uFF35': 'U', + '\u00D9': 'U', + '\u00DA': 'U', + '\u00DB': 'U', + '\u0168': 'U', + '\u1E78': 'U', + '\u016A': 'U', + '\u1E7A': 'U', + '\u016C': 'U', + '\u00DC': 'U', + '\u01DB': 'U', + '\u01D7': 'U', + '\u01D5': 'U', + '\u01D9': 'U', + '\u1EE6': 'U', + '\u016E': 'U', + '\u0170': 'U', + '\u01D3': 'U', + '\u0214': 'U', + '\u0216': 'U', + '\u01AF': 'U', + '\u1EEA': 'U', + '\u1EE8': 'U', + '\u1EEE': 'U', + '\u1EEC': 'U', + '\u1EF0': 'U', + '\u1EE4': 'U', + '\u1E72': 'U', + '\u0172': 'U', + '\u1E76': 'U', + '\u1E74': 'U', + '\u0244': 'U', + '\u24CB': 'V', + '\uFF36': 'V', + '\u1E7C': 'V', + '\u1E7E': 'V', + '\u01B2': 'V', + '\uA75E': 'V', + '\u0245': 'V', + '\uA760': 'VY', + '\u24CC': 'W', + '\uFF37': 'W', + '\u1E80': 'W', + '\u1E82': 'W', + '\u0174': 'W', + '\u1E86': 'W', + '\u1E84': 'W', + '\u1E88': 'W', + '\u2C72': 'W', + '\u24CD': 'X', + '\uFF38': 'X', + '\u1E8A': 'X', + '\u1E8C': 'X', + '\u24CE': 'Y', + '\uFF39': 'Y', + '\u1EF2': 'Y', + '\u00DD': 'Y', + '\u0176': 'Y', + '\u1EF8': 'Y', + '\u0232': 'Y', + '\u1E8E': 'Y', + '\u0178': 'Y', + '\u1EF6': 'Y', + '\u1EF4': 'Y', + '\u01B3': 'Y', + '\u024E': 'Y', + '\u1EFE': 'Y', + '\u24CF': 'Z', + '\uFF3A': 'Z', + '\u0179': 'Z', + '\u1E90': 'Z', + '\u017B': 'Z', + '\u017D': 'Z', + '\u1E92': 'Z', + '\u1E94': 'Z', + '\u01B5': 'Z', + '\u0224': 'Z', + '\u2C7F': 'Z', + '\u2C6B': 'Z', + '\uA762': 'Z', + '\u24D0': 'a', + '\uFF41': 'a', + '\u1E9A': 'a', + '\u00E0': 'a', + '\u00E1': 'a', + '\u00E2': 'a', + '\u1EA7': 'a', + '\u1EA5': 'a', + '\u1EAB': 'a', + '\u1EA9': 'a', + '\u00E3': 'a', + '\u0101': 'a', + '\u0103': 'a', + '\u1EB1': 'a', + '\u1EAF': 'a', + '\u1EB5': 'a', + '\u1EB3': 'a', + '\u0227': 'a', + '\u01E1': 'a', + '\u00E4': 'a', + '\u01DF': 'a', + '\u1EA3': 'a', + '\u00E5': 'a', + '\u01FB': 'a', + '\u01CE': 'a', + '\u0201': 'a', + '\u0203': 'a', + '\u1EA1': 'a', + '\u1EAD': 'a', + '\u1EB7': 'a', + '\u1E01': 'a', + '\u0105': 'a', + '\u2C65': 'a', + '\u0250': 'a', + '\uA733': 'aa', + '\u00E6': 'ae', + '\u01FD': 'ae', + '\u01E3': 'ae', + '\uA735': 'ao', + '\uA737': 'au', + '\uA739': 'av', + '\uA73B': 'av', + '\uA73D': 'ay', + '\u24D1': 'b', + '\uFF42': 'b', + '\u1E03': 'b', + '\u1E05': 'b', + '\u1E07': 'b', + '\u0180': 'b', + '\u0183': 'b', + '\u0253': 'b', + '\u24D2': 'c', + '\uFF43': 'c', + '\u0107': 'c', + '\u0109': 'c', + '\u010B': 'c', + '\u010D': 'c', + '\u00E7': 'c', + '\u1E09': 'c', + '\u0188': 'c', + '\u023C': 'c', + '\uA73F': 'c', + '\u2184': 'c', + '\u24D3': 'd', + '\uFF44': 'd', + '\u1E0B': 'd', + '\u010F': 'd', + '\u1E0D': 'd', + '\u1E11': 'd', + '\u1E13': 'd', + '\u1E0F': 'd', + '\u0111': 'd', + '\u018C': 'd', + '\u0256': 'd', + '\u0257': 'd', + '\uA77A': 'd', + '\u01F3': 'dz', + '\u01C6': 'dz', + '\u24D4': 'e', + '\uFF45': 'e', + '\u00E8': 'e', + '\u00E9': 'e', + '\u00EA': 'e', + '\u1EC1': 'e', + '\u1EBF': 'e', + '\u1EC5': 'e', + '\u1EC3': 'e', + '\u1EBD': 'e', + '\u0113': 'e', + '\u1E15': 'e', + '\u1E17': 'e', + '\u0115': 'e', + '\u0117': 'e', + '\u00EB': 'e', + '\u1EBB': 'e', + '\u011B': 'e', + '\u0205': 'e', + '\u0207': 'e', + '\u1EB9': 'e', + '\u1EC7': 'e', + '\u0229': 'e', + '\u1E1D': 'e', + '\u0119': 'e', + '\u1E19': 'e', + '\u1E1B': 'e', + '\u0247': 'e', + '\u025B': 'e', + '\u01DD': 'e', + '\u24D5': 'f', + '\uFF46': 'f', + '\u1E1F': 'f', + '\u0192': 'f', + '\uA77C': 'f', + '\u24D6': 'g', + '\uFF47': 'g', + '\u01F5': 'g', + '\u011D': 'g', + '\u1E21': 'g', + '\u011F': 'g', + '\u0121': 'g', + '\u01E7': 'g', + '\u0123': 'g', + '\u01E5': 'g', + '\u0260': 'g', + '\uA7A1': 'g', + '\u1D79': 'g', + '\uA77F': 'g', + '\u24D7': 'h', + '\uFF48': 'h', + '\u0125': 'h', + '\u1E23': 'h', + '\u1E27': 'h', + '\u021F': 'h', + '\u1E25': 'h', + '\u1E29': 'h', + '\u1E2B': 'h', + '\u1E96': 'h', + '\u0127': 'h', + '\u2C68': 'h', + '\u2C76': 'h', + '\u0265': 'h', + '\u0195': 'hv', + '\u24D8': 'i', + '\uFF49': 'i', + '\u00EC': 'i', + '\u00ED': 'i', + '\u00EE': 'i', + '\u0129': 'i', + '\u012B': 'i', + '\u012D': 'i', + '\u00EF': 'i', + '\u1E2F': 'i', + '\u1EC9': 'i', + '\u01D0': 'i', + '\u0209': 'i', + '\u020B': 'i', + '\u1ECB': 'i', + '\u012F': 'i', + '\u1E2D': 'i', + '\u0268': 'i', + '\u0131': 'i', + '\u24D9': 'j', + '\uFF4A': 'j', + '\u0135': 'j', + '\u01F0': 'j', + '\u0249': 'j', + '\u24DA': 'k', + '\uFF4B': 'k', + '\u1E31': 'k', + '\u01E9': 'k', + '\u1E33': 'k', + '\u0137': 'k', + '\u1E35': 'k', + '\u0199': 'k', + '\u2C6A': 'k', + '\uA741': 'k', + '\uA743': 'k', + '\uA745': 'k', + '\uA7A3': 'k', + '\u24DB': 'l', + '\uFF4C': 'l', + '\u0140': 'l', + '\u013A': 'l', + '\u013E': 'l', + '\u1E37': 'l', + '\u1E39': 'l', + '\u013C': 'l', + '\u1E3D': 'l', + '\u1E3B': 'l', + '\u017F': 'l', + '\u0142': 'l', + '\u019A': 'l', + '\u026B': 'l', + '\u2C61': 'l', + '\uA749': 'l', + '\uA781': 'l', + '\uA747': 'l', + '\u01C9': 'lj', + '\u24DC': 'm', + '\uFF4D': 'm', + '\u1E3F': 'm', + '\u1E41': 'm', + '\u1E43': 'm', + '\u0271': 'm', + '\u026F': 'm', + '\u24DD': 'n', + '\uFF4E': 'n', + '\u01F9': 'n', + '\u0144': 'n', + '\u00F1': 'n', + '\u1E45': 'n', + '\u0148': 'n', + '\u1E47': 'n', + '\u0146': 'n', + '\u1E4B': 'n', + '\u1E49': 'n', + '\u019E': 'n', + '\u0272': 'n', + '\u0149': 'n', + '\uA791': 'n', + '\uA7A5': 'n', + '\u01CC': 'nj', + '\u24DE': 'o', + '\uFF4F': 'o', + '\u00F2': 'o', + '\u00F3': 'o', + '\u00F4': 'o', + '\u1ED3': 'o', + '\u1ED1': 'o', + '\u1ED7': 'o', + '\u1ED5': 'o', + '\u00F5': 'o', + '\u1E4D': 'o', + '\u022D': 'o', + '\u1E4F': 'o', + '\u014D': 'o', + '\u1E51': 'o', + '\u1E53': 'o', + '\u014F': 'o', + '\u022F': 'o', + '\u0231': 'o', + '\u00F6': 'o', + '\u022B': 'o', + '\u1ECF': 'o', + '\u0151': 'o', + '\u01D2': 'o', + '\u020D': 'o', + '\u020F': 'o', + '\u01A1': 'o', + '\u1EDD': 'o', + '\u1EDB': 'o', + '\u1EE1': 'o', + '\u1EDF': 'o', + '\u1EE3': 'o', + '\u1ECD': 'o', + '\u1ED9': 'o', + '\u01EB': 'o', + '\u01ED': 'o', + '\u00F8': 'o', + '\u01FF': 'o', + '\u0254': 'o', + '\uA74B': 'o', + '\uA74D': 'o', + '\u0275': 'o', + '\u0153': 'oe', + '\u01A3': 'oi', + '\u0223': 'ou', + '\uA74F': 'oo', + '\u24DF': 'p', + '\uFF50': 'p', + '\u1E55': 'p', + '\u1E57': 'p', + '\u01A5': 'p', + '\u1D7D': 'p', + '\uA751': 'p', + '\uA753': 'p', + '\uA755': 'p', + '\u24E0': 'q', + '\uFF51': 'q', + '\u024B': 'q', + '\uA757': 'q', + '\uA759': 'q', + '\u24E1': 'r', + '\uFF52': 'r', + '\u0155': 'r', + '\u1E59': 'r', + '\u0159': 'r', + '\u0211': 'r', + '\u0213': 'r', + '\u1E5B': 'r', + '\u1E5D': 'r', + '\u0157': 'r', + '\u1E5F': 'r', + '\u024D': 'r', + '\u027D': 'r', + '\uA75B': 'r', + '\uA7A7': 'r', + '\uA783': 'r', + '\u24E2': 's', + '\uFF53': 's', + '\u00DF': 's', + '\u015B': 's', + '\u1E65': 's', + '\u015D': 's', + '\u1E61': 's', + '\u0161': 's', + '\u1E67': 's', + '\u1E63': 's', + '\u1E69': 's', + '\u0219': 's', + '\u015F': 's', + '\u023F': 's', + '\uA7A9': 's', + '\uA785': 's', + '\u1E9B': 's', + '\u24E3': 't', + '\uFF54': 't', + '\u1E6B': 't', + '\u1E97': 't', + '\u0165': 't', + '\u1E6D': 't', + '\u021B': 't', + '\u0163': 't', + '\u1E71': 't', + '\u1E6F': 't', + '\u0167': 't', + '\u01AD': 't', + '\u0288': 't', + '\u2C66': 't', + '\uA787': 't', + '\uA729': 'tz', + '\u24E4': 'u', + '\uFF55': 'u', + '\u00F9': 'u', + '\u00FA': 'u', + '\u00FB': 'u', + '\u0169': 'u', + '\u1E79': 'u', + '\u016B': 'u', + '\u1E7B': 'u', + '\u016D': 'u', + '\u00FC': 'u', + '\u01DC': 'u', + '\u01D8': 'u', + '\u01D6': 'u', + '\u01DA': 'u', + '\u1EE7': 'u', + '\u016F': 'u', + '\u0171': 'u', + '\u01D4': 'u', + '\u0215': 'u', + '\u0217': 'u', + '\u01B0': 'u', + '\u1EEB': 'u', + '\u1EE9': 'u', + '\u1EEF': 'u', + '\u1EED': 'u', + '\u1EF1': 'u', + '\u1EE5': 'u', + '\u1E73': 'u', + '\u0173': 'u', + '\u1E77': 'u', + '\u1E75': 'u', + '\u0289': 'u', + '\u24E5': 'v', + '\uFF56': 'v', + '\u1E7D': 'v', + '\u1E7F': 'v', + '\u028B': 'v', + '\uA75F': 'v', + '\u028C': 'v', + '\uA761': 'vy', + '\u24E6': 'w', + '\uFF57': 'w', + '\u1E81': 'w', + '\u1E83': 'w', + '\u0175': 'w', + '\u1E87': 'w', + '\u1E85': 'w', + '\u1E98': 'w', + '\u1E89': 'w', + '\u2C73': 'w', + '\u24E7': 'x', + '\uFF58': 'x', + '\u1E8B': 'x', + '\u1E8D': 'x', + '\u24E8': 'y', + '\uFF59': 'y', + '\u1EF3': 'y', + '\u00FD': 'y', + '\u0177': 'y', + '\u1EF9': 'y', + '\u0233': 'y', + '\u1E8F': 'y', + '\u00FF': 'y', + '\u1EF7': 'y', + '\u1E99': 'y', + '\u1EF5': 'y', + '\u01B4': 'y', + '\u024F': 'y', + '\u1EFF': 'y', + '\u24E9': 'z', + '\uFF5A': 'z', + '\u017A': 'z', + '\u1E91': 'z', + '\u017C': 'z', + '\u017E': 'z', + '\u1E93': 'z', + '\u1E95': 'z', + '\u01B6': 'z', + '\u0225': 'z', + '\u0240': 'z', + '\u2C6C': 'z', + '\uA763': 'z', + '\u0386': '\u0391', + '\u0388': '\u0395', + '\u0389': '\u0397', + '\u038A': '\u0399', + '\u03AA': '\u0399', + '\u038C': '\u039F', + '\u038E': '\u03A5', + '\u03AB': '\u03A5', + '\u038F': '\u03A9', + '\u03AC': '\u03B1', + '\u03AD': '\u03B5', + '\u03AE': '\u03B7', + '\u03AF': '\u03B9', + '\u03CA': '\u03B9', + '\u0390': '\u03B9', + '\u03CC': '\u03BF', + '\u03CD': '\u03C5', + '\u03CB': '\u03C5', + '\u03B0': '\u03C5', + '\u03CE': '\u03C9', + '\u03C2': '\u03C3', + '\u2019': '\'' + }; + + return diacritics; +}); + +S2.define('select2/data/base',[ + '../utils' +], function (Utils) { + function BaseAdapter ($element, options) { + BaseAdapter.__super__.constructor.call(this); + } + + Utils.Extend(BaseAdapter, Utils.Observable); + + BaseAdapter.prototype.current = function (callback) { + throw new Error('The `current` method must be defined in child classes.'); + }; + + BaseAdapter.prototype.query = function (params, callback) { + throw new Error('The `query` method must be defined in child classes.'); + }; + + BaseAdapter.prototype.bind = function (container, $container) { + // Can be implemented in subclasses + }; + + BaseAdapter.prototype.destroy = function () { + // Can be implemented in subclasses + }; + + BaseAdapter.prototype.generateResultId = function (container, data) { + var id = container.id + '-result-'; + + id += Utils.generateChars(4); + + if (data.id != null) { + id += '-' + data.id.toString(); + } else { + id += '-' + Utils.generateChars(4); + } + return id; + }; + + return BaseAdapter; +}); + +S2.define('select2/data/select',[ + './base', + '../utils', + 'jquery' +], function (BaseAdapter, Utils, $) { + function SelectAdapter ($element, options) { + this.$element = $element; + this.options = options; + + SelectAdapter.__super__.constructor.call(this); + } + + Utils.Extend(SelectAdapter, BaseAdapter); + + SelectAdapter.prototype.current = function (callback) { + var self = this; + + var data = Array.prototype.map.call( + this.$element[0].querySelectorAll(':checked'), + function (selectedElement) { + return self.item($(selectedElement)); + } + ); + + callback(data); + }; + + SelectAdapter.prototype.select = function (data) { + var self = this; + + data.selected = true; + + // If data.element is a DOM node, use it instead + if ( + data.element != null && data.element.tagName.toLowerCase() === 'option' + ) { + data.element.selected = true; + + this.$element.trigger('input').trigger('change'); + + return; + } + + if (this.$element.prop('multiple')) { + this.current(function (currentData) { + var val = []; + + data = [data]; + data.push.apply(data, currentData); + + for (var d = 0; d < data.length; d++) { + var id = data[d].id; + + if (val.indexOf(id) === -1) { + val.push(id); + } + } + + self.$element.val(val); + self.$element.trigger('input').trigger('change'); + }); + } else { + var val = data.id; + + this.$element.val(val); + this.$element.trigger('input').trigger('change'); + } + }; + + SelectAdapter.prototype.unselect = function (data) { + var self = this; + + if (!this.$element.prop('multiple')) { + return; + } + + data.selected = false; + + if ( + data.element != null && + data.element.tagName.toLowerCase() === 'option' + ) { + data.element.selected = false; + + this.$element.trigger('input').trigger('change'); + + return; + } + + this.current(function (currentData) { + var val = []; + + for (var d = 0; d < currentData.length; d++) { + var id = currentData[d].id; + + if (id !== data.id && val.indexOf(id) === -1) { + val.push(id); + } + } + + self.$element.val(val); + + self.$element.trigger('input').trigger('change'); + }); + }; + + SelectAdapter.prototype.bind = function (container, $container) { + var self = this; + + this.container = container; + + container.on('select', function (params) { + self.select(params.data); + }); + + container.on('unselect', function (params) { + self.unselect(params.data); + }); + }; + + SelectAdapter.prototype.destroy = function () { + // Remove anything added to child elements + this.$element.find('*').each(function () { + // Remove any custom data set by Select2 + Utils.RemoveData(this); + }); + }; + + SelectAdapter.prototype.query = function (params, callback) { + var data = []; + var self = this; + + var $options = this.$element.children(); + + $options.each(function () { + if ( + this.tagName.toLowerCase() !== 'option' && + this.tagName.toLowerCase() !== 'optgroup' + ) { + return; + } + + var $option = $(this); + + var option = self.item($option); + + var matches = self.matches(params, option); + + if (matches !== null) { + data.push(matches); + } + }); + + callback({ + results: data + }); + }; + + SelectAdapter.prototype.addOptions = function ($options) { + this.$element.append($options); + }; + + SelectAdapter.prototype.option = function (data) { + var option; + + if (data.children) { + option = document.createElement('optgroup'); + option.label = data.text; + } else { + option = document.createElement('option'); + + if (option.textContent !== undefined) { + option.textContent = data.text; + } else { + option.innerText = data.text; + } + } + + if (data.id !== undefined) { + option.value = data.id; + } + + if (data.disabled) { + option.disabled = true; + } + + if (data.selected) { + option.selected = true; + } + + if (data.title) { + option.title = data.title; + } + + var normalizedData = this._normalizeItem(data); + normalizedData.element = option; + + // Override the option's data with the combined data + Utils.StoreData(option, 'data', normalizedData); + + return $(option); + }; + + SelectAdapter.prototype.item = function ($option) { + var data = {}; + + data = Utils.GetData($option[0], 'data'); + + if (data != null) { + return data; + } + + var option = $option[0]; + + if (option.tagName.toLowerCase() === 'option') { + data = { + id: $option.val(), + text: $option.text(), + disabled: $option.prop('disabled'), + selected: $option.prop('selected'), + title: $option.prop('title') + }; + } else if (option.tagName.toLowerCase() === 'optgroup') { + data = { + text: $option.prop('label'), + children: [], + title: $option.prop('title') + }; + + var $children = $option.children('option'); + var children = []; + + for (var c = 0; c < $children.length; c++) { + var $child = $($children[c]); + + var child = this.item($child); + + children.push(child); + } + + data.children = children; + } + + data = this._normalizeItem(data); + data.element = $option[0]; + + Utils.StoreData($option[0], 'data', data); + + return data; + }; + + SelectAdapter.prototype._normalizeItem = function (item) { + if (item !== Object(item)) { + item = { + id: item, + text: item + }; + } + + item = $.extend({}, { + text: '' + }, item); + + var defaults = { + selected: false, + disabled: false + }; + + if (item.id != null) { + item.id = item.id.toString(); + } + + if (item.text != null) { + item.text = item.text.toString(); + } + + if (item._resultId == null && item.id && this.container != null) { + item._resultId = this.generateResultId(this.container, item); + } + + return $.extend({}, defaults, item); + }; + + SelectAdapter.prototype.matches = function (params, data) { + var matcher = this.options.get('matcher'); + + return matcher(params, data); + }; + + return SelectAdapter; +}); + +S2.define('select2/data/array',[ + './select', + '../utils', + 'jquery' +], function (SelectAdapter, Utils, $) { + function ArrayAdapter ($element, options) { + this._dataToConvert = options.get('data') || []; + + ArrayAdapter.__super__.constructor.call(this, $element, options); + } + + Utils.Extend(ArrayAdapter, SelectAdapter); + + ArrayAdapter.prototype.bind = function (container, $container) { + ArrayAdapter.__super__.bind.call(this, container, $container); + + this.addOptions(this.convertToOptions(this._dataToConvert)); + }; + + ArrayAdapter.prototype.select = function (data) { + var $option = this.$element.find('option').filter(function (i, elm) { + return elm.value == data.id.toString(); + }); + + if ($option.length === 0) { + $option = this.option(data); + + this.addOptions($option); + } + + ArrayAdapter.__super__.select.call(this, data); + }; + + ArrayAdapter.prototype.convertToOptions = function (data) { + var self = this; + + var $existing = this.$element.find('option'); + var existingIds = $existing.map(function () { + return self.item($(this)).id; + }).get(); + + var $options = []; + + // Filter out all items except for the one passed in the argument + function onlyItem (item) { + return function () { + return $(this).val() == item.id; + }; + } + + for (var d = 0; d < data.length; d++) { + var item = this._normalizeItem(data[d]); + + // Skip items which were pre-loaded, only merge the data + if (existingIds.indexOf(item.id) >= 0) { + var $existingOption = $existing.filter(onlyItem(item)); + + var existingData = this.item($existingOption); + var newData = $.extend(true, {}, item, existingData); + + var $newOption = this.option(newData); + + $existingOption.replaceWith($newOption); + + continue; + } + + var $option = this.option(item); + + if (item.children) { + var $children = this.convertToOptions(item.children); + + $option.append($children); + } + + $options.push($option); + } + + return $options; + }; + + return ArrayAdapter; +}); + +S2.define('select2/data/ajax',[ + './array', + '../utils', + 'jquery' +], function (ArrayAdapter, Utils, $) { + function AjaxAdapter ($element, options) { + this.ajaxOptions = this._applyDefaults(options.get('ajax')); + + if (this.ajaxOptions.processResults != null) { + this.processResults = this.ajaxOptions.processResults; + } + + AjaxAdapter.__super__.constructor.call(this, $element, options); + } + + Utils.Extend(AjaxAdapter, ArrayAdapter); + + AjaxAdapter.prototype._applyDefaults = function (options) { + var defaults = { + data: function (params) { + return $.extend({}, params, { + q: params.term + }); + }, + transport: function (params, success, failure) { + var $request = $.ajax(params); + + $request.then(success); + $request.fail(failure); + + return $request; + } + }; + + return $.extend({}, defaults, options, true); + }; + + AjaxAdapter.prototype.processResults = function (results) { + return results; + }; + + AjaxAdapter.prototype.query = function (params, callback) { + var matches = []; + var self = this; + + if (this._request != null) { + // JSONP requests cannot always be aborted + if (typeof this._request.abort === 'function') { + this._request.abort(); + } + + this._request = null; + } + + var options = $.extend({ + type: 'GET' + }, this.ajaxOptions); + + if (typeof options.url === 'function') { + options.url = options.url.call(this.$element, params); + } + + if (typeof options.data === 'function') { + options.data = options.data.call(this.$element, params); + } + + function request () { + var $request = options.transport(options, function (data) { + var results = self.processResults(data, params); + + if (self.options.get('debug') && window.console && console.error) { + // Check to make sure that the response included a `results` key. + if (!results || !results.results || !Array.isArray(results.results)) { + console.error( + 'Select2: The AJAX results did not return an array in the ' + + '`results` key of the response.' + ); + } + } + + callback(results); + }, function () { + // Attempt to detect if a request was aborted + // Only works if the transport exposes a status property + if ('status' in $request && + ($request.status === 0 || $request.status === '0')) { + return; + } + + self.trigger('results:message', { + message: 'errorLoading' + }); + }); + + self._request = $request; + } + + if (this.ajaxOptions.delay && params.term != null) { + if (this._queryTimeout) { + window.clearTimeout(this._queryTimeout); + } + + this._queryTimeout = window.setTimeout(request, this.ajaxOptions.delay); + } else { + request(); + } + }; + + return AjaxAdapter; +}); + +S2.define('select2/data/tags',[ + 'jquery' +], function ($) { + function Tags (decorated, $element, options) { + var tags = options.get('tags'); + + var createTag = options.get('createTag'); + + if (createTag !== undefined) { + this.createTag = createTag; + } + + var insertTag = options.get('insertTag'); + + if (insertTag !== undefined) { + this.insertTag = insertTag; + } + + decorated.call(this, $element, options); + + if (Array.isArray(tags)) { + for (var t = 0; t < tags.length; t++) { + var tag = tags[t]; + var item = this._normalizeItem(tag); + + var $option = this.option(item); + + this.$element.append($option); + } + } + } + + Tags.prototype.query = function (decorated, params, callback) { + var self = this; + + this._removeOldTags(); + + if (params.term == null || params.page != null) { + decorated.call(this, params, callback); + return; + } + + function wrapper (obj, child) { + var data = obj.results; + + for (var i = 0; i < data.length; i++) { + var option = data[i]; + + var checkChildren = ( + option.children != null && + !wrapper({ + results: option.children + }, true) + ); + + var optionText = (option.text || '').toUpperCase(); + var paramsTerm = (params.term || '').toUpperCase(); + + var checkText = optionText === paramsTerm; + + if (checkText || checkChildren) { + if (child) { + return false; + } + + obj.data = data; + callback(obj); + + return; + } + } + + if (child) { + return true; + } + + var tag = self.createTag(params); + + if (tag != null) { + var $option = self.option(tag); + $option.attr('data-select2-tag', 'true'); + + self.addOptions([$option]); + + self.insertTag(data, tag); + } + + obj.results = data; + + callback(obj); + } + + decorated.call(this, params, wrapper); + }; + + Tags.prototype.createTag = function (decorated, params) { + if (params.term == null) { + return null; + } + + var term = params.term.trim(); + + if (term === '') { + return null; + } + + return { + id: term, + text: term + }; + }; + + Tags.prototype.insertTag = function (_, data, tag) { + data.unshift(tag); + }; + + Tags.prototype._removeOldTags = function (_) { + var $options = this.$element.find('option[data-select2-tag]'); + + $options.each(function () { + if (this.selected) { + return; + } + + $(this).remove(); + }); + }; + + return Tags; +}); + +S2.define('select2/data/tokenizer',[ + 'jquery' +], function ($) { + function Tokenizer (decorated, $element, options) { + var tokenizer = options.get('tokenizer'); + + if (tokenizer !== undefined) { + this.tokenizer = tokenizer; + } + + decorated.call(this, $element, options); + } + + Tokenizer.prototype.bind = function (decorated, container, $container) { + decorated.call(this, container, $container); + + this.$search = container.dropdown.$search || container.selection.$search || + $container.find('.select2-search__field'); + }; + + Tokenizer.prototype.query = function (decorated, params, callback) { + var self = this; + + function createAndSelect (data) { + // Normalize the data object so we can use it for checks + var item = self._normalizeItem(data); + + // Check if the data object already exists as a tag + // Select it if it doesn't + var $existingOptions = self.$element.find('option').filter(function () { + return $(this).val() === item.id; + }); + + // If an existing option wasn't found for it, create the option + if (!$existingOptions.length) { + var $option = self.option(item); + $option.attr('data-select2-tag', true); + + self._removeOldTags(); + self.addOptions([$option]); + } + + // Select the item, now that we know there is an option for it + select(item); + } + + function select (data) { + self.trigger('select', { + data: data + }); + } + + params.term = params.term || ''; + + var tokenData = this.tokenizer(params, this.options, createAndSelect); + + if (tokenData.term !== params.term) { + // Replace the search term if we have the search box + if (this.$search.length) { + this.$search.val(tokenData.term); + this.$search.trigger('focus'); + } + + params.term = tokenData.term; + } + + decorated.call(this, params, callback); + }; + + Tokenizer.prototype.tokenizer = function (_, params, options, callback) { + var separators = options.get('tokenSeparators') || []; + var term = params.term; + var i = 0; + + var createTag = this.createTag || function (params) { + return { + id: params.term, + text: params.term + }; + }; + + while (i < term.length) { + var termChar = term[i]; + + if (separators.indexOf(termChar) === -1) { + i++; + + continue; + } + + var part = term.substr(0, i); + var partParams = $.extend({}, params, { + term: part + }); + + var data = createTag(partParams); + + if (data == null) { + i++; + continue; + } + + callback(data); + + // Reset the term to not include the tokenized portion + term = term.substr(i + 1) || ''; + i = 0; + } + + return { + term: term + }; + }; + + return Tokenizer; +}); + +S2.define('select2/data/minimumInputLength',[ + +], function () { + function MinimumInputLength (decorated, $e, options) { + this.minimumInputLength = options.get('minimumInputLength'); + + decorated.call(this, $e, options); + } + + MinimumInputLength.prototype.query = function (decorated, params, callback) { + params.term = params.term || ''; + + if (params.term.length < this.minimumInputLength) { + this.trigger('results:message', { + message: 'inputTooShort', + args: { + minimum: this.minimumInputLength, + input: params.term, + params: params + } + }); + + return; + } + + decorated.call(this, params, callback); + }; + + return MinimumInputLength; +}); + +S2.define('select2/data/maximumInputLength',[ + +], function () { + function MaximumInputLength (decorated, $e, options) { + this.maximumInputLength = options.get('maximumInputLength'); + + decorated.call(this, $e, options); + } + + MaximumInputLength.prototype.query = function (decorated, params, callback) { + params.term = params.term || ''; + + if (this.maximumInputLength > 0 && + params.term.length > this.maximumInputLength) { + this.trigger('results:message', { + message: 'inputTooLong', + args: { + maximum: this.maximumInputLength, + input: params.term, + params: params + } + }); + + return; + } + + decorated.call(this, params, callback); + }; + + return MaximumInputLength; +}); + +S2.define('select2/data/maximumSelectionLength',[ + +], function (){ + function MaximumSelectionLength (decorated, $e, options) { + this.maximumSelectionLength = options.get('maximumSelectionLength'); + + decorated.call(this, $e, options); + } + + MaximumSelectionLength.prototype.bind = + function (decorated, container, $container) { + var self = this; + + decorated.call(this, container, $container); + + container.on('select', function () { + self._checkIfMaximumSelected(); + }); + }; + + MaximumSelectionLength.prototype.query = + function (decorated, params, callback) { + var self = this; + + this._checkIfMaximumSelected(function () { + decorated.call(self, params, callback); + }); + }; + + MaximumSelectionLength.prototype._checkIfMaximumSelected = + function (_, successCallback) { + var self = this; + + this.current(function (currentData) { + var count = currentData != null ? currentData.length : 0; + if (self.maximumSelectionLength > 0 && + count >= self.maximumSelectionLength) { + self.trigger('results:message', { + message: 'maximumSelected', + args: { + maximum: self.maximumSelectionLength + } + }); + return; + } + + if (successCallback) { + successCallback(); + } + }); + }; + + return MaximumSelectionLength; +}); + +S2.define('select2/dropdown',[ + 'jquery', + './utils' +], function ($, Utils) { + function Dropdown ($element, options) { + this.$element = $element; + this.options = options; + + Dropdown.__super__.constructor.call(this); + } + + Utils.Extend(Dropdown, Utils.Observable); + + Dropdown.prototype.render = function () { + var $dropdown = $( + '' + + '' + + '' + ); + + $dropdown.attr('dir', this.options.get('dir')); + + this.$dropdown = $dropdown; + + return $dropdown; + }; + + Dropdown.prototype.bind = function () { + // Should be implemented in subclasses + }; + + Dropdown.prototype.position = function ($dropdown, $container) { + // Should be implemented in subclasses + }; + + Dropdown.prototype.destroy = function () { + // Remove the dropdown from the DOM + this.$dropdown.remove(); + }; + + return Dropdown; +}); + +S2.define('select2/dropdown/search',[ + 'jquery' +], function ($) { + function Search () { } + + Search.prototype.render = function (decorated) { + var $rendered = decorated.call(this); + var searchLabel = this.options.get('translations').get('search'); + + var $search = $( + '' + + '' + + '' + ); + + this.$searchContainer = $search; + this.$search = $search.find('input'); + + this.$search.prop('autocomplete', this.options.get('autocomplete')); + this.$search.attr('aria-label', searchLabel()); + + $rendered.prepend($search); + + return $rendered; + }; + + Search.prototype.bind = function (decorated, container, $container) { + var self = this; + + var resultsId = container.id + '-results'; + + decorated.call(this, container, $container); + + this.$search.on('keydown', function (evt) { + self.trigger('keypress', evt); + + self._keyUpPrevented = evt.isDefaultPrevented(); + }); + + // Workaround for browsers which do not support the `input` event + // This will prevent double-triggering of events for browsers which support + // both the `keyup` and `input` events. + this.$search.on('input', function (evt) { + // Unbind the duplicated `keyup` event + $(this).off('keyup'); + }); + + this.$search.on('keyup input', function (evt) { + self.handleSearch(evt); + }); + + container.on('open', function () { + self.$search.attr('tabindex', 0); + self.$search.attr('aria-controls', resultsId); + + self.$search.trigger('focus'); + + window.setTimeout(function () { + self.$search.trigger('focus'); + }, 0); + }); + + container.on('close', function () { + self.$search.attr('tabindex', -1); + self.$search.removeAttr('aria-controls'); + self.$search.removeAttr('aria-activedescendant'); + + self.$search.val(''); + self.$search.trigger('blur'); + }); + + container.on('focus', function () { + if (!container.isOpen()) { + self.$search.trigger('focus'); + } + }); + + container.on('results:all', function (params) { + if (params.query.term == null || params.query.term === '') { + var showSearch = self.showSearch(params); + + if (showSearch) { + self.$searchContainer[0].classList.remove('select2-search--hide'); + } else { + self.$searchContainer[0].classList.add('select2-search--hide'); + } + } + }); + + container.on('results:focus', function (params) { + if (params.data._resultId) { + self.$search.attr('aria-activedescendant', params.data._resultId); + } else { + self.$search.removeAttr('aria-activedescendant'); + } + }); + }; + + Search.prototype.handleSearch = function (evt) { + if (!this._keyUpPrevented) { + var input = this.$search.val(); + + this.trigger('query', { + term: input + }); + } + + this._keyUpPrevented = false; + }; + + Search.prototype.showSearch = function (_, params) { + return true; + }; + + return Search; +}); + +S2.define('select2/dropdown/hidePlaceholder',[ + +], function () { + function HidePlaceholder (decorated, $element, options, dataAdapter) { + this.placeholder = this.normalizePlaceholder(options.get('placeholder')); + + decorated.call(this, $element, options, dataAdapter); + } + + HidePlaceholder.prototype.append = function (decorated, data) { + data.results = this.removePlaceholder(data.results); + + decorated.call(this, data); + }; + + HidePlaceholder.prototype.normalizePlaceholder = function (_, placeholder) { + if (typeof placeholder === 'string') { + placeholder = { + id: '', + text: placeholder + }; + } + + return placeholder; + }; + + HidePlaceholder.prototype.removePlaceholder = function (_, data) { + var modifiedData = data.slice(0); + + for (var d = data.length - 1; d >= 0; d--) { + var item = data[d]; + + if (this.placeholder.id === item.id) { + modifiedData.splice(d, 1); + } + } + + return modifiedData; + }; + + return HidePlaceholder; +}); + +S2.define('select2/dropdown/infiniteScroll',[ + 'jquery' +], function ($) { + function InfiniteScroll (decorated, $element, options, dataAdapter) { + this.lastParams = {}; + + decorated.call(this, $element, options, dataAdapter); + + this.$loadingMore = this.createLoadingMore(); + this.loading = false; + } + + InfiniteScroll.prototype.append = function (decorated, data) { + this.$loadingMore.remove(); + this.loading = false; + + decorated.call(this, data); + + if (this.showLoadingMore(data)) { + this.$results.append(this.$loadingMore); + this.loadMoreIfNeeded(); + } + }; + + InfiniteScroll.prototype.bind = function (decorated, container, $container) { + var self = this; + + decorated.call(this, container, $container); + + container.on('query', function (params) { + self.lastParams = params; + self.loading = true; + }); + + container.on('query:append', function (params) { + self.lastParams = params; + self.loading = true; + }); + + this.$results.on('scroll', this.loadMoreIfNeeded.bind(this)); + }; + + InfiniteScroll.prototype.loadMoreIfNeeded = function () { + var isLoadMoreVisible = $.contains( + document.documentElement, + this.$loadingMore[0] + ); + + if (this.loading || !isLoadMoreVisible) { + return; + } + + var currentOffset = this.$results.offset().top + + this.$results.outerHeight(false); + var loadingMoreOffset = this.$loadingMore.offset().top + + this.$loadingMore.outerHeight(false); + + if (currentOffset + 50 >= loadingMoreOffset) { + this.loadMore(); + } + }; + + InfiniteScroll.prototype.loadMore = function () { + this.loading = true; + + var params = $.extend({}, {page: 1}, this.lastParams); + + params.page++; + + this.trigger('query:append', params); + }; + + InfiniteScroll.prototype.showLoadingMore = function (_, data) { + return data.pagination && data.pagination.more; + }; + + InfiniteScroll.prototype.createLoadingMore = function () { + var $option = $( + '
        • ' + ); + + var message = this.options.get('translations').get('loadingMore'); + + $option.html(message(this.lastParams)); + + return $option; + }; + + return InfiniteScroll; +}); + +S2.define('select2/dropdown/attachBody',[ + 'jquery', + '../utils' +], function ($, Utils) { + function AttachBody (decorated, $element, options) { + this.$dropdownParent = $(options.get('dropdownParent') || document.body); + + decorated.call(this, $element, options); + } + + AttachBody.prototype.bind = function (decorated, container, $container) { + var self = this; + + decorated.call(this, container, $container); + + container.on('open', function () { + self._showDropdown(); + self._attachPositioningHandler(container); + + // Must bind after the results handlers to ensure correct sizing + self._bindContainerResultHandlers(container); + }); + + container.on('close', function () { + self._hideDropdown(); + self._detachPositioningHandler(container); + }); + + this.$dropdownContainer.on('mousedown', function (evt) { + evt.stopPropagation(); + }); + }; + + AttachBody.prototype.destroy = function (decorated) { + decorated.call(this); + + this.$dropdownContainer.remove(); + }; + + AttachBody.prototype.position = function (decorated, $dropdown, $container) { + // Clone all of the container classes + $dropdown.attr('class', $container.attr('class')); + + $dropdown[0].classList.remove('select2'); + $dropdown[0].classList.add('select2-container--open'); + + $dropdown.css({ + position: 'absolute', + top: -999999 + }); + + this.$container = $container; + }; + + AttachBody.prototype.render = function (decorated) { + var $container = $(''); + + var $dropdown = decorated.call(this); + $container.append($dropdown); + + this.$dropdownContainer = $container; + + return $container; + }; + + AttachBody.prototype._hideDropdown = function (decorated) { + this.$dropdownContainer.detach(); + }; + + AttachBody.prototype._bindContainerResultHandlers = + function (decorated, container) { + + // These should only be bound once + if (this._containerResultsHandlersBound) { + return; + } + + var self = this; + + container.on('results:all', function () { + self._positionDropdown(); + self._resizeDropdown(); + }); + + container.on('results:append', function () { + self._positionDropdown(); + self._resizeDropdown(); + }); + + container.on('results:message', function () { + self._positionDropdown(); + self._resizeDropdown(); + }); + + container.on('select', function () { + self._positionDropdown(); + self._resizeDropdown(); + }); + + container.on('unselect', function () { + self._positionDropdown(); + self._resizeDropdown(); + }); + + this._containerResultsHandlersBound = true; + }; + + AttachBody.prototype._attachPositioningHandler = + function (decorated, container) { + var self = this; + + var scrollEvent = 'scroll.select2.' + container.id; + var resizeEvent = 'resize.select2.' + container.id; + var orientationEvent = 'orientationchange.select2.' + container.id; + + var $watchers = this.$container.parents().filter(Utils.hasScroll); + $watchers.each(function () { + Utils.StoreData(this, 'select2-scroll-position', { + x: $(this).scrollLeft(), + y: $(this).scrollTop() + }); + }); + + $watchers.on(scrollEvent, function (ev) { + var position = Utils.GetData(this, 'select2-scroll-position'); + $(this).scrollTop(position.y); + }); + + $(window).on(scrollEvent + ' ' + resizeEvent + ' ' + orientationEvent, + function (e) { + self._positionDropdown(); + self._resizeDropdown(); + }); + }; + + AttachBody.prototype._detachPositioningHandler = + function (decorated, container) { + var scrollEvent = 'scroll.select2.' + container.id; + var resizeEvent = 'resize.select2.' + container.id; + var orientationEvent = 'orientationchange.select2.' + container.id; + + var $watchers = this.$container.parents().filter(Utils.hasScroll); + $watchers.off(scrollEvent); + + $(window).off(scrollEvent + ' ' + resizeEvent + ' ' + orientationEvent); + }; + + AttachBody.prototype._positionDropdown = function () { + var $window = $(window); + + var isCurrentlyAbove = this.$dropdown[0].classList + .contains('select2-dropdown--above'); + var isCurrentlyBelow = this.$dropdown[0].classList + .contains('select2-dropdown--below'); + + var newDirection = null; + + var offset = this.$container.offset(); + + offset.bottom = offset.top + this.$container.outerHeight(false); + + var container = { + height: this.$container.outerHeight(false) + }; + + container.top = offset.top; + container.bottom = offset.top + container.height; + + var dropdown = { + height: this.$dropdown.outerHeight(false) + }; + + var viewport = { + top: $window.scrollTop(), + bottom: $window.scrollTop() + $window.height() + }; + + var enoughRoomAbove = viewport.top < (offset.top - dropdown.height); + var enoughRoomBelow = viewport.bottom > (offset.bottom + dropdown.height); + + var css = { + left: offset.left, + top: container.bottom + }; + + // Determine what the parent element is to use for calculating the offset + var $offsetParent = this.$dropdownParent; + + // For statically positioned elements, we need to get the element + // that is determining the offset + if ($offsetParent.css('position') === 'static') { + $offsetParent = $offsetParent.offsetParent(); + } + + var parentOffset = { + top: 0, + left: 0 + }; + + if ( + $.contains(document.body, $offsetParent[0]) || + $offsetParent[0].isConnected + ) { + parentOffset = $offsetParent.offset(); + } + + css.top -= parentOffset.top; + css.left -= parentOffset.left; + + if (!isCurrentlyAbove && !isCurrentlyBelow) { + newDirection = 'below'; + } + + if (!enoughRoomBelow && enoughRoomAbove && !isCurrentlyAbove) { + newDirection = 'above'; + } else if (!enoughRoomAbove && enoughRoomBelow && isCurrentlyAbove) { + newDirection = 'below'; + } + + if (newDirection == 'above' || + (isCurrentlyAbove && newDirection !== 'below')) { + css.top = container.top - parentOffset.top - dropdown.height; + } + + if (newDirection != null) { + this.$dropdown[0].classList.remove('select2-dropdown--below'); + this.$dropdown[0].classList.remove('select2-dropdown--above'); + this.$dropdown[0].classList.add('select2-dropdown--' + newDirection); + + this.$container[0].classList.remove('select2-container--below'); + this.$container[0].classList.remove('select2-container--above'); + this.$container[0].classList.add('select2-container--' + newDirection); + } + + this.$dropdownContainer.css(css); + }; + + AttachBody.prototype._resizeDropdown = function () { + var css = { + width: this.$container.outerWidth(false) + 'px' + }; + + if (this.options.get('dropdownAutoWidth')) { + css.minWidth = css.width; + css.position = 'relative'; + css.width = 'auto'; + } + + this.$dropdown.css(css); + }; + + AttachBody.prototype._showDropdown = function (decorated) { + this.$dropdownContainer.appendTo(this.$dropdownParent); + + this._positionDropdown(); + this._resizeDropdown(); + }; + + return AttachBody; +}); + +S2.define('select2/dropdown/minimumResultsForSearch',[ + +], function () { + function countResults (data) { + var count = 0; + + for (var d = 0; d < data.length; d++) { + var item = data[d]; + + if (item.children) { + count += countResults(item.children); + } else { + count++; + } + } + + return count; + } + + function MinimumResultsForSearch (decorated, $element, options, dataAdapter) { + this.minimumResultsForSearch = options.get('minimumResultsForSearch'); + + if (this.minimumResultsForSearch < 0) { + this.minimumResultsForSearch = Infinity; + } + + decorated.call(this, $element, options, dataAdapter); + } + + MinimumResultsForSearch.prototype.showSearch = function (decorated, params) { + if (countResults(params.data.results) < this.minimumResultsForSearch) { + return false; + } + + return decorated.call(this, params); + }; + + return MinimumResultsForSearch; +}); + +S2.define('select2/dropdown/selectOnClose',[ + '../utils' +], function (Utils) { + function SelectOnClose () { } + + SelectOnClose.prototype.bind = function (decorated, container, $container) { + var self = this; + + decorated.call(this, container, $container); + + container.on('close', function (params) { + self._handleSelectOnClose(params); + }); + }; + + SelectOnClose.prototype._handleSelectOnClose = function (_, params) { + if (params && params.originalSelect2Event != null) { + var event = params.originalSelect2Event; + + // Don't select an item if the close event was triggered from a select or + // unselect event + if (event._type === 'select' || event._type === 'unselect') { + return; + } + } + + var $highlightedResults = this.getHighlightedResults(); + + // Only select highlighted results + if ($highlightedResults.length < 1) { + return; + } + + var data = Utils.GetData($highlightedResults[0], 'data'); + + // Don't re-select already selected resulte + if ( + (data.element != null && data.element.selected) || + (data.element == null && data.selected) + ) { + return; + } + + this.trigger('select', { + data: data + }); + }; + + return SelectOnClose; +}); + +S2.define('select2/dropdown/closeOnSelect',[ + +], function () { + function CloseOnSelect () { } + + CloseOnSelect.prototype.bind = function (decorated, container, $container) { + var self = this; + + decorated.call(this, container, $container); + + container.on('select', function (evt) { + self._selectTriggered(evt); + }); + + container.on('unselect', function (evt) { + self._selectTriggered(evt); + }); + }; + + CloseOnSelect.prototype._selectTriggered = function (_, evt) { + var originalEvent = evt.originalEvent; + + // Don't close if the control key is being held + if (originalEvent && (originalEvent.ctrlKey || originalEvent.metaKey)) { + return; + } + + this.trigger('close', { + originalEvent: originalEvent, + originalSelect2Event: evt + }); + }; + + return CloseOnSelect; +}); + +S2.define('select2/dropdown/dropdownCss',[ + '../utils' +], function (Utils) { + function DropdownCSS () { } + + DropdownCSS.prototype.render = function (decorated) { + var $dropdown = decorated.call(this); + + var dropdownCssClass = this.options.get('dropdownCssClass') || ''; + + if (dropdownCssClass.indexOf(':all:') !== -1) { + dropdownCssClass = dropdownCssClass.replace(':all:', ''); + + Utils.copyNonInternalCssClasses($dropdown[0], this.$element[0]); + } + + $dropdown.addClass(dropdownCssClass); + + return $dropdown; + }; + + return DropdownCSS; +}); + +S2.define('select2/dropdown/tagsSearchHighlight',[ + '../utils' +], function (Utils) { + function TagsSearchHighlight () { } + + TagsSearchHighlight.prototype.highlightFirstItem = function (decorated) { + var $options = this.$results + .find( + '.select2-results__option--selectable' + + ':not(.select2-results__option--selected)' + ); + + if ($options.length > 0) { + var $firstOption = $options.first(); + var data = Utils.GetData($firstOption[0], 'data'); + var firstElement = data.element; + + if (firstElement && firstElement.getAttribute) { + if (firstElement.getAttribute('data-select2-tag') === 'true') { + $firstOption.trigger('mouseenter'); + + return; + } + } + } + + decorated.call(this); + }; + + return TagsSearchHighlight; +}); + +S2.define('select2/i18n/en',[],function () { + // English + return { + errorLoading: function () { + return 'The results could not be loaded.'; + }, + inputTooLong: function (args) { + var overChars = args.input.length - args.maximum; + + var message = 'Please delete ' + overChars + ' character'; + + if (overChars != 1) { + message += 's'; + } + + return message; + }, + inputTooShort: function (args) { + var remainingChars = args.minimum - args.input.length; + + var message = 'Please enter ' + remainingChars + ' or more characters'; + + return message; + }, + loadingMore: function () { + return 'Loading more results…'; + }, + maximumSelected: function (args) { + var message = 'You can only select ' + args.maximum + ' item'; + + if (args.maximum != 1) { + message += 's'; + } + + return message; + }, + noResults: function () { + return 'No results found'; + }, + searching: function () { + return 'Searching…'; + }, + removeAllItems: function () { + return 'Remove all items'; + }, + removeItem: function () { + return 'Remove item'; + }, + search: function() { + return 'Search'; + } + }; +}); + +S2.define('select2/defaults',[ + 'jquery', + + './results', + + './selection/single', + './selection/multiple', + './selection/placeholder', + './selection/allowClear', + './selection/search', + './selection/selectionCss', + './selection/eventRelay', + + './utils', + './translation', + './diacritics', + + './data/select', + './data/array', + './data/ajax', + './data/tags', + './data/tokenizer', + './data/minimumInputLength', + './data/maximumInputLength', + './data/maximumSelectionLength', + + './dropdown', + './dropdown/search', + './dropdown/hidePlaceholder', + './dropdown/infiniteScroll', + './dropdown/attachBody', + './dropdown/minimumResultsForSearch', + './dropdown/selectOnClose', + './dropdown/closeOnSelect', + './dropdown/dropdownCss', + './dropdown/tagsSearchHighlight', + + './i18n/en' +], function ($, + + ResultsList, + + SingleSelection, MultipleSelection, Placeholder, AllowClear, + SelectionSearch, SelectionCSS, EventRelay, + + Utils, Translation, DIACRITICS, + + SelectData, ArrayData, AjaxData, Tags, Tokenizer, + MinimumInputLength, MaximumInputLength, MaximumSelectionLength, + + Dropdown, DropdownSearch, HidePlaceholder, InfiniteScroll, + AttachBody, MinimumResultsForSearch, SelectOnClose, CloseOnSelect, + DropdownCSS, TagsSearchHighlight, + + EnglishTranslation) { + function Defaults () { + this.reset(); + } + + Defaults.prototype.apply = function (options) { + options = $.extend(true, {}, this.defaults, options); + + if (options.dataAdapter == null) { + if (options.ajax != null) { + options.dataAdapter = AjaxData; + } else if (options.data != null) { + options.dataAdapter = ArrayData; + } else { + options.dataAdapter = SelectData; + } + + if (options.minimumInputLength > 0) { + options.dataAdapter = Utils.Decorate( + options.dataAdapter, + MinimumInputLength + ); + } + + if (options.maximumInputLength > 0) { + options.dataAdapter = Utils.Decorate( + options.dataAdapter, + MaximumInputLength + ); + } + + if (options.maximumSelectionLength > 0) { + options.dataAdapter = Utils.Decorate( + options.dataAdapter, + MaximumSelectionLength + ); + } + + if (options.tags) { + options.dataAdapter = Utils.Decorate(options.dataAdapter, Tags); + } + + if (options.tokenSeparators != null || options.tokenizer != null) { + options.dataAdapter = Utils.Decorate( + options.dataAdapter, + Tokenizer + ); + } + } + + if (options.resultsAdapter == null) { + options.resultsAdapter = ResultsList; + + if (options.ajax != null) { + options.resultsAdapter = Utils.Decorate( + options.resultsAdapter, + InfiniteScroll + ); + } + + if (options.placeholder != null) { + options.resultsAdapter = Utils.Decorate( + options.resultsAdapter, + HidePlaceholder + ); + } + + if (options.selectOnClose) { + options.resultsAdapter = Utils.Decorate( + options.resultsAdapter, + SelectOnClose + ); + } + + if (options.tags) { + options.resultsAdapter = Utils.Decorate( + options.resultsAdapter, + TagsSearchHighlight + ); + } + } + + if (options.dropdownAdapter == null) { + if (options.multiple) { + options.dropdownAdapter = Dropdown; + } else { + var SearchableDropdown = Utils.Decorate(Dropdown, DropdownSearch); + + options.dropdownAdapter = SearchableDropdown; + } + + if (options.minimumResultsForSearch !== 0) { + options.dropdownAdapter = Utils.Decorate( + options.dropdownAdapter, + MinimumResultsForSearch + ); + } + + if (options.closeOnSelect) { + options.dropdownAdapter = Utils.Decorate( + options.dropdownAdapter, + CloseOnSelect + ); + } + + if (options.dropdownCssClass != null) { + options.dropdownAdapter = Utils.Decorate( + options.dropdownAdapter, + DropdownCSS + ); + } + + options.dropdownAdapter = Utils.Decorate( + options.dropdownAdapter, + AttachBody + ); + } + + if (options.selectionAdapter == null) { + if (options.multiple) { + options.selectionAdapter = MultipleSelection; + } else { + options.selectionAdapter = SingleSelection; + } + + // Add the placeholder mixin if a placeholder was specified + if (options.placeholder != null) { + options.selectionAdapter = Utils.Decorate( + options.selectionAdapter, + Placeholder + ); + } + + if (options.allowClear) { + options.selectionAdapter = Utils.Decorate( + options.selectionAdapter, + AllowClear + ); + } + + if (options.multiple) { + options.selectionAdapter = Utils.Decorate( + options.selectionAdapter, + SelectionSearch + ); + } + + if (options.selectionCssClass != null) { + options.selectionAdapter = Utils.Decorate( + options.selectionAdapter, + SelectionCSS + ); + } + + options.selectionAdapter = Utils.Decorate( + options.selectionAdapter, + EventRelay + ); + } + + // If the defaults were not previously applied from an element, it is + // possible for the language option to have not been resolved + options.language = this._resolveLanguage(options.language); + + // Always fall back to English since it will always be complete + options.language.push('en'); + + var uniqueLanguages = []; + + for (var l = 0; l < options.language.length; l++) { + var language = options.language[l]; + + if (uniqueLanguages.indexOf(language) === -1) { + uniqueLanguages.push(language); + } + } + + options.language = uniqueLanguages; + + options.translations = this._processTranslations( + options.language, + options.debug + ); + + return options; + }; + + Defaults.prototype.reset = function () { + function stripDiacritics (text) { + // Used 'uni range + named function' from http://jsperf.com/diacritics/18 + function match(a) { + return DIACRITICS[a] || a; + } + + return text.replace(/[^\u0000-\u007E]/g, match); + } + + function matcher (params, data) { + // Always return the object if there is nothing to compare + if (params.term == null || params.term.trim() === '') { + return data; + } + + // Do a recursive check for options with children + if (data.children && data.children.length > 0) { + // Clone the data object if there are children + // This is required as we modify the object to remove any non-matches + var match = $.extend(true, {}, data); + + // Check each child of the option + for (var c = data.children.length - 1; c >= 0; c--) { + var child = data.children[c]; + + var matches = matcher(params, child); + + // If there wasn't a match, remove the object in the array + if (matches == null) { + match.children.splice(c, 1); + } + } + + // If any children matched, return the new object + if (match.children.length > 0) { + return match; + } + + // If there were no matching children, check just the plain object + return matcher(params, match); + } + + var original = stripDiacritics(data.text).toUpperCase(); + var term = stripDiacritics(params.term).toUpperCase(); + + // Check if the text contains the term + if (original.indexOf(term) > -1) { + return data; + } + + // If it doesn't contain the term, don't return anything + return null; + } + + this.defaults = { + amdLanguageBase: './i18n/', + autocomplete: 'off', + closeOnSelect: true, + debug: false, + dropdownAutoWidth: false, + escapeMarkup: Utils.escapeMarkup, + language: {}, + matcher: matcher, + minimumInputLength: 0, + maximumInputLength: 0, + maximumSelectionLength: 0, + minimumResultsForSearch: 0, + selectOnClose: false, + scrollAfterSelect: false, + sorter: function (data) { + return data; + }, + templateResult: function (result) { + return result.text; + }, + templateSelection: function (selection) { + return selection.text; + }, + theme: 'default', + width: 'resolve' + }; + }; + + Defaults.prototype.applyFromElement = function (options, $element) { + var optionLanguage = options.language; + var defaultLanguage = this.defaults.language; + var elementLanguage = $element.prop('lang'); + var parentLanguage = $element.closest('[lang]').prop('lang'); + + var languages = Array.prototype.concat.call( + this._resolveLanguage(elementLanguage), + this._resolveLanguage(optionLanguage), + this._resolveLanguage(defaultLanguage), + this._resolveLanguage(parentLanguage) + ); + + options.language = languages; + + return options; + }; + + Defaults.prototype._resolveLanguage = function (language) { + if (!language) { + return []; + } + + if ($.isEmptyObject(language)) { + return []; + } + + if ($.isPlainObject(language)) { + return [language]; + } + + var languages; + + if (!Array.isArray(language)) { + languages = [language]; + } else { + languages = language; + } + + var resolvedLanguages = []; + + for (var l = 0; l < languages.length; l++) { + resolvedLanguages.push(languages[l]); + + if (typeof languages[l] === 'string' && languages[l].indexOf('-') > 0) { + // Extract the region information if it is included + var languageParts = languages[l].split('-'); + var baseLanguage = languageParts[0]; + + resolvedLanguages.push(baseLanguage); + } + } + + return resolvedLanguages; + }; + + Defaults.prototype._processTranslations = function (languages, debug) { + var translations = new Translation(); + + for (var l = 0; l < languages.length; l++) { + var languageData = new Translation(); + + var language = languages[l]; + + if (typeof language === 'string') { + try { + // Try to load it with the original name + languageData = Translation.loadPath(language); + } catch (e) { + try { + // If we couldn't load it, check if it wasn't the full path + language = this.defaults.amdLanguageBase + language; + languageData = Translation.loadPath(language); + } catch (ex) { + // The translation could not be loaded at all. Sometimes this is + // because of a configuration problem, other times this can be + // because of how Select2 helps load all possible translation files + if (debug && window.console && console.warn) { + console.warn( + 'Select2: The language file for "' + language + '" could ' + + 'not be automatically loaded. A fallback will be used instead.' + ); + } + } + } + } else if ($.isPlainObject(language)) { + languageData = new Translation(language); + } else { + languageData = language; + } + + translations.extend(languageData); + } + + return translations; + }; + + Defaults.prototype.set = function (key, value) { + var camelKey = $.camelCase(key); + + var data = {}; + data[camelKey] = value; + + var convertedData = Utils._convertData(data); + + $.extend(true, this.defaults, convertedData); + }; + + var defaults = new Defaults(); + + return defaults; +}); + +S2.define('select2/options',[ + 'jquery', + './defaults', + './utils' +], function ($, Defaults, Utils) { + function Options (options, $element) { + this.options = options; + + if ($element != null) { + this.fromElement($element); + } + + if ($element != null) { + this.options = Defaults.applyFromElement(this.options, $element); + } + + this.options = Defaults.apply(this.options); + } + + Options.prototype.fromElement = function ($e) { + var excludedData = ['select2']; + + if (this.options.multiple == null) { + this.options.multiple = $e.prop('multiple'); + } + + if (this.options.disabled == null) { + this.options.disabled = $e.prop('disabled'); + } + + if (this.options.autocomplete == null && $e.prop('autocomplete')) { + this.options.autocomplete = $e.prop('autocomplete'); + } + + if (this.options.dir == null) { + if ($e.prop('dir')) { + this.options.dir = $e.prop('dir'); + } else if ($e.closest('[dir]').prop('dir')) { + this.options.dir = $e.closest('[dir]').prop('dir'); + } else { + this.options.dir = 'ltr'; + } + } + + $e.prop('disabled', this.options.disabled); + $e.prop('multiple', this.options.multiple); + + if (Utils.GetData($e[0], 'select2Tags')) { + if (this.options.debug && window.console && console.warn) { + console.warn( + 'Select2: The `data-select2-tags` attribute has been changed to ' + + 'use the `data-data` and `data-tags="true"` attributes and will be ' + + 'removed in future versions of Select2.' + ); + } + + Utils.StoreData($e[0], 'data', Utils.GetData($e[0], 'select2Tags')); + Utils.StoreData($e[0], 'tags', true); + } + + if (Utils.GetData($e[0], 'ajaxUrl')) { + if (this.options.debug && window.console && console.warn) { + console.warn( + 'Select2: The `data-ajax-url` attribute has been changed to ' + + '`data-ajax--url` and support for the old attribute will be removed' + + ' in future versions of Select2.' + ); + } + + $e.attr('ajax--url', Utils.GetData($e[0], 'ajaxUrl')); + Utils.StoreData($e[0], 'ajax-Url', Utils.GetData($e[0], 'ajaxUrl')); + } + + var dataset = {}; + + function upperCaseLetter(_, letter) { + return letter.toUpperCase(); + } + + // Pre-load all of the attributes which are prefixed with `data-` + for (var attr = 0; attr < $e[0].attributes.length; attr++) { + var attributeName = $e[0].attributes[attr].name; + var prefix = 'data-'; + + if (attributeName.substr(0, prefix.length) == prefix) { + // Get the contents of the attribute after `data-` + var dataName = attributeName.substring(prefix.length); + + // Get the data contents from the consistent source + // This is more than likely the jQuery data helper + var dataValue = Utils.GetData($e[0], dataName); + + // camelCase the attribute name to match the spec + var camelDataName = dataName.replace(/-([a-z])/g, upperCaseLetter); + + // Store the data attribute contents into the dataset since + dataset[camelDataName] = dataValue; + } + } + + // Prefer the element's `dataset` attribute if it exists + // jQuery 1.x does not correctly handle data attributes with multiple dashes + if ($.fn.jquery && $.fn.jquery.substr(0, 2) == '1.' && $e[0].dataset) { + dataset = $.extend(true, {}, $e[0].dataset, dataset); + } + + // Prefer our internal data cache if it exists + var data = $.extend(true, {}, Utils.GetData($e[0]), dataset); + + data = Utils._convertData(data); + + for (var key in data) { + if (excludedData.indexOf(key) > -1) { + continue; + } + + if ($.isPlainObject(this.options[key])) { + $.extend(this.options[key], data[key]); + } else { + this.options[key] = data[key]; + } + } + + return this; + }; + + Options.prototype.get = function (key) { + return this.options[key]; + }; + + Options.prototype.set = function (key, val) { + this.options[key] = val; + }; + + return Options; +}); + +S2.define('select2/core',[ + 'jquery', + './options', + './utils', + './keys' +], function ($, Options, Utils, KEYS) { + var Select2 = function ($element, options) { + if (Utils.GetData($element[0], 'select2') != null) { + Utils.GetData($element[0], 'select2').destroy(); + } + + this.$element = $element; + + this.id = this._generateId($element); + + options = options || {}; + + this.options = new Options(options, $element); + + Select2.__super__.constructor.call(this); + + // Set up the tabindex + + var tabindex = $element.attr('tabindex') || 0; + Utils.StoreData($element[0], 'old-tabindex', tabindex); + $element.attr('tabindex', '-1'); + + // Set up containers and adapters + + var DataAdapter = this.options.get('dataAdapter'); + this.dataAdapter = new DataAdapter($element, this.options); + + var $container = this.render(); + + this._placeContainer($container); + + var SelectionAdapter = this.options.get('selectionAdapter'); + this.selection = new SelectionAdapter($element, this.options); + this.$selection = this.selection.render(); + + this.selection.position(this.$selection, $container); + + var DropdownAdapter = this.options.get('dropdownAdapter'); + this.dropdown = new DropdownAdapter($element, this.options); + this.$dropdown = this.dropdown.render(); + + this.dropdown.position(this.$dropdown, $container); + + var ResultsAdapter = this.options.get('resultsAdapter'); + this.results = new ResultsAdapter($element, this.options, this.dataAdapter); + this.$results = this.results.render(); + + this.results.position(this.$results, this.$dropdown); + + // Bind events + + var self = this; + + // Bind the container to all of the adapters + this._bindAdapters(); + + // Register any DOM event handlers + this._registerDomEvents(); + + // Register any internal event handlers + this._registerDataEvents(); + this._registerSelectionEvents(); + this._registerDropdownEvents(); + this._registerResultsEvents(); + this._registerEvents(); + + // Set the initial state + this.dataAdapter.current(function (initialData) { + self.trigger('selection:update', { + data: initialData + }); + }); + + // Hide the original select + $element[0].classList.add('select2-hidden-accessible'); + $element.attr('aria-hidden', 'true'); + + // Synchronize any monitored attributes + this._syncAttributes(); + + Utils.StoreData($element[0], 'select2', this); + + // Ensure backwards compatibility with $element.data('select2'). + $element.data('select2', this); + }; + + Utils.Extend(Select2, Utils.Observable); + + Select2.prototype._generateId = function ($element) { + var id = ''; + + if ($element.attr('id') != null) { + id = $element.attr('id'); + } else if ($element.attr('name') != null) { + id = $element.attr('name') + '-' + Utils.generateChars(2); + } else { + id = Utils.generateChars(4); + } + + id = id.replace(/(:|\.|\[|\]|,)/g, ''); + id = 'select2-' + id; + + return id; + }; + + Select2.prototype._placeContainer = function ($container) { + $container.insertAfter(this.$element); + + var width = this._resolveWidth(this.$element, this.options.get('width')); + + if (width != null) { + $container.css('width', width); + } + }; + + Select2.prototype._resolveWidth = function ($element, method) { + var WIDTH = /^width:(([-+]?([0-9]*\.)?[0-9]+)(px|em|ex|%|in|cm|mm|pt|pc))/i; + + if (method == 'resolve') { + var styleWidth = this._resolveWidth($element, 'style'); + + if (styleWidth != null) { + return styleWidth; + } + + return this._resolveWidth($element, 'element'); + } + + if (method == 'element') { + var elementWidth = $element.outerWidth(false); + + if (elementWidth <= 0) { + return 'auto'; + } + + return elementWidth + 'px'; + } + + if (method == 'style') { + var style = $element.attr('style'); + + if (typeof(style) !== 'string') { + return null; + } + + var attrs = style.split(';'); + + for (var i = 0, l = attrs.length; i < l; i = i + 1) { + var attr = attrs[i].replace(/\s/g, ''); + var matches = attr.match(WIDTH); + + if (matches !== null && matches.length >= 1) { + return matches[1]; + } + } + + return null; + } + + if (method == 'computedstyle') { + var computedStyle = window.getComputedStyle($element[0]); + + return computedStyle.width; + } + + return method; + }; + + Select2.prototype._bindAdapters = function () { + this.dataAdapter.bind(this, this.$container); + this.selection.bind(this, this.$container); + + this.dropdown.bind(this, this.$container); + this.results.bind(this, this.$container); + }; + + Select2.prototype._registerDomEvents = function () { + var self = this; + + this.$element.on('change.select2', function () { + self.dataAdapter.current(function (data) { + self.trigger('selection:update', { + data: data + }); + }); + }); + + this.$element.on('focus.select2', function (evt) { + self.trigger('focus', evt); + }); + + this._syncA = Utils.bind(this._syncAttributes, this); + this._syncS = Utils.bind(this._syncSubtree, this); + + this._observer = new window.MutationObserver(function (mutations) { + self._syncA(); + self._syncS(mutations); + }); + this._observer.observe(this.$element[0], { + attributes: true, + childList: true, + subtree: false + }); + }; + + Select2.prototype._registerDataEvents = function () { + var self = this; + + this.dataAdapter.on('*', function (name, params) { + self.trigger(name, params); + }); + }; + + Select2.prototype._registerSelectionEvents = function () { + var self = this; + var nonRelayEvents = ['toggle', 'focus']; + + this.selection.on('toggle', function () { + self.toggleDropdown(); + }); + + this.selection.on('focus', function (params) { + self.focus(params); + }); + + this.selection.on('*', function (name, params) { + if (nonRelayEvents.indexOf(name) !== -1) { + return; + } + + self.trigger(name, params); + }); + }; + + Select2.prototype._registerDropdownEvents = function () { + var self = this; + + this.dropdown.on('*', function (name, params) { + self.trigger(name, params); + }); + }; + + Select2.prototype._registerResultsEvents = function () { + var self = this; + + this.results.on('*', function (name, params) { + self.trigger(name, params); + }); + }; + + Select2.prototype._registerEvents = function () { + var self = this; + + this.on('open', function () { + self.$container[0].classList.add('select2-container--open'); + }); + + this.on('close', function () { + self.$container[0].classList.remove('select2-container--open'); + }); + + this.on('enable', function () { + self.$container[0].classList.remove('select2-container--disabled'); + }); + + this.on('disable', function () { + self.$container[0].classList.add('select2-container--disabled'); + }); + + this.on('blur', function () { + self.$container[0].classList.remove('select2-container--focus'); + }); + + this.on('query', function (params) { + if (!self.isOpen()) { + self.trigger('open', {}); + } + + this.dataAdapter.query(params, function (data) { + self.trigger('results:all', { + data: data, + query: params + }); + }); + }); + + this.on('query:append', function (params) { + this.dataAdapter.query(params, function (data) { + self.trigger('results:append', { + data: data, + query: params + }); + }); + }); + + this.on('keypress', function (evt) { + var key = evt.which; + + if (self.isOpen()) { + if (key === KEYS.ESC || (key === KEYS.UP && evt.altKey)) { + self.close(evt); + + evt.preventDefault(); + } else if (key === KEYS.ENTER || key === KEYS.TAB) { + self.trigger('results:select', {}); + + evt.preventDefault(); + } else if ((key === KEYS.SPACE && evt.ctrlKey)) { + self.trigger('results:toggle', {}); + + evt.preventDefault(); + } else if (key === KEYS.UP) { + self.trigger('results:previous', {}); + + evt.preventDefault(); + } else if (key === KEYS.DOWN) { + self.trigger('results:next', {}); + + evt.preventDefault(); + } + } else { + if (key === KEYS.ENTER || key === KEYS.SPACE || + (key === KEYS.DOWN && evt.altKey)) { + self.open(); + + evt.preventDefault(); + } + } + }); + }; + + Select2.prototype._syncAttributes = function () { + this.options.set('disabled', this.$element.prop('disabled')); + + if (this.isDisabled()) { + if (this.isOpen()) { + this.close(); + } + + this.trigger('disable', {}); + } else { + this.trigger('enable', {}); + } + }; + + Select2.prototype._isChangeMutation = function (mutations) { + var self = this; + + if (mutations.addedNodes && mutations.addedNodes.length > 0) { + for (var n = 0; n < mutations.addedNodes.length; n++) { + var node = mutations.addedNodes[n]; + + if (node.selected) { + return true; + } + } + } else if (mutations.removedNodes && mutations.removedNodes.length > 0) { + return true; + } else if (Array.isArray(mutations)) { + return mutations.some(function (mutation) { + return self._isChangeMutation(mutation); + }); + } + + return false; + }; + + Select2.prototype._syncSubtree = function (mutations) { + var changed = this._isChangeMutation(mutations); + var self = this; + + // Only re-pull the data if we think there is a change + if (changed) { + this.dataAdapter.current(function (currentData) { + self.trigger('selection:update', { + data: currentData + }); + }); + } + }; + + /** + * Override the trigger method to automatically trigger pre-events when + * there are events that can be prevented. + */ + Select2.prototype.trigger = function (name, args) { + var actualTrigger = Select2.__super__.trigger; + var preTriggerMap = { + 'open': 'opening', + 'close': 'closing', + 'select': 'selecting', + 'unselect': 'unselecting', + 'clear': 'clearing' + }; + + if (args === undefined) { + args = {}; + } + + if (name in preTriggerMap) { + var preTriggerName = preTriggerMap[name]; + var preTriggerArgs = { + prevented: false, + name: name, + args: args + }; + + actualTrigger.call(this, preTriggerName, preTriggerArgs); + + if (preTriggerArgs.prevented) { + args.prevented = true; + + return; + } + } + + actualTrigger.call(this, name, args); + }; + + Select2.prototype.toggleDropdown = function () { + if (this.isDisabled()) { + return; + } + + if (this.isOpen()) { + this.close(); + } else { + this.open(); + } + }; + + Select2.prototype.open = function () { + if (this.isOpen()) { + return; + } + + if (this.isDisabled()) { + return; + } + + this.trigger('query', {}); + }; + + Select2.prototype.close = function (evt) { + if (!this.isOpen()) { + return; + } + + this.trigger('close', { originalEvent : evt }); + }; + + /** + * Helper method to abstract the "enabled" (not "disabled") state of this + * object. + * + * @return {true} if the instance is not disabled. + * @return {false} if the instance is disabled. + */ + Select2.prototype.isEnabled = function () { + return !this.isDisabled(); + }; + + /** + * Helper method to abstract the "disabled" state of this object. + * + * @return {true} if the disabled option is true. + * @return {false} if the disabled option is false. + */ + Select2.prototype.isDisabled = function () { + return this.options.get('disabled'); + }; + + Select2.prototype.isOpen = function () { + return this.$container[0].classList.contains('select2-container--open'); + }; + + Select2.prototype.hasFocus = function () { + return this.$container[0].classList.contains('select2-container--focus'); + }; + + Select2.prototype.focus = function (data) { + // No need to re-trigger focus events if we are already focused + if (this.hasFocus()) { + return; + } + + this.$container[0].classList.add('select2-container--focus'); + this.trigger('focus', {}); + }; + + Select2.prototype.enable = function (args) { + if (this.options.get('debug') && window.console && console.warn) { + console.warn( + 'Select2: The `select2("enable")` method has been deprecated and will' + + ' be removed in later Select2 versions. Use $element.prop("disabled")' + + ' instead.' + ); + } + + if (args == null || args.length === 0) { + args = [true]; + } + + var disabled = !args[0]; + + this.$element.prop('disabled', disabled); + }; + + Select2.prototype.data = function () { + if (this.options.get('debug') && + arguments.length > 0 && window.console && console.warn) { + console.warn( + 'Select2: Data can no longer be set using `select2("data")`. You ' + + 'should consider setting the value instead using `$element.val()`.' + ); + } + + var data = []; + + this.dataAdapter.current(function (currentData) { + data = currentData; + }); + + return data; + }; + + Select2.prototype.val = function (args) { + if (this.options.get('debug') && window.console && console.warn) { + console.warn( + 'Select2: The `select2("val")` method has been deprecated and will be' + + ' removed in later Select2 versions. Use $element.val() instead.' + ); + } + + if (args == null || args.length === 0) { + return this.$element.val(); + } + + var newVal = args[0]; + + if (Array.isArray(newVal)) { + newVal = newVal.map(function (obj) { + return obj.toString(); + }); + } + + this.$element.val(newVal).trigger('input').trigger('change'); + }; + + Select2.prototype.destroy = function () { + Utils.RemoveData(this.$container[0]); + this.$container.remove(); + + this._observer.disconnect(); + this._observer = null; + + this._syncA = null; + this._syncS = null; + + this.$element.off('.select2'); + this.$element.attr('tabindex', + Utils.GetData(this.$element[0], 'old-tabindex')); + + this.$element[0].classList.remove('select2-hidden-accessible'); + this.$element.attr('aria-hidden', 'false'); + Utils.RemoveData(this.$element[0]); + this.$element.removeData('select2'); + + this.dataAdapter.destroy(); + this.selection.destroy(); + this.dropdown.destroy(); + this.results.destroy(); + + this.dataAdapter = null; + this.selection = null; + this.dropdown = null; + this.results = null; + }; + + Select2.prototype.render = function () { + var $container = $( + '' + + '' + + '' + + '' + ); + + $container.attr('dir', this.options.get('dir')); + + this.$container = $container; + + this.$container[0].classList + .add('select2-container--' + this.options.get('theme')); + + Utils.StoreData($container[0], 'element', this.$element); + + return $container; + }; + + return Select2; +}); + +S2.define('jquery-mousewheel',[ + 'jquery' +], function ($) { + // Used to shim jQuery.mousewheel for non-full builds. + return $; +}); + +S2.define('jquery.select2',[ + 'jquery', + 'jquery-mousewheel', + + './select2/core', + './select2/defaults', + './select2/utils' +], function ($, _, Select2, Defaults, Utils) { + if ($.fn.select2 == null) { + // All methods that should return the element + var thisMethods = ['open', 'close', 'destroy']; + + $.fn.select2 = function (options) { + options = options || {}; + + if (typeof options === 'object') { + this.each(function () { + var instanceOptions = $.extend(true, {}, options); + + var instance = new Select2($(this), instanceOptions); + }); + + return this; + } else if (typeof options === 'string') { + var ret; + var args = Array.prototype.slice.call(arguments, 1); + + this.each(function () { + var instance = Utils.GetData(this, 'select2'); + + if (instance == null && window.console && console.error) { + console.error( + 'The select2(\'' + options + '\') method was called on an ' + + 'element that is not using Select2.' + ); + } + + ret = instance[options].apply(instance, args); + }); + + // Check if we should be returning `this` + if (thisMethods.indexOf(options) > -1) { + return this; + } + + return ret; + } else { + throw new Error('Invalid arguments for Select2: ' + options); + } + }; + } + + if ($.fn.select2.defaults == null) { + $.fn.select2.defaults = Defaults; + } + + return Select2; +}); + + // Return the AMD loader configuration so it can be used outside of this file + return { + define: S2.define, + require: S2.require + }; +}()); + + // Autoload the jQuery bindings + // We know that all of the modules exist above this, so we're safe + var select2 = S2.require('jquery.select2'); + + // Hold the AMD module references on the jQuery function that was just loaded + // This allows Select2 to use the internal loader outside of this file, such + // as in the language files. + jQuery.fn.select2.amd = S2; + + // Return the Select2 instance for anyone who is importing it. + return select2; +})); diff --git a/includes/vendor/select2/js/select2.min.js b/includes/vendor/select2/js/select2.min.js new file mode 100644 index 00000000..87c0c56e --- /dev/null +++ b/includes/vendor/select2/js/select2.min.js @@ -0,0 +1,2 @@ +/*! Select2 4.1.0-rc.0 | https://github.com/select2/select2/blob/master/LICENSE.md */ +!function(n){"function"==typeof define&&define.amd?define(["jquery"],n):"object"==typeof module&&module.exports?module.exports=function(e,t){return void 0===t&&(t="undefined"!=typeof window?require("jquery"):require("jquery")(e)),n(t),t}:n(jQuery)}(function(t){var e,n,s,p,r,o,h,f,g,m,y,v,i,a,_,s=(t&&t.fn&&t.fn.select2&&t.fn.select2.amd&&(u=t.fn.select2.amd),u&&u.requirejs||(u?n=u:u={},g={},m={},y={},v={},i=Object.prototype.hasOwnProperty,a=[].slice,_=/\.js$/,h=function(e,t){var n,s,i=c(e),r=i[0],t=t[1];return e=i[1],r&&(n=x(r=l(r,t))),r?e=n&&n.normalize?n.normalize(e,(s=t,function(e){return l(e,s)})):l(e,t):(r=(i=c(e=l(e,t)))[0],e=i[1],r&&(n=x(r))),{f:r?r+"!"+e:e,n:e,pr:r,p:n}},f={require:function(e){return w(e)},exports:function(e){var t=g[e];return void 0!==t?t:g[e]={}},module:function(e){return{id:e,uri:"",exports:g[e],config:(t=e,function(){return y&&y.config&&y.config[t]||{}})};var t}},r=function(e,t,n,s){var i,r,o,a,l,c=[],u=typeof n,d=A(s=s||e);if("undefined"==u||"function"==u){for(t=!t.length&&n.length?["require","exports","module"]:t,a=0;a":">",'"':""","'":"'","/":"/"};return"string"!=typeof e?e:String(e).replace(/[&<>"'\/\\]/g,function(e){return t[e]})},s.__cache={};var n=0;return s.GetUniqueElementId=function(e){var t=e.getAttribute("data-select2-id");return null!=t||(t=e.id?"select2-data-"+e.id:"select2-data-"+(++n).toString()+"-"+s.generateChars(4),e.setAttribute("data-select2-id",t)),t},s.StoreData=function(e,t,n){e=s.GetUniqueElementId(e);s.__cache[e]||(s.__cache[e]={}),s.__cache[e][t]=n},s.GetData=function(e,t){var n=s.GetUniqueElementId(e);return t?s.__cache[n]&&null!=s.__cache[n][t]?s.__cache[n][t]:r(e).data(t):s.__cache[n]},s.RemoveData=function(e){var t=s.GetUniqueElementId(e);null!=s.__cache[t]&&delete s.__cache[t],e.removeAttribute("data-select2-id")},s.copyNonInternalCssClasses=function(e,t){var n=(n=e.getAttribute("class").trim().split(/\s+/)).filter(function(e){return 0===e.indexOf("select2-")}),t=(t=t.getAttribute("class").trim().split(/\s+/)).filter(function(e){return 0!==e.indexOf("select2-")}),t=n.concat(t);e.setAttribute("class",t.join(" "))},s}),u.define("select2/results",["jquery","./utils"],function(d,p){function s(e,t,n){this.$element=e,this.data=n,this.options=t,s.__super__.constructor.call(this)}return p.Extend(s,p.Observable),s.prototype.render=function(){var e=d('
            ');return this.options.get("multiple")&&e.attr("aria-multiselectable","true"),this.$results=e},s.prototype.clear=function(){this.$results.empty()},s.prototype.displayMessage=function(e){var t=this.options.get("escapeMarkup");this.clear(),this.hideLoading();var n=d(''),s=this.options.get("translations").get(e.message);n.append(t(s(e.args))),n[0].className+=" select2-results__message",this.$results.append(n)},s.prototype.hideMessages=function(){this.$results.find(".select2-results__message").remove()},s.prototype.append=function(e){this.hideLoading();var t=[];if(null!=e.results&&0!==e.results.length){e.results=this.sort(e.results);for(var n=0;n",{class:"select2-results__options select2-results__options--nested",role:"none"});i.append(l),o.append(a),o.append(i)}else this.template(e,t);return p.StoreData(t,"data",e),t},s.prototype.bind=function(t,e){var i=this,n=t.id+"-results";this.$results.attr("id",n),t.on("results:all",function(e){i.clear(),i.append(e.data),t.isOpen()&&(i.setClasses(),i.highlightFirstItem())}),t.on("results:append",function(e){i.append(e.data),t.isOpen()&&i.setClasses()}),t.on("query",function(e){i.hideMessages(),i.showLoading(e)}),t.on("select",function(){t.isOpen()&&(i.setClasses(),i.options.get("scrollAfterSelect")&&i.highlightFirstItem())}),t.on("unselect",function(){t.isOpen()&&(i.setClasses(),i.options.get("scrollAfterSelect")&&i.highlightFirstItem())}),t.on("open",function(){i.$results.attr("aria-expanded","true"),i.$results.attr("aria-hidden","false"),i.setClasses(),i.ensureHighlightVisible()}),t.on("close",function(){i.$results.attr("aria-expanded","false"),i.$results.attr("aria-hidden","true"),i.$results.removeAttr("aria-activedescendant")}),t.on("results:toggle",function(){var e=i.getHighlightedResults();0!==e.length&&e.trigger("mouseup")}),t.on("results:select",function(){var e,t=i.getHighlightedResults();0!==t.length&&(e=p.GetData(t[0],"data"),t.hasClass("select2-results__option--selected")?i.trigger("close",{}):i.trigger("select",{data:e}))}),t.on("results:previous",function(){var e,t=i.getHighlightedResults(),n=i.$results.find(".select2-results__option--selectable"),s=n.index(t);s<=0||(e=s-1,0===t.length&&(e=0),(s=n.eq(e)).trigger("mouseenter"),t=i.$results.offset().top,n=s.offset().top,s=i.$results.scrollTop()+(n-t),0===e?i.$results.scrollTop(0):n-t<0&&i.$results.scrollTop(s))}),t.on("results:next",function(){var e,t=i.getHighlightedResults(),n=i.$results.find(".select2-results__option--selectable"),s=n.index(t)+1;s>=n.length||((e=n.eq(s)).trigger("mouseenter"),t=i.$results.offset().top+i.$results.outerHeight(!1),n=e.offset().top+e.outerHeight(!1),e=i.$results.scrollTop()+n-t,0===s?i.$results.scrollTop(0):tthis.$results.outerHeight()||s<0)&&this.$results.scrollTop(n))},s.prototype.template=function(e,t){var n=this.options.get("templateResult"),s=this.options.get("escapeMarkup"),e=n(e,t);null==e?t.style.display="none":"string"==typeof e?t.innerHTML=s(e):d(t).append(e)},s}),u.define("select2/keys",[],function(){return{BACKSPACE:8,TAB:9,ENTER:13,SHIFT:16,CTRL:17,ALT:18,ESC:27,SPACE:32,PAGE_UP:33,PAGE_DOWN:34,END:35,HOME:36,LEFT:37,UP:38,RIGHT:39,DOWN:40,DELETE:46}}),u.define("select2/selection/base",["jquery","../utils","../keys"],function(n,s,i){function r(e,t){this.$element=e,this.options=t,r.__super__.constructor.call(this)}return s.Extend(r,s.Observable),r.prototype.render=function(){var e=n('');return this._tabindex=0,null!=s.GetData(this.$element[0],"old-tabindex")?this._tabindex=s.GetData(this.$element[0],"old-tabindex"):null!=this.$element.attr("tabindex")&&(this._tabindex=this.$element.attr("tabindex")),e.attr("title",this.$element.attr("title")),e.attr("tabindex",this._tabindex),e.attr("aria-disabled","false"),this.$selection=e},r.prototype.bind=function(e,t){var n=this,s=e.id+"-results";this.container=e,this.$selection.on("focus",function(e){n.trigger("focus",e)}),this.$selection.on("blur",function(e){n._handleBlur(e)}),this.$selection.on("keydown",function(e){n.trigger("keypress",e),e.which===i.SPACE&&e.preventDefault()}),e.on("results:focus",function(e){n.$selection.attr("aria-activedescendant",e.data._resultId)}),e.on("selection:update",function(e){n.update(e.data)}),e.on("open",function(){n.$selection.attr("aria-expanded","true"),n.$selection.attr("aria-owns",s),n._attachCloseHandler(e)}),e.on("close",function(){n.$selection.attr("aria-expanded","false"),n.$selection.removeAttr("aria-activedescendant"),n.$selection.removeAttr("aria-owns"),n.$selection.trigger("focus"),n._detachCloseHandler(e)}),e.on("enable",function(){n.$selection.attr("tabindex",n._tabindex),n.$selection.attr("aria-disabled","false")}),e.on("disable",function(){n.$selection.attr("tabindex","-1"),n.$selection.attr("aria-disabled","true")})},r.prototype._handleBlur=function(e){var t=this;window.setTimeout(function(){document.activeElement==t.$selection[0]||n.contains(t.$selection[0],document.activeElement)||t.trigger("blur",e)},1)},r.prototype._attachCloseHandler=function(e){n(document.body).on("mousedown.select2."+e.id,function(e){var t=n(e.target).closest(".select2");n(".select2.select2-container--open").each(function(){this!=t[0]&&s.GetData(this,"element").select2("close")})})},r.prototype._detachCloseHandler=function(e){n(document.body).off("mousedown.select2."+e.id)},r.prototype.position=function(e,t){t.find(".selection").append(e)},r.prototype.destroy=function(){this._detachCloseHandler(this.container)},r.prototype.update=function(e){throw new Error("The `update` method must be defined in child classes.")},r.prototype.isEnabled=function(){return!this.isDisabled()},r.prototype.isDisabled=function(){return this.options.get("disabled")},r}),u.define("select2/selection/single",["jquery","./base","../utils","../keys"],function(e,t,n,s){function i(){i.__super__.constructor.apply(this,arguments)}return n.Extend(i,t),i.prototype.render=function(){var e=i.__super__.render.call(this);return e[0].classList.add("select2-selection--single"),e.html(''),e},i.prototype.bind=function(t,e){var n=this;i.__super__.bind.apply(this,arguments);var s=t.id+"-container";this.$selection.find(".select2-selection__rendered").attr("id",s).attr("role","textbox").attr("aria-readonly","true"),this.$selection.attr("aria-labelledby",s),this.$selection.attr("aria-controls",s),this.$selection.on("mousedown",function(e){1===e.which&&n.trigger("toggle",{originalEvent:e})}),this.$selection.on("focus",function(e){}),this.$selection.on("blur",function(e){}),t.on("focus",function(e){t.isOpen()||n.$selection.trigger("focus")})},i.prototype.clear=function(){var e=this.$selection.find(".select2-selection__rendered");e.empty(),e.removeAttr("title")},i.prototype.display=function(e,t){var n=this.options.get("templateSelection");return this.options.get("escapeMarkup")(n(e,t))},i.prototype.selectionContainer=function(){return e("")},i.prototype.update=function(e){var t,n;0!==e.length?(n=e[0],t=this.$selection.find(".select2-selection__rendered"),e=this.display(n,t),t.empty().append(e),(n=n.title||n.text)?t.attr("title",n):t.removeAttr("title")):this.clear()},i}),u.define("select2/selection/multiple",["jquery","./base","../utils"],function(i,e,c){function r(e,t){r.__super__.constructor.apply(this,arguments)}return c.Extend(r,e),r.prototype.render=function(){var e=r.__super__.render.call(this);return e[0].classList.add("select2-selection--multiple"),e.html('
              '),e},r.prototype.bind=function(e,t){var n=this;r.__super__.bind.apply(this,arguments);var s=e.id+"-container";this.$selection.find(".select2-selection__rendered").attr("id",s),this.$selection.on("click",function(e){n.trigger("toggle",{originalEvent:e})}),this.$selection.on("click",".select2-selection__choice__remove",function(e){var t;n.isDisabled()||(t=i(this).parent(),t=c.GetData(t[0],"data"),n.trigger("unselect",{originalEvent:e,data:t}))}),this.$selection.on("keydown",".select2-selection__choice__remove",function(e){n.isDisabled()||e.stopPropagation()})},r.prototype.clear=function(){var e=this.$selection.find(".select2-selection__rendered");e.empty(),e.removeAttr("title")},r.prototype.display=function(e,t){var n=this.options.get("templateSelection");return this.options.get("escapeMarkup")(n(e,t))},r.prototype.selectionContainer=function(){return i('
            • ')},r.prototype.update=function(e){if(this.clear(),0!==e.length){for(var t=[],n=this.$selection.find(".select2-selection__rendered").attr("id")+"-choice-",s=0;s')).attr("title",s()),e.attr("aria-label",s()),e.attr("aria-describedby",n),a.StoreData(e[0],"data",t),this.$selection.prepend(e),this.$selection[0].classList.add("select2-selection--clearable"))},e}),u.define("select2/selection/search",["jquery","../utils","../keys"],function(s,a,l){function e(e,t,n){e.call(this,t,n)}return e.prototype.render=function(e){var t=this.options.get("translations").get("search"),n=s('');this.$searchContainer=n,this.$search=n.find("textarea"),this.$search.prop("autocomplete",this.options.get("autocomplete")),this.$search.attr("aria-label",t());e=e.call(this);return this._transferTabIndex(),e.append(this.$searchContainer),e},e.prototype.bind=function(e,t,n){var s=this,i=t.id+"-results",r=t.id+"-container";e.call(this,t,n),s.$search.attr("aria-describedby",r),t.on("open",function(){s.$search.attr("aria-controls",i),s.$search.trigger("focus")}),t.on("close",function(){s.$search.val(""),s.resizeSearch(),s.$search.removeAttr("aria-controls"),s.$search.removeAttr("aria-activedescendant"),s.$search.trigger("focus")}),t.on("enable",function(){s.$search.prop("disabled",!1),s._transferTabIndex()}),t.on("disable",function(){s.$search.prop("disabled",!0)}),t.on("focus",function(e){s.$search.trigger("focus")}),t.on("results:focus",function(e){e.data._resultId?s.$search.attr("aria-activedescendant",e.data._resultId):s.$search.removeAttr("aria-activedescendant")}),this.$selection.on("focusin",".select2-search--inline",function(e){s.trigger("focus",e)}),this.$selection.on("focusout",".select2-search--inline",function(e){s._handleBlur(e)}),this.$selection.on("keydown",".select2-search--inline",function(e){var t;e.stopPropagation(),s.trigger("keypress",e),s._keyUpPrevented=e.isDefaultPrevented(),e.which!==l.BACKSPACE||""!==s.$search.val()||0<(t=s.$selection.find(".select2-selection__choice").last()).length&&(t=a.GetData(t[0],"data"),s.searchRemoveChoice(t),e.preventDefault())}),this.$selection.on("click",".select2-search--inline",function(e){s.$search.val()&&e.stopPropagation()});var t=document.documentMode,o=t&&t<=11;this.$selection.on("input.searchcheck",".select2-search--inline",function(e){o?s.$selection.off("input.search input.searchcheck"):s.$selection.off("keyup.search")}),this.$selection.on("keyup.search input.search",".select2-search--inline",function(e){var t;o&&"input"===e.type?s.$selection.off("input.search input.searchcheck"):(t=e.which)!=l.SHIFT&&t!=l.CTRL&&t!=l.ALT&&t!=l.TAB&&s.handleSearch(e)})},e.prototype._transferTabIndex=function(e){this.$search.attr("tabindex",this.$selection.attr("tabindex")),this.$selection.attr("tabindex","-1")},e.prototype.createPlaceholder=function(e,t){this.$search.attr("placeholder",t.text)},e.prototype.update=function(e,t){var n=this.$search[0]==document.activeElement;this.$search.attr("placeholder",""),e.call(this,t),this.resizeSearch(),n&&this.$search.trigger("focus")},e.prototype.handleSearch=function(){var e;this.resizeSearch(),this._keyUpPrevented||(e=this.$search.val(),this.trigger("query",{term:e})),this._keyUpPrevented=!1},e.prototype.searchRemoveChoice=function(e,t){this.trigger("unselect",{data:t}),this.$search.val(t.text),this.handleSearch()},e.prototype.resizeSearch=function(){this.$search.css("width","25px");var e="100%";""===this.$search.attr("placeholder")&&(e=.75*(this.$search.val().length+1)+"em"),this.$search.css("width",e)},e}),u.define("select2/selection/selectionCss",["../utils"],function(n){function e(){}return e.prototype.render=function(e){var t=e.call(this),e=this.options.get("selectionCssClass")||"";return-1!==e.indexOf(":all:")&&(e=e.replace(":all:",""),n.copyNonInternalCssClasses(t[0],this.$element[0])),t.addClass(e),t},e}),u.define("select2/selection/eventRelay",["jquery"],function(o){function e(){}return e.prototype.bind=function(e,t,n){var s=this,i=["open","opening","close","closing","select","selecting","unselect","unselecting","clear","clearing"],r=["opening","closing","selecting","unselecting","clearing"];e.call(this,t,n),t.on("*",function(e,t){var n;-1!==i.indexOf(e)&&(t=t||{},n=o.Event("select2:"+e,{params:t}),s.$element.trigger(n),-1!==r.indexOf(e)&&(t.prevented=n.isDefaultPrevented()))})},e}),u.define("select2/translation",["jquery","require"],function(t,n){function s(e){this.dict=e||{}}return s.prototype.all=function(){return this.dict},s.prototype.get=function(e){return this.dict[e]},s.prototype.extend=function(e){this.dict=t.extend({},e.all(),this.dict)},s._cache={},s.loadPath=function(e){var t;return e in s._cache||(t=n(e),s._cache[e]=t),new s(s._cache[e])},s}),u.define("select2/diacritics",[],function(){return{"Ⓐ":"A","A":"A","À":"A","Á":"A","Â":"A","Ầ":"A","Ấ":"A","Ẫ":"A","Ẩ":"A","Ã":"A","Ā":"A","Ă":"A","Ằ":"A","Ắ":"A","Ẵ":"A","Ẳ":"A","Ȧ":"A","Ǡ":"A","Ä":"A","Ǟ":"A","Ả":"A","Å":"A","Ǻ":"A","Ǎ":"A","Ȁ":"A","Ȃ":"A","Ạ":"A","Ậ":"A","Ặ":"A","Ḁ":"A","Ą":"A","Ⱥ":"A","Ɐ":"A","Ꜳ":"AA","Æ":"AE","Ǽ":"AE","Ǣ":"AE","Ꜵ":"AO","Ꜷ":"AU","Ꜹ":"AV","Ꜻ":"AV","Ꜽ":"AY","Ⓑ":"B","B":"B","Ḃ":"B","Ḅ":"B","Ḇ":"B","Ƀ":"B","Ƃ":"B","Ɓ":"B","Ⓒ":"C","C":"C","Ć":"C","Ĉ":"C","Ċ":"C","Č":"C","Ç":"C","Ḉ":"C","Ƈ":"C","Ȼ":"C","Ꜿ":"C","Ⓓ":"D","D":"D","Ḋ":"D","Ď":"D","Ḍ":"D","Ḑ":"D","Ḓ":"D","Ḏ":"D","Đ":"D","Ƌ":"D","Ɗ":"D","Ɖ":"D","Ꝺ":"D","DZ":"DZ","DŽ":"DZ","Dz":"Dz","Dž":"Dz","Ⓔ":"E","E":"E","È":"E","É":"E","Ê":"E","Ề":"E","Ế":"E","Ễ":"E","Ể":"E","Ẽ":"E","Ē":"E","Ḕ":"E","Ḗ":"E","Ĕ":"E","Ė":"E","Ë":"E","Ẻ":"E","Ě":"E","Ȅ":"E","Ȇ":"E","Ẹ":"E","Ệ":"E","Ȩ":"E","Ḝ":"E","Ę":"E","Ḙ":"E","Ḛ":"E","Ɛ":"E","Ǝ":"E","Ⓕ":"F","F":"F","Ḟ":"F","Ƒ":"F","Ꝼ":"F","Ⓖ":"G","G":"G","Ǵ":"G","Ĝ":"G","Ḡ":"G","Ğ":"G","Ġ":"G","Ǧ":"G","Ģ":"G","Ǥ":"G","Ɠ":"G","Ꞡ":"G","Ᵹ":"G","Ꝿ":"G","Ⓗ":"H","H":"H","Ĥ":"H","Ḣ":"H","Ḧ":"H","Ȟ":"H","Ḥ":"H","Ḩ":"H","Ḫ":"H","Ħ":"H","Ⱨ":"H","Ⱶ":"H","Ɥ":"H","Ⓘ":"I","I":"I","Ì":"I","Í":"I","Î":"I","Ĩ":"I","Ī":"I","Ĭ":"I","İ":"I","Ï":"I","Ḯ":"I","Ỉ":"I","Ǐ":"I","Ȉ":"I","Ȋ":"I","Ị":"I","Į":"I","Ḭ":"I","Ɨ":"I","Ⓙ":"J","J":"J","Ĵ":"J","Ɉ":"J","Ⓚ":"K","K":"K","Ḱ":"K","Ǩ":"K","Ḳ":"K","Ķ":"K","Ḵ":"K","Ƙ":"K","Ⱪ":"K","Ꝁ":"K","Ꝃ":"K","Ꝅ":"K","Ꞣ":"K","Ⓛ":"L","L":"L","Ŀ":"L","Ĺ":"L","Ľ":"L","Ḷ":"L","Ḹ":"L","Ļ":"L","Ḽ":"L","Ḻ":"L","Ł":"L","Ƚ":"L","Ɫ":"L","Ⱡ":"L","Ꝉ":"L","Ꝇ":"L","Ꞁ":"L","LJ":"LJ","Lj":"Lj","Ⓜ":"M","M":"M","Ḿ":"M","Ṁ":"M","Ṃ":"M","Ɱ":"M","Ɯ":"M","Ⓝ":"N","N":"N","Ǹ":"N","Ń":"N","Ñ":"N","Ṅ":"N","Ň":"N","Ṇ":"N","Ņ":"N","Ṋ":"N","Ṉ":"N","Ƞ":"N","Ɲ":"N","Ꞑ":"N","Ꞥ":"N","NJ":"NJ","Nj":"Nj","Ⓞ":"O","O":"O","Ò":"O","Ó":"O","Ô":"O","Ồ":"O","Ố":"O","Ỗ":"O","Ổ":"O","Õ":"O","Ṍ":"O","Ȭ":"O","Ṏ":"O","Ō":"O","Ṑ":"O","Ṓ":"O","Ŏ":"O","Ȯ":"O","Ȱ":"O","Ö":"O","Ȫ":"O","Ỏ":"O","Ő":"O","Ǒ":"O","Ȍ":"O","Ȏ":"O","Ơ":"O","Ờ":"O","Ớ":"O","Ỡ":"O","Ở":"O","Ợ":"O","Ọ":"O","Ộ":"O","Ǫ":"O","Ǭ":"O","Ø":"O","Ǿ":"O","Ɔ":"O","Ɵ":"O","Ꝋ":"O","Ꝍ":"O","Œ":"OE","Ƣ":"OI","Ꝏ":"OO","Ȣ":"OU","Ⓟ":"P","P":"P","Ṕ":"P","Ṗ":"P","Ƥ":"P","Ᵽ":"P","Ꝑ":"P","Ꝓ":"P","Ꝕ":"P","Ⓠ":"Q","Q":"Q","Ꝗ":"Q","Ꝙ":"Q","Ɋ":"Q","Ⓡ":"R","R":"R","Ŕ":"R","Ṙ":"R","Ř":"R","Ȑ":"R","Ȓ":"R","Ṛ":"R","Ṝ":"R","Ŗ":"R","Ṟ":"R","Ɍ":"R","Ɽ":"R","Ꝛ":"R","Ꞧ":"R","Ꞃ":"R","Ⓢ":"S","S":"S","ẞ":"S","Ś":"S","Ṥ":"S","Ŝ":"S","Ṡ":"S","Š":"S","Ṧ":"S","Ṣ":"S","Ṩ":"S","Ș":"S","Ş":"S","Ȿ":"S","Ꞩ":"S","Ꞅ":"S","Ⓣ":"T","T":"T","Ṫ":"T","Ť":"T","Ṭ":"T","Ț":"T","Ţ":"T","Ṱ":"T","Ṯ":"T","Ŧ":"T","Ƭ":"T","Ʈ":"T","Ⱦ":"T","Ꞇ":"T","Ꜩ":"TZ","Ⓤ":"U","U":"U","Ù":"U","Ú":"U","Û":"U","Ũ":"U","Ṹ":"U","Ū":"U","Ṻ":"U","Ŭ":"U","Ü":"U","Ǜ":"U","Ǘ":"U","Ǖ":"U","Ǚ":"U","Ủ":"U","Ů":"U","Ű":"U","Ǔ":"U","Ȕ":"U","Ȗ":"U","Ư":"U","Ừ":"U","Ứ":"U","Ữ":"U","Ử":"U","Ự":"U","Ụ":"U","Ṳ":"U","Ų":"U","Ṷ":"U","Ṵ":"U","Ʉ":"U","Ⓥ":"V","V":"V","Ṽ":"V","Ṿ":"V","Ʋ":"V","Ꝟ":"V","Ʌ":"V","Ꝡ":"VY","Ⓦ":"W","W":"W","Ẁ":"W","Ẃ":"W","Ŵ":"W","Ẇ":"W","Ẅ":"W","Ẉ":"W","Ⱳ":"W","Ⓧ":"X","X":"X","Ẋ":"X","Ẍ":"X","Ⓨ":"Y","Y":"Y","Ỳ":"Y","Ý":"Y","Ŷ":"Y","Ỹ":"Y","Ȳ":"Y","Ẏ":"Y","Ÿ":"Y","Ỷ":"Y","Ỵ":"Y","Ƴ":"Y","Ɏ":"Y","Ỿ":"Y","Ⓩ":"Z","Z":"Z","Ź":"Z","Ẑ":"Z","Ż":"Z","Ž":"Z","Ẓ":"Z","Ẕ":"Z","Ƶ":"Z","Ȥ":"Z","Ɀ":"Z","Ⱬ":"Z","Ꝣ":"Z","ⓐ":"a","a":"a","ẚ":"a","à":"a","á":"a","â":"a","ầ":"a","ấ":"a","ẫ":"a","ẩ":"a","ã":"a","ā":"a","ă":"a","ằ":"a","ắ":"a","ẵ":"a","ẳ":"a","ȧ":"a","ǡ":"a","ä":"a","ǟ":"a","ả":"a","å":"a","ǻ":"a","ǎ":"a","ȁ":"a","ȃ":"a","ạ":"a","ậ":"a","ặ":"a","ḁ":"a","ą":"a","ⱥ":"a","ɐ":"a","ꜳ":"aa","æ":"ae","ǽ":"ae","ǣ":"ae","ꜵ":"ao","ꜷ":"au","ꜹ":"av","ꜻ":"av","ꜽ":"ay","ⓑ":"b","b":"b","ḃ":"b","ḅ":"b","ḇ":"b","ƀ":"b","ƃ":"b","ɓ":"b","ⓒ":"c","c":"c","ć":"c","ĉ":"c","ċ":"c","č":"c","ç":"c","ḉ":"c","ƈ":"c","ȼ":"c","ꜿ":"c","ↄ":"c","ⓓ":"d","d":"d","ḋ":"d","ď":"d","ḍ":"d","ḑ":"d","ḓ":"d","ḏ":"d","đ":"d","ƌ":"d","ɖ":"d","ɗ":"d","ꝺ":"d","dz":"dz","dž":"dz","ⓔ":"e","e":"e","è":"e","é":"e","ê":"e","ề":"e","ế":"e","ễ":"e","ể":"e","ẽ":"e","ē":"e","ḕ":"e","ḗ":"e","ĕ":"e","ė":"e","ë":"e","ẻ":"e","ě":"e","ȅ":"e","ȇ":"e","ẹ":"e","ệ":"e","ȩ":"e","ḝ":"e","ę":"e","ḙ":"e","ḛ":"e","ɇ":"e","ɛ":"e","ǝ":"e","ⓕ":"f","f":"f","ḟ":"f","ƒ":"f","ꝼ":"f","ⓖ":"g","g":"g","ǵ":"g","ĝ":"g","ḡ":"g","ğ":"g","ġ":"g","ǧ":"g","ģ":"g","ǥ":"g","ɠ":"g","ꞡ":"g","ᵹ":"g","ꝿ":"g","ⓗ":"h","h":"h","ĥ":"h","ḣ":"h","ḧ":"h","ȟ":"h","ḥ":"h","ḩ":"h","ḫ":"h","ẖ":"h","ħ":"h","ⱨ":"h","ⱶ":"h","ɥ":"h","ƕ":"hv","ⓘ":"i","i":"i","ì":"i","í":"i","î":"i","ĩ":"i","ī":"i","ĭ":"i","ï":"i","ḯ":"i","ỉ":"i","ǐ":"i","ȉ":"i","ȋ":"i","ị":"i","į":"i","ḭ":"i","ɨ":"i","ı":"i","ⓙ":"j","j":"j","ĵ":"j","ǰ":"j","ɉ":"j","ⓚ":"k","k":"k","ḱ":"k","ǩ":"k","ḳ":"k","ķ":"k","ḵ":"k","ƙ":"k","ⱪ":"k","ꝁ":"k","ꝃ":"k","ꝅ":"k","ꞣ":"k","ⓛ":"l","l":"l","ŀ":"l","ĺ":"l","ľ":"l","ḷ":"l","ḹ":"l","ļ":"l","ḽ":"l","ḻ":"l","ſ":"l","ł":"l","ƚ":"l","ɫ":"l","ⱡ":"l","ꝉ":"l","ꞁ":"l","ꝇ":"l","lj":"lj","ⓜ":"m","m":"m","ḿ":"m","ṁ":"m","ṃ":"m","ɱ":"m","ɯ":"m","ⓝ":"n","n":"n","ǹ":"n","ń":"n","ñ":"n","ṅ":"n","ň":"n","ṇ":"n","ņ":"n","ṋ":"n","ṉ":"n","ƞ":"n","ɲ":"n","ʼn":"n","ꞑ":"n","ꞥ":"n","nj":"nj","ⓞ":"o","o":"o","ò":"o","ó":"o","ô":"o","ồ":"o","ố":"o","ỗ":"o","ổ":"o","õ":"o","ṍ":"o","ȭ":"o","ṏ":"o","ō":"o","ṑ":"o","ṓ":"o","ŏ":"o","ȯ":"o","ȱ":"o","ö":"o","ȫ":"o","ỏ":"o","ő":"o","ǒ":"o","ȍ":"o","ȏ":"o","ơ":"o","ờ":"o","ớ":"o","ỡ":"o","ở":"o","ợ":"o","ọ":"o","ộ":"o","ǫ":"o","ǭ":"o","ø":"o","ǿ":"o","ɔ":"o","ꝋ":"o","ꝍ":"o","ɵ":"o","œ":"oe","ƣ":"oi","ȣ":"ou","ꝏ":"oo","ⓟ":"p","p":"p","ṕ":"p","ṗ":"p","ƥ":"p","ᵽ":"p","ꝑ":"p","ꝓ":"p","ꝕ":"p","ⓠ":"q","q":"q","ɋ":"q","ꝗ":"q","ꝙ":"q","ⓡ":"r","r":"r","ŕ":"r","ṙ":"r","ř":"r","ȑ":"r","ȓ":"r","ṛ":"r","ṝ":"r","ŗ":"r","ṟ":"r","ɍ":"r","ɽ":"r","ꝛ":"r","ꞧ":"r","ꞃ":"r","ⓢ":"s","s":"s","ß":"s","ś":"s","ṥ":"s","ŝ":"s","ṡ":"s","š":"s","ṧ":"s","ṣ":"s","ṩ":"s","ș":"s","ş":"s","ȿ":"s","ꞩ":"s","ꞅ":"s","ẛ":"s","ⓣ":"t","t":"t","ṫ":"t","ẗ":"t","ť":"t","ṭ":"t","ț":"t","ţ":"t","ṱ":"t","ṯ":"t","ŧ":"t","ƭ":"t","ʈ":"t","ⱦ":"t","ꞇ":"t","ꜩ":"tz","ⓤ":"u","u":"u","ù":"u","ú":"u","û":"u","ũ":"u","ṹ":"u","ū":"u","ṻ":"u","ŭ":"u","ü":"u","ǜ":"u","ǘ":"u","ǖ":"u","ǚ":"u","ủ":"u","ů":"u","ű":"u","ǔ":"u","ȕ":"u","ȗ":"u","ư":"u","ừ":"u","ứ":"u","ữ":"u","ử":"u","ự":"u","ụ":"u","ṳ":"u","ų":"u","ṷ":"u","ṵ":"u","ʉ":"u","ⓥ":"v","v":"v","ṽ":"v","ṿ":"v","ʋ":"v","ꝟ":"v","ʌ":"v","ꝡ":"vy","ⓦ":"w","w":"w","ẁ":"w","ẃ":"w","ŵ":"w","ẇ":"w","ẅ":"w","ẘ":"w","ẉ":"w","ⱳ":"w","ⓧ":"x","x":"x","ẋ":"x","ẍ":"x","ⓨ":"y","y":"y","ỳ":"y","ý":"y","ŷ":"y","ỹ":"y","ȳ":"y","ẏ":"y","ÿ":"y","ỷ":"y","ẙ":"y","ỵ":"y","ƴ":"y","ɏ":"y","ỿ":"y","ⓩ":"z","z":"z","ź":"z","ẑ":"z","ż":"z","ž":"z","ẓ":"z","ẕ":"z","ƶ":"z","ȥ":"z","ɀ":"z","ⱬ":"z","ꝣ":"z","Ά":"Α","Έ":"Ε","Ή":"Η","Ί":"Ι","Ϊ":"Ι","Ό":"Ο","Ύ":"Υ","Ϋ":"Υ","Ώ":"Ω","ά":"α","έ":"ε","ή":"η","ί":"ι","ϊ":"ι","ΐ":"ι","ό":"ο","ύ":"υ","ϋ":"υ","ΰ":"υ","ώ":"ω","ς":"σ","’":"'"}}),u.define("select2/data/base",["../utils"],function(n){function s(e,t){s.__super__.constructor.call(this)}return n.Extend(s,n.Observable),s.prototype.current=function(e){throw new Error("The `current` method must be defined in child classes.")},s.prototype.query=function(e,t){throw new Error("The `query` method must be defined in child classes.")},s.prototype.bind=function(e,t){},s.prototype.destroy=function(){},s.prototype.generateResultId=function(e,t){e=e.id+"-result-";return e+=n.generateChars(4),null!=t.id?e+="-"+t.id.toString():e+="-"+n.generateChars(4),e},s}),u.define("select2/data/select",["./base","../utils","jquery"],function(e,a,l){function n(e,t){this.$element=e,this.options=t,n.__super__.constructor.call(this)}return a.Extend(n,e),n.prototype.current=function(e){var t=this;e(Array.prototype.map.call(this.$element[0].querySelectorAll(":checked"),function(e){return t.item(l(e))}))},n.prototype.select=function(i){var e,r=this;if(i.selected=!0,null!=i.element&&"option"===i.element.tagName.toLowerCase())return i.element.selected=!0,void this.$element.trigger("input").trigger("change");this.$element.prop("multiple")?this.current(function(e){var t=[];(i=[i]).push.apply(i,e);for(var n=0;nthis.maximumInputLength?this.trigger("results:message",{message:"inputTooLong",args:{maximum:this.maximumInputLength,input:t.term,params:t}}):e.call(this,t,n)},e}),u.define("select2/data/maximumSelectionLength",[],function(){function e(e,t,n){this.maximumSelectionLength=n.get("maximumSelectionLength"),e.call(this,t,n)}return e.prototype.bind=function(e,t,n){var s=this;e.call(this,t,n),t.on("select",function(){s._checkIfMaximumSelected()})},e.prototype.query=function(e,t,n){var s=this;this._checkIfMaximumSelected(function(){e.call(s,t,n)})},e.prototype._checkIfMaximumSelected=function(e,t){var n=this;this.current(function(e){e=null!=e?e.length:0;0=n.maximumSelectionLength?n.trigger("results:message",{message:"maximumSelected",args:{maximum:n.maximumSelectionLength}}):t&&t()})},e}),u.define("select2/dropdown",["jquery","./utils"],function(t,e){function n(e,t){this.$element=e,this.options=t,n.__super__.constructor.call(this)}return e.Extend(n,e.Observable),n.prototype.render=function(){var e=t('');return e.attr("dir",this.options.get("dir")),this.$dropdown=e},n.prototype.bind=function(){},n.prototype.position=function(e,t){},n.prototype.destroy=function(){this.$dropdown.remove()},n}),u.define("select2/dropdown/search",["jquery"],function(r){function e(){}return e.prototype.render=function(e){var t=e.call(this),n=this.options.get("translations").get("search"),e=r('');return this.$searchContainer=e,this.$search=e.find("input"),this.$search.prop("autocomplete",this.options.get("autocomplete")),this.$search.attr("aria-label",n()),t.prepend(e),t},e.prototype.bind=function(e,t,n){var s=this,i=t.id+"-results";e.call(this,t,n),this.$search.on("keydown",function(e){s.trigger("keypress",e),s._keyUpPrevented=e.isDefaultPrevented()}),this.$search.on("input",function(e){r(this).off("keyup")}),this.$search.on("keyup input",function(e){s.handleSearch(e)}),t.on("open",function(){s.$search.attr("tabindex",0),s.$search.attr("aria-controls",i),s.$search.trigger("focus"),window.setTimeout(function(){s.$search.trigger("focus")},0)}),t.on("close",function(){s.$search.attr("tabindex",-1),s.$search.removeAttr("aria-controls"),s.$search.removeAttr("aria-activedescendant"),s.$search.val(""),s.$search.trigger("blur")}),t.on("focus",function(){t.isOpen()||s.$search.trigger("focus")}),t.on("results:all",function(e){null!=e.query.term&&""!==e.query.term||(s.showSearch(e)?s.$searchContainer[0].classList.remove("select2-search--hide"):s.$searchContainer[0].classList.add("select2-search--hide"))}),t.on("results:focus",function(e){e.data._resultId?s.$search.attr("aria-activedescendant",e.data._resultId):s.$search.removeAttr("aria-activedescendant")})},e.prototype.handleSearch=function(e){var t;this._keyUpPrevented||(t=this.$search.val(),this.trigger("query",{term:t})),this._keyUpPrevented=!1},e.prototype.showSearch=function(e,t){return!0},e}),u.define("select2/dropdown/hidePlaceholder",[],function(){function e(e,t,n,s){this.placeholder=this.normalizePlaceholder(n.get("placeholder")),e.call(this,t,n,s)}return e.prototype.append=function(e,t){t.results=this.removePlaceholder(t.results),e.call(this,t)},e.prototype.normalizePlaceholder=function(e,t){return"string"==typeof t&&(t={id:"",text:t}),t},e.prototype.removePlaceholder=function(e,t){for(var n=t.slice(0),s=t.length-1;0<=s;s--){var i=t[s];this.placeholder.id===i.id&&n.splice(s,1)}return n},e}),u.define("select2/dropdown/infiniteScroll",["jquery"],function(n){function e(e,t,n,s){this.lastParams={},e.call(this,t,n,s),this.$loadingMore=this.createLoadingMore(),this.loading=!1}return e.prototype.append=function(e,t){this.$loadingMore.remove(),this.loading=!1,e.call(this,t),this.showLoadingMore(t)&&(this.$results.append(this.$loadingMore),this.loadMoreIfNeeded())},e.prototype.bind=function(e,t,n){var s=this;e.call(this,t,n),t.on("query",function(e){s.lastParams=e,s.loading=!0}),t.on("query:append",function(e){s.lastParams=e,s.loading=!0}),this.$results.on("scroll",this.loadMoreIfNeeded.bind(this))},e.prototype.loadMoreIfNeeded=function(){var e=n.contains(document.documentElement,this.$loadingMore[0]);!this.loading&&e&&(e=this.$results.offset().top+this.$results.outerHeight(!1),this.$loadingMore.offset().top+this.$loadingMore.outerHeight(!1)<=e+50&&this.loadMore())},e.prototype.loadMore=function(){this.loading=!0;var e=n.extend({},{page:1},this.lastParams);e.page++,this.trigger("query:append",e)},e.prototype.showLoadingMore=function(e,t){return t.pagination&&t.pagination.more},e.prototype.createLoadingMore=function(){var e=n('
            • '),t=this.options.get("translations").get("loadingMore");return e.html(t(this.lastParams)),e},e}),u.define("select2/dropdown/attachBody",["jquery","../utils"],function(u,o){function e(e,t,n){this.$dropdownParent=u(n.get("dropdownParent")||document.body),e.call(this,t,n)}return e.prototype.bind=function(e,t,n){var s=this;e.call(this,t,n),t.on("open",function(){s._showDropdown(),s._attachPositioningHandler(t),s._bindContainerResultHandlers(t)}),t.on("close",function(){s._hideDropdown(),s._detachPositioningHandler(t)}),this.$dropdownContainer.on("mousedown",function(e){e.stopPropagation()})},e.prototype.destroy=function(e){e.call(this),this.$dropdownContainer.remove()},e.prototype.position=function(e,t,n){t.attr("class",n.attr("class")),t[0].classList.remove("select2"),t[0].classList.add("select2-container--open"),t.css({position:"absolute",top:-999999}),this.$container=n},e.prototype.render=function(e){var t=u(""),e=e.call(this);return t.append(e),this.$dropdownContainer=t},e.prototype._hideDropdown=function(e){this.$dropdownContainer.detach()},e.prototype._bindContainerResultHandlers=function(e,t){var n;this._containerResultsHandlersBound||(n=this,t.on("results:all",function(){n._positionDropdown(),n._resizeDropdown()}),t.on("results:append",function(){n._positionDropdown(),n._resizeDropdown()}),t.on("results:message",function(){n._positionDropdown(),n._resizeDropdown()}),t.on("select",function(){n._positionDropdown(),n._resizeDropdown()}),t.on("unselect",function(){n._positionDropdown(),n._resizeDropdown()}),this._containerResultsHandlersBound=!0)},e.prototype._attachPositioningHandler=function(e,t){var n=this,s="scroll.select2."+t.id,i="resize.select2."+t.id,r="orientationchange.select2."+t.id,t=this.$container.parents().filter(o.hasScroll);t.each(function(){o.StoreData(this,"select2-scroll-position",{x:u(this).scrollLeft(),y:u(this).scrollTop()})}),t.on(s,function(e){var t=o.GetData(this,"select2-scroll-position");u(this).scrollTop(t.y)}),u(window).on(s+" "+i+" "+r,function(e){n._positionDropdown(),n._resizeDropdown()})},e.prototype._detachPositioningHandler=function(e,t){var n="scroll.select2."+t.id,s="resize.select2."+t.id,t="orientationchange.select2."+t.id;this.$container.parents().filter(o.hasScroll).off(n),u(window).off(n+" "+s+" "+t)},e.prototype._positionDropdown=function(){var e=u(window),t=this.$dropdown[0].classList.contains("select2-dropdown--above"),n=this.$dropdown[0].classList.contains("select2-dropdown--below"),s=null,i=this.$container.offset();i.bottom=i.top+this.$container.outerHeight(!1);var r={height:this.$container.outerHeight(!1)};r.top=i.top,r.bottom=i.top+r.height;var o=this.$dropdown.outerHeight(!1),a=e.scrollTop(),l=e.scrollTop()+e.height(),c=ai.bottom+o,a={left:i.left,top:r.bottom},l=this.$dropdownParent;"static"===l.css("position")&&(l=l.offsetParent());i={top:0,left:0};(u.contains(document.body,l[0])||l[0].isConnected)&&(i=l.offset()),a.top-=i.top,a.left-=i.left,t||n||(s="below"),e||!c||t?!c&&e&&t&&(s="below"):s="above",("above"==s||t&&"below"!==s)&&(a.top=r.top-i.top-o),null!=s&&(this.$dropdown[0].classList.remove("select2-dropdown--below"),this.$dropdown[0].classList.remove("select2-dropdown--above"),this.$dropdown[0].classList.add("select2-dropdown--"+s),this.$container[0].classList.remove("select2-container--below"),this.$container[0].classList.remove("select2-container--above"),this.$container[0].classList.add("select2-container--"+s)),this.$dropdownContainer.css(a)},e.prototype._resizeDropdown=function(){var e={width:this.$container.outerWidth(!1)+"px"};this.options.get("dropdownAutoWidth")&&(e.minWidth=e.width,e.position="relative",e.width="auto"),this.$dropdown.css(e)},e.prototype._showDropdown=function(e){this.$dropdownContainer.appendTo(this.$dropdownParent),this._positionDropdown(),this._resizeDropdown()},e}),u.define("select2/dropdown/minimumResultsForSearch",[],function(){function e(e,t,n,s){this.minimumResultsForSearch=n.get("minimumResultsForSearch"),this.minimumResultsForSearch<0&&(this.minimumResultsForSearch=1/0),e.call(this,t,n,s)}return e.prototype.showSearch=function(e,t){return!(function e(t){for(var n=0,s=0;s');return e.attr("dir",this.options.get("dir")),this.$container=e,this.$container[0].classList.add("select2-container--"+this.options.get("theme")),r.StoreData(e[0],"element",this.$element),e},o}),u.define("jquery-mousewheel",["jquery"],function(e){return e}),u.define("jquery.select2",["jquery","jquery-mousewheel","./select2/core","./select2/defaults","./select2/utils"],function(i,e,r,t,o){var a;return null==i.fn.select2&&(a=["open","close","destroy"],i.fn.select2=function(t){if("object"==typeof(t=t||{}))return this.each(function(){var e=i.extend(!0,{},t);new r(i(this),e)}),this;if("string"!=typeof t)throw new Error("Invalid arguments for Select2: "+t);var n,s=Array.prototype.slice.call(arguments,1);return this.each(function(){var e=o.GetData(this,"select2");null==e&&window.console&&console.error&&console.error("The select2('"+t+"') method was called on an element that is not using Select2."),n=e[t].apply(e,s)}),-1 $_wp_nav_menu_max_depth ? $depth : $_wp_nav_menu_max_depth; + + $indent = ( $depth ) ? str_repeat( "\t", $depth ) : ''; + + ob_start(); + $item_id = esc_attr( $item->ID ); + $removed_args = array( + 'action', + 'customlink-tab', + 'edit-menu-item', + 'menu-item', + 'page-tab', + '_wpnonce', + ); + + $original_title = ''; + if ( 'taxonomy' == $item->type ) { + $original_title = get_term_field( 'name', $item->object_id, $item->object, 'raw' ); + if ( is_wp_error( $original_title ) ) + $original_title = false; + } elseif ( 'post_type' == $item->type ) { + $original_object = get_post( $item->object_id ); + $original_title = $original_object->post_title; + } + + $classes = array( + 'menu-item menu-item-depth-' . $depth, + 'menu-item-' . esc_attr( $item->object ), + 'menu-item-edit-' . ( ( isset( $_GET['edit-menu-item'] ) && $item_id == $_GET['edit-menu-item'] ) ? 'active' : 'inactive'), + ); + + $title = $item->title; + + if ( ! empty( $item->_invalid ) ) { + $classes[] = 'menu-item-invalid'; + /* translators: %s: title of menu item which is invalid */ + $title = sprintf( esc_html__( '%s (Invalid)', 'wp-members' ), $item->title ); + } elseif ( isset( $item->post_status ) && 'draft' == $item->post_status ) { + $classes[] = 'pending'; + /* translators: %s: title of menu item in draft status */ + $title = sprintf( esc_html__( '%s (Pending)', 'wp-members'), $item->title ); + } + + $title = empty( $item->label ) ? $title : $item->label; + + ?> +