wpForo Forum - Version 2.1.0

Version Description

Download this release

Release Info

Developer Tomdever
Plugin Icon 128x128 wpForo Forum
Version 2.1.0
Comparing to
See all releases

Code changes from version 2.0.9 to 2.1.0

Files changed (69) hide show
  1. admin/assets/js/widgets.js +36 -0
  2. admin/listtables/Members.php +21 -18
  3. admin/listtables/Moderations.php +1 -1
  4. admin/listtables/Phrases.php +1 -1
  5. admin/settings/board.php +1 -0
  6. admin/settings/email.php +10 -0
  7. assets/addons/wpforo-coocomerce-memberships/header-off.png +0 -0
  8. assets/addons/wpforo-coocomerce-memberships/header.png +0 -0
  9. assets/addons/wpforo-woocomerce-memberships/header-off.png +0 -0
  10. assets/addons/wpforo-woocomerce-memberships/header.png +0 -0
  11. assets/js/ajax.js +52 -26
  12. assets/js/frontend.js +8 -8
  13. assets/js/widgets.js +48 -1
  14. classes/API.php +14 -17
  15. classes/Actions.php +35 -15
  16. classes/Activity.php +5 -5
  17. classes/Boards.php +18 -1
  18. classes/Cache.php +33 -8
  19. classes/Forms.php +4 -7
  20. classes/Forums.php +21 -21
  21. classes/Members.php +69 -13
  22. classes/Moderation.php +2 -2
  23. classes/Phrases.php +9 -4
  24. classes/Posts.php +55 -18
  25. classes/Settings.php +46 -2
  26. classes/Template.php +46 -9
  27. classes/Topics.php +75 -14
  28. includes/functions-template.php +18 -6
  29. includes/functions.php +91 -81
  30. includes/hooks.php +65 -30
  31. includes/install-sql.php +1 -1
  32. includes/installation.php +1 -0
  33. integrations/UltimateMember.php +1 -2
  34. languages/wpforo.pot +762 -677
  35. modules/mentioning/classes/Actions.php +1 -1
  36. modules/reactions/Reactions.php +540 -363
  37. modules/subscriptions/Subscriptions.php +1 -1
  38. readme.txt +43 -2
  39. themes/2022/members.php +1 -1
  40. themes/2022/profile-activity.php +2 -2
  41. themes/2022/profile-favored.php +1 -1
  42. themes/2022/profile-subscriptions.php +1 -1
  43. themes/2022/recent.php +2 -2
  44. themes/2022/search.php +1 -1
  45. themes/2022/style-rtl.css +6 -0
  46. themes/2022/style.css +8 -2
  47. themes/2022/styles/matrix.css +1 -0
  48. themes/2022/widgets-rtl.css +3 -3
  49. themes/2022/widgets.css +3 -3
  50. themes/classic/layouts/1/forum.php +1 -1
  51. themes/classic/layouts/2/forum.php +1 -1
  52. themes/classic/layouts/3/forum.php +1 -1
  53. themes/classic/layouts/4/forum.php +1 -1
  54. themes/classic/profile-activity.php +2 -2
  55. themes/classic/profile-favored.php +1 -1
  56. themes/classic/profile-subscriptions.php +1 -1
  57. themes/classic/recent.php +2 -2
  58. themes/classic/search.php +1 -1
  59. themes/classic/style-rtl.css +3 -0
  60. themes/classic/style.css +3 -0
  61. themes/classic/widgets-rtl.css +3 -3
  62. themes/classic/widgets.css +3 -3
  63. widgets/Forums.php +63 -32
  64. widgets/OnlineMembers.php +80 -51
  65. widgets/RecentPosts.php +238 -186
  66. widgets/RecentTopics.php +181 -130
  67. widgets/Search.php +53 -23
  68. widgets/Tags.php +68 -36
  69. wpforo.php +15 -10
admin/assets/js/widgets.js ADDED
@@ -0,0 +1,36 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ jQuery.ajaxSetup({
2
+ url: ajaxurl,
3
+ data:{
4
+ referer: window.location.origin + window.location.pathname
5
+ }
6
+ });
7
+
8
+ jQuery( document ).ready( function($){
9
+ var body = $( 'body' );
10
+ body.on( 'change', '.wpf_wdg_limit_per_topic', {}, function () {
11
+ var wrap = $(this).parents('.wpf_wdg_form_wrap')
12
+ var disabled = $(this).val() > 0
13
+ $('.wpf_wdg_orderby', wrap).attr('disabled', disabled)
14
+ $('.wpf_wdg_order', wrap).attr('disabled', disabled)
15
+ });
16
+
17
+ body.on( 'change', '.wpf_wdg_boardid', {}, function(){
18
+ var $this = $( this );
19
+ var wrap = $this.closest( '.wpf-wdg-wrapper' );
20
+ var forumids_dd = $( '.wpf_wdg_forumids', wrap );
21
+ var boardid = $this.val();
22
+ forumids_dd.empty();
23
+
24
+ $.ajax({
25
+ type: 'POST',
26
+ url: ajaxurl + '?wpforo_boardid=' + boardid,
27
+ data: {
28
+ action: 'wpforo_get_forum_tree'
29
+ }
30
+ }).done( function( r ){
31
+ if( r.success ){
32
+ forumids_dd.html( r.data['html'] );
33
+ }
34
+ } );
35
+ } );
36
+ } );
admin/listtables/Members.php CHANGED
@@ -20,11 +20,11 @@ class Members extends WP_List_Table {
20
  function __construct() {
21
  //Set parent defaults
22
  parent::__construct( [
23
- 'singular' => 'member', //singular name of the listed records
24
- 'plural' => 'members', //plural name of the listed records
25
- 'ajax' => false, //does this table support ajax?
26
- 'screen' => 'wpForoMembers',
27
- ] );
28
 
29
  }
30
 
@@ -57,6 +57,8 @@ class Members extends WP_List_Table {
57
  $usergroup = WPF()->usergroup->get_usergroup( $item[ $column_name ] );
58
 
59
  return ! empty( $usergroup['name'] ) ? esc_html( $usergroup['name'] ) : __( 'default', 'wpforo' );
 
 
60
  case 'blog_posts':
61
  return WPF()->member->blog_posts( $item['userid'] );
62
  case 'blog_comments':
@@ -170,17 +172,18 @@ class Members extends WP_List_Table {
170
  */
171
  function get_columns() {
172
  $columns = [
173
- 'cb' => '<input type="checkbox" />', //Render a checkbox instead of text
174
- 'userid' => __( 'ID', 'wpforo' ),
175
- 'display_name' => __( 'Display Name', 'wpforo' ),
176
- 'user_login' => __( 'Login', 'wpforo' ),
177
- 'user_email' => __( 'Email', 'wpforo' ),
178
- 'groupid' => __( 'Group', 'wpforo' ),
179
- 'status' => __( 'Status', 'wpforo' ),
180
- 'online_time' => __( 'Last Login', 'wpforo' ),
181
- 'posts' => __( 'Forum Posts', 'wpforo' ),
182
- 'blog_posts' => __( 'Blog Posts', 'wpforo' ),
183
- 'blog_comments' => __( 'Blog Comments', 'wpforo' ),
 
184
  ];
185
 
186
  return $this->unset_not_permitted_cols( $columns );
@@ -224,7 +227,7 @@ class Members extends WP_List_Table {
224
  unset( $columns['user_email'] );
225
  }
226
  if( ! WPF()->usergroup->can( 'vmg' ) ) {
227
- unset( $columns['groupid'] );
228
  }
229
  if( ! WPF()->usergroup->can( 'bm' ) ) {
230
  unset( $columns['status'] );
@@ -348,7 +351,7 @@ class Members extends WP_List_Table {
348
  $args = [];
349
  if( $s = wpfval( $_REQUEST, 's' ) ) $args['include'] = WPF()->member->search( $s, $search_fields );
350
  $orderby = wpfval( $_REQUEST, 'orderby' );
351
- $order = strtoupper( wpfval( $_REQUEST, 'order' ) );
352
  $filter_by_group = $this->get_filter_by_group_var();
353
  $filter_by_status = $this->get_filter_by_status_var();
354
  if( $filter_by_group !== - 1 ) $args['groupid'] = $filter_by_group;
20
  function __construct() {
21
  //Set parent defaults
22
  parent::__construct( [
23
+ 'singular' => 'member', //singular name of the listed records
24
+ 'plural' => 'members', //plural name of the listed records
25
+ 'ajax' => false, //does this table support ajax?
26
+ 'screen' => 'wpForoMembers',
27
+ ] );
28
 
29
  }
30
 
57
  $usergroup = WPF()->usergroup->get_usergroup( $item[ $column_name ] );
58
 
59
  return ! empty( $usergroup['name'] ) ? esc_html( $usergroup['name'] ) : __( 'default', 'wpforo' );
60
+ case 'secondary_groupids':
61
+ return implode( ', ', WPF()->usergroup->get_secondary_group_names( $item[ $column_name ] ) );
62
  case 'blog_posts':
63
  return WPF()->member->blog_posts( $item['userid'] );
64
  case 'blog_comments':
172
  */
173
  function get_columns() {
174
  $columns = [
175
+ 'cb' => '<input type="checkbox" />', //Render a checkbox instead of text
176
+ 'userid' => __( 'ID', 'wpforo' ),
177
+ 'display_name' => __( 'Display Name', 'wpforo' ),
178
+ 'user_login' => __( 'Login', 'wpforo' ),
179
+ 'user_email' => __( 'Email', 'wpforo' ),
180
+ 'groupid' => __( 'Group', 'wpforo' ),
181
+ 'secondary_groupids' => __( 'Secondary Groups', 'wpforo' ),
182
+ 'status' => __( 'Status', 'wpforo' ),
183
+ 'online_time' => __( 'Last Login', 'wpforo' ),
184
+ 'posts' => __( 'Forum Posts', 'wpforo' ),
185
+ 'blog_posts' => __( 'Blog Posts', 'wpforo' ),
186
+ 'blog_comments' => __( 'Blog Comments', 'wpforo' ),
187
  ];
188
 
189
  return $this->unset_not_permitted_cols( $columns );
227
  unset( $columns['user_email'] );
228
  }
229
  if( ! WPF()->usergroup->can( 'vmg' ) ) {
230
+ unset( $columns['groupid'], $columns['secondary_groupids'] );
231
  }
232
  if( ! WPF()->usergroup->can( 'bm' ) ) {
233
  unset( $columns['status'] );
351
  $args = [];
352
  if( $s = wpfval( $_REQUEST, 's' ) ) $args['include'] = WPF()->member->search( $s, $search_fields );
353
  $orderby = wpfval( $_REQUEST, 'orderby' );
354
+ $order = strtoupper( (string) wpfval( $_REQUEST, 'order' ) );
355
  $filter_by_group = $this->get_filter_by_group_var();
356
  $filter_by_status = $this->get_filter_by_status_var();
357
  if( $filter_by_group !== - 1 ) $args['groupid'] = $filter_by_group;
admin/listtables/Moderations.php CHANGED
@@ -262,7 +262,7 @@ class Moderations extends WP_List_Table {
262
  }
263
  $filter_by_userid = $this->get_filter_by_userid_var();
264
  $orderby = wpfval( $_REQUEST, 'orderby' );
265
- $order = strtoupper( wpfval( $_REQUEST, 'order' ) );
266
  if( $filter_by_userid !== - 1 ) $args['userid'] = $filter_by_userid;
267
 
268
  if( $type = $this->get_filter_by_type_var() ){
262
  }
263
  $filter_by_userid = $this->get_filter_by_userid_var();
264
  $orderby = wpfval( $_REQUEST, 'orderby' );
265
+ $order = strtoupper( (string) wpfval( $_REQUEST, 'order' ) );
266
  if( $filter_by_userid !== - 1 ) $args['userid'] = $filter_by_userid;
267
 
268
  if( $type = $this->get_filter_by_type_var() ){
admin/listtables/Phrases.php CHANGED
@@ -231,7 +231,7 @@ class Phrases extends WP_List_Table {
231
  $args = [ 'langid' => $this->get_filter_by_langid_var() ];
232
  if( $s = wpfval( $_REQUEST, 's' ) ) $args['include'] = WPF()->phrase->search( $s );
233
  $orderby = wpfval( $_REQUEST, 'orderby' );
234
- $order = strtoupper( wpfval( $_REQUEST, 'order' ) );
235
  $filter_by_package = $this->get_filter_by_package_var();
236
  if( $filter_by_package !== - 1 ) $args['package'] = (array) $filter_by_package;
237
  if( in_array( $order, [ 'ASC', 'DESC' ] ) ) $args['order'] = sanitize_text_field( $order );
231
  $args = [ 'langid' => $this->get_filter_by_langid_var() ];
232
  if( $s = wpfval( $_REQUEST, 's' ) ) $args['include'] = WPF()->phrase->search( $s );
233
  $orderby = wpfval( $_REQUEST, 'orderby' );
234
+ $order = strtoupper( (string) wpfval( $_REQUEST, 'order' ) );
235
  $filter_by_package = $this->get_filter_by_package_var();
236
  if( $filter_by_package !== - 1 ) $args['package'] = (array) $filter_by_package;
237
  if( in_array( $order, [ 'ASC', 'DESC' ] ) ) $args['order'] = sanitize_text_field( $order );
admin/settings/board.php CHANGED
@@ -7,6 +7,7 @@
7
  WPF()->settings->header( 'board' );
8
  WPF()->settings->form_field('board', 'under_construction');
9
  WPF()->settings->form_field('board', 'cache');
 
10
  ?>
11
 
12
  <div class="wpf-subtitle">
7
  WPF()->settings->header( 'board' );
8
  WPF()->settings->form_field('board', 'under_construction');
9
  WPF()->settings->form_field('board', 'cache');
10
+ WPF()->settings->form_field('board', 'url_structure');
11
  ?>
12
 
13
  <div class="wpf-subtitle">
admin/settings/email.php CHANGED
@@ -49,3 +49,13 @@ WPF()->settings->form_field( 'email', 'wp_new_user_notification_email_message' )
49
  <?php
50
  WPF()->settings->form_field( 'email', 'overwrite_reset_password_email' );
51
  WPF()->settings->form_field( 'email', 'reset_password_email_message' );
 
 
 
 
 
 
 
 
 
 
49
  <?php
50
  WPF()->settings->form_field( 'email', 'overwrite_reset_password_email' );
51
  WPF()->settings->form_field( 'email', 'reset_password_email_message' );
52
+ ?>
53
+
54
+ <div class="wpf-subtitle">
55
+ <span class="dashicons dashicons-admin-users"></span> <?php _e( 'After User Approve Email', 'wpforo' ) ?>
56
+ <p class="wpf-desc" style="padding: 5px 2px 0;"><?php _e( 'This message comes when moderators has been manually approved a user', 'wpforo' ) ?></p>
57
+ </div>
58
+ <?php
59
+ WPF()->settings->form_field( 'email', 'after_user_approve_email_subject' );
60
+ WPF()->settings->form_field( 'email', 'after_user_approve_email_message' );
61
+ ?>
assets/addons/wpforo-coocomerce-memberships/header-off.png DELETED
Binary file
assets/addons/wpforo-coocomerce-memberships/header.png DELETED
Binary file
assets/addons/wpforo-woocomerce-memberships/header-off.png ADDED
Binary file
assets/addons/wpforo-woocomerce-memberships/header.png ADDED
Binary file
assets/js/ajax.js CHANGED
@@ -312,9 +312,7 @@ $wpf(document).ready(function ($) {
312
  $(".wpf-reply-form-title").html(phrase);
313
  $(".wpf-form-postid", main_form).val(0);
314
 
315
- wpforo_editor.set_content(response.data, wpforo_editor.get_main());
316
-
317
- $('html, body').animate({scrollTop: wrap.offset().top}, 1000);
318
  wpforo_load_hide();
319
  $this.removeClass('wpf-processing');
320
  });
@@ -1431,13 +1429,21 @@ $wpf(document).ready(function ($) {
1431
  inputElement.dispatchEvent(new MouseEvent("click"));
1432
  }
1433
 
1434
- wpforo_wrap.on( 'click', '.wpforo-profile .wpforo-profile-head .wpf-edit-cover:not(.wpf-processing)', function(){
 
 
 
 
 
 
 
1435
  if ( !( window.File && window.FileReader && window.FileList && window.Blob ) ) {
1436
  alert('The File APIs are not fully supported in this browser.');
1437
  return false;
1438
  }
1439
  var that = $( this );
1440
- OpenFileDialog('image/*', function(){
 
1441
  if( this.files.length ) {
1442
  that.addClass( 'wpf-processing' );
1443
  wpforo_load_show('Uploading...');
@@ -1460,35 +1466,58 @@ $wpf(document).ready(function ($) {
1460
  });
1461
  });
1462
 
1463
- wpforo_wrap.on( 'click', '.wpforo-profile .wpforo-follow-user:not(.wpf-processing)', function(){
1464
- var that = $( this );
1465
- var userid = parseInt( that.data('userid') );
1466
- var stat = !parseInt( that.data('stat') );
1467
  that.addClass( 'wpf-processing' );
1468
- wpforo_load_show();
1469
  $wpf.ajax({
1470
  type: 'POST',
1471
  data: {
1472
- userid,
1473
- stat: ( stat ? 1 : 0 ),
1474
- action: 'wpforo_follow_unfollow_user',
1475
- _wpfnonce: wpforo['nonces']['wpforo_follow_unfollow_user'],
1476
  }
1477
  }).done(function( r ){
1478
- if( r.success ){
1479
- that.data( 'stat', r.data['stat'] );
1480
- that.prop( 'stat', r.data['stat'] );
1481
- that.attr( 'stat', r.data['stat'] );
1482
- $( '.wpforo-follow-user-label', that ).text( r.data['phrase'] );
1483
- $( '.wpforo-follow-user-followers-count', that.closest( '.wpforo-follow-wrap' ) ).text( r.data['followers_count'] );
1484
- }
1485
- wpforo_notice_show( r.data['notice'] );
1486
  }).always(function(){
1487
  that.removeClass('wpf-processing');
1488
  wpforo_load_hide();
1489
  });
1490
  });
1491
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1492
  wpforo_wrap.on('click', '.wpforo-post-head .wpf-pb-more', function(){
1493
  var that = $( this );
1494
  var wrap = that.closest( '.wpforo-post-head' );
@@ -1651,10 +1680,7 @@ $wpf(document).ready(function ($) {
1651
  }
1652
  }).done(function( r ){
1653
  if( r.success ) wrap.remove();
1654
- wpforo_notice_show( r.data['notice'] );
1655
- setTimeout( function(){
1656
- wpforo_notice_hide();
1657
- }, 3000 );
1658
  }).always(function(){
1659
  $this.removeClass( 'wpf-processing' );
1660
  });
312
  $(".wpf-reply-form-title").html(phrase);
313
  $(".wpf-form-postid", main_form).val(0);
314
 
315
+ wpforo_editor.set_content(response.data);
 
 
316
  wpforo_load_hide();
317
  $this.removeClass('wpf-processing');
318
  });
1429
  inputElement.dispatchEvent(new MouseEvent("click"));
1430
  }
1431
 
1432
+ wpforo_wrap.on( 'click', '.wpforo-profile .wpforo-profile-head .wpf-edit-cover:not(.wpf-processing)', function( e ){
1433
+ if( e.target.dataset['action'] === 'editcover' ){
1434
+ var options = $( '.wpf-edit-cover-options', $( this ) );
1435
+ options.css( 'display', ( options.is( ':visible' ) ? 'none' : 'flex') );
1436
+ }
1437
+ });
1438
+
1439
+ wpforo_wrap.on( 'click', '.wpforo-profile .wpforo-profile-head .wpf-edit-cover .wpf-upload-cover:not(.wpf-processing)', function(){
1440
  if ( !( window.File && window.FileReader && window.FileList && window.Blob ) ) {
1441
  alert('The File APIs are not fully supported in this browser.');
1442
  return false;
1443
  }
1444
  var that = $( this );
1445
+ that.closest( '.wpf-edit-cover-options' ).hide();
1446
+ OpenFileDialog('image/!*', function(){
1447
  if( this.files.length ) {
1448
  that.addClass( 'wpf-processing' );
1449
  wpforo_load_show('Uploading...');
1466
  });
1467
  });
1468
 
1469
+ wpforo_wrap.on( 'click', '.wpforo-profile .wpforo-profile-head .wpf-edit-cover .wpf-delete-cover:not(.wpf-processing)', function(){
1470
+ var that = $( this );
1471
+ that.closest( '.wpf-edit-cover-options' ).hide();
 
1472
  that.addClass( 'wpf-processing' );
1473
+ wpforo_load_show('Uploading...');
1474
  $wpf.ajax({
1475
  type: 'POST',
1476
  data: {
1477
+ action: 'wpforo_profile_cover_delete',
1478
+ _wpfnonce: wpforo['nonces']['wpforo_profile_cover_delete'],
 
 
1479
  }
1480
  }).done(function( r ){
1481
+ if( r.success ) that.closest('.wpforo-profile-head').css('background-image', 'url(\'' + r.data['background_url'] + '\')');
 
 
 
 
 
 
 
1482
  }).always(function(){
1483
  that.removeClass('wpf-processing');
1484
  wpforo_load_hide();
1485
  });
1486
  });
1487
 
1488
+ wpforo_wrap.on( 'click', '.wpforo-profile .wpforo-follow-user:not(.wpf-processing)', function(){
1489
+ if( document.body.classList.contains( 'logged-in' ) ){
1490
+ var that = $( this );
1491
+ var userid = parseInt( that.data('userid') );
1492
+ var stat = !parseInt( that.data('stat') );
1493
+ that.addClass( 'wpf-processing' );
1494
+ wpforo_load_show();
1495
+ $wpf.ajax({
1496
+ type: 'POST',
1497
+ data: {
1498
+ userid,
1499
+ stat: ( stat ? 1 : 0 ),
1500
+ action: 'wpforo_follow_unfollow_user',
1501
+ _wpfnonce: wpforo['nonces']['wpforo_follow_unfollow_user'],
1502
+ }
1503
+ }).done(function( r ){
1504
+ if( r.success ){
1505
+ that.data( 'stat', r.data['stat'] );
1506
+ that.prop( 'stat', r.data['stat'] );
1507
+ that.attr( 'stat', r.data['stat'] );
1508
+ $( '.wpforo-follow-user-label', that ).text( r.data['phrase'] );
1509
+ $( '.wpforo-follow-user-followers-count', that.closest( '.wpforo-follow-wrap' ) ).text( r.data['followers_count'] );
1510
+ }
1511
+ wpforo_notice_show( r.data['notice'], ( r.success ? 'success' : 'error' ) );
1512
+ }).always(function(){
1513
+ that.removeClass('wpf-processing');
1514
+ wpforo_load_hide();
1515
+ });
1516
+ }else{
1517
+ wpforo_notice_show( wpforo['notice']['login_or_register'] );
1518
+ }
1519
+ });
1520
+
1521
  wpforo_wrap.on('click', '.wpforo-post-head .wpf-pb-more', function(){
1522
  var that = $( this );
1523
  var wrap = that.closest( '.wpforo-post-head' );
1680
  }
1681
  }).done(function( r ){
1682
  if( r.success ) wrap.remove();
1683
+ wpforo_notice_show( r.data['notice'], ( r.success ? 'success' : 'error' ) );
 
 
 
1684
  }).always(function(){
1685
  $this.removeClass( 'wpf-processing' );
1686
  });
assets/js/frontend.js CHANGED
@@ -203,6 +203,7 @@ var wpforo_editor = {
203
  tinymce_focus: function(textareaid, caret_to_end){
204
  textareaid = this.fix_textareaid(textareaid);
205
  if( this.is_tinymce(textareaid) ){
 
206
  var focus_mce = tinymce.get(textareaid);
207
  focus_mce.focus();
208
  if(caret_to_end){
@@ -214,6 +215,7 @@ var wpforo_editor = {
214
  textarea_focus: function(textareaid, caret_to_end){
215
  textareaid = this.fix_textareaid(textareaid);
216
  if( this.is_textarea(textareaid) ){
 
217
  var textarea = $wpf( 'textarea#' + textareaid );
218
  var textarea_val = textarea.val();
219
  textarea.trigger("focus");
@@ -427,16 +429,14 @@ function wpforo_getTextSelection(){
427
  if( !userid ) userid = 0;
428
  var postid = post_wrap.data('postid');
429
  if( !postid ) postid = 0;
430
- var mention_html = '';
431
- var mention = post_wrap.data('mention');
432
- if( userid && mention ){
433
- mention_html = '<div class="wpforo-post-quote-author"><strong> '+ wpforo_phrase('Posted by') +': @' + mention +' </strong></div>';
434
  }else{
435
- mention = '';
436
  }
437
- var editorContent = '<blockquote data-userid="'+ userid +'" data-postid="'+ postid +'" data-mention="'+ mention +'">'+ mention_html +'<p>' + container.innerHTML.replace(/\s*data-[\w-]+="[^"]*?"/gi, '') + '</p></blockquote><p></p>';
438
- wpforo_editor.insert_content( editorContent, wpforo_editor.get_main() );
439
- $wpf('html, body').animate({ scrollTop: $wpf("form.wpforo-main-form").offset().top }, 500);
440
  $wpf(this).remove();
441
  });
442
  toolTip.append(link);
203
  tinymce_focus: function(textareaid, caret_to_end){
204
  textareaid = this.fix_textareaid(textareaid);
205
  if( this.is_tinymce(textareaid) ){
206
+ $wpf('html, body').animate({ scrollTop: ( $wpf('form[data-textareaid="' + textareaid + '"]').offset().top - 200 ) }, 500);
207
  var focus_mce = tinymce.get(textareaid);
208
  focus_mce.focus();
209
  if(caret_to_end){
215
  textarea_focus: function(textareaid, caret_to_end){
216
  textareaid = this.fix_textareaid(textareaid);
217
  if( this.is_textarea(textareaid) ){
218
+ $wpf('html, body').animate({ scrollTop: ($wpf('form[data-textareaid="' + textareaid + '"]').offset().top - 200) }, 500);
219
  var textarea = $wpf( 'textarea#' + textareaid );
220
  var textarea_val = textarea.val();
221
  textarea.trigger("focus");
429
  if( !userid ) userid = 0;
430
  var postid = post_wrap.data('postid');
431
  if( !postid ) postid = 0;
432
+ var editorContent = '';
433
+ if( wpforo_editor.is_tinymce() ){
434
+ editorContent = '[quote data-userid="'+ userid +'" data-postid="'+ postid +'"]<p>' + container.innerHTML.replace(/\s*data-[\w-]+="[^"]*?"/gi, '') + '</p>[/quote]<p></p>';
 
435
  }else{
436
+ editorContent = '[quote data-userid="'+ userid +'" data-postid="'+ postid +'"]' + container.innerHTML.replace(/\s*data-[\w-]+="[^"]*?"/gi, '') + '[/quote]';
437
  }
438
+ wpforo_editor.insert_content( editorContent );
439
+ // $wpf('html, body').animate({ scrollTop: $wpf("form.wpforo-main-form").offset().top }, 500);
 
440
  $wpf(this).remove();
441
  });
442
  toolTip.append(link);
assets/js/widgets.js CHANGED
@@ -50,6 +50,53 @@ jQuery(document).ready(function ($) {
50
  }
51
  });
52
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
53
  });
54
 
55
  function wpforo_bell( wpf_alerts ){
@@ -124,4 +171,4 @@ function wpforo_notifications_ui_update(response){
124
  }
125
  if( response.data.notifications ) jQuery('.wpf-notifications .wpf-notification-content').html( response.data.notifications );
126
  wpforo_bell( wpf_alerts );
127
- }
50
  }
51
  });
52
 
53
+ function do_wpforo_ajax_widget( elem ){
54
+ var j = elem.data( 'json' );
55
+ if( j ){
56
+ if( typeof j !== 'object' ) j = JSON.parse( j );
57
+ if( j['instance'] !== undefined && typeof j['instance'] !== 'object' ) j['instance'] = JSON.parse( j['instance'] );
58
+ if( j['topic_args'] !== undefined && typeof j['topic_args'] !== 'object' ) j['topic_args'] = JSON.parse( j['topic_args'] );
59
+ if( j['post_args'] !== undefined && typeof j['post_args'] !== 'object' ) j['post_args'] = JSON.parse( j['post_args'] );
60
+
61
+ if( j['boardid'] !== undefined ){
62
+ var ajax_url = wpforo_widgets.ajax_url.replace( /[&?]wpforo_boardid=\d*/i, '' );
63
+ ajax_url += (/\?/.test( ajax_url ) ? '&' : '?') + 'wpforo_boardid=' + j['boardid'];
64
+
65
+ if( j['instance'] !== undefined && j['instance']['refresh_interval'] !== undefined ){
66
+ var interval = parseInt( j['instance']['refresh_interval'] );
67
+ }
68
+
69
+ if( j['instance'] !== undefined ) j['instance'] = JSON.stringify( j['instance'] );
70
+ if( j['topic_args'] !== undefined ) j['topic_args'] = JSON.stringify( j['topic_args'] );
71
+ if( j['post_args'] !== undefined ) j['post_args'] = JSON.stringify( j['post_args'] );
72
+
73
+ $.ajax({
74
+ type: 'POST',
75
+ url: ajax_url,
76
+ data: j,
77
+ }).done(function( r ){
78
+ if( r.success ) elem.html( r.data['html'] );
79
+
80
+ if( !isNaN( interval ) && interval > 0 ){
81
+ setTimeout( function(){
82
+ do_wpforo_ajax_widget( elem );
83
+ }, interval * 1000 );
84
+ }
85
+ });
86
+ }
87
+ }
88
+ }
89
+
90
+ function do_wpforo_ajax_widgets(){
91
+ var wdgts = $( '.wpforo-widget-wrap .wpforo-ajax-widget[data-json]' );
92
+ if( wdgts.length ){
93
+ wdgts.each(function( k, v ){
94
+ do_wpforo_ajax_widget( $(v) );
95
+ });
96
+ }
97
+ }
98
+
99
+ do_wpforo_ajax_widgets();
100
  });
101
 
102
  function wpforo_bell( wpf_alerts ){
171
  }
172
  if( response.data.notifications ) jQuery('.wpf-notifications .wpf-notification-content').html( response.data.notifications );
173
  wpforo_bell( wpf_alerts );
174
+ }
classes/API.php CHANGED
@@ -401,6 +401,9 @@ class API {
401
  }
402
 
403
  public function fb_sdk() {
 
 
 
404
  if( wpforo_setting( 'authorization', 'fb_api_id' ) ){
405
  ?>
406
  <script>
@@ -515,24 +518,18 @@ class API {
515
  } else {
516
  ?>
517
  <div class="wpf-sbw wpf-sbw-fb">
518
- <?php if( wpforo_setting( 'social', 'sb_type' ) === 'button_count' ): ?>
519
- <div class="fb-share-button" data-href="<?php echo esc_url( $url ) ?>" data-layout="button_count"
520
- data-size="small" data-mobile-iframe="true">
521
- <a target="_blank"
522
- href="https://www.facebook.com/sharer/sharer.php?u=<?php echo urlencode( $url ) ?>"
523
- class="fb-xfbml-parse-ignore"><?php wpforo_phrase( 'Share' ); ?></a>
524
- </div>
525
- <?php elseif( wpforo_setting( 'social', 'sb_type' ) === 'button' ): ?>
526
- <span class="wpf-sb-button wpf-fb" data-wpfurl="<?php echo esc_url( $url ) ?>">
527
- <i class="fab fa-facebook-f" aria-hidden="true"></i> <span><?php echo wpforo_phrase(
528
- 'Share'
529
- ) ?></span>
530
- </span>
531
- <?php else: ?>
532
- <span class="wpf-sb-button wpf-sb-icon wpf-fb" data-wpfurl="<?php echo esc_url( $url ) ?>">
533
  <i class="fab fa-facebook-f" aria-hidden="true"></i>
534
- </span>
535
- <?php endif; ?>
536
  </div>
537
  <?php
538
  }
401
  }
402
 
403
  public function fb_sdk() {
404
+ // @todo
405
+ // FB SDK is disabled temporarily.
406
+ return false;
407
  if( wpforo_setting( 'authorization', 'fb_api_id' ) ){
408
  ?>
409
  <script>
518
  } else {
519
  ?>
520
  <div class="wpf-sbw wpf-sbw-fb">
521
+ <?php if( wpforo_setting( 'social', 'sb_type' ) === 'button_count' ): ?>
522
+ <a target="_blank" href="https://www.facebook.com/share.php?u=<?php echo urlencode( $url ) ?>"
523
+ class="fb-xfbml-parse-ignore"><?php wpforo_phrase( 'Share' ); ?></a>
524
+ <?php elseif( wpforo_setting( 'social', 'sb_type' ) === 'button' ): ?>
525
+ <a class="wpf-sb-button wpf-fb" href="https://www.facebook.com/share.php?u=<?php echo urlencode($url) ?>" target="_blank">
526
+ <i class="fab fa-facebook-f" aria-hidden="true"></i> <span><?php echo wpforo_phrase('Share') ?></span>
527
+ </a>
528
+ <?php else: ?>
529
+ <a class="wpf-sb-button wpf-sb-icon wpf-fb" href="https://www.facebook.com/share.php?u=<?php echo urlencode($url) ?>" target="_blank">
 
 
 
 
 
 
530
  <i class="fab fa-facebook-f" aria-hidden="true"></i>
531
+ </a>
532
+ <?php endif; ?>
533
  </div>
534
  <?php
535
  }
classes/Actions.php CHANGED
@@ -35,7 +35,6 @@ class Actions {
35
  add_action( 'wpforo_actions', [ $this, 'init_wp_emoji_hooks' ] );
36
 
37
  add_action( 'wpforo_actions', [ $this, 'feed_rss2' ] );
38
- add_action( 'wpforo_actions', [ $this, 'ucf_file_delete' ] );
39
  add_action( 'wpforo_actions', [ $this, 'mark_all_read' ] );
40
  add_action( 'wpforo_actions', [ $this, 'mark_notification_read' ] );
41
 
@@ -45,6 +44,7 @@ class Actions {
45
  add_action( 'wpforo_action_resetpassword_form', [ $this, 'resetpassword_form' ] );
46
  add_action( 'wpforo_action_resetpassword', [ $this, 'resetpassword' ] );
47
  add_action( 'wpforo_action_profile_update', [ $this, 'profile_update' ] );
 
48
  add_action( 'wpforo_action_cantlogin_contact', [ $this, 'cantlogin_contact' ] );
49
 
50
  add_action( 'wpforo_action_topic_add', [ $this, 'topic_add' ] );
@@ -61,6 +61,7 @@ class Actions {
61
  add_action( 'wp_ajax_wpforo_acp_toggle', [ $this, 'acp_toggle' ] );
62
  add_action( 'wp_ajax_wpforo_clear_all_notifications', [ $this, 'clear_all_notifications' ] );
63
  add_action( 'wp_ajax_wpforo_profile_cover_upload', [ $this, 'profile_cover_upload' ] );
 
64
  add_action( 'wp_ajax_wpforo_get_topic_head_more_info', [ $this, 'get_topic_head_more_info' ] );
65
  add_action( 'wp_ajax_nopriv_wpforo_get_topic_head_more_info', [ $this, 'get_topic_head_more_info' ] );
66
  add_action( 'wp_ajax_wpforo_get_topic_overview_chunk', [ $this, 'get_topic_overview_chunk' ] );
@@ -270,7 +271,7 @@ class Actions {
270
  $topic['topicurl'] = wpforo_home_url();
271
  } else {
272
  $topic = wpforo_topic( $topicid );
273
- $topic['topicurl'] = ( wpfval( $topic, 'url' ) ) ? $topic['url'] : WPF()->topic->get_topic_url( $topicid );
274
  $posts = WPF()->post->get_posts( [
275
  'topicid' => $topicid,
276
  'row_count' => $topic_rss_items,
@@ -282,7 +283,7 @@ class Actions {
282
  $member = wpforo_member( $post );
283
  $posts[ $key ]['description'] = wpforo_text( trim( strip_tags( $post['body'] ) ), 190, false );
284
  $posts[ $key ]['content'] = trim( $post['body'] );
285
- $posts[ $key ]['posturl'] = WPF()->post->get_post_url( $post['postid'] );
286
  $posts[ $key ]['author'] = $member['display_name'];
287
  }
288
  WPF()->feed->rss2_topic( $forum, $topic, $posts );
@@ -306,7 +307,7 @@ class Actions {
306
  $member = wpforo_member( $topic );
307
  $topics[ $key ]['description'] = wpforo_text( trim( strip_tags( $post['body'] ) ), 190, false );
308
  $topics[ $key ]['content'] = trim( $post['body'] );
309
- $topics[ $key ]['topicurl'] = WPF()->topic->get_topic_url( $topic['topicid'] );
310
  $topics[ $key ]['author'] = $member['display_name'];
311
  }
312
  WPF()->feed->rss2_forum( $forum, $topics );
@@ -319,15 +320,16 @@ class Actions {
319
  * ucf_file_delete delete /wp-content/uploads/UCFFILENAME
320
  */
321
  public function ucf_file_delete() {
 
322
  if( wpfval( WPF()->GET, 'foro_f' ) && wpfval( WPF()->GET, 'foro_u' ) && wpfval( WPF()->GET, 'foro_n' ) ) {
323
  if( wp_verify_nonce( WPF()->GET['foro_n'], 'wpforo_delete_profile_field' ) ) {
324
  $userid = intval( WPF()->GET['foro_u'] );
325
  $field = sanitize_title( WPF()->GET['foro_f'] );
326
  if( $file = WPF()->member->get_custom_field( $userid, $field ) ) {
327
- $file = WPF()->folders['wp_upload']['dir'] . DIRECTORY_SEPARATOR . ltrim( wpforo_fix_dir_sep( $file ), DIRECTORY_SEPARATOR );
328
  $result = WPF()->member->update_custom_field( $userid, $field, '' );
329
  if( $result ) {
330
- @unlink( $file );
331
  WPF()->phrase->clear_cache();
332
  WPF()->notice->add( 'Deleted Successfully!', 'success' );
333
  } else {
@@ -337,6 +339,9 @@ class Actions {
337
  }
338
  }
339
  }
 
 
 
340
  }
341
 
342
  /**
@@ -426,6 +431,16 @@ class Actions {
426
  wp_send_json_error();
427
  }
428
 
 
 
 
 
 
 
 
 
 
 
429
  public function profiles_default_cover_upload() {
430
 
431
  if( $image_blob = wpfval( $_POST, 'image_blob' ) ){
@@ -687,7 +702,7 @@ class Actions {
687
  $args = $_REQUEST['thread'];
688
  $args['postmetas'] = (array) wpfval( $_REQUEST, 'data' );
689
  if( $topicid = WPF()->topic->add( $args ) ) {
690
- wp_safe_redirect( WPF()->topic->get_topic_url( $topicid ) );
691
  exit();
692
  }
693
  wp_safe_redirect( wpforo_get_request_uri() );
@@ -702,7 +717,7 @@ class Actions {
702
  $args = $_REQUEST['thread'];
703
  $args['postmetas'] = (array) wpfval( $_REQUEST, 'data' );
704
  if( $topicid = WPF()->topic->edit( $args ) ) {
705
- wp_safe_redirect( WPF()->topic->get_topic_url( $topicid ) );
706
  exit();
707
  }
708
  wp_safe_redirect( wpforo_get_request_uri() );
@@ -717,7 +732,7 @@ class Actions {
717
  $args = $_REQUEST['post'];
718
  $args['postmetas'] = (array) wpfval( $_REQUEST, 'data' );
719
  if( $postid = WPF()->post->add( $args ) ) {
720
- wp_safe_redirect( WPF()->post->get_post_url( $postid ) );
721
  exit();
722
  }
723
  wp_safe_redirect( wpforo_get_request_uri() );
@@ -732,7 +747,7 @@ class Actions {
732
  $args = $_REQUEST['post'];
733
  $args['postmetas'] = (array) wpfval( $_REQUEST, 'data' );
734
  if( $postid = WPF()->post->edit( $args ) ) {
735
- wp_safe_redirect( WPF()->post->get_post_url( $postid ) );
736
  exit();
737
  }
738
  wp_safe_redirect( wpforo_get_request_uri() );
@@ -749,7 +764,7 @@ class Actions {
749
  $forumid = intval( wpfval( $_POST['topic_move'], 'forumid' ) );
750
  if( $topicid && $forumid ) {
751
  WPF()->topic->move( $topicid, $forumid );
752
- $url = WPF()->topic->get_topic_url( $topicid, [], false );
753
  wpforo_clean_cache();
754
  wp_safe_redirect( $url );
755
  exit();
@@ -773,7 +788,7 @@ class Actions {
773
  $to_target_title = ( empty( $_POST['wpforo']['to_target_title'] ) ? 0 : 1 );
774
 
775
  if( WPF()->topic->merge( $target, WPF()->current_object['topic'], [], $to_target_title, $append ) ) {
776
- $redirect_to = WPF()->topic->get_topic_url( $target, [], false );
777
  wpforo_clean_cache();
778
  }
779
  } else {
@@ -799,7 +814,7 @@ class Actions {
799
  ];
800
  $to_target_title = ( empty( $_POST['wpforo']['to_target_title'] ) ? 0 : 1 );
801
  if( $topicid = WPF()->topic->split( $args, $to_target_title ) ) {
802
- $redirect_to = WPF()->topic->get_topic_url( $topicid );
803
  }
804
  } else {
805
  if( ! empty( $_POST['wpforo']['target_topic_url'] ) && ! empty( $_POST['wpforo']['posts'] ) ) {
@@ -809,7 +824,7 @@ class Actions {
809
  $to_target_title = ( empty( $_POST['wpforo']['to_target_title'] ) ? 0 : 1 );
810
  $postids = array_map( 'intval', $_POST['wpforo']['posts'] );
811
  if( WPF()->topic->merge( $target, WPF()->current_object['topic'], $postids, $to_target_title, $append ) ) {
812
- $redirect_to = WPF()->topic->get_topic_url( $target );
813
  }
814
  } else {
815
  WPF()->notice->add( 'Target Topic not found', 'error' );
@@ -1815,7 +1830,7 @@ class Actions {
1815
  $topics = WPF()->topic->get_topics( [ 'include' => $topicids, 'row_count' => apply_filters( 'wpforo_suggested_topics_limit', 5 ), 'orderby' => 'created' ] );
1816
  if( $topics ){
1817
  $topics = array_map( function( $topic ){
1818
- $topic['url'] = WPF()->topic->get_topic_url( $topic );
1819
  return $topic;
1820
  }, $topics );
1821
 
@@ -1827,6 +1842,7 @@ class Actions {
1827
  }
1828
 
1829
  public function user_delete() {
 
1830
  if(
1831
  WPF()->current_object['user']
1832
  && ( $action = WPF()->member->get_action( WPF()->current_object['user'], 'delete' ) )
@@ -2335,6 +2351,8 @@ class Actions {
2335
  }
2336
  }
2337
 
 
 
2338
  WPF()->notice->add( 'Successfully Done', 'success' );
2339
  wp_safe_redirect( wp_get_raw_referer() );
2340
  exit();
@@ -2494,6 +2512,8 @@ class Actions {
2494
  $email['wp_new_user_notification_email_subject'] = sanitize_text_field( $email['wp_new_user_notification_email_subject'] );
2495
  $email['wp_new_user_notification_email_message'] = wpforo_kses( $email['wp_new_user_notification_email_message'], 'email' );
2496
  $email['reset_password_email_message'] = wpforo_kses( $email['reset_password_email_message'], 'email' );
 
 
2497
 
2498
  wpforo_update_option( 'wpforo_email', $email );
2499
  }
35
  add_action( 'wpforo_actions', [ $this, 'init_wp_emoji_hooks' ] );
36
 
37
  add_action( 'wpforo_actions', [ $this, 'feed_rss2' ] );
 
38
  add_action( 'wpforo_actions', [ $this, 'mark_all_read' ] );
39
  add_action( 'wpforo_actions', [ $this, 'mark_notification_read' ] );
40
 
44
  add_action( 'wpforo_action_resetpassword_form', [ $this, 'resetpassword_form' ] );
45
  add_action( 'wpforo_action_resetpassword', [ $this, 'resetpassword' ] );
46
  add_action( 'wpforo_action_profile_update', [ $this, 'profile_update' ] );
47
+ add_action( 'wpforo_action_ucf_file_delete', [ $this, 'ucf_file_delete' ] );
48
  add_action( 'wpforo_action_cantlogin_contact', [ $this, 'cantlogin_contact' ] );
49
 
50
  add_action( 'wpforo_action_topic_add', [ $this, 'topic_add' ] );
61
  add_action( 'wp_ajax_wpforo_acp_toggle', [ $this, 'acp_toggle' ] );
62
  add_action( 'wp_ajax_wpforo_clear_all_notifications', [ $this, 'clear_all_notifications' ] );
63
  add_action( 'wp_ajax_wpforo_profile_cover_upload', [ $this, 'profile_cover_upload' ] );
64
+ add_action( 'wp_ajax_wpforo_profile_cover_delete', [ $this, 'profile_cover_delete' ] );
65
  add_action( 'wp_ajax_wpforo_get_topic_head_more_info', [ $this, 'get_topic_head_more_info' ] );
66
  add_action( 'wp_ajax_nopriv_wpforo_get_topic_head_more_info', [ $this, 'get_topic_head_more_info' ] );
67
  add_action( 'wp_ajax_wpforo_get_topic_overview_chunk', [ $this, 'get_topic_overview_chunk' ] );
271
  $topic['topicurl'] = wpforo_home_url();
272
  } else {
273
  $topic = wpforo_topic( $topicid );
274
+ $topic['topicurl'] = ( wpfval( $topic, 'url' ) ) ? $topic['url'] : WPF()->topic->get_url( $topicid );
275
  $posts = WPF()->post->get_posts( [
276
  'topicid' => $topicid,
277
  'row_count' => $topic_rss_items,
283
  $member = wpforo_member( $post );
284
  $posts[ $key ]['description'] = wpforo_text( trim( strip_tags( $post['body'] ) ), 190, false );
285
  $posts[ $key ]['content'] = trim( $post['body'] );
286
+ $posts[ $key ]['posturl'] = WPF()->post->get_url( $post['postid'] );
287
  $posts[ $key ]['author'] = $member['display_name'];
288
  }
289
  WPF()->feed->rss2_topic( $forum, $topic, $posts );
307
  $member = wpforo_member( $topic );
308
  $topics[ $key ]['description'] = wpforo_text( trim( strip_tags( $post['body'] ) ), 190, false );
309
  $topics[ $key ]['content'] = trim( $post['body'] );
310
+ $topics[ $key ]['topicurl'] = WPF()->topic->get_url( $topic['topicid'] );
311
  $topics[ $key ]['author'] = $member['display_name'];
312
  }
313
  WPF()->feed->rss2_forum( $forum, $topics );
320
  * ucf_file_delete delete /wp-content/uploads/UCFFILENAME
321
  */
322
  public function ucf_file_delete() {
323
+ $userid = 0;
324
  if( wpfval( WPF()->GET, 'foro_f' ) && wpfval( WPF()->GET, 'foro_u' ) && wpfval( WPF()->GET, 'foro_n' ) ) {
325
  if( wp_verify_nonce( WPF()->GET['foro_n'], 'wpforo_delete_profile_field' ) ) {
326
  $userid = intval( WPF()->GET['foro_u'] );
327
  $field = sanitize_title( WPF()->GET['foro_f'] );
328
  if( $file = WPF()->member->get_custom_field( $userid, $field ) ) {
329
+ $file = wpforo_fix_upload_dir( $file );
330
  $result = WPF()->member->update_custom_field( $userid, $field, '' );
331
  if( $result ) {
332
+ if( file_exists( $file ) ) @unlink( $file );
333
  WPF()->phrase->clear_cache();
334
  WPF()->notice->add( 'Deleted Successfully!', 'success' );
335
  } else {
339
  }
340
  }
341
  }
342
+
343
+ wp_safe_redirect( $userid ? WPF()->member->get_profile_url( $userid, 'account' ) : wpforo_home_url() );
344
+ exit();
345
  }
346
 
347
  /**
431
  wp_send_json_error();
432
  }
433
 
434
+ public function profile_cover_delete() {
435
+ wpforo_verify_nonce( 'wpforo_profile_cover_delete' );
436
+
437
+ if( WPF()->current_object['user'] && WPF()->usergroup->can( 'upc' ) && WPF()->perm->user_can_edit_account( WPF()->current_object['user'] ) ){
438
+ WPF()->member->update_profile_field( WPF()->current_object['user']['userid'], 'cover', '' );
439
+ wp_send_json_success( [ 'background_url' => wpforo_setting( 'profiles', 'default_cover' ) ] );
440
+ }
441
+ wp_send_json_error();
442
+ }
443
+
444
  public function profiles_default_cover_upload() {
445
 
446
  if( $image_blob = wpfval( $_POST, 'image_blob' ) ){
702
  $args = $_REQUEST['thread'];
703
  $args['postmetas'] = (array) wpfval( $_REQUEST, 'data' );
704
  if( $topicid = WPF()->topic->add( $args ) ) {
705
+ wp_safe_redirect( WPF()->topic->get_url( $topicid ) );
706
  exit();
707
  }
708
  wp_safe_redirect( wpforo_get_request_uri() );
717
  $args = $_REQUEST['thread'];
718
  $args['postmetas'] = (array) wpfval( $_REQUEST, 'data' );
719
  if( $topicid = WPF()->topic->edit( $args ) ) {
720
+ wp_safe_redirect( WPF()->topic->get_url( $topicid ) );
721
  exit();
722
  }
723
  wp_safe_redirect( wpforo_get_request_uri() );
732
  $args = $_REQUEST['post'];
733
  $args['postmetas'] = (array) wpfval( $_REQUEST, 'data' );
734
  if( $postid = WPF()->post->add( $args ) ) {
735
+ wp_safe_redirect( WPF()->post->get_url( $postid ) );
736
  exit();
737
  }
738
  wp_safe_redirect( wpforo_get_request_uri() );
747
  $args = $_REQUEST['post'];
748
  $args['postmetas'] = (array) wpfval( $_REQUEST, 'data' );
749
  if( $postid = WPF()->post->edit( $args ) ) {
750
+ wp_safe_redirect( WPF()->post->get_url( $postid ) );
751
  exit();
752
  }
753
  wp_safe_redirect( wpforo_get_request_uri() );
764
  $forumid = intval( wpfval( $_POST['topic_move'], 'forumid' ) );
765
  if( $topicid && $forumid ) {
766
  WPF()->topic->move( $topicid, $forumid );
767
+ $url = WPF()->topic->get_url( $topicid, [], false );
768
  wpforo_clean_cache();
769
  wp_safe_redirect( $url );
770
  exit();
788
  $to_target_title = ( empty( $_POST['wpforo']['to_target_title'] ) ? 0 : 1 );
789
 
790
  if( WPF()->topic->merge( $target, WPF()->current_object['topic'], [], $to_target_title, $append ) ) {
791
+ $redirect_to = WPF()->topic->get_url( $target, [], false );
792
  wpforo_clean_cache();
793
  }
794
  } else {
814
  ];
815
  $to_target_title = ( empty( $_POST['wpforo']['to_target_title'] ) ? 0 : 1 );
816
  if( $topicid = WPF()->topic->split( $args, $to_target_title ) ) {
817
+ $redirect_to = WPF()->topic->get_url( $topicid );
818
  }
819
  } else {
820
  if( ! empty( $_POST['wpforo']['target_topic_url'] ) && ! empty( $_POST['wpforo']['posts'] ) ) {
824
  $to_target_title = ( empty( $_POST['wpforo']['to_target_title'] ) ? 0 : 1 );
825
  $postids = array_map( 'intval', $_POST['wpforo']['posts'] );
826
  if( WPF()->topic->merge( $target, WPF()->current_object['topic'], $postids, $to_target_title, $append ) ) {
827
+ $redirect_to = WPF()->topic->get_url( $target );
828
  }
829
  } else {
830
  WPF()->notice->add( 'Target Topic not found', 'error' );
1830
  $topics = WPF()->topic->get_topics( [ 'include' => $topicids, 'row_count' => apply_filters( 'wpforo_suggested_topics_limit', 5 ), 'orderby' => 'created' ] );
1831
  if( $topics ){
1832
  $topics = array_map( function( $topic ){
1833
+ $topic['url'] = WPF()->topic->get_url( $topic );
1834
  return $topic;
1835
  }, $topics );
1836
 
1842
  }
1843
 
1844
  public function user_delete() {
1845
+ wpforo_verify_nonce( 'user_delete', 'full' );
1846
  if(
1847
  WPF()->current_object['user']
1848
  && ( $action = WPF()->member->get_action( WPF()->current_object['user'], 'delete' ) )
2351
  }
2352
  }
2353
 
2354
+ wpforo_clean_cache();
2355
+
2356
  WPF()->notice->add( 'Successfully Done', 'success' );
2357
  wp_safe_redirect( wp_get_raw_referer() );
2358
  exit();
2512
  $email['wp_new_user_notification_email_subject'] = sanitize_text_field( $email['wp_new_user_notification_email_subject'] );
2513
  $email['wp_new_user_notification_email_message'] = wpforo_kses( $email['wp_new_user_notification_email_message'], 'email' );
2514
  $email['reset_password_email_message'] = wpforo_kses( $email['reset_password_email_message'], 'email' );
2515
+ $email['after_user_approve_email_subject'] = sanitize_text_field( $email['after_user_approve_email_subject'] );
2516
+ $email['after_user_approve_email_message'] = wpforo_kses( $email['after_user_approve_email_message'], 'email' );
2517
 
2518
  wpforo_update_option( 'wpforo_email', $email );
2519
  }
classes/Activity.php CHANGED
@@ -598,7 +598,7 @@ class Activity {
598
  'itemid' => $post['postid'],
599
  'userid' => $post['userid'],
600
  'content' => $post['body'],
601
- 'permalink' => WPF()->post->get_post_url( $post['postid'] ),
602
  ];
603
  $this->add_notification( 'new_like', $args );
604
  }
@@ -610,7 +610,7 @@ class Activity {
610
  'itemid' => $post['postid'],
611
  'userid' => $post['userid'],
612
  'content' => $post['body'],
613
- 'permalink' => WPF()->post->get_post_url( $post['postid'] ),
614
  ];
615
  $this->add_notification( 'new_dislike', $args );
616
  }
@@ -643,7 +643,7 @@ class Activity {
643
  'itemid' => $post['postid'],
644
  'userid' => $post['userid'],
645
  'content' => $post['body'],
646
- 'permalink' => WPF()->post->get_post_url( $post['postid'] ),
647
  ];
648
  $this->add_notification( 'new_up_vote', $args );
649
  $args = [
@@ -658,7 +658,7 @@ class Activity {
658
  'itemid' => $post['postid'],
659
  'userid' => $post['userid'],
660
  'content' => $post['body'],
661
- 'permalink' => WPF()->post->get_post_url( $post['postid'] ),
662
  ];
663
  $this->add_notification( 'new_down_vote', $args );
664
  $args = [
@@ -678,7 +678,7 @@ class Activity {
678
 
679
  public function update_notification( $post, $status ) {
680
  $post['status'] = $status = intval($status);
681
- $post['posturl'] = WPF()->post->get_post_url( $post['postid'] );
682
  if( wpfval( $post, 'topicid' ) ) {
683
  $topic = WPF()->topic->get_topic( $post['topicid'] );
684
  if( $status ) {
598
  'itemid' => $post['postid'],
599
  'userid' => $post['userid'],
600
  'content' => $post['body'],
601
+ 'permalink' => WPF()->post->get_url( $post['postid'] ),
602
  ];
603
  $this->add_notification( 'new_like', $args );
604
  }
610
  'itemid' => $post['postid'],
611
  'userid' => $post['userid'],
612
  'content' => $post['body'],
613
+ 'permalink' => WPF()->post->get_url( $post['postid'] ),
614
  ];
615
  $this->add_notification( 'new_dislike', $args );
616
  }
643
  'itemid' => $post['postid'],
644
  'userid' => $post['userid'],
645
  'content' => $post['body'],
646
+ 'permalink' => WPF()->post->get_url( $post['postid'] ),
647
  ];
648
  $this->add_notification( 'new_up_vote', $args );
649
  $args = [
658
  'itemid' => $post['postid'],
659
  'userid' => $post['userid'],
660
  'content' => $post['body'],
661
+ 'permalink' => WPF()->post->get_url( $post['postid'] ),
662
  ];
663
  $this->add_notification( 'new_down_vote', $args );
664
  $args = [
678
 
679
  public function update_notification( $post, $status ) {
680
  $post['status'] = $status = intval($status);
681
+ $post['posturl'] = WPF()->post->get_url( $post['postid'] );
682
  if( wpfval( $post, 'topicid' ) ) {
683
  $topic = WPF()->topic->get_topic( $post['topicid'] );
684
  if( $status ) {
classes/Boards.php CHANGED
@@ -381,7 +381,7 @@ class Boards {
381
  $board = [];
382
  if( is_null( $boardid = wpfval( $args, 'boardid' ) ) && is_null( $boardid = wpfval( $get, 'boardid' ) ) && is_null( $boardid = wpfval( $get, 'wpforo_boardid' ) ) ) {
383
  if( wpforo_is_admin() ) {
384
- if( preg_match( '#^wpforo-(?:(\d*)-)?#iu', wpfval( $get, 'page' ), $match ) ) {
385
  if( ! $boardid = (int) wpfval( $get, 'boardid' ) ) {
386
  $boardid = (int) wpfval( $match, 1 );
387
  }
@@ -488,4 +488,21 @@ class Boards {
488
  foreach( $boards as $board ) $boardids[] = $board['boardid'];
489
  return $boardids;
490
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
491
  }
381
  $board = [];
382
  if( is_null( $boardid = wpfval( $args, 'boardid' ) ) && is_null( $boardid = wpfval( $get, 'boardid' ) ) && is_null( $boardid = wpfval( $get, 'wpforo_boardid' ) ) ) {
383
  if( wpforo_is_admin() ) {
384
+ if( preg_match( '#^wpforo-(?:(\d*)-)?#iu', (string) wpfval( $get, 'page' ), $match ) ) {
385
  if( ! $boardid = (int) wpfval( $get, 'boardid' ) ) {
386
  $boardid = (int) wpfval( $match, 1 );
387
  }
488
  foreach( $boards as $board ) $boardids[] = $board['boardid'];
489
  return $boardids;
490
  }
491
+
492
+ public function dropdown( $selected = null ) {
493
+ if( is_null($selected) ) $selected = $this->get_current( 'boardid' );
494
+ $selected = intval( $selected );
495
+
496
+ $html = '';
497
+ foreach ( $this->get_boards( [ 'status' => true ] ) as $board ){
498
+ $html .= sprintf(
499
+ '<option value="%1$d" %2$s>%3$s</option>',
500
+ $board['boardid'],
501
+ selected( $board['boardid'], $selected, false ),
502
+ $board['title'] . '(' . strtok( $board['locale'], '_' ) . ')'
503
+ );
504
+ }
505
+
506
+ return $html;
507
+ }
508
  }
classes/Cache.php CHANGED
@@ -19,6 +19,8 @@ class Cache {
19
  if( ! is_dir( $cache_dir . DIRECTORY_SEPARATOR . 'tag' ) ) $this->mkdir( $cache_dir . DIRECTORY_SEPARATOR . 'tag' );
20
  if( ! is_dir( $cache_dir . DIRECTORY_SEPARATOR . 'item' . DIRECTORY_SEPARATOR . 'tag' ) ) $this->mkdir( $cache_dir . DIRECTORY_SEPARATOR . 'item' . DIRECTORY_SEPARATOR . 'tag' );
21
  if( ! is_dir( $cache_dir . DIRECTORY_SEPARATOR . 'item' . DIRECTORY_SEPARATOR . 'url' ) ) $this->mkdir( $cache_dir . DIRECTORY_SEPARATOR . 'item' . DIRECTORY_SEPARATOR . 'url' );
 
 
22
  if( ! is_dir( $cache_dir . DIRECTORY_SEPARATOR . 'item' . DIRECTORY_SEPARATOR . 'option' ) ) $this->mkdir( $cache_dir . DIRECTORY_SEPARATOR . 'item' . DIRECTORY_SEPARATOR . 'option' );
23
 
24
  $this->dir = $cache_dir;
@@ -63,6 +65,8 @@ class Cache {
63
  $cache_dir . DIRECTORY_SEPARATOR . 'item' . DIRECTORY_SEPARATOR . 'post',
64
  $cache_dir . DIRECTORY_SEPARATOR . 'item' . DIRECTORY_SEPARATOR . 'tag',
65
  $cache_dir . DIRECTORY_SEPARATOR . 'item' . DIRECTORY_SEPARATOR . 'url',
 
 
66
  $cache_dir . DIRECTORY_SEPARATOR . 'item' . DIRECTORY_SEPARATOR . 'option',
67
  ];
68
  $this->mkdir( $dirs );
@@ -82,7 +86,7 @@ class Cache {
82
 
83
  public function get( $key, $type = 'loop', $template = null ) {
84
  $template = ( $template ) ?: WPF()->current_object['template'];
85
- $loop_templates = [ 'forum', 'topic', 'post', 'tag', 'url', 'option' ];
86
  if( $type === 'loop' && $template ) {
87
  if( $this->exists( $key, $template ) ) {
88
  if( in_array( $template, $loop_templates ) ) {
@@ -98,12 +102,19 @@ class Cache {
98
  public function get_item( $id, $type = 'post', $sub_type = '' ) {
99
  if( $id ) {
100
  $key = $id . '_' . $this->lang;
 
101
  if( $this->exists( $key, 'item', $type, $sub_type ) ) {
102
  $cache_file = $this->dir . '/item/' . $type . '/' . ( $sub_type ? $sub_type . '_' : '' ) . $key;
103
  $array = wpforo_get_file_content( $cache_file );
104
- return @unserialize( $array );
 
 
 
 
 
105
  }
106
  }
 
107
  }
108
 
109
  public function get_html() {
@@ -294,10 +305,24 @@ class Cache {
294
  $dirs = [ $this->dir . '/tag' ];
295
  }
296
  } elseif( $template === 'option' ) {
297
- $dirs = [ $this->dir . '/item/option/' ];
298
  } elseif( $template === 'url' ) {
299
- $dirs = [ $this->dir . '/item/url/' ];
300
- } elseif( $template === 'user' ) {
 
 
 
 
 
 
 
 
 
 
 
 
 
 
301
  if( wpforo_setting( 'seo', 'seo_profile' ) ) WPF()->seo->clear_cache();
302
  } elseif( $template === 'loop' ) {
303
  $dirs = [ $this->dir . '/forum', $this->dir . '/topic', $this->dir . '/post' ];
@@ -306,7 +331,7 @@ class Cache {
306
  $dirs = [ $this->dir . '/item/post', $this->dir . '/item/topic', $this->dir . '/item/forum' ];
307
  WPF()->seo->clear_cache();
308
  } else {
309
- $dirs = [ $this->dir . '/forum', $this->dir . '/topic', $this->dir . '/post', $this->dir . '/tag', $this->dir . '/item/post', $this->dir . '/item/topic', $this->dir . '/item/forum', $this->dir . '/item/tag', $this->dir . '/item/url', $this->dir . '/item/option/' ];
310
  WPF()->seo->clear_cache();
311
  }
312
 
@@ -410,7 +435,7 @@ class Cache {
410
  } else {
411
  $board_paths[] = '/' . WPF()->board->get_current( 'slug' ) . '/';
412
  }
413
-
414
  $board_paths[] = '/' . wpforo_settings_get_slug('member') . '/';
415
  $board_paths[] = '/' . wpforo_settings_get_slug('register') . '/';
416
  $board_paths[] = '/' . wpforo_settings_get_slug('login') . '/';
@@ -479,7 +504,7 @@ class Cache {
479
  public function cache_plugins_status(){
480
  $not_exluded = [];
481
  $cache_plugins = $this->cache_plugins();
482
- $excluded = wpforo_get_option( 'wpforo_excluded_cache', null, false );
483
  $excluded = explode(',', $excluded );
484
  if( ! empty( $cache_plugins ) ){
485
  foreach( $cache_plugins as $cache_plugin ){
19
  if( ! is_dir( $cache_dir . DIRECTORY_SEPARATOR . 'tag' ) ) $this->mkdir( $cache_dir . DIRECTORY_SEPARATOR . 'tag' );
20
  if( ! is_dir( $cache_dir . DIRECTORY_SEPARATOR . 'item' . DIRECTORY_SEPARATOR . 'tag' ) ) $this->mkdir( $cache_dir . DIRECTORY_SEPARATOR . 'item' . DIRECTORY_SEPARATOR . 'tag' );
21
  if( ! is_dir( $cache_dir . DIRECTORY_SEPARATOR . 'item' . DIRECTORY_SEPARATOR . 'url' ) ) $this->mkdir( $cache_dir . DIRECTORY_SEPARATOR . 'item' . DIRECTORY_SEPARATOR . 'url' );
22
+ if( ! is_dir( $cache_dir . DIRECTORY_SEPARATOR . 'item' . DIRECTORY_SEPARATOR . 'avatar' ) ) $this->mkdir( $cache_dir . DIRECTORY_SEPARATOR . 'item' . DIRECTORY_SEPARATOR . 'avatar' );
23
+ if( ! is_dir( $cache_dir . DIRECTORY_SEPARATOR . 'item' . DIRECTORY_SEPARATOR . 'reaction' ) ) $this->mkdir( $cache_dir . DIRECTORY_SEPARATOR . 'item' . DIRECTORY_SEPARATOR . 'reaction' );
24
  if( ! is_dir( $cache_dir . DIRECTORY_SEPARATOR . 'item' . DIRECTORY_SEPARATOR . 'option' ) ) $this->mkdir( $cache_dir . DIRECTORY_SEPARATOR . 'item' . DIRECTORY_SEPARATOR . 'option' );
25
 
26
  $this->dir = $cache_dir;
65
  $cache_dir . DIRECTORY_SEPARATOR . 'item' . DIRECTORY_SEPARATOR . 'post',
66
  $cache_dir . DIRECTORY_SEPARATOR . 'item' . DIRECTORY_SEPARATOR . 'tag',
67
  $cache_dir . DIRECTORY_SEPARATOR . 'item' . DIRECTORY_SEPARATOR . 'url',
68
+ $cache_dir . DIRECTORY_SEPARATOR . 'item' . DIRECTORY_SEPARATOR . 'avatar',
69
+ $cache_dir . DIRECTORY_SEPARATOR . 'item' . DIRECTORY_SEPARATOR . 'reaction',
70
  $cache_dir . DIRECTORY_SEPARATOR . 'item' . DIRECTORY_SEPARATOR . 'option',
71
  ];
72
  $this->mkdir( $dirs );
86
 
87
  public function get( $key, $type = 'loop', $template = null ) {
88
  $template = ( $template ) ?: WPF()->current_object['template'];
89
+ $loop_templates = [ 'forum', 'topic', 'post', 'tag' ];
90
  if( $type === 'loop' && $template ) {
91
  if( $this->exists( $key, $template ) ) {
92
  if( in_array( $template, $loop_templates ) ) {
102
  public function get_item( $id, $type = 'post', $sub_type = '' ) {
103
  if( $id ) {
104
  $key = $id . '_' . $this->lang;
105
+ $domain_path = preg_replace('|https?\:\/\/|is', '', get_site_url() );
106
  if( $this->exists( $key, 'item', $type, $sub_type ) ) {
107
  $cache_file = $this->dir . '/item/' . $type . '/' . ( $sub_type ? $sub_type . '_' : '' ) . $key;
108
  $array = wpforo_get_file_content( $cache_file );
109
+ $data = @unserialize( $array );
110
+ if( $type === 'url' ) {
111
+ // Always make sure the cached URLs are pointed to current website
112
+ if( strpos( $data, $domain_path ) === FALSE ) return null;
113
+ }
114
+ return $data;
115
  }
116
  }
117
+ return null;
118
  }
119
 
120
  public function get_html() {
305
  $dirs = [ $this->dir . '/tag' ];
306
  }
307
  } elseif( $template === 'option' ) {
308
+ $dirs = [ $this->dir . '/item/option' ];
309
  } elseif( $template === 'url' ) {
310
+ $dirs = [ $this->dir . '/item/url' ];
311
+ } elseif( $template === 'avatar' ) {
312
+ if( $id ){
313
+ $file = $this->dir . '/item/avatar/' . $id . '_' . $this->lang;
314
+ $this->clean_file( $file );
315
+ } else {
316
+ $dirs = [ $this->dir . '/item/avatar' ];
317
+ }
318
+ } elseif( $template === 'reaction' ) {
319
+ if( $id ){
320
+ $file = $this->dir . '/item/reaction/' . $id . '_' . $this->lang;
321
+ $this->clean_file( $file );
322
+ } else {
323
+ $dirs = [ $this->dir . '/item/reaction' ];
324
+ }
325
+ } elseif( $template === 'user' ) {
326
  if( wpforo_setting( 'seo', 'seo_profile' ) ) WPF()->seo->clear_cache();
327
  } elseif( $template === 'loop' ) {
328
  $dirs = [ $this->dir . '/forum', $this->dir . '/topic', $this->dir . '/post' ];
331
  $dirs = [ $this->dir . '/item/post', $this->dir . '/item/topic', $this->dir . '/item/forum' ];
332
  WPF()->seo->clear_cache();
333
  } else {
334
+ $dirs = [ $this->dir . '/forum', $this->dir . '/topic', $this->dir . '/post', $this->dir . '/tag', $this->dir . '/item/post', $this->dir . '/item/topic', $this->dir . '/item/forum', $this->dir . '/item/tag', $this->dir . '/item/url', $this->dir . '/item/avatar', $this->dir . '/item/option' ];
335
  WPF()->seo->clear_cache();
336
  }
337
 
435
  } else {
436
  $board_paths[] = '/' . WPF()->board->get_current( 'slug' ) . '/';
437
  }
438
+
439
  $board_paths[] = '/' . wpforo_settings_get_slug('member') . '/';
440
  $board_paths[] = '/' . wpforo_settings_get_slug('register') . '/';
441
  $board_paths[] = '/' . wpforo_settings_get_slug('login') . '/';
504
  public function cache_plugins_status(){
505
  $not_exluded = [];
506
  $cache_plugins = $this->cache_plugins();
507
+ $excluded = wpforo_get_option( 'wpforo_excluded_cache', '', false );
508
  $excluded = explode(',', $excluded );
509
  if( ! empty( $cache_plugins ) ){
510
  foreach( $cache_plugins as $cache_plugin ){
classes/Forms.php CHANGED
@@ -7,7 +7,6 @@ if( ! defined( 'ABSPATH' ) ) exit;
7
 
8
  class Forms {
9
  public $default;
10
- public $user_dir;
11
  public $field_dir;
12
  public $current;
13
 
@@ -16,8 +15,7 @@ class Forms {
16
  }
17
 
18
  private function init_defaults() {
19
- $this->user_dir = '/users/';
20
- $this->field_dir = '/users/fields/';
21
  $this->default = [
22
  'label' => '',
23
  'title' => '',
@@ -450,9 +448,8 @@ class Forms {
450
  $f['value'] = wpforo_fix_upload_url( $f['value'] );
451
 
452
  if( wpfval( WPF()->current_object['user'], 'userid' ) ) {
453
- $url = strtok( wpforo_get_request_uri(), '?' );
454
- $delete = $url . '?foro_f=' . $f['name'] . '&foro_u=' . WPF()->current_object['user']['userid'];
455
- $delete_url = wp_nonce_url( wpforo_home_url( $delete ), 'wpforo_delete_profile_field', 'foro_n' );
456
  $delete_html = ' &nbsp;|&nbsp; <a href="' . $delete_url . '" title="' . wpforo_phrase( 'Delete this file', false ) . '" onclick="return confirm(\'' . wpforo_phrase( 'Are you sure you want to delete this file?', false ) . '\')"><i class="fas fa-times" style="color:#e86666; font-size:14px; line-height:14px;"></i></a>';
457
  } else {
458
  $delete_html = ' &nbsp;|&nbsp; <span data-fieldkey="' . $f['fieldKey'] . '" style="cursor: pointer;" class="wpforo-delete-custom-file" title="' . wpforo_phrase( 'Delete this file', false ) . '"><i class="fas fa-times" style="color:#e86666; font-size:14px; line-height:14px;"></i></span>';
@@ -1072,7 +1069,7 @@ class Forms {
1072
  if( ! empty( $file_data ) ) {
1073
  foreach( $file_data as $file_field_name => $file_name ) {
1074
  $field_name_folder = substr( $file_field_name, 6 );
1075
- $file_upload_dir = wpforo_fix_dir_sep( WPF()->folders['upload']['dir'] . $this->field_dir . $userid . DIRECTORY_SEPARATOR . $field_name_folder . DIRECTORY_SEPARATOR );
1076
  $file_path = $file_upload_dir . $file_name;
1077
  $file['files'][ $file_field_name ] = $file_path;
1078
  $file['fields'][ $file_field_name ] = $this->field_dir . $userid . '/' . $field_name_folder . '/' . $file_name;
7
 
8
  class Forms {
9
  public $default;
 
10
  public $field_dir;
11
  public $current;
12
 
15
  }
16
 
17
  private function init_defaults() {
18
+ $this->field_dir = '/wpforo/users/fields/';
 
19
  $this->default = [
20
  'label' => '',
21
  'title' => '',
448
  $f['value'] = wpforo_fix_upload_url( $f['value'] );
449
 
450
  if( wpfval( WPF()->current_object['user'], 'userid' ) ) {
451
+ $delete = '?wpfaction=ucf_file_delete&foro_f=' . $f['name'] . '&foro_u=' . WPF()->current_object['user']['userid'];
452
+ $delete_url = wp_nonce_url( $delete, 'wpforo_delete_profile_field', 'foro_n' );
 
453
  $delete_html = ' &nbsp;|&nbsp; <a href="' . $delete_url . '" title="' . wpforo_phrase( 'Delete this file', false ) . '" onclick="return confirm(\'' . wpforo_phrase( 'Are you sure you want to delete this file?', false ) . '\')"><i class="fas fa-times" style="color:#e86666; font-size:14px; line-height:14px;"></i></a>';
454
  } else {
455
  $delete_html = ' &nbsp;|&nbsp; <span data-fieldkey="' . $f['fieldKey'] . '" style="cursor: pointer;" class="wpforo-delete-custom-file" title="' . wpforo_phrase( 'Delete this file', false ) . '"><i class="fas fa-times" style="color:#e86666; font-size:14px; line-height:14px;"></i></span>';
1069
  if( ! empty( $file_data ) ) {
1070
  foreach( $file_data as $file_field_name => $file_name ) {
1071
  $field_name_folder = substr( $file_field_name, 6 );
1072
+ $file_upload_dir = wpforo_fix_dir_sep( WPF()->folders['wp_upload']['dir'] . $this->field_dir . $userid . DIRECTORY_SEPARATOR . $field_name_folder ) . DIRECTORY_SEPARATOR;
1073
  $file_path = $file_upload_dir . $file_name;
1074
  $file['files'][ $file_field_name ] = $file_path;
1075
  $file['fields'][ $file_field_name ] = $this->field_dir . $userid . '/' . $field_name_folder . '/' . $file_name;
classes/Forums.php CHANGED
@@ -798,14 +798,15 @@ class Forums {
798
  $selected = (array) $selected;
799
 
800
  foreach( $forumids as $forumid ) {
 
801
  if( ! $forumid || ( ! wpforo_is_admin() && ! WPF()->perm->forum_can( 'vf', $forumid ) ) || ( wpforo_is_admin() && ! WPF()->usergroup->can_manage_forum() ) ) continue;
802
  $depth = 0;
803
  $this->count_depth( $forumid, $depth );
804
  $forum = wpforo_forum( $forumid );
805
  $name = wpfval($forum, 'title');
806
- if( $type == 'select_box' ) { ?>
807
- <option value="<?php echo intval( $forumid ) ?>" <?php echo( ( ! $cats && $depth == 0 || ( ! empty( $disabled ) && in_array( $forumid, $disabled ) ) ) ? ' disabled ' : '' );
808
- echo( in_array( $forumid, $selected ) ? ' selected ' : '' ) ?> > <?php echo esc_html( str_repeat( '— ', $depth ) . trim( $name ) ) ?></option><?php
809
  } elseif( $type === 'drag_menu' ) {
810
  switch( $forum['layout'] ) {
811
  case 2:
@@ -822,28 +823,28 @@ class Forums {
822
  }
823
  ?>
824
 
825
- <li id="menu-item-<?php echo intval( $forumid ) ?>" class="menu-item menu-item-depth-<?php echo esc_attr( $depth ) ?>">
826
- <input id="forumid-<?php echo intval( $forumid ) ?>" type="hidden" name="forum[<?php echo intval( $forumid ) ?>][forumid]"/>
827
- <input id="parentid-<?php echo intval( $forumid ) ?>" type="hidden" name="forum[<?php echo intval( $forumid ) ?>][parentid]"/>
828
- <input id="order-<?php echo intval( $forumid ) ?>" type="hidden" name="forum[<?php echo intval( $forumid ) ?>][order]"/>
829
  <dl class="menu-item-bar">
830
  <dt class="menu-item-handle forum_width">
831
  <span class="item-title forumtitle"><span style="font-weight:400; cursor:help;" title="Forum ID"><?php echo $forumid; ?> &nbsp;|&nbsp;</span> <?php echo apply_filters( 'wpforo_dashboard_forums_item_name', esc_html($name), $forumid); ?></span>
832
  <span class="item-controls">
833
  <span class="wpforo-cat-layout"><?php echo( $depth != 0 ? __( 'Topics', 'wpforo' ) . '&nbsp;(' . intval( $forum['topics'] ) . ')&nbsp;,&nbsp;' . __( 'Posts', 'wpforo' ) . '&nbsp;(' . intval( $forum['posts'] ) . ')&nbsp; | &nbsp;' : '' ) ?><?php echo( $depth == 0 ? '(&nbsp;<i>' . esc_html( $layout_name ) . '</i>&nbsp;)&nbsp; | &nbsp;' : '' ); ?></span>
834
  <span class="menu_add">
835
- <a href="<?php echo admin_url( 'admin.php?page=' . wpforo_prefix_slug( 'forums' ) . '&action=add&parentid=' . intval( $forumid ) ) ?>">
836
  <span class="dashicons dashicons-plus" title="<?php if( $depth ) : _e( 'Add a new Subforum', 'wpforo' ); else: _e( 'Add a new Forum in this Category', 'wpforo' ); endif; ?>"></span>
837
  </a>
838
  </span> &nbsp;|&nbsp;
839
  <span class="menu_edit">
840
- <a href="<?php echo admin_url( 'admin.php?page=' . wpforo_prefix_slug( 'forums' ) . '&id=' . intval( $forumid ) . '&action=edit' ) ?>">
841
  <span class="dashicons dashicons-edit" title="<?php _e( 'edit', 'wpforo' ) ?>"></span>
842
  </a>
843
  </span>&nbsp;|&nbsp;
844
  <?php if( WPF()->usergroup->can_manage_forum() ): ?>
845
  <span class="menu_delete">
846
- <a href="<?php echo admin_url( 'admin.php?page=' . wpforo_prefix_slug( 'forums' ) . '&id=' . intval( $forumid ) . '&action=del' ) ?>">
847
  <span class="dashicons dashicons-trash" title="<?php _e( 'delete', 'wpforo' ) ?>"></span>
848
  </a>
849
  </span>&nbsp;|&nbsp;
@@ -866,15 +867,14 @@ class Forums {
866
  if( isset( $old_depth ) && $old_depth < $depth ) echo '<dl><dd>';
867
  if( isset( $old_depth ) && $old_depth > $depth ) echo '</dd></dl>';
868
  $old_depth = $depth;
869
- if( isset( WPF()->current_object ) && isset( WPF()->current_object['forumid'] ) ) {
870
- if( $forumid === intval( WPF()->current_object['forumid']) ) {
871
- echo '<span class="wpf-dl-item wpf-dl-current"><a href="' . esc_url( wpforo_forum( $forumid, 'url' ) ) . '" ><span class="wpf-circle wpf-s" style="color: ' . $forum['color'] . '; display: inline-flex;"><i class="' . $forum['icon'] . '"></i></span><strong style="color:#666;">' . esc_html( $name ) . '</strong></a></span>';
872
- } else {
873
- echo '<span class="wpf-dl-item"><a href="' . esc_url( wpforo_forum( $forumid, 'url' ) ) . '" ><span class="wpf-circle wpf-s" style="color: ' . $forum['color'] . '; display: inline-flex;"><i class="' . $forum['icon'] . '"></i></span>' . esc_html( $name ) . '</a></span>';
874
- }
875
- } else {
876
- echo '<span class="wpf-dl-item"><a href="' . esc_url( wpforo_forum( $forumid, 'url' ) ) . '" ><span class="wpf-circle wpf-s" style="color: ' . $forum['color'] . '; display: inline-flex;"><i class="' . $forum['icon'] . '"></i></span>' . esc_html( $name ) . '</a></span>';
877
- }
878
  } elseif( $type === 'subscribe_manager_form' ) {
879
  ?>
880
  <li>
@@ -882,9 +882,9 @@ class Forums {
882
  $forum_topic_attr = '';
883
  $forum_attr = '';
884
  if( key_exists( $forumid, $selected ) ) {
885
- if( $selected[ $forumid ] == 'forum-topic' ) {
886
  $forum_topic_attr = ' checked ';
887
- } elseif( $selected[ $forumid ] == 'forum' ) {
888
  $forum_attr = ' checked ';
889
  }
890
  }
798
  $selected = (array) $selected;
799
 
800
  foreach( $forumids as $forumid ) {
801
+ $forumid = intval( $forumid );
802
  if( ! $forumid || ( ! wpforo_is_admin() && ! WPF()->perm->forum_can( 'vf', $forumid ) ) || ( wpforo_is_admin() && ! WPF()->usergroup->can_manage_forum() ) ) continue;
803
  $depth = 0;
804
  $this->count_depth( $forumid, $depth );
805
  $forum = wpforo_forum( $forumid );
806
  $name = wpfval($forum, 'title');
807
+ if( $type === 'select_box' ) { ?>
808
+ <option value="<?php echo $forumid ?>" <?php echo( ( ! $cats && $depth == 0 || ( in_array( $forumid, $disabled ) ) ) ? ' disabled ' : '' );
809
+ echo( in_array( $forumid, $selected ) ? ' selected ' : '' ) ?> > <?php echo esc_html( str_repeat( '— ', $depth ) . trim( $name ) ) ?></option><?php
810
  } elseif( $type === 'drag_menu' ) {
811
  switch( $forum['layout'] ) {
812
  case 2:
823
  }
824
  ?>
825
 
826
+ <li id="menu-item-<?php echo $forumid ?>" class="menu-item menu-item-depth-<?php echo esc_attr( $depth ) ?>">
827
+ <input id="forumid-<?php echo $forumid ?>" type="hidden" name="forum[<?php echo $forumid ?>][forumid]"/>
828
+ <input id="parentid-<?php echo $forumid ?>" type="hidden" name="forum[<?php echo $forumid ?>][parentid]"/>
829
+ <input id="order-<?php echo $forumid ?>" type="hidden" name="forum[<?php echo $forumid ?>][order]"/>
830
  <dl class="menu-item-bar">
831
  <dt class="menu-item-handle forum_width">
832
  <span class="item-title forumtitle"><span style="font-weight:400; cursor:help;" title="Forum ID"><?php echo $forumid; ?> &nbsp;|&nbsp;</span> <?php echo apply_filters( 'wpforo_dashboard_forums_item_name', esc_html($name), $forumid); ?></span>
833
  <span class="item-controls">
834
  <span class="wpforo-cat-layout"><?php echo( $depth != 0 ? __( 'Topics', 'wpforo' ) . '&nbsp;(' . intval( $forum['topics'] ) . ')&nbsp;,&nbsp;' . __( 'Posts', 'wpforo' ) . '&nbsp;(' . intval( $forum['posts'] ) . ')&nbsp; | &nbsp;' : '' ) ?><?php echo( $depth == 0 ? '(&nbsp;<i>' . esc_html( $layout_name ) . '</i>&nbsp;)&nbsp; | &nbsp;' : '' ); ?></span>
835
  <span class="menu_add">
836
+ <a href="<?php echo admin_url( 'admin.php?page=' . wpforo_prefix_slug( 'forums' ) . '&action=add&parentid=' . $forumid ) ?>">
837
  <span class="dashicons dashicons-plus" title="<?php if( $depth ) : _e( 'Add a new Subforum', 'wpforo' ); else: _e( 'Add a new Forum in this Category', 'wpforo' ); endif; ?>"></span>
838
  </a>
839
  </span> &nbsp;|&nbsp;
840
  <span class="menu_edit">
841
+ <a href="<?php echo admin_url( 'admin.php?page=' . wpforo_prefix_slug( 'forums' ) . '&id=' . $forumid . '&action=edit' ) ?>">
842
  <span class="dashicons dashicons-edit" title="<?php _e( 'edit', 'wpforo' ) ?>"></span>
843
  </a>
844
  </span>&nbsp;|&nbsp;
845
  <?php if( WPF()->usergroup->can_manage_forum() ): ?>
846
  <span class="menu_delete">
847
+ <a href="<?php echo admin_url( 'admin.php?page=' . wpforo_prefix_slug( 'forums' ) . '&id=' . $forumid . '&action=del' ) ?>">
848
  <span class="dashicons dashicons-trash" title="<?php _e( 'delete', 'wpforo' ) ?>"></span>
849
  </a>
850
  </span>&nbsp;|&nbsp;
867
  if( isset( $old_depth ) && $old_depth < $depth ) echo '<dl><dd>';
868
  if( isset( $old_depth ) && $old_depth > $depth ) echo '</dd></dl>';
869
  $old_depth = $depth;
870
+ printf(
871
+ '<span class="wpf-dl-item %1$s"><a href="%2$s"><span class="wpf-circle wpf-s" style="display: inline-flex; %3$s"><i class="%4$s"></i></span><span class="wpf-dl-item-label">%5$s</span></a></span>',
872
+ ( in_array( $forumid, $selected ) ? 'wpf-dl-current' : '' ),
873
+ esc_url( wpforo_forum( $forumid, 'url' ) ),
874
+ ( ($forum['color'] = trim( $forum['color'] )) ? 'color: ' . $forum['color'] . ';' : ''),
875
+ $forum['icon'],
876
+ esc_html( $name )
877
+ );
 
878
  } elseif( $type === 'subscribe_manager_form' ) {
879
  ?>
880
  <li>
882
  $forum_topic_attr = '';
883
  $forum_attr = '';
884
  if( key_exists( $forumid, $selected ) ) {
885
+ if( $selected[ $forumid ] === 'forum-topic' ) {
886
  $forum_topic_attr = ' checked ';
887
+ } elseif( $selected[ $forumid ] === 'forum' ) {
888
  $forum_attr = ' checked ';
889
  }
890
  }
classes/Members.php CHANGED
@@ -129,6 +129,8 @@ class Members {
129
  add_action( 'wpforo_after_delete_reaction', [$this, 'after_delete_reaction'] );
130
 
131
  add_action( 'wpforo_after_delete_user', [$this, 'after_delete_user'], 11, 2 );
 
 
132
  }
133
 
134
  public function init_list_table() {
@@ -147,8 +149,8 @@ class Members {
147
  $reaction_types = array_map( '__return_zero', array_flip( Reactions::get_type_list() ) );
148
  $member = array_merge( $this->default->member, (array) $member );
149
  $member['userid'] = wpforo_bigintval( $member['userid'] );
150
- $member['first_name'] = trim( strip_tags( $member['first_name'] ) );
151
- $member['last_name'] = trim( strip_tags( $member['last_name'] ) );
152
  $member['groupid'] = intval( $member['groupid'] );
153
  $member['secondary_groupids'] = array_map( 'intval', (array) ( is_scalar( $member['secondary_groupids'] ) ? explode( ',', $member['secondary_groupids'] ) : $member['secondary_groupids'] ) );
154
  $member['secondary_groupids'] = array_diff( $member['secondary_groupids'], (array) $member['groupid'] );
@@ -175,7 +177,7 @@ class Members {
175
  $member['points'] = $member['custom_points'] ?: $this->calc_points( $member );
176
  $member['rating'] = $this->calc_rating( $member['points'] );
177
 
178
- $member['online_time'] = (int) ( !is_numeric( $member['online_time'] ) ? strtotime( $member['online_time'] ) : $member['online_time'] );
179
  $member['is_email_confirmed'] = (bool) (int) $member['is_email_confirmed'];
180
  $member['is_mention_muted'] = (bool) (int) $member['is_mention_muted'];
181
 
@@ -266,7 +268,7 @@ class Members {
266
  );
267
  },
268
  'callback_for_get_url' => function() use ( $userid ){
269
- return trim( WPF()->member->get_profile_url( $userid ), '/' ) . '/?wpfaction=user_delete';
270
  },
271
  'confirm_msg' => wpforo_phrase( 'Please confirm you want to do this action?', false ),
272
  ],
@@ -584,7 +586,35 @@ class Members {
584
  }
585
 
586
  //Check file uploading custom fields and merge to $user array
587
- $file_data = isset( $_FILES['data']['name'] ) && $_FILES['data']['name'] && is_array( $_FILES['data']['name'] ) ? array_filter( $_FILES['data']['name'] ) : [];
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
588
  $file_fields = WPF()->form->prepare_file_args( $file_data, $userid );
589
  if( wpfval( $file_fields, 'fields' ) ) {
590
  $user = array_merge( $file_fields['fields'], $user );
@@ -1186,7 +1216,7 @@ class Members {
1186
  INNER JOIN `" . WPF()->tables->profiles . "` p ON p.`userid` = u.`ID`
1187
  LEFT JOIN `" . WPF()->tables->usergroups . "` ug ON ug.`groupid` = p.`groupid`
1188
  LEFT JOIN `" . WPF()->db->usermeta . "` fn ON fn.`user_id` = u.`ID` AND fn.`meta_key` LIKE 'first_name'
1189
- LEFT JOIN `" . WPF()->db->usermeta . "` ln ON ln.`user_id` = u.`ID` AND fn.`meta_key` LIKE 'last_name'";
1190
  $wheres = [];
1191
  if( $userid ) $wheres[] = "`ID` = $userid";
1192
  if( $user_nicename ) $wheres[] = "`user_nicename` = '" . esc_sql( $user_nicename ) . "'";
@@ -1476,8 +1506,16 @@ class Members {
1476
  }
1477
 
1478
  public function _get_avatar_url( $userid ) {
 
 
 
 
 
1479
  $avatar_url = WPF()->db->get_var( WPF()->db->prepare( "SELECT `avatar` FROM `" . WPF()->tables->profiles . "` WHERE `userid` = %d", wpforo_bigintval( $userid ) ) );
1480
-
 
 
 
1481
  return apply_filters( 'wpforo_avatar_url', $avatar_url, $userid );
1482
  }
1483
 
@@ -1710,6 +1748,7 @@ class Members {
1710
 
1711
  public function reset( $userid ) {
1712
  if( ! $userid ) return;
 
1713
  delete_user_meta( intval( $userid ), '_wpf_member_obj' );
1714
  if( wpforo_setting( 'seo', 'seo_profile' ) ) WPF()->seo->clear_cache();
1715
  }
@@ -3197,10 +3236,12 @@ class Members {
3197
  }
3198
 
3199
  public function after_password_reset( $user ) {
3200
- $data = [ 'status' => 'active', 'is_email_confirmed' => 1 ];
3201
- if( wpforo_setting( 'authorization', 'manually_approval' ) ) $data['status'] = 'inactive';
3202
- $this->update_profile_fields( $user->ID, $data, false );
3203
- $this->reset( $user->ID );
 
 
3204
  }
3205
 
3206
  public function wp_login( $user_login, $user ) {
@@ -3542,6 +3583,21 @@ class Members {
3542
  if( $reassign ) $this->rebuild_stats( $reassign );
3543
  }
3544
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3545
  public function get_activity_url( $filter = '', $boardid = null, $arg = null ) {
3546
  if( !$arg ) $arg = WPF()->current_object['user'];
3547
  $url = rtrim( $this->get_profile_url( $arg, 'activity' ), '/' );
@@ -3583,11 +3639,11 @@ class Members {
3583
  $sql = "SELECT `userid` FROM `". WPF()->tables->profiles ."`
3584
  WHERE `status` IN ('" . $status . "')
3585
  AND `groupid` IN (" . $groupids . ")
3586
- ORDER BY `userid` DESC";
3587
  } else {
3588
  $sql = "SELECT `userid` FROM `". WPF()->tables->profiles ."`
3589
  WHERE `groupid` IN (" . $groupids . ")
3590
- ORDER BY `userid` DESC";
3591
  }
3592
 
3593
  $memberid = WPF()->db->get_var( $sql );
129
  add_action( 'wpforo_after_delete_reaction', [$this, 'after_delete_reaction'] );
130
 
131
  add_action( 'wpforo_after_delete_user', [$this, 'after_delete_user'], 11, 2 );
132
+
133
+ add_action( 'wpforo_after_activate_user', [$this, 'after_activate_user'] );
134
  }
135
 
136
  public function init_list_table() {
149
  $reaction_types = array_map( '__return_zero', array_flip( Reactions::get_type_list() ) );
150
  $member = array_merge( $this->default->member, (array) $member );
151
  $member['userid'] = wpforo_bigintval( $member['userid'] );
152
+ $member['first_name'] = trim( strip_tags( (string) $member['first_name'] ) );
153
+ $member['last_name'] = trim( strip_tags( (string) $member['last_name'] ) );
154
  $member['groupid'] = intval( $member['groupid'] );
155
  $member['secondary_groupids'] = array_map( 'intval', (array) ( is_scalar( $member['secondary_groupids'] ) ? explode( ',', $member['secondary_groupids'] ) : $member['secondary_groupids'] ) );
156
  $member['secondary_groupids'] = array_diff( $member['secondary_groupids'], (array) $member['groupid'] );
177
  $member['points'] = $member['custom_points'] ?: $this->calc_points( $member );
178
  $member['rating'] = $this->calc_rating( $member['points'] );
179
 
180
+ $member['online_time'] = (int) ( !is_numeric( $member['online_time'] ) ? strtotime( (string) $member['online_time'] ) : $member['online_time'] );
181
  $member['is_email_confirmed'] = (bool) (int) $member['is_email_confirmed'];
182
  $member['is_mention_muted'] = (bool) (int) $member['is_mention_muted'];
183
 
268
  );
269
  },
270
  'callback_for_get_url' => function() use ( $userid ){
271
+ return wp_nonce_url( trim( WPF()->member->get_profile_url( $userid ), '/' ) . '/?wpfaction=user_delete', 'user_delete', '_wpfnonce' );
272
  },
273
  'confirm_msg' => wpforo_phrase( 'Please confirm you want to do this action?', false ),
274
  ],
586
  }
587
 
588
  //Check file uploading custom fields and merge to $user array
589
+ $file_data = isset( $_FILES['data']['name'] ) && $_FILES['data']['name'] && is_array( $_FILES['data']['name'] )
590
+ ? array_filter( $_FILES['data']['name'], function( $key ){
591
+ if( trim($key) && ($field = $this->get_field( $key )) ){
592
+ if( wpfval( $field, 'type' ) === 'file' ){
593
+ $mime_type = wpfval( $_FILES, 'data', 'type', $key );
594
+ $mime_types = wp_get_mime_types();
595
+ $allowed_mime_types = get_allowed_mime_types();
596
+ $name = wpfval( $_FILES, 'data', 'name', $key );
597
+ $ext = pathinfo( $name, PATHINFO_EXTENSION );
598
+ $size = intval( $field['fileSize'] );
599
+ $fileExtensions = array_filter( (array) (is_scalar( $field['fileExtensions'] ) ? explode( ',', trim( (string) $field['fileExtensions'] ) ) : $field['fileExtensions']) );
600
+ if( $fileExtensions ) {
601
+ if( in_array( $ext, $fileExtensions ) ) {
602
+ $extensions = explode( '|', array_search( $mime_type, $mime_types ) );
603
+ $e = in_array( $ext, $extensions );
604
+ } else {
605
+ $e = false;
606
+ }
607
+ } else {
608
+ $extensions = explode( '|', array_search( $mime_type, $allowed_mime_types ) );
609
+ $e = in_array( $ext, $extensions );
610
+ }
611
+
612
+ return ! empty( $e ) && wpfval( $_FILES, 'data', 'size', $key ) <= ( $size * 1024 * 1024 );
613
+ }
614
+ }
615
+ return false;
616
+ }, ARRAY_FILTER_USE_KEY )
617
+ : [];
618
  $file_fields = WPF()->form->prepare_file_args( $file_data, $userid );
619
  if( wpfval( $file_fields, 'fields' ) ) {
620
  $user = array_merge( $file_fields['fields'], $user );
1216
  INNER JOIN `" . WPF()->tables->profiles . "` p ON p.`userid` = u.`ID`
1217
  LEFT JOIN `" . WPF()->tables->usergroups . "` ug ON ug.`groupid` = p.`groupid`
1218
  LEFT JOIN `" . WPF()->db->usermeta . "` fn ON fn.`user_id` = u.`ID` AND fn.`meta_key` LIKE 'first_name'
1219
+ LEFT JOIN `" . WPF()->db->usermeta . "` ln ON ln.`user_id` = u.`ID` AND ln.`meta_key` LIKE 'last_name'";
1220
  $wheres = [];
1221
  if( $userid ) $wheres[] = "`ID` = $userid";
1222
  if( $user_nicename ) $wheres[] = "`user_nicename` = '" . esc_sql( $user_nicename ) . "'";
1506
  }
1507
 
1508
  public function _get_avatar_url( $userid ) {
1509
+ $cache = WPF()->cache->on();
1510
+ $cache_avatar = apply_filters( 'wpforo_avatar_cache', true, $userid );
1511
+ if( $cache && $cache_avatar && $avatar_url = WPF()->cache->get_item( $userid, 'avatar') ) {
1512
+ return str_replace('#', '', (string) $avatar_url );
1513
+ }
1514
  $avatar_url = WPF()->db->get_var( WPF()->db->prepare( "SELECT `avatar` FROM `" . WPF()->tables->profiles . "` WHERE `userid` = %d", wpforo_bigintval( $userid ) ) );
1515
+ if( $cache && $userid ) {
1516
+ $cached_avatar_url = ( $avatar_url ) ? : '#';
1517
+ WPF()->cache->create( 'item', [ $userid => $cached_avatar_url ], 'avatar' );
1518
+ }
1519
  return apply_filters( 'wpforo_avatar_url', $avatar_url, $userid );
1520
  }
1521
 
1748
 
1749
  public function reset( $userid ) {
1750
  if( ! $userid ) return;
1751
+ wpforo_clean_cache( 'avatar', $userid );
1752
  delete_user_meta( intval( $userid ), '_wpf_member_obj' );
1753
  if( wpforo_setting( 'seo', 'seo_profile' ) ) WPF()->seo->clear_cache();
1754
  }
3236
  }
3237
 
3238
  public function after_password_reset( $user ) {
3239
+ if( $this->get_status( $user->ID ) !== 'banned' ){
3240
+ $data = [ 'status' => 'active', 'is_email_confirmed' => 1 ];
3241
+ if( wpforo_setting( 'authorization', 'manually_approval' ) ) $data['status'] = 'inactive';
3242
+ $this->update_profile_fields( $user->ID, $data, false );
3243
+ $this->reset( $user->ID );
3244
+ }
3245
  }
3246
 
3247
  public function wp_login( $user_login, $user ) {
3583
  if( $reassign ) $this->rebuild_stats( $reassign );
3584
  }
3585
 
3586
+ public function after_activate_user( $userid ){
3587
+ $user = get_user_by( 'ID', $userid );
3588
+ if( $user ){
3589
+ $sbj = wpforo_setting( 'email', 'after_user_approve_email_subject' );
3590
+ $msg = wpforo_setting( 'email', 'after_user_approve_email_message' );
3591
+ $blogname = get_option('blogname', '');
3592
+ $login_url = wpforo_login_url( '' );
3593
+ $login_link = sprintf( '<a href="%1$s">%2$s</a>', $login_url, $blogname );
3594
+
3595
+ $sbj = str_replace( [ '[blogname]', '[user_login]', '[login_link]', '[login_url]' ], [ $blogname, $user->user_login, $login_link, $login_url ], $sbj );
3596
+ $msg = str_replace( [ '[blogname]', '[user_login]', '[login_link]', '[login_url]' ], [ $blogname, $user->user_login, $login_link, $login_url ], $msg );
3597
+ wpforo_send_email( $user->user_email, $sbj, $msg );
3598
+ }
3599
+ }
3600
+
3601
  public function get_activity_url( $filter = '', $boardid = null, $arg = null ) {
3602
  if( !$arg ) $arg = WPF()->current_object['user'];
3603
  $url = rtrim( $this->get_profile_url( $arg, 'activity' ), '/' );
3639
  $sql = "SELECT `userid` FROM `". WPF()->tables->profiles ."`
3640
  WHERE `status` IN ('" . $status . "')
3641
  AND `groupid` IN (" . $groupids . ")
3642
+ ORDER BY `userid` DESC LIMIT 1";
3643
  } else {
3644
  $sql = "SELECT `userid` FROM `". WPF()->tables->profiles ."`
3645
  WHERE `groupid` IN (" . $groupids . ")
3646
+ ORDER BY `userid` DESC LIMIT 1";
3647
  }
3648
 
3649
  $memberid = WPF()->db->get_var( $sql );
classes/Moderation.php CHANGED
@@ -97,7 +97,7 @@ class Moderation {
97
  }
98
 
99
  public function get_view_url( $arg ) {
100
- return WPF()->post->get_post_url( $arg );
101
  }
102
 
103
  public function akismet_topic( $item ) {
@@ -148,7 +148,7 @@ class Moderation {
148
  $post['comment_author_url'] = WPF()->member->get_profile_url( WPF()->current_userid );
149
  $post['comment_post_modified_gmt'] = $topic['modified'];
150
  $post['comment_content'] = $item['body'];
151
- $post['permalink'] = WPF()->topic->get_topic_url( $item['topicid'] );
152
 
153
  $response = Akismet::http_post( Akismet::build_query( $post ), 'comment-check' );
154
  if( $response[1] == 'true' ) {
97
  }
98
 
99
  public function get_view_url( $arg ) {
100
+ return WPF()->post->get_url( $arg );
101
  }
102
 
103
  public function akismet_topic( $item ) {
148
  $post['comment_author_url'] = WPF()->member->get_profile_url( WPF()->current_userid );
149
  $post['comment_post_modified_gmt'] = $topic['modified'];
150
  $post['comment_content'] = $item['body'];
151
+ $post['permalink'] = WPF()->topic->get_url( $item['topicid'] );
152
 
153
  $response = Akismet::http_post( Akismet::build_query( $post ), 'comment-check' );
154
  if( $response[1] == 'true' ) {
classes/Phrases.php CHANGED
@@ -52,8 +52,8 @@ class Phrases {
52
  (`langid`, `phrase_key`, `phrase_value`, `package`)
53
  VALUES (%d, %s, %s, %s)",
54
  intval( $args['langid'] ),
55
- stripslashes( $args['key'] ),
56
- stripslashes( $args['value'] ),
57
  stripslashes( $args['package'] )
58
  );
59
  if( false !== WPF()->db->query( $sql ) ) {
@@ -72,8 +72,13 @@ class Phrases {
72
  if( ! $args && ! empty( $_REQUEST['phrases'] ) ) $args = $_REQUEST['phrases'];
73
  if( ! empty( $args ) ) {
74
  foreach( $args as $phraseid => $phrase ) {
75
- WPF()->db->update( WPF()->tables->phrases, [ 'phrase_value' => sanitize_text_field( stripslashes( $phrase ) ) ], [ 'phraseid' => intval( $phraseid ) ], [ '%s' ], [ '%d' ] );
76
-
 
 
 
 
 
77
  }
78
  $this->clear_cache();
79
  WPF()->notice->add( 'Phrase successfully updates', 'success' );
52
  (`langid`, `phrase_key`, `phrase_value`, `package`)
53
  VALUES (%d, %s, %s, %s)",
54
  intval( $args['langid'] ),
55
+ sanitize_text_field( stripslashes( $args['key'] ) ),
56
+ sanitize_text_field( stripslashes( $args['value'] ) ),
57
  stripslashes( $args['package'] )
58
  );
59
  if( false !== WPF()->db->query( $sql ) ) {
72
  if( ! $args && ! empty( $_REQUEST['phrases'] ) ) $args = $_REQUEST['phrases'];
73
  if( ! empty( $args ) ) {
74
  foreach( $args as $phraseid => $phrase ) {
75
+ WPF()->db->update(
76
+ WPF()->tables->phrases,
77
+ [ 'phrase_value' => sanitize_text_field( stripslashes( $phrase ) ) ],
78
+ [ 'phraseid' => intval( $phraseid ) ],
79
+ [ '%s' ],
80
+ [ '%d' ]
81
+ );
82
  }
83
  $this->clear_cache();
84
  WPF()->notice->add( 'Phrase successfully updates', 'success' );
classes/Posts.php CHANGED
@@ -189,7 +189,7 @@ class Posts {
189
  $post['postid'] = $postid;
190
  $post['status'] = $status;
191
  $post['private'] = $private;
192
- $post['posturl'] = $this->get_post_url( $postid );
193
 
194
  if( $root_exists ) WPF()->topic->rebuild_threads( $topic, $root );
195
 
@@ -440,7 +440,11 @@ class Posts {
440
  }
441
  }
442
 
443
- if( $post ) $post['url'] = $this->get_post_url( $post );
 
 
 
 
444
 
445
  return apply_filters( 'wpforo_get_post', $post );
446
  }
@@ -1152,17 +1156,35 @@ class Posts {
1152
  return (int) WPF()->db->get_var( $sql );
1153
  }
1154
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1155
  /**
1156
  * return post full url by id
1157
  *
 
 
1158
  * @param int|array $arg
1159
  *
1160
  * @return string $url
1161
- * @since 1.0.0
1162
- *
1163
  */
1164
- function get_post_url( $arg ) {
1165
- $cache = WPF()->cache->on();
 
 
 
 
 
1166
 
1167
  if( isset( $arg ) && ! is_array( $arg ) ) {
1168
  $postid = wpforo_bigintval( $arg );
@@ -1174,10 +1196,10 @@ class Posts {
1174
 
1175
  if( ! empty( $post ) && is_array( $post ) && ! empty( $postid ) ) {
1176
 
1177
- if( $cache ) {
1178
- $post_url = WPF()->cache->get_item( $postid, 'url', 'post' );
1179
- if( $post_url ) return $post_url;
1180
- }
1181
 
1182
  $forum_slug = ( wpfval( $post, 'forumid' ) ) ? wpforo_forum( $post['forumid'], 'slug' ) : $this->get_forumslug_byid( $postid );
1183
  $topic_slug = ( wpfval( $post, 'topicid' ) ) ? wpforo_topic( $post['topicid'], 'slug' ) : $this->get_topicslug_byid( $postid );
@@ -1188,9 +1210,9 @@ class Posts {
1188
  $items_per_page = $this->get_option_items_per_page( WPF()->forum->get_layout( $post['forumid'] ) );
1189
 
1190
  if( $position <= $items_per_page ) {
1191
- $post_url = wpforo_home_url( $url ) . "#post-" . wpforo_bigintval( $postid );
1192
- if( $cache ) WPF()->cache->create( 'item', [ 'post_' . intval( $postid ) => $post_url ], 'url' );
1193
- return $post_url;
1194
  }
1195
  if( $position && $items_per_page ) {
1196
  $paged = (int) ceil( $position / $items_per_page );
@@ -1198,14 +1220,28 @@ class Posts {
1198
  $paged = 1;
1199
  }
1200
 
1201
- $post_url = wpforo_home_url( $url . "/" . wpforo_settings_get_slug( 'paged' ) . "/" . $paged ) . "#post-" . wpforo_bigintval( $postid );
1202
- if( $cache ) WPF()->cache->create( 'item', [ 'post_' . intval( $postid ) => $post_url ], 'url' );
1203
- return $post_url;
1204
- }
1205
 
1206
  return wpforo_home_url();
1207
  }
1208
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1209
 
1210
  /**
1211
  *
@@ -1936,7 +1972,8 @@ class Posts {
1936
  $forum = WPF()->forum->get_forum( $post['forumid'] );
1937
  $fields = WPF()->post->get_topic_fields_list( false, $forum, ! WPF()->current_userid );
1938
  foreach( $fields as $field ) {
1939
- if( $postmeta = wpfval( $postmetas, $field ) ) {
 
1940
  $field = WPF()->post->get_field( $field, 'topic', $forum );
1941
  if( ! (int) wpfval( $field, 'isDefault' ) ) {
1942
  $field['value'] = $postmeta;
189
  $post['postid'] = $postid;
190
  $post['status'] = $status;
191
  $post['private'] = $private;
192
+ $post['posturl'] = $this->get_url( $postid );
193
 
194
  if( $root_exists ) WPF()->topic->rebuild_threads( $topic, $root );
195
 
440
  }
441
  }
442
 
443
+ if ( $post ) {
444
+ $post['url'] = $this->get_url( $post );
445
+ $post['full_url'] = $this->get_full_url( $post );
446
+ $post['short_url'] = $this->get_short_url( $post );
447
+ }
448
 
449
  return apply_filters( 'wpforo_get_post', $post );
450
  }
1156
  return (int) WPF()->db->get_var( $sql );
1157
  }
1158
 
1159
+ /**
1160
+ * @deprecated since 2.0.10 instead this method use get_url()
1161
+ *
1162
+ * @since 1.0.0
1163
+ *
1164
+ * @param $arg
1165
+ *
1166
+ * @return string
1167
+ */
1168
+ function get_post_url( $arg ){
1169
+ return $this->get_url( $arg );
1170
+ }
1171
+
1172
  /**
1173
  * return post full url by id
1174
  *
1175
+ * @since 2.0.10
1176
+ *
1177
  * @param int|array $arg
1178
  *
1179
  * @return string $url
 
 
1180
  */
1181
+ function get_url( $arg ) {
1182
+ if( wpforo_setting( 'board', 'url_structure' ) === 'short' ) return $this->get_short_url( $arg );
1183
+ return $this->get_full_url( $arg );
1184
+ }
1185
+
1186
+ public function get_full_url( $arg ) {
1187
+ $cache = WPF()->cache->on();
1188
 
1189
  if( isset( $arg ) && ! is_array( $arg ) ) {
1190
  $postid = wpforo_bigintval( $arg );
1196
 
1197
  if( ! empty( $post ) && is_array( $post ) && ! empty( $postid ) ) {
1198
 
1199
+ if( $cache ) {
1200
+ $post_url = WPF()->cache->get_item( $postid, 'url', 'post' );
1201
+ if( $post_url ) return $post_url;
1202
+ }
1203
 
1204
  $forum_slug = ( wpfval( $post, 'forumid' ) ) ? wpforo_forum( $post['forumid'], 'slug' ) : $this->get_forumslug_byid( $postid );
1205
  $topic_slug = ( wpfval( $post, 'topicid' ) ) ? wpforo_topic( $post['topicid'], 'slug' ) : $this->get_topicslug_byid( $postid );
1210
  $items_per_page = $this->get_option_items_per_page( WPF()->forum->get_layout( $post['forumid'] ) );
1211
 
1212
  if( $position <= $items_per_page ) {
1213
+ $post_url = wpforo_home_url( $url ) . "#post-" . wpforo_bigintval( $postid );
1214
+ if( $cache ) WPF()->cache->create( 'item', [ 'post_' . intval( $postid ) => $post_url ], 'url' );
1215
+ return $post_url;
1216
  }
1217
  if( $position && $items_per_page ) {
1218
  $paged = (int) ceil( $position / $items_per_page );
1220
  $paged = 1;
1221
  }
1222
 
1223
+ $post_url = wpforo_home_url( $url . "/" . wpforo_settings_get_slug( 'paged' ) . "/" . $paged ) . "#post-" . wpforo_bigintval( $postid );
1224
+ if( $cache ) WPF()->cache->create( 'item', [ 'post_' . intval( $postid ) => $post_url ], 'url' );
1225
+ return $post_url;
1226
+ }
1227
 
1228
  return wpforo_home_url();
1229
  }
1230
 
1231
+ public function get_short_url( $arg ) {
1232
+ if( is_numeric( $arg ) ){
1233
+ $postid = $arg;
1234
+ }elseif( wpfkey( $arg, 'postid' ) ){
1235
+ $postid = $arg['postid'];
1236
+ }elseif ( wpfkey( $arg, 'first_postid' ) ){
1237
+ $postid = $arg['first_postid'];
1238
+ }else{
1239
+ $postid = 0;
1240
+ }
1241
+
1242
+ if( $postid = wpforo_bigintval( $postid ) ) return wpforo_home_url( '/' . wpforo_settings_get_slug( 'postid' ) . '/' . $postid . '/' );
1243
+ return wpforo_home_url();
1244
+ }
1245
 
1246
  /**
1247
  *
1972
  $forum = WPF()->forum->get_forum( $post['forumid'] );
1973
  $fields = WPF()->post->get_topic_fields_list( false, $forum, ! WPF()->current_userid );
1974
  foreach( $fields as $field ) {
1975
+ $display = apply_filters( 'wpforo_topic_fields_filter', true, $field, $post );
1976
+ if( $display && $postmeta = wpfval( $postmetas, $field ) ) {
1977
  $field = WPF()->post->get_field( $field, 'topic', $forum );
1978
  if( ! (int) wpfval( $field, 'isDefault' ) ) {
1979
  $field['value'] = $postmeta;
classes/Settings.php CHANGED
@@ -193,6 +193,18 @@ class Settings {
193
  "description_original" => "wpForo has own cache system, enable this to reduce sql requests and make your forum run faster.",
194
  "docurl" => "https://wpforo.com/docs/wpforo-v2/settings/board-settings/#enable-cache",
195
  ],
 
 
 
 
 
 
 
 
 
 
 
 
196
  ],
197
  ],
198
  'components' => [
@@ -1766,6 +1778,34 @@ class Settings {
1766
  "description_original" => "[user_login] - Registered user login [reset_password_url] - Link to open password reset form",
1767
  "docurl" => "https://wpforo.com/community/faq/wpforo-email-shortcodes/",
1768
  ],
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1769
  ],
1770
  ],
1771
  'subscriptions' => [
@@ -3346,8 +3386,9 @@ class Settings {
3346
  if( ! $max_upload_size || $max_upload_size > 10485760 ) $max_upload_size = 10485760;
3347
 
3348
  $this->_slugs = [
3349
- 'paged' => 'paged',
3350
- 'postid' => 'postid',
 
3351
  ];
3352
  $this->_slugs = (array) apply_filters( 'wpforo_settings_init__slugs', $this->_slugs );
3353
 
@@ -3508,6 +3549,7 @@ class Settings {
3508
  $this->_board = [
3509
  'under_construction' => false,
3510
  'cache' => true,
 
3511
  ];
3512
  $this->_forums = [
3513
  'layout_extended_intro_topics_toggle' => true,
@@ -3795,6 +3837,8 @@ class Settings {
3795
  'wp_new_user_notification_email_message' => __( "Username: [user_login]\n\nTo set your password, visit the following address:\n\n[set_password_url]\n\n", 'wpforo' ),
3796
  'overwrite_reset_password_email' => true,
3797
  'reset_password_email_message' => __( "Hello! \n\n You asked us to reset your password for your account using the email address [user_login]. \n\n If this was a mistake, or you didn't ask for a password reset, just ignore this email and nothing will happen. \n\n To reset your password, visit the following address: \n\n [reset_password_url] \n\n Thanks!", 'wpforo' ),
 
 
3798
  ];
3799
  $this->_subscriptions = [
3800
  'subscribe_confirmation' => true,
193
  "description_original" => "wpForo has own cache system, enable this to reduce sql requests and make your forum run faster.",
194
  "docurl" => "https://wpforo.com/docs/wpforo-v2/settings/board-settings/#enable-cache",
195
  ],
196
+ "url_structure" => [
197
+ "type" => "radio",
198
+ "label" => esc_html__( "URL Structure", "wpforo" ),
199
+ "label_original" => "URL Structure",
200
+ "description" => esc_html__( "This option allows managing topic and post URL structure. By default, URLs are built based on topic titles. You can change them to ID and make them shorter.", "wpforo" ),
201
+ "description_original" => "This option allows managing topic and post URL structure. By default, URLs are built based on topic titles. You can change them to ID and make them shorter.",
202
+ "variants" => [
203
+ [ 'value' => 'short', 'label' => __( 'ID', 'wpforo' ), 'title' => 'https://example.com/postid/123/' ],
204
+ [ 'value' => 'full', 'label' => __( 'Title', 'wpforo' ), 'title' => 'https://example.com/community/sample-forum/sample-topic/' ],
205
+ ],
206
+ "docurl" => "",
207
+ ],
208
  ],
209
  ],
210
  'components' => [
1778
  "description_original" => "[user_login] - Registered user login [reset_password_url] - Link to open password reset form",
1779
  "docurl" => "https://wpforo.com/community/faq/wpforo-email-shortcodes/",
1780
  ],
1781
+ "after_user_approve_email_subject" => [
1782
+ "type" => "text",
1783
+ "label" => esc_html__( "Message Subject", "wpforo" ),
1784
+ "label_original" => "Message Subject",
1785
+ "description" => esc_html__( "", "wpforo" ),
1786
+ "description_original" => "",
1787
+ "docurl" => "",
1788
+ ],
1789
+ "after_user_approve_email_message" => [
1790
+ "type" => "richeditor",
1791
+ "media_buttons" => true,
1792
+ "label" => esc_html__( "Message Body", "wpforo" ),
1793
+ "label_original" => "Message Body",
1794
+ "description" => sprintf(
1795
+ '<ul class="wpf-email-shortcodes">
1796
+ <li>[blogname] - %1$s</li>
1797
+ <li>[user_login] - %2$s</li>
1798
+ <li>[login_link] - %3$s</li>
1799
+ <li>[login_url] - %4$s</li>
1800
+ </ul>',
1801
+ __( 'WordPress Blog Name', 'wpforo' ),
1802
+ __( 'Approved User Login', 'wpforo' ),
1803
+ __( 'Approved User Login Link', 'wpforo' ),
1804
+ __( 'Approved User Login URL', 'wpforo' )
1805
+ ),
1806
+ "description_original" => "[user_login] - Approved User Login [login_link] - Approved User Login Link [login_url] - Approved User Login URL ",
1807
+ "docurl" => "",
1808
+ ],
1809
  ],
1810
  ],
1811
  'subscriptions' => [
3386
  if( ! $max_upload_size || $max_upload_size > 10485760 ) $max_upload_size = 10485760;
3387
 
3388
  $this->_slugs = [
3389
+ 'paged' => 'paged',
3390
+ 'postid' => 'postid',
3391
+ 'topicid' => 'topicid',
3392
  ];
3393
  $this->_slugs = (array) apply_filters( 'wpforo_settings_init__slugs', $this->_slugs );
3394
 
3549
  $this->_board = [
3550
  'under_construction' => false,
3551
  'cache' => true,
3552
+ 'url_structure' => 'full',
3553
  ];
3554
  $this->_forums = [
3555
  'layout_extended_intro_topics_toggle' => true,
3837
  'wp_new_user_notification_email_message' => __( "Username: [user_login]\n\nTo set your password, visit the following address:\n\n[set_password_url]\n\n", 'wpforo' ),
3838
  'overwrite_reset_password_email' => true,
3839
  'reset_password_email_message' => __( "Hello! \n\n You asked us to reset your password for your account using the email address [user_login]. \n\n If this was a mistake, or you didn't ask for a password reset, just ignore this email and nothing will happen. \n\n To reset your password, visit the following address: \n\n [reset_password_url] \n\n Thanks!", 'wpforo' ),
3840
+ 'after_user_approve_email_subject' => __( '[blogname] - Your Account Has been Approved', 'wpforo' ),
3841
+ 'after_user_approve_email_message' => __( 'Hi [user_login] , Thank you for your registration. Your account has been approved. Your can login here: [login_link]', 'wpforo' ),
3842
  ];
3843
  $this->_subscriptions = [
3844
  'subscribe_confirmation' => true,
classes/Template.php CHANGED
@@ -61,6 +61,7 @@ class Template {
61
  } );
62
 
63
  add_filter( 'wpforo_content_after', [ $this, 'do_spoilers' ] );
 
64
  add_action( 'wp_footer', [ $this, 'add_footer_html' ], 999999 );
65
 
66
  add_action( 'wpforo_profile_head_right', function( $user ){
@@ -986,7 +987,7 @@ class Template {
986
  $style = ( $layout === 3 && ! wpforo_setting( 'posting', 'qa_display_answer_editor' ) ) ? 'style="display: none;"' : '';
987
  $parentid = ( $layout === 3 && ! WPF()->topic->can_answer( $topic['topicid'] ) ) ? wpforo_bigintval( wpfval( $topic, 'first_postid' ) ) : 0;
988
  $v = $values;
989
- if( ! trim( wpfval( $v, 'title' ) ) ) $v['title'] = $topic['title'];
990
  ?>
991
  <div class="wpf-form-wrapper wpfel-<?php echo $layout ?>" <?php echo $style ?>>
992
  <?php if( ! $values ): ?>
@@ -1733,8 +1734,8 @@ class Template {
1733
  }
1734
  break;
1735
  case 'link':
1736
- $full_url = esc_url( wpforo_post( $postid, 'url' ) );
1737
- $short_url = esc_url( wpforo_home_url( '/' . wpforo_settings_get_slug( 'postid' ) . '/' . $postid . '/' ) );
1738
  $title = esc_attr( wpforo_phrase( 'Post link', false ) );
1739
  $button_html[] = sprintf(
1740
  '<span class="wpf-action" title="%1$s" data-copy-wpf-furl="%2$s" data-copy-wpf-shurl="%3$s"><i class="fas fa-link wpfsx"></i></span>',
@@ -2739,18 +2740,46 @@ class Template {
2739
 
2740
  public function do_spoilers( $text ) {
2741
  $text = preg_replace(
2742
- '#(?:<(p|a|span|blockquote|b|i|pre|font|del|strike|strong|em|div|u|center|marquee|table|tr|td|th|tt|sup|sub|s|ul|ol|li|small|code|h\d)(?:[\r\n\t\s\0]+[^<>]*?)?>[\r\n\t\s\0]*)\[[\r\n\t\s\0]*spoiler(?:[\r\n\t\s\0]*title[\r\n\t\s\0]*=[\r\n\t\s\0]*\"([^\"]+)\")?[\r\n\t\s\0]*\](?:[\r\n\t\s\0]*</\1>)#isu',
2743
  '<div class="wpf-spoiler-wrap"><div class="wpf-spoiler-head"><i class="wpf-spoiler-chevron-name">' . wpforo_phrase( 'Spoiler', false ) . '</i><i class="wpf-spoiler-chevron fas fa-chevron-down"></i><div class="wpf-spoiler-title">$2</div></div><div class="wpf-spoiler-body">',
2744
  $text,
2745
  - 1,
2746
  $count1
2747
  );
2748
- $text = preg_replace( '#\[[\r\n\t\s\0]*spoiler(?:[\r\n\t\s\0]*title[\r\n\t\s\0]*=[\r\n\t\s\0]*\"([^\"]+)\")?[\r\n\t\s\0]*\]#isu', '<div class="wpf-spoiler-wrap"><div class="wpf-spoiler-head"><i class="wpf-spoiler-chevron-name">' . wpforo_phrase( 'Spoiler', false ) . '</i><i class="wpf-spoiler-chevron fas fa-chevron-down"></i><div class="wpf-spoiler-title">$1</div></div><div class="wpf-spoiler-body">', $text, - 1, $count2 );
2749
- $text = preg_replace( '#(?:<(p|a|span|blockquote|b|i|pre|font|del|strike|strong|em|div|u|center|marquee|table|tr|td|th|tt|sup|sub|s|ul|ol|li|small|code|h\d)(?:[\r\n\t\s\0]+[^<>]*?)?>[\r\n\t\s\0]*)\[[\r\n\t\s\0]*/[\r\n\t\s\0]*spoiler[\r\n\t\s\0]*\](?:[\r\n\t\s\0]*</\1>)#isu', '</div></div>', $text, $count1 );
2750
 
2751
- return preg_replace( '#\[[\r\n\t\s\0]*/[\r\n\t\s\0]*spoiler[\r\n\t\s\0]*\]#isu', '</div></div>', $text, $count2 );
2752
  }
2753
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2754
  public function please_login() {
2755
  if( ! wpforo_is_bot() ) {
2756
  $html = sprintf(
@@ -2882,8 +2911,16 @@ class Template {
2882
  public function change_cover_button( $user ) {
2883
  if( WPF()->usergroup->can( 'upc' ) && WPF()->perm->user_can_edit_account( $user ) ){
2884
  return sprintf(
2885
- '<div class="wpf-edit-cover" wpf-tooltip="%1$s" wpf-tooltip-position="top" wpf-tooltip-size="small"><i class="fas fa-images"></i></div>',
2886
- wpforo_phrase('Change Cover Image', false)
 
 
 
 
 
 
 
 
2887
  );
2888
  }
2889
 
61
  } );
62
 
63
  add_filter( 'wpforo_content_after', [ $this, 'do_spoilers' ] );
64
+ add_filter( 'wpforo_content_after', [ $this, 'apply_quotes' ] );
65
  add_action( 'wp_footer', [ $this, 'add_footer_html' ], 999999 );
66
 
67
  add_action( 'wpforo_profile_head_right', function( $user ){
987
  $style = ( $layout === 3 && ! wpforo_setting( 'posting', 'qa_display_answer_editor' ) ) ? 'style="display: none;"' : '';
988
  $parentid = ( $layout === 3 && ! WPF()->topic->can_answer( $topic['topicid'] ) ) ? wpforo_bigintval( wpfval( $topic, 'first_postid' ) ) : 0;
989
  $v = $values;
990
+ if( ! trim( (string) wpfval( $v, 'title' ) ) ) $v['title'] = $topic['title'];
991
  ?>
992
  <div class="wpf-form-wrapper wpfel-<?php echo $layout ?>" <?php echo $style ?>>
993
  <?php if( ! $values ): ?>
1734
  }
1735
  break;
1736
  case 'link':
1737
+ $full_url = esc_url( wpforo_post( $postid, 'full_url' ) );
1738
+ $short_url = esc_url( wpforo_post( $postid, 'short_url' ) );
1739
  $title = esc_attr( wpforo_phrase( 'Post link', false ) );
1740
  $button_html[] = sprintf(
1741
  '<span class="wpf-action" title="%1$s" data-copy-wpf-furl="%2$s" data-copy-wpf-shurl="%3$s"><i class="fas fa-link wpfsx"></i></span>',
2740
 
2741
  public function do_spoilers( $text ) {
2742
  $text = preg_replace(
2743
+ '#(?:<(p|a|span|blockquote|b|i|pre|font|del|strike|strong|em|div|u|center|marquee|table|tr|td|th|tt|sup|sub|s|ul|ol|li|small|code|h\d)(?:[\r\n\t\s\0]+[^<>]*?)?>[\r\n\t\s\0]*)\[[\r\n\t\s\0]*spoiler(?:[\r\n\t\s\0]*title[\r\n\t\s\0]*=[\r\n\t\s\0]*\"([^\"]+)\")?[\r\n\t\s\0]*](?:[\r\n\t\s\0]*</\1>)#iu',
2744
  '<div class="wpf-spoiler-wrap"><div class="wpf-spoiler-head"><i class="wpf-spoiler-chevron-name">' . wpforo_phrase( 'Spoiler', false ) . '</i><i class="wpf-spoiler-chevron fas fa-chevron-down"></i><div class="wpf-spoiler-title">$2</div></div><div class="wpf-spoiler-body">',
2745
  $text,
2746
  - 1,
2747
  $count1
2748
  );
2749
+ $text = preg_replace( '#\[[\r\n\t\s\0]*spoiler(?:[\r\n\t\s\0]*title[\r\n\t\s\0]*=[\r\n\t\s\0]*\"([^\"]+)\")?[\r\n\t\s\0]*]#iu', '<div class="wpf-spoiler-wrap"><div class="wpf-spoiler-head"><i class="wpf-spoiler-chevron-name">' . wpforo_phrase( 'Spoiler', false ) . '</i><i class="wpf-spoiler-chevron fas fa-chevron-down"></i><div class="wpf-spoiler-title">$1</div></div><div class="wpf-spoiler-body">', $text, - 1, $count2 );
2750
+ $text = preg_replace( '#(?:<(p|a|span|blockquote|b|i|pre|font|del|strike|strong|em|div|u|center|marquee|table|tr|td|th|tt|sup|sub|s|ul|ol|li|small|code|h\d)(?:[\r\n\t\s\0]+[^<>]*?)?>[\r\n\t\s\0]*)\[[\r\n\t\s\0]*/[\r\n\t\s\0]*spoiler[\r\n\t\s\0]*](?:[\r\n\t\s\0]*</\1>)#iu', '</div></div>', $text, $count1 );
2751
 
2752
+ return preg_replace( '#\[[\r\n\t\s\0]*/[\r\n\t\s\0]*spoiler[\r\n\t\s\0]*]#iu', '</div></div>', $text, $count2 );
2753
  }
2754
 
2755
+ public function apply_quotes( $text ) {
2756
+ $text = preg_replace_callback( '#\[quote(\s[^\[\]]+|\s?)?]#iu', function( $m ){
2757
+ $userid = 0;
2758
+ $postid = 0;
2759
+ $mention = '';
2760
+ $posted_by = '';
2761
+ if( preg_match( '#data-userid=[\'"](\d+)[\'"]#iu', $m[1], $u ) ) $userid = wpforo_bigintval( $u[1] );
2762
+ if( preg_match( '#data-postid=[\'"](\d+)[\'"]#iu', $m[1], $p ) ) $postid = wpforo_bigintval( $p[1] );
2763
+
2764
+ if( $userid ){
2765
+ $profiles_mention_nicknames = wpforo_setting( 'profiles', 'mention_nicknames' );
2766
+ $posted_by = $mention = trim( $profiles_mention_nicknames ? wpforo_member( $userid, 'user_nicename' ) : wpforo_member( $userid, 'display_name' ) );
2767
+ if( $profiles_mention_nicknames ) $posted_by = '@' . $posted_by;
2768
+ }
2769
+
2770
+ return sprintf(
2771
+ '<blockquote data-userid="%1$d" data-postid="%2$d" data-mention="%3$s"><div class="wpforo-post-quote-head">%4$s %5$s</div>',
2772
+ $userid,
2773
+ $postid,
2774
+ $mention,
2775
+ ( $posted_by ? sprintf('<div class="wpforo-post-quote-author"><strong> Posted by: %1$s </strong></div>', $posted_by) : '' ),
2776
+ ( $postid ? sprintf( '<div class="wpforo-post-quote-link"><a href="%1$s" title="%2$s">&uarr;</a></div>', WPF()->post->get_url( $postid ), wpforo_phrase( 'go to original post', false ) ) : '' )
2777
+ );
2778
+ }, $text );
2779
+
2780
+ return preg_replace( '#\[/quote]#iu', '</blockquote>', $text );
2781
+ }
2782
+
2783
  public function please_login() {
2784
  if( ! wpforo_is_bot() ) {
2785
  $html = sprintf(
2911
  public function change_cover_button( $user ) {
2912
  if( WPF()->usergroup->can( 'upc' ) && WPF()->perm->user_can_edit_account( $user ) ){
2913
  return sprintf(
2914
+ '<div class="wpf-edit-cover" wpf-tooltip="%1$s" wpf-tooltip-position="top" wpf-tooltip-size="small">
2915
+ <i class="fas fa-images" data-action="editcover"></i>
2916
+ <ul class="wpf-edit-cover-options">
2917
+ <li class="wpf-upload-cover"><i class="fas fa-upload"></i> %2$s</li>
2918
+ <li class="wpf-delete-cover"><i class="fas fa-rotate-left"></i> %3$s</li>
2919
+ </ul>
2920
+ </div>',
2921
+ wpforo_phrase('Change Cover Image', false),
2922
+ wpforo_phrase('Upload New Cover', false),
2923
+ wpforo_phrase( 'Set the Default', false )
2924
  );
2925
  }
2926
 
classes/Topics.php CHANGED
@@ -198,7 +198,7 @@ class Topics {
198
  $args['type'] = $type;
199
  $args['status'] = $status;
200
  $args['private'] = $private;
201
- $args['url'] = $args['topicurl'] = $this->get_topic_url( $topicid );
202
  if( $tags && ! $status && ! $private ) $this->add_tags( $tags );
203
 
204
  do_action( 'wpforo_after_add_topic', $args, $forum );
@@ -528,7 +528,11 @@ class Topics {
528
  }
529
  }
530
 
531
- if( $topic ) $topic['url'] = $this->get_topic_url( $topic, [], false );
 
 
 
 
532
 
533
  return $topic;
534
  }
@@ -1064,16 +1068,41 @@ class Topics {
1064
  return false;
1065
  }
1066
 
 
 
 
 
 
 
 
 
 
1067
  public function _get_topic_url( $topic, $forum = [], $_cache = true ) {
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1068
  if( ! is_array( $topic ) ) $topic = $this->get_topic( $topic );
1069
  if( $topic ) {
1070
- $cache = WPF()->cache->on();
1071
- // $_cache is used to stop caching on merge and move actions,
1072
- // otherwise the merging and splitting go to redirection loop
1073
- if( $_cache && $cache && wpfval($topic, 'topicid') ) {
1074
- $topic_url = WPF()->cache->get_item( $topic['topicid'], 'url', 'topic' );
1075
- if( $topic_url ) return $topic_url;
1076
- }
1077
  if( is_array( $forum ) && ! empty( $forum ) ) {
1078
  $forum_slug = $forum['slug'];
1079
  } else {
@@ -1085,19 +1114,51 @@ class Topics {
1085
  }
1086
  }
1087
  if( wpfval( $topic, 'slug' ) ) {
1088
- $topic_url = wpforo_home_url( $forum_slug . '/' . $topic['slug'] );
1089
- if( $cache ) WPF()->cache->create( 'item', [ 'topic_' . intval( $topic['topicid'] ) => $topic_url ], 'url' );
1090
- return $topic_url;
1091
- }
1092
  }
1093
 
1094
  return wpforo_home_url();
1095
  }
1096
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1097
  public function get_topic_url( $topic, $forum = [], $_cache = true ) {
1098
- return wpforo_ram_get( [ $this, '_get_topic_url' ], $topic, $forum, $_cache );
1099
  }
1100
 
 
 
 
 
 
 
 
 
 
 
1101
 
1102
  function get_count( $args = [] ) {
1103
  $sql = "SELECT SQL_NO_CACHE COUNT(*) FROM `" . WPF()->tables->topics . "`";
198
  $args['type'] = $type;
199
  $args['status'] = $status;
200
  $args['private'] = $private;
201
+ $args['url'] = $args['topicurl'] = $this->get_url( $topicid );
202
  if( $tags && ! $status && ! $private ) $this->add_tags( $tags );
203
 
204
  do_action( 'wpforo_after_add_topic', $args, $forum );
528
  }
529
  }
530
 
531
+ if( $topic ) {
532
+ $topic['url'] = $this->get_url( $topic, [], false );
533
+ $topic['full_url'] = $this->get_full_url( $topic, [], false );
534
+ $topic['short_url'] = $this->get_short_url( $topic );
535
+ }
536
 
537
  return $topic;
538
  }
1068
  return false;
1069
  }
1070
 
1071
+ /**
1072
+ * @deprecated since 2.0.10 instead this method use _get_url()
1073
+ *
1074
+ * @param $topic
1075
+ * @param $forum
1076
+ * @param $_cache
1077
+ *
1078
+ * @return string
1079
+ */
1080
  public function _get_topic_url( $topic, $forum = [], $_cache = true ) {
1081
+ return $this->_get_url( $topic, $forum, $_cache );
1082
+ }
1083
+
1084
+ /**
1085
+ * @param $topic
1086
+ * @param $forum
1087
+ * @param $_cache
1088
+ *
1089
+ * @return string
1090
+ */
1091
+ public function _get_url( $topic, $forum = [], $_cache = true ) {
1092
+ if( wpforo_setting( 'board', 'url_structure' ) === 'short' ) return $this->get_short_url( $topic );
1093
+ return $this->get_full_url( $topic, $forum, $_cache );
1094
+ }
1095
+
1096
+ public function get_full_url( $topic, $forum = [], $_cache = true ) {
1097
  if( ! is_array( $topic ) ) $topic = $this->get_topic( $topic );
1098
  if( $topic ) {
1099
+ $cache = WPF()->cache->on();
1100
+ // $_cache is used to stop caching on merge and move actions,
1101
+ // otherwise the merging and splitting go to redirection loop
1102
+ if( $_cache && $cache && wpfval($topic, 'topicid') ) {
1103
+ $topic_url = (string) WPF()->cache->get_item( $topic['topicid'], 'url', 'topic' );
1104
+ if( $topic_url ) return $topic_url;
1105
+ }
1106
  if( is_array( $forum ) && ! empty( $forum ) ) {
1107
  $forum_slug = $forum['slug'];
1108
  } else {
1114
  }
1115
  }
1116
  if( wpfval( $topic, 'slug' ) ) {
1117
+ $topic_url = wpforo_home_url( $forum_slug . '/' . $topic['slug'] );
1118
+ if( $cache ) WPF()->cache->create( 'item', [ 'topic_' . intval( $topic['topicid'] ) => $topic_url ], 'url' );
1119
+ return $topic_url;
1120
+ }
1121
  }
1122
 
1123
  return wpforo_home_url();
1124
  }
1125
 
1126
+ public function get_short_url( $arg ) {
1127
+ if( is_numeric( $arg ) ){
1128
+ $topicid = $arg;
1129
+ }elseif( wpfkey( $arg, 'topicid' ) ){
1130
+ $topicid = $arg['topicid'];
1131
+ }else{
1132
+ $topicid = 0;
1133
+ }
1134
+
1135
+ if( $topicid = wpforo_bigintval( $topicid ) ) return wpforo_home_url( '/' . wpforo_settings_get_slug( 'topicid' ) . '/' . $topicid . '/' );
1136
+ return wpforo_home_url();
1137
+ }
1138
+
1139
+ /**
1140
+ * @deprecated since 2.0.10 instead this method use get_url()
1141
+ *
1142
+ * @param $topic
1143
+ * @param $forum
1144
+ * @param $_cache
1145
+ *
1146
+ * @return string
1147
+ */
1148
  public function get_topic_url( $topic, $forum = [], $_cache = true ) {
1149
+ return $this->get_url( $topic, $forum, $_cache );
1150
  }
1151
 
1152
+ /**
1153
+ * @param $topic
1154
+ * @param $forum
1155
+ * @param $_cache
1156
+ *
1157
+ * @return string
1158
+ */
1159
+ public function get_url( $topic, $forum = [], $_cache = true ) {
1160
+ return (string) wpforo_ram_get( [ $this, '_get_url' ], $topic, $forum, $_cache );
1161
+ }
1162
 
1163
  function get_count( $args = [] ) {
1164
  $sql = "SELECT SQL_NO_CACHE COUNT(*) FROM `" . WPF()->tables->topics . "`";
includes/functions-template.php CHANGED
@@ -269,7 +269,11 @@ function wpforo_post( $postid, $var = 'item', $echo = false ) {
269
  if( empty( $post ) ) {
270
  $post = [];
271
  if( ! $cache && $var === 'url' ) {
272
- $post['url'] = WPF()->post->get_post_url( $postid );
 
 
 
 
273
  } elseif( ! $cache && $var === 'is_answered' ) {
274
  $post['is_answered'] = WPF()->post->is_answered( $postid );
275
  } elseif( ! $cache && $var === 'likes_count' ) {
@@ -279,7 +283,9 @@ function wpforo_post( $postid, $var = 'item', $echo = false ) {
279
  } else {
280
  $post = WPF()->post->get_post( $postid );
281
  if( ! empty( $post ) ) {
282
- $post['url'] = WPF()->post->get_post_url( $post );
 
 
283
  $post['is_answered'] = WPF()->post->is_answered( $postid );
284
  $post['likes_count'] = WPF()->reaction->get_post_reactions_count( $postid );
285
  $post['likers_usernames'] = WPF()->reaction->get_post_reactions_user_dnames( $postid );
@@ -308,11 +314,17 @@ function wpforo_topic( $topicid, $var = 'item', $echo = false ) {
308
  if( empty( $topic ) ) {
309
  $topic = [];
310
  if( ! $cache && $var === 'url' ) {
311
- $topic['url'] = WPF()->topic->get_topic_url( $topicid );
 
 
 
 
312
  } else {
313
  $topic = WPF()->topic->get_topic( $topicid );
314
  if( ! empty( $topic ) ) {
315
- $topic['url'] = WPF()->topic->get_topic_url( $topic );
 
 
316
  if( ! empty( $topic ) ) {
317
  $cache_item = [ $topicid => $topic ];
318
  WPF()->cache->create( 'item', $cache_item, 'topic' );
@@ -988,7 +1000,7 @@ function wpforo_activity_content_delete( $item = [] ) {
988
  function wpforo_activity_content_on_post_status_change( $post, $status = 0 ) {
989
  if( ! empty( $post ) ) {
990
  $post['status'] = $status;
991
- $post['posturl'] = WPF()->post->get_post_url( $post['postid'] );
992
  if( ! (int) wpfval( $post, 'is_first_post' ) ) {
993
  if( $status ) {
994
  wpforo_activity_content_delete( $post );
@@ -1003,7 +1015,7 @@ add_action( 'wpforo_post_status_update', 'wpforo_activity_content_on_post_status
1003
  function wpforo_activity_content_on_topic_status_change( $topic, $status = 0 ) {
1004
  if( ! empty( $topic ) ) {
1005
  $topic['status'] = $status;
1006
- $topic['topicurl'] = WPF()->topic->get_topic_url( $topic['topicid'] );
1007
  if( $status ) {
1008
  wpforo_activity_content_delete( $topic );
1009
  } else {
269
  if( empty( $post ) ) {
270
  $post = [];
271
  if( ! $cache && $var === 'url' ) {
272
+ $post['url'] = WPF()->post->get_url( $postid );
273
+ } elseif( ! $cache && $var === 'full_url' ) {
274
+ $post['full_url'] = WPF()->post->get_full_url( $postid );
275
+ } elseif( ! $cache && $var === 'short_url' ) {
276
+ $post['short_url'] = WPF()->post->get_short_url( $postid );
277
  } elseif( ! $cache && $var === 'is_answered' ) {
278
  $post['is_answered'] = WPF()->post->is_answered( $postid );
279
  } elseif( ! $cache && $var === 'likes_count' ) {
283
  } else {
284
  $post = WPF()->post->get_post( $postid );
285
  if( ! empty( $post ) ) {
286
+ $post['url'] = WPF()->post->get_url( $post );
287
+ $post['full_url'] = WPF()->post->get_full_url( $post );
288
+ $post['short_url'] = WPF()->post->get_short_url( $post );
289
  $post['is_answered'] = WPF()->post->is_answered( $postid );
290
  $post['likes_count'] = WPF()->reaction->get_post_reactions_count( $postid );
291
  $post['likers_usernames'] = WPF()->reaction->get_post_reactions_user_dnames( $postid );
314
  if( empty( $topic ) ) {
315
  $topic = [];
316
  if( ! $cache && $var === 'url' ) {
317
+ $topic['url'] = WPF()->topic->get_url( $topicid );
318
+ }elseif( ! $cache && $var === 'full_url' ) {
319
+ $topic['full_url'] = WPF()->topic->get_full_url( $topicid );
320
+ }elseif( ! $cache && $var === 'short_url' ) {
321
+ $topic['short_url'] = WPF()->topic->get_short_url( $topicid );
322
  } else {
323
  $topic = WPF()->topic->get_topic( $topicid );
324
  if( ! empty( $topic ) ) {
325
+ $topic['url'] = WPF()->topic->get_url( $topic );
326
+ $topic['full_url'] = WPF()->topic->get_full_url( $topic );
327
+ $topic['short_url'] = WPF()->topic->get_short_url( $topic );
328
  if( ! empty( $topic ) ) {
329
  $cache_item = [ $topicid => $topic ];
330
  WPF()->cache->create( 'item', $cache_item, 'topic' );
1000
  function wpforo_activity_content_on_post_status_change( $post, $status = 0 ) {
1001
  if( ! empty( $post ) ) {
1002
  $post['status'] = $status;
1003
+ $post['posturl'] = WPF()->post->get_url( $post['postid'] );
1004
  if( ! (int) wpfval( $post, 'is_first_post' ) ) {
1005
  if( $status ) {
1006
  wpforo_activity_content_delete( $post );
1015
  function wpforo_activity_content_on_topic_status_change( $topic, $status = 0 ) {
1016
  if( ! empty( $topic ) ) {
1017
  $topic['status'] = $status;
1018
+ $topic['topicurl'] = WPF()->topic->get_url( $topic['topicid'] );
1019
  if( $status ) {
1020
  wpforo_activity_content_delete( $topic );
1021
  } else {
includes/functions.php CHANGED
@@ -336,7 +336,7 @@ function wpforo_get_addons_info( $base = null ) {
336
  'class' => 'wpForoWooMembers',
337
  'deps' => [],
338
  'title' => 'WooCommerce Memberships Integration',
339
- 'thumb' => WPFORO_URL . '/assets/addons/wpforo-coocomerce-memberships/header.png',
340
  'desc' => __( 'Allows to setup membership access to your forums and topics through WooCommerce Memberships plugin.', 'wpforo' ),
341
  'url' => 'https://gvectors.com/product/wpforo-woocommerce-memberships/',
342
  ],
@@ -804,10 +804,11 @@ function wpforo_screen_option() { ?>
804
 
805
  function wpforo_strip_shortcodes( $text, $only_wpforo_shortcodes = false ) {
806
  $text = apply_filters( 'wpforo_strip_shortcodes', $text, $only_wpforo_shortcodes );
807
- $text = preg_replace( '#\[attach[^\[\]]*\][^\[\]]*\[/attach\]#isu', '', $text );
808
- $text = preg_replace( '#\[spoiler[^\[\]]*\][^\[\]]*\[/spoiler\]#isu', '', $text );
809
- $text = preg_replace( '#\[wpfgiphy[^\[\]]+?\]#isu', '', $text );
810
- $text = preg_replace( '#\[wpftenor[^\[\]]+?\]#isu', '', $text );
 
811
  // $text = preg_replace('#(?:{\w+})?:[^/.\s]+:#iu', '', $text);
812
  if( ! $only_wpforo_shortcodes ) $text = strip_shortcodes( $text );
813
 
@@ -815,11 +816,12 @@ function wpforo_strip_shortcodes( $text, $only_wpforo_shortcodes = false ) {
815
  }
816
 
817
  function wpforo_strip_quotes( $text ) {
818
- return preg_replace( '#<(blockquote)[^<>]*?data-userid[^<>]*?>(?:.*?(?R)*.*?)*?</\1>#isu', '', $text );
 
819
  }
820
 
821
  function wpforo_strip_urls( $text ) {
822
- return preg_replace( '#(?:[^\'\"]|^)(https?://[^\s\'\"<>]+)(?:[^\'\"]|$)#isu', '', $text );
823
  }
824
 
825
  function wpforo_text( $text, $length = 0, $echo = true, $strip_tags = true, $strip_urls = true, $strip_shortcodes = true, $strip_quotes = true ) {
@@ -2141,7 +2143,7 @@ function wpforo_key( $array = [], $value = '', $type = 'default' ) {
2141
  }
2142
 
2143
  function wpforo_unslashe( $data ) {
2144
- $data = is_array( $data ) ? array_map( 'wpforo_unslashe', $data ) : stripslashes( $data );
2145
 
2146
  return $data;
2147
  }
@@ -2719,7 +2721,7 @@ function wpforo_get_topic_slug_from_url( $url = '' ) {
2719
 
2720
  if( is_wpforo_url( $url ) ) {
2721
  if( preg_match( '#/' . preg_quote( wpforo_settings_get_slug( 'postid' ) ) . '/(\d+)/?$#isu', strtok( $url, '?' ), $match ) ) {
2722
- $url = WPF()->post->get_post_url( $match[1] );
2723
  }
2724
  if( preg_match( '#^[\r\n\t\s]*https?://[^\r\n\t\s]+?/[^/]+?/([^/]+?)(?:/' . wpforo_settings_get_slug( 'paged' ) . '/\d+/?)?(?:/?\#post-\d+)?/?[\r\n\t\s]*$#isu', $url, $match ) ) {
2725
  return $match[1];
@@ -2801,7 +2803,7 @@ function is_wpforo_multiboard() {
2801
  }
2802
 
2803
  function wpforo_get_redirect_to() {
2804
- if( ! ( ( $redirect_to = urldecode( wpfval( $_GET, 'redirect_to' ) ) ) && wpforo_is_url_internal( $redirect_to ) ) ) {
2805
  $redirect_to = preg_replace( '#/?\?.*$#isu', '', wpforo_get_request_uri() );
2806
  }
2807
 
@@ -2916,79 +2918,87 @@ function wpforo_setting( $group, $name ) {
2916
  return null;
2917
  }
2918
 
2919
- function wpforo_apply_email_shortcodes( $txt, $pitem, $item, $owner, $user, $unsubscribe_link ){
2920
- $forumid = ( intval( wpfval( $pitem, 'forumid' ) ) ?: intval( wpfval( $item, 'forumid' ) ) );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2921
  $topicid = ( wpforo_bigintval( wpfval( $pitem, 'topicid' ) ) ?: wpforo_bigintval( wpfval( $item, 'topicid' ) ) );
2922
- $postid = ( wpforo_bigintval( wpfval( $item, 'postid' ) ) ?: wpforo_bigintval( wpfval( $item, 'first_postid' ) ) );
2923
-
2924
- return preg_replace_callback( '#\[[^\[\]]+?]#iu', function( $match ) use ( $forumid, $topicid, $postid, $user, $owner, $unsubscribe_link ){
2925
- $body_length = apply_filters( 'wpforo_email_notification_post_body_length', 1000 );
2926
- $value = '';
2927
- $shortcode = $match[0];
2928
-
2929
- if( $shortcode === '[forum_link]' ){
2930
- if( $forumid ){
2931
- $value = sprintf( '<a target="_blank" href="%1$s">%2$s</a>', esc_url( wpforo_forum( $forumid, 'url' ) ), sanitize_text_field( wpforo_forum( $forumid, 'title' ) ) );
2932
- $value = stripslashes( $value );
2933
- }
2934
- }elseif ( $shortcode === '[topic_link]' ){
2935
- if( $topicid ){
2936
- $value = sprintf( '<a target="_blank" href="%1$s">%2$s</a>', esc_url( wpforo_topic( $topicid, 'url' ) ), sanitize_text_field( wpforo_topic( $topicid, 'title' ) ) );
2937
- $value = stripslashes( $value );
2938
- }
2939
- }elseif ( $shortcode === '[post_link]' ){
2940
- if( $postid ){
2941
- $value = sprintf( '<a target="_blank" href="%1$s">%2$s</a>', esc_url( wpforo_post( $postid, 'url' ) ), sanitize_text_field( wpforo_post( $postid, 'title' ) ) );
2942
- $value = stripslashes( $value );
2943
- }
2944
- }elseif ( $shortcode === '[unsubscribe_link]' ){
2945
- if( $unsubscribe_link ){
2946
- $value = sprintf( '<br><a target="_blank" href="%1$s">%2$s</a>', esc_url( $unsubscribe_link ), wpforo_phrase( 'Unsubscribe', false ) );
2947
- $value = stripslashes( $value );
2948
- }
2949
- }elseif ( preg_match( '#\[user_([^\[\]]+?)]#iu', $shortcode, $match ) ){
2950
- if( wpforo_bigintval( wpfval( $user, 'userid' ) ) ){
2951
- $value = wpforo_user_field_shortcode_to_value( '['. $match[1] .']', $user['userid'] );
2952
- if( ! $value || ! ( is_string( $value ) || is_numeric( $value ) ) ) $value = '';
2953
- }else{
2954
- if( $shortcode === '[user_display_name]' ){
2955
- $value = wpfval( $user, 'display_name' ) ?: wpforo_phrase( 'Anonymous', false );
2956
- }elseif( $shortcode === '[user_user_email]' ){
2957
- $value = (string) wpfval( $user, 'user_email' );
2958
- }
2959
- }
2960
- }elseif ( preg_match( '#\[owner_([^\[\]]+?)]#iu', $shortcode, $match ) ){
2961
- if( wpforo_bigintval( wpfval( $owner, 'userid' ) ) ){
2962
- $value = wpforo_user_field_shortcode_to_value( '['. $match[1] .']', $owner['userid'] );
2963
- if( ! $value || ! ( is_string( $value ) || is_numeric( $value ) ) ) $value = '';
2964
- }else{
2965
- if( $shortcode === '[owner_display_name]' ){
2966
- $value = wpfval( $owner, 'display_name' ) ?: wpforo_phrase( 'Anonymous', false );
2967
- }elseif( $shortcode === '[owner_user_email]' ){
2968
- $value = (string) wpfval( $owner, 'user_email' );
2969
- }
2970
- }
2971
- }elseif ( preg_match( '#\[forum_([^\[\]]+?)]#iu', $shortcode, $match ) ){
2972
- if( $forumid ){
2973
- $value = wpforo_forum_field_shortcode_to_value( '['. $match[1] .']', $forumid );
2974
- if( ! $value || ! ( is_string( $value ) || is_numeric( $value ) ) ) $value = '';
2975
- }
2976
- }elseif ( preg_match( '#\[topic_([^\[\]]+?)]#iu', $shortcode, $match ) ){
2977
- if( $topicid ){
2978
- $value = wpforo_topic_field_shortcode_to_value( '['. $match[1] .']', $topicid );
2979
- if( ! $value || ! ( is_string( $value ) || is_numeric( $value ) ) ) $value = '';
2980
- if( $match[1] === 'body' ) $value = wpforo_text( wpforo_kses( $value, 'email' ), $body_length, false, false, false, true, false );
2981
- }
2982
- }elseif ( preg_match( '#\[post_([^\[\]]+?)]#iu', $shortcode, $match ) ){
2983
- if( $postid ){
2984
- $value = wpforo_post_field_shortcode_to_value( '['. $match[1] .']', $postid );
2985
- if( ! $value || ! ( is_string( $value ) || is_numeric( $value ) ) ) $value = '';
2986
- if( $match[1] === 'body' ) $value = wpforo_text( wpforo_kses( $value, 'email' ), $body_length, false, false, false, true, false );
2987
- }
2988
- }
2989
 
2990
- return $value;
2991
- }, $txt );
2992
  }
2993
 
2994
  function wpforo_send_email( $email, $sbj, $msg, $headers = '' ){
336
  'class' => 'wpForoWooMembers',
337
  'deps' => [],
338
  'title' => 'WooCommerce Memberships Integration',
339
+ 'thumb' => WPFORO_URL . '/assets/addons/wpforo-woocomerce-memberships/header.png',
340
  'desc' => __( 'Allows to setup membership access to your forums and topics through WooCommerce Memberships plugin.', 'wpforo' ),
341
  'url' => 'https://gvectors.com/product/wpforo-woocommerce-memberships/',
342
  ],
804
 
805
  function wpforo_strip_shortcodes( $text, $only_wpforo_shortcodes = false ) {
806
  $text = apply_filters( 'wpforo_strip_shortcodes', $text, $only_wpforo_shortcodes );
807
+ $text = preg_replace( '#\[attach[^\[\]]*][^\[\]]*\[/attach]#iu', '', $text );
808
+ $text = preg_replace( '#\[spoiler[^\[\]]*][^\[\]]*\[/spoiler]#iu', '', $text );
809
+ $text = preg_replace( '#\[quote[^\[\]]*][^\[\]]*\[/quote]#iu', '', $text );
810
+ $text = preg_replace( '#\[wpfgiphy[^\[\]]+?]#iu', '', $text );
811
+ $text = preg_replace( '#\[wpftenor[^\[\]]+?]#iu', '', $text );
812
  // $text = preg_replace('#(?:{\w+})?:[^/.\s]+:#iu', '', $text);
813
  if( ! $only_wpforo_shortcodes ) $text = strip_shortcodes( $text );
814
 
816
  }
817
 
818
  function wpforo_strip_quotes( $text ) {
819
+ $text = preg_replace( '#<(blockquote)[^<>]*?data-userid[^<>]*?>(?:.*?(?R)*.*?)*?</\1>#isu', '', $text );
820
+ return preg_replace( '#\[(quote)[^\[\]]*?data-userid[^\[\]]*?](?:.*?(?R)*.*?)*?\[/\1]#isu', '', $text );
821
  }
822
 
823
  function wpforo_strip_urls( $text ) {
824
+ return preg_replace( '#(?:[^\'\"]|^)(https?://[^\s\'\"<>]+)(?:[^\'\"]|$)#iu', '', $text );
825
  }
826
 
827
  function wpforo_text( $text, $length = 0, $echo = true, $strip_tags = true, $strip_urls = true, $strip_shortcodes = true, $strip_quotes = true ) {
2143
  }
2144
 
2145
  function wpforo_unslashe( $data ) {
2146
+ $data = is_array( $data ) ? array_map( 'wpforo_unslashe', $data ) : stripslashes( (string) $data );
2147
 
2148
  return $data;
2149
  }
2721
 
2722
  if( is_wpforo_url( $url ) ) {
2723
  if( preg_match( '#/' . preg_quote( wpforo_settings_get_slug( 'postid' ) ) . '/(\d+)/?$#isu', strtok( $url, '?' ), $match ) ) {
2724
+ $url = WPF()->post->get_url( $match[1] );
2725
  }
2726
  if( preg_match( '#^[\r\n\t\s]*https?://[^\r\n\t\s]+?/[^/]+?/([^/]+?)(?:/' . wpforo_settings_get_slug( 'paged' ) . '/\d+/?)?(?:/?\#post-\d+)?/?[\r\n\t\s]*$#isu', $url, $match ) ) {
2727
  return $match[1];
2803
  }
2804
 
2805
  function wpforo_get_redirect_to() {
2806
+ if( ! ( ( $redirect_to = urldecode( (string) wpfval( $_GET, 'redirect_to' ) ) ) && wpforo_is_url_internal( $redirect_to ) ) ) {
2807
  $redirect_to = preg_replace( '#/?\?.*$#isu', '', wpforo_get_request_uri() );
2808
  }
2809
 
2918
  return null;
2919
  }
2920
 
2921
+ function _wpforo_apply_email_shortcodes( $txt, $args ){
2922
+ $forumid = (int) wpfval( $args, 'forumid' );
2923
+ $topicid = wpforo_bigintval( wpfval( $args, 'topicid' ) );
2924
+ $postid = wpforo_bigintval( wpfval( $args, 'postid' ) );
2925
+ $user = (array) wpfval( $args, 'user' );
2926
+ $owner = (array) wpfval( $args, 'owner' );
2927
+ $unsubscribe_link = (string) wpfval( $args, 'unsubscribe_link' );
2928
+
2929
+ return preg_replace_callback( '#\[[^\[\]]+?]#iu', function ( $match ) use ( $forumid, $topicid, $postid, $user, $owner, $unsubscribe_link ) {
2930
+ $body_length = apply_filters( 'wpforo_email_notification_post_body_length', 1000 );
2931
+ $value = '';
2932
+ $shortcode = $match[0];
2933
+
2934
+ if ( $shortcode === '[unsubscribe_link]' ) {
2935
+ if ( $unsubscribe_link ) {
2936
+ $value = sprintf( '<br><a target="_blank" href="%1$s">%2$s</a>', esc_url( $unsubscribe_link ), wpforo_phrase( 'Unsubscribe', false ) );
2937
+ $value = stripslashes( $value );
2938
+ }
2939
+ } elseif ( strpos( $shortcode, '[user_' ) === 0 ) {
2940
+ if ( wpforo_bigintval( wpfval( $user, 'userid' ) ) ) {
2941
+ $value = wpforo_user_field_shortcode_to_value( $shortcode, $user['userid'] );
2942
+ if ( ! $value || ! ( is_string( $value ) || is_numeric( $value ) ) ) {
2943
+ $value = '';
2944
+ }
2945
+ } else {
2946
+ if ( $shortcode === '[user_display_name]' ) {
2947
+ $value = wpfval( $user, 'display_name' ) ?: wpforo_phrase( 'Anonymous', false );
2948
+ } elseif ( $shortcode === '[user_user_email]' ) {
2949
+ $value = (string) wpfval( $user, 'user_email' );
2950
+ }
2951
+ }
2952
+ } elseif ( strpos( $shortcode, '[owner_' ) === 0 ) {
2953
+ if ( wpforo_bigintval( wpfval( $owner, 'userid' ) ) ) {
2954
+ $value = wpforo_user_field_shortcode_to_value( $shortcode, $owner['userid'] );
2955
+ if ( ! $value || ! ( is_string( $value ) || is_numeric( $value ) ) ) {
2956
+ $value = '';
2957
+ }
2958
+ } else {
2959
+ if ( $shortcode === '[owner_display_name]' ) {
2960
+ $value = wpfval( $owner, 'display_name' ) ?: wpforo_phrase( 'Anonymous', false );
2961
+ } elseif ( $shortcode === '[owner_user_email]' ) {
2962
+ $value = (string) wpfval( $owner, 'user_email' );
2963
+ }
2964
+ }
2965
+ } elseif ( strpos( $shortcode, '[forum_' ) === 0 ) {
2966
+ if ( $forumid ) {
2967
+ $value = wpforo_forum_field_shortcode_to_value( $shortcode, $forumid );
2968
+ if ( ! $value || ! ( is_string( $value ) || is_numeric( $value ) ) ) {
2969
+ $value = '';
2970
+ }
2971
+ }
2972
+ } elseif ( strpos( $shortcode, '[topic_' ) === 0 ) {
2973
+ if ( $topicid ) {
2974
+ $value = wpforo_topic_field_shortcode_to_value( $shortcode, $topicid );
2975
+ if ( ! $value || ! ( is_string( $value ) || is_numeric( $value ) ) ) {
2976
+ $value = '';
2977
+ }elseif ( $shortcode === '[topic_body]' ) {
2978
+ $value = wpforo_text( wpforo_kses( $value, 'email' ), $body_length, false, false, false, true, false );
2979
+ }
2980
+ }
2981
+ } elseif ( strpos( $shortcode, '[post_' ) === 0 ) {
2982
+ if ( $postid ) {
2983
+ $value = wpforo_post_field_shortcode_to_value( $shortcode, $postid );
2984
+ if ( ! $value || ! ( is_string( $value ) || is_numeric( $value ) ) ) {
2985
+ $value = '';
2986
+ }elseif ( $shortcode === '[post_body]' ) {
2987
+ $value = wpforo_text( wpforo_kses( $value, 'email' ), $body_length, false, false, false, true, false );
2988
+ }
2989
+ }
2990
+ }
2991
+
2992
+ return $value;
2993
+ }, $txt );
2994
+ }
2995
+
2996
+ function wpforo_apply_email_shortcodes( $txt, $pitem, $item, $owner, $user, $unsubscribe_link ) {
2997
+ $forumid = ( intval( wpfval( $pitem, 'forumid' ) ) ?: intval( wpfval( $item, 'forumid' ) ) );
2998
  $topicid = ( wpforo_bigintval( wpfval( $pitem, 'topicid' ) ) ?: wpforo_bigintval( wpfval( $item, 'topicid' ) ) );
2999
+ $postid = ( wpforo_bigintval( wpfval( $item, 'postid' ) ) ?: wpforo_bigintval( wpfval( $item, 'first_postid' ) ) );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3000
 
3001
+ return _wpforo_apply_email_shortcodes( $txt, compact('forumid', 'topicid', 'postid', 'owner', 'user', 'unsubscribe_link') );
 
3002
  }
3003
 
3004
  function wpforo_send_email( $email, $sbj, $msg, $headers = '' ){
includes/hooks.php CHANGED
@@ -189,17 +189,24 @@ add_filter( 'pre_update_option', function( $value, $option, $old_value ) {
189
  return $value;
190
  }, 10, 3 );*/
191
 
192
- function wpftpl( $filename ) {
193
- $find = [];
194
  if( $filename ) {
195
- $find[] = 'wpforo/' . $filename;
196
- $template = locate_template( array_unique( $find ) );
197
- if( ! $template ) {
198
- $template = WPFORO_THEME_DIR . '/' . WPF()->tpl->theme . '/' . $filename;
199
- }
 
200
 
201
- return apply_filters( 'wpforo_wpftpl', $template );
 
 
 
 
202
  }
 
 
203
  }
204
 
205
  add_shortcode( 'wpforo', function ( $atts ) {
@@ -266,8 +273,10 @@ add_filter( 'rewrite_rules_array', function( $rules ) {
266
  if( function_exists('pll_languages_list') ) $rewrite_prefix = '(?:(' . implode('|', pll_languages_list()) . ')/)?';
267
 
268
  if( ! WPF()->board->get_current( 'is_standalone' ) ) {
 
269
  $boards = WPF()->board->get_boards( [ 'status' => true ] );
270
  foreach( $boards as $board ) {
 
271
  $route = urldecode( $board['slug'] );
272
  $route = preg_replace( '#^/?index\.php/?#isu', '', $route );
273
  $route = trim( $route, '/' );
@@ -276,7 +285,7 @@ add_filter( 'rewrite_rules_array', function( $rules ) {
276
  if( ! array_key_exists( $pattern, $rules ) ) $rules = array_merge( [ $pattern => $to_url ], $rules );
277
  }
278
 
279
- $pageid = wpforo_get_option( 'wpforo_pageid', 0 );
280
  foreach( WPF()->board->routes as $route ) {
281
  // $route = utf8_uri_encode( urldecode( $route ) );
282
  $route = urldecode( $route );
@@ -602,8 +611,7 @@ function wpf_quote() {
602
  return;
603
  }
604
  $post = apply_filters( 'wpforo_quote_post_ajax', $post );
605
- $poster = wpforo_member( $post );
606
- $response = '<blockquote data-userid="' . $post['userid'] . '" data-postid="' . $post['postid'] . '" data-mention="' . esc_attr( ( wpforo_setting( 'profiles', 'mention_nicknames' ) ? $poster['user_nicename'] : '' ) ) . '"><div class="wpforo-post-quote-author"><strong> ' . wpforo_phrase( 'Posted by', false ) . ': ' . esc_textarea( '@' . $poster['user_nicename'] ) . ' </strong></div>' . wpautop( $post['body'] ) . '</blockquote><br />';
607
  wp_send_json_success( $response );
608
  }
609
 
@@ -621,11 +629,11 @@ function wpf_report() {
621
  }
622
 
623
  ############### Sending Email ##################
624
- $report_text = substr( $_POST['reportmsg'], 0, 1000 );
625
  $postid = intval( $_POST['postid'] );
626
  $reporter = '<a href="' . WPF()->current_user['profile_url'] . '">' . ( WPF()->current_user['display_name'] ? WPF()->current_user['display_name'] : urldecode( WPF()->current_user['user_nicename'] ) ) . '</a>';
627
  $reportmsg = wpforo_kses( $report_text, 'email' );
628
- $post_url = WPF()->post->get_post_url( $postid );
629
 
630
  $subject = wpforo_setting( 'email', 'report_email_subject' );
631
  $message = wpforo_setting( 'email', 'report_email_message' );
@@ -997,7 +1005,7 @@ function wpforo_post_url_fixer() {
997
  }
998
  set_transient( 'wpforo_post_url_fixer' . $referer_hash, $nowtime, 1000 );
999
  if( $post = WPF()->post->get_post( $postid ) ) {
1000
- echo WPF()->post->get_post_url( $post );
1001
  }
1002
  }
1003
  }
@@ -1160,10 +1168,10 @@ function wpforo_frontend_register_scripts() {
1160
  'suggest',
1161
  'wpforo-frontend-js',
1162
  ], WPFORO_VERSION, true );
1163
- wp_register_style( 'wpforo-style', WPF()->tpl->template_url . '/style.css', false, WPFORO_VERSION );
1164
- wp_register_style( 'wpforo-style-rtl', WPF()->tpl->template_url . '/style-rtl.css', false, WPFORO_VERSION );
1165
- wp_register_style( 'wpforo-widgets', WPF()->tpl->template_url . '/widgets.css', [], WPFORO_VERSION );
1166
- wp_register_style( 'wpforo-widgets-rtl', WPF()->tpl->template_url . '/widgets-rtl.css', [], WPFORO_VERSION );
1167
  wp_register_script( 'wpforo-widgets-js', WPFORO_URL . '/assets/js/widgets.js', [ 'jquery' ], WPFORO_VERSION, true );
1168
  $wpforo_widgets = [
1169
  'ajax_url' => wpforo_get_ajax_url(),
@@ -1265,6 +1273,7 @@ function wpforo_admin_enqueue() {
1265
  'pick' => __( 'Select Color' ),
1266
  ] );
1267
  wp_register_script( 'wpforo-contenthover-addons', WPFORO_URL . '/admin/assets/js/contenthover/jquery.contenthover.min.js', [ 'jquery' ], WPFORO_VERSION, false );
 
1268
  wp_register_script( 'wpforo-backend-js', WPFORO_URL . '/admin/assets/js/backend.js', [ 'jquery' ], WPFORO_VERSION, false );
1269
  wp_localize_script( 'wpforo-backend-js', 'wpforo_admin', [
1270
  'phrases' => [
@@ -1347,6 +1356,10 @@ function wpforo_admin_enqueue() {
1347
  if( ( 'user-edit' === $screen->id || 'profile' === $screen->id ) ) {
1348
  wp_enqueue_style( 'wpforo-font-awesome' );
1349
  }
 
 
 
 
1350
  }
1351
 
1352
  add_action( 'admin_enqueue_scripts', 'wpforo_admin_enqueue' );
@@ -1886,7 +1899,7 @@ add_filter( 'wpforo_body_text_filter', function( $text ) {
1886
 
1887
  add_action( 'wp_footer', function() { WPF()->cache->create(); } );
1888
 
1889
- add_filter( 'retrieve_password_message', function( $message, $key, $user_login = '' ) {
1890
  $reset_password_url = '';
1891
  if( preg_match( wpforo_get_wprp_url_pattern(), $message, $match ) ) {
1892
  if( wpforo_setting( 'authorization', 'use_our_lostpassword_url' ) ) {
@@ -1903,16 +1916,17 @@ add_filter( 'retrieve_password_message', function( $message, $key, $user_login =
1903
  [ $user_login, $reset_password_url, ],
1904
  wpforo_setting( 'email', 'reset_password_email_message' )
1905
  );
 
1906
  add_filter( 'wp_mail_content_type', '__wpforo_set_html_content_type', 999 );
1907
  }
1908
 
1909
  return $message;
1910
- }, 999, 3 );
1911
 
1912
  function wpforo_user_field_shortcode_to_value( $shortcode, $userid = null ) {
1913
  $value = null;
1914
 
1915
- if( $shortcode && ($field = preg_replace( '#^\s*\[?\s*(?:fields_)?([^\[\]]+?)\s*]?\s*$#iu', '$1', $shortcode )) ) {
1916
  if( ! $userid ) $userid = WPF()->current_userid;
1917
  $value = wpforo_member( $userid, $field );
1918
  }
@@ -1923,9 +1937,16 @@ function wpforo_user_field_shortcode_to_value( $shortcode, $userid = null ) {
1923
  function wpforo_forum_field_shortcode_to_value( $shortcode, $forumid ) {
1924
  $value = null;
1925
 
1926
- if( $shortcode && ($field = preg_replace( '#^\s*\[?\s*(?:fields_)?([^\[\]]+?)\s*]?\s*$#iu', '$1', $shortcode )) ) {
1927
- $value = wpforo_forum( $forumid, $field );
1928
- }
 
 
 
 
 
 
 
1929
 
1930
  return $value;
1931
  }
@@ -1933,9 +1954,16 @@ function wpforo_forum_field_shortcode_to_value( $shortcode, $forumid ) {
1933
  function wpforo_topic_field_shortcode_to_value( $shortcode, $topicid ) {
1934
  $value = null;
1935
 
1936
- if( $shortcode && ($field = preg_replace( '#^\s*\[?\s*(?:fields_)?([^\[\]]+?)\s*]?\s*$#iu', '$1', $shortcode )) ) {
1937
- $value = wpforo_topic( $topicid, $field );
1938
- }
 
 
 
 
 
 
 
1939
 
1940
  return $value;
1941
  }
@@ -1943,9 +1971,16 @@ function wpforo_topic_field_shortcode_to_value( $shortcode, $topicid ) {
1943
  function wpforo_post_field_shortcode_to_value( $shortcode, $postid ) {
1944
  $value = null;
1945
 
1946
- if( $shortcode && ($field = preg_replace( '#^\s*\[?\s*(?:fields_)?([^\[\]]+?)\s*]?\s*$#iu', '$1', $shortcode )) ) {
1947
- $value = wpforo_post( $postid, $field );
1948
- }
 
 
 
 
 
 
 
1949
 
1950
  return $value;
1951
  }
189
  return $value;
190
  }, 10, 3 );*/
191
 
192
+ function wpftpl_url( $filename ) {
193
+ $tpl_url = '';
194
  if( $filename ) {
195
+ if( $tpl_url = locate_template( 'wpforo/' . $filename ) ) $tpl_url = get_template_directory_uri() . '/wpforo/' . $filename;
196
+ if( ! $tpl_url ) $tpl_url = WPF()->tpl->template_url . '/' . $filename;
197
+ }
198
+
199
+ return apply_filters( 'wpforo_wpftpl_url', $tpl_url, $filename );
200
+ }
201
 
202
+ function wpftpl( $filename ) {
203
+ $tpl = '';
204
+ if( $filename ) {
205
+ $tpl = locate_template( 'wpforo/' . $filename );
206
+ if( ! $tpl ) $tpl = WPF()->tpl->template_dir . '/' . $filename;
207
  }
208
+
209
+ return apply_filters( 'wpforo_wpftpl', $tpl, $filename );
210
  }
211
 
212
  add_shortcode( 'wpforo', function ( $atts ) {
273
  if( function_exists('pll_languages_list') ) $rewrite_prefix = '(?:(' . implode('|', pll_languages_list()) . ')/)?';
274
 
275
  if( ! WPF()->board->get_current( 'is_standalone' ) ) {
276
+ $pageid = 0;
277
  $boards = WPF()->board->get_boards( [ 'status' => true ] );
278
  foreach( $boards as $board ) {
279
+ if( $board['boardid'] === 0 ) $pageid = $board['pageid'];
280
  $route = urldecode( $board['slug'] );
281
  $route = preg_replace( '#^/?index\.php/?#isu', '', $route );
282
  $route = trim( $route, '/' );
285
  if( ! array_key_exists( $pattern, $rules ) ) $rules = array_merge( [ $pattern => $to_url ], $rules );
286
  }
287
 
288
+ if( ! $pageid ) $pageid = wpforo_get_option( 'wpforo_pageid', 0 );
289
  foreach( WPF()->board->routes as $route ) {
290
  // $route = utf8_uri_encode( urldecode( $route ) );
291
  $route = urldecode( $route );
611
  return;
612
  }
613
  $post = apply_filters( 'wpforo_quote_post_ajax', $post );
614
+ $response = sprintf( '[quote data-userid="%1$d" data-postid="%2$d"]%3$s[/quote]<p></p>', $post['userid'], $post['postid'], wpautop( $post['body'] ) );
 
615
  wp_send_json_success( $response );
616
  }
617
 
629
  }
630
 
631
  ############### Sending Email ##################
632
+ $report_text = substr( strip_tags( $_POST['reportmsg'] ), 0, 1000 );
633
  $postid = intval( $_POST['postid'] );
634
  $reporter = '<a href="' . WPF()->current_user['profile_url'] . '">' . ( WPF()->current_user['display_name'] ? WPF()->current_user['display_name'] : urldecode( WPF()->current_user['user_nicename'] ) ) . '</a>';
635
  $reportmsg = wpforo_kses( $report_text, 'email' );
636
+ $post_url = WPF()->post->get_url( $postid );
637
 
638
  $subject = wpforo_setting( 'email', 'report_email_subject' );
639
  $message = wpforo_setting( 'email', 'report_email_message' );
1005
  }
1006
  set_transient( 'wpforo_post_url_fixer' . $referer_hash, $nowtime, 1000 );
1007
  if( $post = WPF()->post->get_post( $postid ) ) {
1008
+ echo WPF()->post->get_url( $post );
1009
  }
1010
  }
1011
  }
1168
  'suggest',
1169
  'wpforo-frontend-js',
1170
  ], WPFORO_VERSION, true );
1171
+ wp_register_style( 'wpforo-style', wpftpl_url( 'style.css' ), false, WPFORO_VERSION );
1172
+ wp_register_style( 'wpforo-style-rtl', wpftpl_url( 'style-rtl.css' ), false, WPFORO_VERSION );
1173
+ wp_register_style( 'wpforo-widgets', wpftpl_url( 'widgets.css' ), [], WPFORO_VERSION );
1174
+ wp_register_style( 'wpforo-widgets-rtl', wpftpl_url( 'widgets-rtl.css' ), [], WPFORO_VERSION );
1175
  wp_register_script( 'wpforo-widgets-js', WPFORO_URL . '/assets/js/widgets.js', [ 'jquery' ], WPFORO_VERSION, true );
1176
  $wpforo_widgets = [
1177
  'ajax_url' => wpforo_get_ajax_url(),
1273
  'pick' => __( 'Select Color' ),
1274
  ] );
1275
  wp_register_script( 'wpforo-contenthover-addons', WPFORO_URL . '/admin/assets/js/contenthover/jquery.contenthover.min.js', [ 'jquery' ], WPFORO_VERSION, false );
1276
+ wp_register_script( 'wpforo-backend-widgets-js', WPFORO_URL . '/admin/assets/js/widgets.js', [ 'jquery' ], WPFORO_VERSION, true );
1277
  wp_register_script( 'wpforo-backend-js', WPFORO_URL . '/admin/assets/js/backend.js', [ 'jquery' ], WPFORO_VERSION, false );
1278
  wp_localize_script( 'wpforo-backend-js', 'wpforo_admin', [
1279
  'phrases' => [
1356
  if( ( 'user-edit' === $screen->id || 'profile' === $screen->id ) ) {
1357
  wp_enqueue_style( 'wpforo-font-awesome' );
1358
  }
1359
+
1360
+ if( $screen->id === 'widgets' ){
1361
+ wp_enqueue_script( 'wpforo-backend-widgets-js' );
1362
+ }
1363
  }
1364
 
1365
  add_action( 'admin_enqueue_scripts', 'wpforo_admin_enqueue' );
1899
 
1900
  add_action( 'wp_footer', function() { WPF()->cache->create(); } );
1901
 
1902
+ add_filter( 'retrieve_password_message', function( $message, $key, $user_login, $user_data ) {
1903
  $reset_password_url = '';
1904
  if( preg_match( wpforo_get_wprp_url_pattern(), $message, $match ) ) {
1905
  if( wpforo_setting( 'authorization', 'use_our_lostpassword_url' ) ) {
1916
  [ $user_login, $reset_password_url, ],
1917
  wpforo_setting( 'email', 'reset_password_email_message' )
1918
  );
1919
+ $message = _wpforo_apply_email_shortcodes( $message, [ 'user' => [ 'userid' => $user_data->ID ] ] );
1920
  add_filter( 'wp_mail_content_type', '__wpforo_set_html_content_type', 999 );
1921
  }
1922
 
1923
  return $message;
1924
+ }, 999, 4 );
1925
 
1926
  function wpforo_user_field_shortcode_to_value( $shortcode, $userid = null ) {
1927
  $value = null;
1928
 
1929
+ if( $shortcode && ($field = preg_replace( '#^\s*\[?\s*(?:user_|owner_)?(?:fields_)?([^\[\]]+?)\s*]?\s*$#iu', '$1', $shortcode )) ) {
1930
  if( ! $userid ) $userid = WPF()->current_userid;
1931
  $value = wpforo_member( $userid, $field );
1932
  }
1937
  function wpforo_forum_field_shortcode_to_value( $shortcode, $forumid ) {
1938
  $value = null;
1939
 
1940
+ if( $forumid ){
1941
+ if( $shortcode && ($field = preg_replace( '#^\s*\[?\s*(?:forum_)?(?:fields_)?([^\[\]]+?)\s*]?\s*$#iu', '$1', $shortcode )) ) {
1942
+ if( $field === 'link' ){
1943
+ $value = sprintf( '<a target="_blank" href="%1$s">%2$s</a>', esc_url( wpforo_forum( $forumid, 'url' ) ), sanitize_text_field( wpforo_forum( $forumid, 'title' ) ) );
1944
+ $value = stripslashes( $value );
1945
+ }else{
1946
+ $value = wpforo_forum( $forumid, $field );
1947
+ }
1948
+ }
1949
+ }
1950
 
1951
  return $value;
1952
  }
1954
  function wpforo_topic_field_shortcode_to_value( $shortcode, $topicid ) {
1955
  $value = null;
1956
 
1957
+ if( $topicid ){
1958
+ if( $shortcode && ($field = preg_replace( '#^\s*\[?\s*(?:topic_)?(?:fields_)?([^\[\]]+?)\s*]?\s*$#iu', '$1', $shortcode )) ) {
1959
+ if( $field === 'link' ){
1960
+ $value = sprintf( '<a target="_blank" href="%1$s">%2$s</a>', esc_url( wpforo_topic( $topicid, 'url' ) ), sanitize_text_field( wpforo_topic( $topicid, 'title' ) ) );
1961
+ $value = stripslashes( $value );
1962
+ }else{
1963
+ $value = wpforo_topic( $topicid, $field );
1964
+ }
1965
+ }
1966
+ }
1967
 
1968
  return $value;
1969
  }
1971
  function wpforo_post_field_shortcode_to_value( $shortcode, $postid ) {
1972
  $value = null;
1973
 
1974
+ if($postid ){
1975
+ if( $shortcode && ($field = preg_replace( '#^\s*\[?\s*(?:post_)?(?:fields_)?([^\[\]]+?)\s*]?\s*$#iu', '$1', $shortcode )) ) {
1976
+ if( $field === 'link' ){
1977
+ $value = sprintf( '<a target="_blank" href="%1$s">%2$s</a>', esc_url( wpforo_post( $postid, 'url' ) ), sanitize_text_field( wpforo_post( $postid, 'title' ) ) );
1978
+ $value = stripslashes( $value );
1979
+ }else{
1980
+ $value = wpforo_post( $postid, $field );
1981
+ }
1982
+ }
1983
+ }
1984
 
1985
  return $value;
1986
  }
includes/install-sql.php CHANGED
@@ -160,7 +160,7 @@ if( ! function_exists( 'wpforo_get_install_sqls' ) ) {
160
  KEY `forumid_answer_first` (`forumid`, `is_answer`, `is_first_post`)
161
  ) ENGINE=$engine $charset_collate",
162
  WPF()->tables->profiles => "CREATE TABLE IF NOT EXISTS `" . WPF()->tables->profiles . "` (
163
- `userid` INT UNSIGNED NOT NULL,
164
  `title` VARCHAR(255) NOT NULL DEFAULT 'member',
165
  `groupid` INT UNSIGNED NOT NULL,
166
  `secondary_groupids` VARCHAR(255) NOT NULL DEFAULT '',
160
  KEY `forumid_answer_first` (`forumid`, `is_answer`, `is_first_post`)
161
  ) ENGINE=$engine $charset_collate",
162
  WPF()->tables->profiles => "CREATE TABLE IF NOT EXISTS `" . WPF()->tables->profiles . "` (
163
+ `userid` BIGINT UNSIGNED NOT NULL,
164
  `title` VARCHAR(255) NOT NULL DEFAULT 'member',
165
  `groupid` INT UNSIGNED NOT NULL,
166
  `secondary_groupids` VARCHAR(255) NOT NULL DEFAULT '',
includes/installation.php CHANGED
@@ -1483,6 +1483,7 @@ function wpforo_database_fixer( $problems ) {
1483
  $board['settings']['title'] = ( wpfval($_general, 'title') ) ? : 'Forum';
1484
  $board['settings']['desc'] = ( wpfval($_general, 'description') ) ? : 'Discussion Board';
1485
  $settings = json_encode($board['settings']);
 
1486
  $slug = basename( trim( wpforo_get_option( 'wpforo_permastruct', 'community', false ), '/' ) );
1487
  $board['slug'] = ( $slug ) ? : 'community';
1488
  $board['locale'] = wpforo_get_site_default_locale();
1483
  $board['settings']['title'] = ( wpfval($_general, 'title') ) ? : 'Forum';
1484
  $board['settings']['desc'] = ( wpfval($_general, 'description') ) ? : 'Discussion Board';
1485
  $settings = json_encode($board['settings']);
1486
+ WPF()->db->query("UPDATE `" . WPF()->tables->boards . "` SET `slug` = CONCAT('community-', `boardid`) WHERE `slug` = 'community' AND `boardid` != 0");
1487
  $slug = basename( trim( wpforo_get_option( 'wpforo_permastruct', 'community', false ), '/' ) );
1488
  $board['slug'] = ( $slug ) ? : 'community';
1489
  $board['locale'] = wpforo_get_site_default_locale();
integrations/UltimateMember.php CHANGED
@@ -15,7 +15,6 @@ class UltimateMember {
15
  $this->um_init();
16
  if( wpforo_setting( 'um', 'forum_tab' ) ) {
17
  add_filter( 'um_profile_tabs', [ $this, 'um_tabs' ], 999 );
18
- add_filter( 'um_user_profile_tabs', [ $this, 'um_tabs' ], 998 );
19
  add_filter( 'um_user_profile_tabs', [ $this, 'um_user_tabs' ], 999 );
20
  add_action( 'um_profile_content_foro_default', [ $this, 'um_default_tab_content' ] );
21
  add_action( 'um_profile_content_foro_topics', [ $this, 'um_user_topics' ] );
@@ -496,7 +495,7 @@ class UltimateMember {
496
  function um_notification_on_post_status_change( $post, $status = 0 ) {
497
  if( ! $post || ! wpforo_setting( 'um', 'notification' ) ) return;
498
  $post['status'] = $status = intval($status);
499
- $post['posturl'] = WPF()->post->get_post_url( $post['postid'] );
500
  if( ($topic = WPF()->topic->get_topic( wpfval( $post, 'topicid' ) )) && ! $status ){
501
  $this->um_add_notification( $post, $topic );
502
  }
15
  $this->um_init();
16
  if( wpforo_setting( 'um', 'forum_tab' ) ) {
17
  add_filter( 'um_profile_tabs', [ $this, 'um_tabs' ], 999 );
 
18
  add_filter( 'um_user_profile_tabs', [ $this, 'um_user_tabs' ], 999 );
19
  add_action( 'um_profile_content_foro_default', [ $this, 'um_default_tab_content' ] );
20
  add_action( 'um_profile_content_foro_topics', [ $this, 'um_user_topics' ] );
495
  function um_notification_on_post_status_change( $post, $status = 0 ) {
496
  if( ! $post || ! wpforo_setting( 'um', 'notification' ) ) return;
497
  $post['status'] = $status = intval($status);
498
+ $post['posturl'] = WPF()->post->get_url( $post['postid'] );
499
  if( ($topic = WPF()->topic->get_topic( wpfval( $post, 'topicid' ) )) && ! $status ){
500
  $this->um_add_notification( $post, $topic );
501
  }
languages/wpforo.pot CHANGED
@@ -4,7 +4,7 @@
4
  msgid ""
5
  msgstr ""
6
  "Project-Id-Version: Forum - wpForo\n"
7
- "POT-Creation-Date: 2022-09-12 21:31+0400\n"
8
  "PO-Revision-Date: 2016-06-28 21:09+0400\n"
9
  "Last-Translator: \n"
10
  "Language-Team: \n"
@@ -123,7 +123,7 @@ msgstr ""
123
  msgid "Other"
124
  msgstr ""
125
 
126
- #: admin/includes/deactivation-dialog.php:142 includes/hooks.php:1290
127
  msgid "Please provide more information"
128
  msgstr ""
129
 
@@ -148,63 +148,63 @@ msgid "Overview"
148
  msgstr ""
149
 
150
  #: admin/index.php:54 admin/index.php:201 admin/pages/dashboard.php:25
151
- #: admin/tools-tabs/misc.php:67 includes/hooks.php:2198 includes/hooks.php:2402
152
  #: includes/phrases.php:309 integrations/BuddyPress.php:12
153
  #: integrations/BuddyPress.php:44 integrations/BuddyPress.php:117
154
- #: widgets/Forums.php:20
155
  msgid "Forums"
156
  msgstr ""
157
 
158
  #: admin/index.php:59 admin/index.php:151 admin/index.php:206
159
- #: admin/pages/settings.php:163 includes/hooks.php:2214 includes/hooks.php:2418
160
- #: includes/hooks.php:2523
161
  msgid "Settings"
162
  msgstr ""
163
 
164
- #: admin/index.php:64 admin/index.php:211 includes/hooks.php:2232
165
- #: includes/hooks.php:2436
166
  msgid "Moderation"
167
  msgstr ""
168
 
169
- #: admin/index.php:69 admin/index.php:216 includes/hooks.php:2282
170
- #: includes/hooks.php:2445 includes/phrases.php:791
171
  msgid "Phrases"
172
  msgstr ""
173
 
174
- #: admin/index.php:74 admin/index.php:221 includes/hooks.php:2223
175
- #: includes/hooks.php:2427 includes/phrases.php:916
176
  msgid "Tools"
177
  msgstr ""
178
 
179
  #: admin/index.php:82 admin/index.php:136 admin/pages/board.php:16
180
- #: includes/hooks.php:10 includes/hooks.php:2466
181
  msgid "Boards"
182
  msgstr ""
183
 
184
- #: admin/index.php:86 admin/index.php:140 includes/hooks.php:2241
185
- #: includes/hooks.php:2482
186
  msgid "Accesses"
187
  msgstr ""
188
 
189
  #: admin/index.php:90 admin/index.php:144 admin/pages/usergroup.php:12
190
- #: admin/pages/usergroup.php:160 includes/hooks.php:2266 includes/hooks.php:2498
191
  msgid "Usergroups"
192
  msgstr ""
193
 
194
  #: admin/index.php:93 admin/index.php:147 admin/pages/dashboard.php:37
195
  #: admin/pages/member.php:10 admin/pages/usergroup.php:37
196
- #: admin/tools-tabs/misc.php:87 includes/hooks.php:2257 includes/hooks.php:2514
197
  #: includes/phrases.php:364
198
  msgid "Members"
199
  msgstr ""
200
 
201
- #: admin/index.php:97 admin/index.php:156 includes/hooks.php:2298
202
- #: includes/hooks.php:2532 includes/phrases.php:792
203
  msgid "Themes"
204
  msgstr ""
205
 
206
  #: admin/index.php:102 admin/index.php:161 admin/pages/board.php:116
207
- #: admin/pages/settings.php:22 includes/hooks.php:2307 includes/hooks.php:2541
208
  #: includes/phrases.php:211
209
  msgid "Addons"
210
  msgstr ""
@@ -243,7 +243,7 @@ msgid "Edit"
243
  msgstr ""
244
 
245
  #: admin/listtables/Boards.php:86 admin/listtables/Moderations.php:94
246
- #: admin/pages/forum.php:273 admin/pages/usergroup.php:78 classes/Forums.php:823
247
  #: includes/phrases.php:541
248
  msgid "View"
249
  msgstr ""
@@ -256,12 +256,12 @@ msgstr ""
256
  msgid "Are you sure you want to DELETE this board and his data permanently?"
257
  msgstr ""
258
 
259
- #: admin/listtables/Boards.php:88 admin/listtables/Members.php:104
260
- #: admin/listtables/Members.php:260 admin/listtables/Moderations.php:103
261
  #: admin/listtables/Moderations.php:208 admin/pages/forum.php:272
262
  #: admin/pages/themes.php:68 admin/pages/usergroup.php:76
263
  #: admin/pages/usergroup.php:295 admin/settings/antispam.php:64
264
- #: includes/hooks.php:1272 includes/phrases.php:252
265
  msgid "Delete"
266
  msgstr ""
267
 
@@ -298,102 +298,107 @@ msgstr ""
298
  msgid "default"
299
  msgstr ""
300
 
301
- #: admin/listtables/Members.php:98
302
  msgid "Edit User"
303
  msgstr ""
304
 
305
- #: admin/listtables/Members.php:99
306
  msgid "Edit Profile"
307
  msgstr ""
308
 
309
- #: admin/listtables/Members.php:100 admin/listtables/Members.php:258
310
  msgid "Ban"
311
  msgstr ""
312
 
313
- #: admin/listtables/Members.php:100
314
  msgid "Are you sure, you want to BAN this user?"
315
  msgstr ""
316
 
317
- #: admin/listtables/Members.php:101 admin/listtables/Members.php:259
318
  msgid "Unban"
319
  msgstr ""
320
 
321
- #: admin/listtables/Members.php:101
322
  msgid "Are you sure, you want to UNBAN this user?"
323
  msgstr ""
324
 
325
- #: admin/listtables/Members.php:102 admin/listtables/Members.php:256
326
  #: admin/pages/themes.php:67 includes/phrases.php:203
327
  msgid "Activate"
328
  msgstr ""
329
 
330
- #: admin/listtables/Members.php:102
331
  msgid "Are you sure, you want to activate this user?"
332
  msgstr ""
333
 
334
- #: admin/listtables/Members.php:103 admin/listtables/Members.php:257
335
  msgid "Deactivate"
336
  msgstr ""
337
 
338
- #: admin/listtables/Members.php:103
339
  msgid "Are you sure, you want to deactivate this user?"
340
  msgstr ""
341
 
342
- #: admin/listtables/Members.php:174 admin/listtables/Moderations.php:151
343
  #: admin/listtables/Phrases.php:133 admin/pages/usergroup.php:41
 
344
  msgid "ID"
345
  msgstr ""
346
 
347
- #: admin/listtables/Members.php:175 includes/phrases.php:257
348
  msgid "Display Name"
349
  msgstr ""
350
 
351
- #: admin/listtables/Members.php:176 includes/phrases.php:347
352
  msgid "Login"
353
  msgstr ""
354
 
355
- #: admin/listtables/Members.php:177 includes/phrases.php:261
356
  msgid "Email"
357
  msgstr ""
358
 
359
- #: admin/listtables/Members.php:178 includes/phrases.php:317
360
  msgid "Group"
361
  msgstr ""
362
 
363
- #: admin/listtables/Members.php:179 admin/pages/board.php:173
 
 
 
 
364
  #: admin/pages/usergroup.php:162 includes/phrases.php:17
365
  msgid "Status"
366
  msgstr ""
367
 
368
- #: admin/listtables/Members.php:180
369
  msgid "Last Login"
370
  msgstr ""
371
 
372
- #: admin/listtables/Members.php:181 includes/phrases.php:831
373
  msgid "Forum Posts"
374
  msgstr ""
375
 
376
- #: admin/listtables/Members.php:182 includes/phrases.php:832
377
  msgid "Blog Posts"
378
  msgstr ""
379
 
380
- #: admin/listtables/Members.php:183 includes/phrases.php:833
381
  msgid "Blog Comments"
382
  msgstr ""
383
 
384
- #: admin/listtables/Members.php:286
385
  msgid "Change usergroup to…"
386
  msgstr ""
387
 
388
- #: admin/listtables/Members.php:289 admin/pages/phrase.php:176
389
  msgid "Change"
390
  msgstr ""
391
 
392
- #: admin/listtables/Members.php:400 includes/phrases.php:536
393
  msgid "filter by group"
394
  msgstr ""
395
 
396
- #: admin/listtables/Members.php:422
397
  msgid "filter by status"
398
  msgstr ""
399
 
@@ -417,9 +422,10 @@ msgstr ""
417
  msgid "Are you sure you want to DELETE this item?"
418
  msgstr ""
419
 
420
- #: admin/listtables/Moderations.php:152 includes/phrases.php:520
421
- #: widgets/Forums.php:64 widgets/OnlineMembers.php:59 widgets/RecentPosts.php:230
422
- #: widgets/RecentTopics.php:130 widgets/Search.php:38 widgets/Tags.php:47
 
423
  msgid "Title"
424
  msgstr ""
425
 
@@ -492,13 +498,13 @@ msgstr ""
492
  #: admin/pages/forum.php:238 admin/pages/forum.php:285 admin/pages/forum.php:325
493
  #: admin/pages/forum.php:401 admin/pages/forum.php:409 admin/pages/phrase.php:167
494
  #: admin/pages/usergroup.php:30 admin/pages/usergroup.php:36
495
- #: admin/pages/usergroup.php:342 admin/settings/board.php:15
496
  #: admin/settings/general.php:24 admin/settings/styles.php:12
497
- #: classes/Settings.php:2837
498
  msgid "Read the documentation"
499
  msgstr ""
500
 
501
- #: admin/pages/accesses.php:29 includes/hooks.php:2248 includes/hooks.php:2489
502
  #: includes/phrases.php:207
503
  msgid "Add New Forum Access"
504
  msgstr ""
@@ -525,7 +531,7 @@ msgstr ""
525
  msgid "Admin"
526
  msgstr ""
527
 
528
- #: admin/pages/accesses.php:68 classes/Forums.php:811 includes/phrases.php:567
529
  msgid "edit"
530
  msgstr ""
531
 
@@ -535,7 +541,7 @@ msgid ""
535
  "this access will lost all forum permissions."
536
  msgstr ""
537
 
538
- #: admin/pages/accesses.php:75 classes/Forums.php:817 includes/phrases.php:566
539
  msgid "delete"
540
  msgstr ""
541
 
@@ -697,7 +703,7 @@ msgstr ""
697
  msgid "one URL per line"
698
  msgstr ""
699
 
700
- #: admin/pages/dashboard.php:7 includes/hooks.php:2190
701
  msgid "Forum Dashboard"
702
  msgstr ""
703
 
@@ -705,11 +711,11 @@ msgstr ""
705
  msgid "Board Statistic"
706
  msgstr ""
707
 
708
- #: admin/pages/dashboard.php:29 classes/Forums.php:803 includes/phrases.php:524
709
  msgid "Topics"
710
  msgstr ""
711
 
712
- #: admin/pages/dashboard.php:33 classes/Forums.php:803 includes/phrases.php:418
713
  msgid "Posts"
714
  msgstr ""
715
 
@@ -1014,7 +1020,7 @@ msgid ""
1014
  msgstr ""
1015
 
1016
  #: admin/pages/member.php:17 admin/pages/moderation.php:18
1017
- #: admin/pages/phrase.php:142 classes/Settings.php:1097
1018
  msgid "Filter"
1019
  msgstr ""
1020
 
@@ -1292,7 +1298,7 @@ msgstr ""
1292
  msgid "Usergroup"
1293
  msgstr ""
1294
 
1295
- #: admin/pages/usergroup.php:38 classes/Settings.php:1125 includes/hooks.php:1264
1296
  msgid "Default"
1297
  msgstr ""
1298
 
@@ -1304,7 +1310,7 @@ msgstr ""
1304
  #: admin/settings/styles.php:64 admin/settings/styles.php:72
1305
  #: admin/settings/styles.php:77 admin/settings/styles.php:83
1306
  #: admin/settings/styles.php:93 admin/settings/styles.php:98
1307
- #: admin/settings/styles.php:104 classes/Settings.php:3322
1308
  #: includes/phrases.php:242
1309
  msgid "Color"
1310
  msgstr ""
@@ -1575,7 +1581,7 @@ msgstr ""
1575
  msgid "Facebook API"
1576
  msgstr ""
1577
 
1578
- #: admin/settings/board.php:13 admin/settings/general.php:22
1579
  msgid "Permalinks"
1580
  msgstr ""
1581
 
@@ -1607,6 +1613,14 @@ msgstr ""
1607
  msgid "This message comes from Reset Password form."
1608
  msgstr ""
1609
 
 
 
 
 
 
 
 
 
1610
  #: admin/settings/forums.php:8 admin/settings/topics.php:8
1611
  msgid "Extended Forum Layout"
1612
  msgstr ""
@@ -1674,8 +1688,8 @@ msgstr ""
1674
  msgid "Post Content"
1675
  msgstr ""
1676
 
1677
- #: admin/settings/rating.php:12 classes/Settings.php:1296
1678
- #: classes/Settings.php:1356 includes/phrases.php:361
1679
  msgid "Member Reputation and Titles"
1680
  msgstr ""
1681
 
@@ -1706,7 +1720,7 @@ msgstr ""
1706
  msgid "General Share Buttons"
1707
  msgstr ""
1708
 
1709
- #: admin/settings/social.php:113 classes/Settings.php:2544
1710
  msgid "Post Sharing Toggle"
1711
  msgstr ""
1712
 
@@ -1870,12 +1884,24 @@ msgid "General"
1870
  msgstr ""
1871
 
1872
  #: admin/settings/topics.php:68 admin/tools-tabs/cleanup.php:40
1873
- #: classes/Settings.php:2791 includes/phrases.php:552 widgets/Tags.php:55
 
 
 
 
 
 
1874
  msgid "Yes"
1875
  msgstr ""
1876
 
1877
  #: admin/settings/topics.php:69 admin/tools-tabs/cleanup.php:41
1878
- #: classes/Settings.php:2792 includes/phrases.php:382 widgets/Tags.php:58
 
 
 
 
 
 
1879
  msgid "No"
1880
  msgstr ""
1881
 
@@ -2225,187 +2251,187 @@ msgstr ""
2225
  msgid "User registration is disabled"
2226
  msgstr ""
2227
 
2228
- #: classes/Actions.php:2107 classes/Template.php:2360 includes/phrases.php:513
2229
  msgid "Theme file not readable"
2230
  msgstr ""
2231
 
2232
- #: classes/Actions.php:2113
2233
  msgid "Theme Successfully Activated"
2234
  msgstr ""
2235
 
2236
- #: classes/Actions.php:2134
2237
  msgid "Theme delete error"
2238
  msgstr ""
2239
 
2240
- #: classes/Actions.php:2141
2241
  msgid "Theme delete success"
2242
  msgstr ""
2243
 
2244
- #: classes/Cache.php:391
2245
  msgid "Please navigate in Dashboard to Settings > WP Super Cache"
2246
  msgstr ""
2247
 
2248
- #: classes/Cache.php:392
2249
  msgid "Go to Advanced Tab, scroll down to \"Rejected URL Strings\" option"
2250
  msgstr ""
2251
 
2252
- #: classes/Cache.php:393 classes/Cache.php:401
2253
  msgid ""
2254
  "Insert the URL path(s) of your forum page(s) one per line in the option "
2255
  "textarea:"
2256
  msgstr ""
2257
 
2258
- #: classes/Cache.php:394 classes/Cache.php:402 classes/Cache.php:410
2259
- #: classes/Cache.php:427 classes/Cache.php:435 classes/Cache.php:443
2260
  msgid "Save it and delete all caches."
2261
  msgstr ""
2262
 
2263
- #: classes/Cache.php:399
2264
  msgid "Please navigate in Dashboard to LiteSpeed Cache > Cache admin page"
2265
  msgstr ""
2266
 
2267
- #: classes/Cache.php:400
2268
  msgid "Go to Exclude Tab, find the \"Do Not Cache URIs\" option"
2269
  msgstr ""
2270
 
2271
- #: classes/Cache.php:407
2272
  msgid "Please navigate in Dashboard to WP Rocket > Advanced Rules Tab"
2273
  msgstr ""
2274
 
2275
- #: classes/Cache.php:408
2276
  msgid "Scroll down to \"Never cache (URLs)\" option"
2277
  msgstr ""
2278
 
2279
- #: classes/Cache.php:409
2280
  msgid ""
2281
  "Insert the URL path(s) of your forum page(s) one per line with wildcard (.*) "
2282
  "in the option textarea:"
2283
  msgstr ""
2284
 
2285
- #: classes/Cache.php:415
2286
  msgid "Please navigate in Dashboard to WP Fastest Cache > Exclude Tab"
2287
  msgstr ""
2288
 
2289
- #: classes/Cache.php:416
2290
  msgid "In the \"Exclude Pages\" section click the [Add New Rule] button"
2291
  msgstr ""
2292
 
2293
- #: classes/Cache.php:417
2294
  msgid ""
2295
  "Select [Start with] option in the drop-down menu and insert the URL path(s) of "
2296
  "your forum page(s) one per rule in the next field:"
2297
  msgstr ""
2298
 
2299
- #: classes/Cache.php:418
2300
  msgid ""
2301
  "If you have more than one forum pages (boards) you should create separate "
2302
  "rules for each forum board."
2303
  msgstr ""
2304
 
2305
- #: classes/Cache.php:419
2306
  msgid "Save rules and delete all caches."
2307
  msgstr ""
2308
 
2309
- #: classes/Cache.php:424
2310
  msgid "Please navigate in Dashboard to Performance > Page Cache admin page"
2311
  msgstr ""
2312
 
2313
- #: classes/Cache.php:425
2314
  msgid "Go to Advanced Tab, scroll down to Rejected URL Strings option"
2315
  msgstr ""
2316
 
2317
- #: classes/Cache.php:426
2318
  msgid ""
2319
  "Scroll to Advanced section and insert the URL path(s) of your forum page(s) "
2320
  "one per line in the \"Never cache the following pages\" textarea:"
2321
  msgstr ""
2322
 
2323
- #: classes/Cache.php:432
2324
  msgid "Please navigate in Dashboard to WP-Optimize > Cache admin page"
2325
  msgstr ""
2326
 
2327
- #: classes/Cache.php:433
2328
  msgid ""
2329
  "Go to Advanced Settings Tab, find the \"URLs to exclude from caching\" option"
2330
  msgstr ""
2331
 
2332
- #: classes/Cache.php:434
2333
  msgid ""
2334
  "Insert the URL path(s) of your forum page(s) one per line with wildcard [*] in "
2335
  "the option textarea:"
2336
  msgstr ""
2337
 
2338
- #: classes/Cache.php:440
2339
  msgid "Please navigate in Dashboard to SG Optimizer > Caching admin page"
2340
  msgstr ""
2341
 
2342
- #: classes/Cache.php:441
2343
  msgid ""
2344
  "Scroll to Exclude URLs from Caching section and click the \"pencil\" button, "
2345
  "enable it, and click the button again"
2346
  msgstr ""
2347
 
2348
- #: classes/Cache.php:442
2349
  msgid ""
2350
  "Insert the URL path(s) of your forum page(s) with wildcard [*] in the pop-up "
2351
  "filed:"
2352
  msgstr ""
2353
 
2354
- #: classes/Forums.php:806
2355
  msgid "Add a new Subforum"
2356
  msgstr ""
2357
 
2358
- #: classes/Forums.php:806
2359
  msgid "Add a new Forum in this Category"
2360
  msgstr ""
2361
 
2362
- #: classes/Members.php:407
2363
  msgid "<strong>ERROR</strong>: Please enter a username."
2364
  msgstr ""
2365
 
2366
- #: classes/Members.php:412
2367
  msgid ""
2368
  "<strong>ERROR</strong>: This username is invalid because it uses illegal "
2369
  "characters. Please enter a valid username."
2370
  msgstr ""
2371
 
2372
- #: classes/Members.php:421
2373
  msgid ""
2374
  "<strong>ERROR</strong>: This username is already registered. Please choose "
2375
  "another one."
2376
  msgstr ""
2377
 
2378
- #: classes/Members.php:426
2379
  msgid "<strong>ERROR</strong>: Sorry, that username is not allowed."
2380
  msgstr ""
2381
 
2382
- #: classes/Members.php:431
2383
  msgid "<strong>ERROR</strong>: Please type your email address."
2384
  msgstr ""
2385
 
2386
- #: classes/Members.php:436
2387
  msgid "<strong>ERROR</strong>: The email address isn&#8217;t correct."
2388
  msgstr ""
2389
 
2390
- #: classes/Members.php:441
2391
  msgid ""
2392
  "<strong>ERROR</strong>: This email is already registered, please choose "
2393
  "another one."
2394
  msgstr ""
2395
 
2396
- #: classes/Members.php:1806
2397
  msgid "What should be done with wpForo content owned by this user?"
2398
  msgstr ""
2399
 
2400
- #: classes/Members.php:1809
2401
  msgid "What should be done with wpForo content owned by these users?"
2402
  msgstr ""
2403
 
2404
- #: classes/Members.php:1813
2405
  msgid "Delete all wpForo content."
2406
  msgstr ""
2407
 
2408
- #: classes/Members.php:1815
2409
  msgid "Attribute all content to:"
2410
  msgstr ""
2411
 
@@ -2660,11 +2686,21 @@ msgid ""
2660
  "forum run faster."
2661
  msgstr ""
2662
 
2663
- #: classes/Settings.php:199
 
 
 
 
 
 
 
 
 
 
2664
  msgid "Display Components"
2665
  msgstr ""
2666
 
2667
- #: classes/Settings.php:202
2668
  msgid ""
2669
  "wpForo is a forum plugin which is loaded in one WordPress page, so the whole "
2670
  "forum with its categories, forums, topics, members and profile pages are "
@@ -2673,59 +2709,59 @@ msgid ""
2673
  "settings, especially here, in the Display Components admin page."
2674
  msgstr ""
2675
 
2676
- #: classes/Settings.php:213
2677
  msgid "Frontend Admin Control Panel"
2678
  msgstr ""
2679
 
2680
- #: classes/Settings.php:215
2681
  msgid ""
2682
  "This is a section with some important buttons for quick actions and accesses "
2683
  "to certain admin pages. it's located in the forum home page under the forum "
2684
  "list. This section is only available for website administrators."
2685
  msgstr ""
2686
 
2687
- #: classes/Settings.php:221 includes/phrases.php:482
2688
  msgid "Show Forum Page Title"
2689
  msgstr ""
2690
 
2691
- #: classes/Settings.php:229
2692
  msgid "Show Forum Menu Bar"
2693
  msgstr ""
2694
 
2695
- #: classes/Settings.php:231
2696
  msgid ""
2697
  "This menu bar contains the forum menu, notification bell and forum search "
2698
  "section."
2699
  msgstr ""
2700
 
2701
- #: classes/Settings.php:237
2702
  msgid "Show Search Section in the Forum Menu Bar"
2703
  msgstr ""
2704
 
2705
- #: classes/Settings.php:245 includes/phrases.php:481
2706
  msgid "Show Breadcrumb"
2707
  msgstr ""
2708
 
2709
- #: classes/Settings.php:253
2710
  msgid "Show Forum Footer"
2711
  msgstr ""
2712
 
2713
- #: classes/Settings.php:255
2714
  msgid ""
2715
  "Forum footer is located at the bottom of all forum content. It includes forum "
2716
  "statistic, last registered user and post information. As well as it contains "
2717
  "the 'Mark all read' button and forums/topics icon description."
2718
  msgstr ""
2719
 
2720
- #: classes/Settings.php:261 includes/phrases.php:483
2721
  msgid "Show Forum Statistic"
2722
  msgstr ""
2723
 
2724
- #: classes/Settings.php:269 includes/phrases.php:320
2725
  msgid "Help wpForo to grow, show plugin info"
2726
  msgstr ""
2727
 
2728
- #: classes/Settings.php:271 includes/phrases.php:412
2729
  msgid ""
2730
  "Please enable this option to help wpForo get more popularity as your thank to "
2731
  "the hard work we do for you totally free. This option adds a very small icon "
@@ -2733,11 +2769,11 @@ msgid ""
2733
  "forum solution you use."
2734
  msgstr ""
2735
 
2736
- #: classes/Settings.php:278
2737
  msgid "Display Forums"
2738
  msgstr ""
2739
 
2740
- #: classes/Settings.php:282
2741
  msgid ""
2742
  "Here you can manage forum specific components which are displayed on the "
2743
  "frontend. All options are grouped by forum layouts. You can find all necessary "
@@ -2745,83 +2781,83 @@ msgid ""
2745
  "own specific features."
2746
  msgstr ""
2747
 
2748
- #: classes/Settings.php:293
2749
  msgid "Extended Layout - Recent topics"
2750
  msgstr ""
2751
 
2752
- #: classes/Settings.php:298 classes/Settings.php:336 classes/Settings.php:374
2753
- #: classes/Settings.php:562 classes/Settings.php:2557 includes/phrases.php:241
2754
  msgid "Collapsed"
2755
  msgstr ""
2756
 
2757
- #: classes/Settings.php:299 classes/Settings.php:337 classes/Settings.php:375
2758
- #: classes/Settings.php:563 classes/Settings.php:2558 includes/phrases.php:275
2759
  msgid "Expanded"
2760
  msgstr ""
2761
 
2762
- #: classes/Settings.php:306
2763
  msgid "Extended Layout - Number of Recent topics"
2764
  msgstr ""
2765
 
2766
- #: classes/Settings.php:315
2767
  msgid "Extended Layout - Recent topic length"
2768
  msgstr ""
2769
 
2770
- #: classes/Settings.php:317 classes/Settings.php:355
2771
  msgid ""
2772
  "Set this option value 0 if you want to show the whole title in recent topic "
2773
  "area."
2774
  msgstr ""
2775
 
2776
- #: classes/Settings.php:323
2777
  msgid "Simplified Layout - Display Add Topic Button on Forum List"
2778
  msgstr ""
2779
 
2780
- #: classes/Settings.php:331
2781
  msgid "Q&A Layout - Recent topics"
2782
  msgstr ""
2783
 
2784
- #: classes/Settings.php:344
2785
  msgid "Q&A Layout - Number of Recent topics"
2786
  msgstr ""
2787
 
2788
- #: classes/Settings.php:353
2789
  msgid "Q&A Layout - Recent topic length"
2790
  msgstr ""
2791
 
2792
- #: classes/Settings.php:361
2793
  msgid "Q&A Layout - Display Add Topic Button on Forum List"
2794
  msgstr ""
2795
 
2796
- #: classes/Settings.php:369
2797
  msgid "Threaded Layout - Forums List"
2798
  msgstr ""
2799
 
2800
- #: classes/Settings.php:381
2801
  msgid "Threaded Layout - Display Sub Forums with Parent Forums"
2802
  msgstr ""
2803
 
2804
- #: classes/Settings.php:389
2805
  msgid "Threaded Layout - Display Thread Filtering Buttons"
2806
  msgstr ""
2807
 
2808
- #: classes/Settings.php:397
2809
  msgid "Threaded Layout - Display Add Topic Button on Forum List"
2810
  msgstr ""
2811
 
2812
- #: classes/Settings.php:406
2813
  msgid "Threaded Layout - Number of Recent topics"
2814
  msgstr ""
2815
 
2816
- #: classes/Settings.php:415
2817
  msgid "Threaded Layout - Recent topic length"
2818
  msgstr ""
2819
 
2820
- #: classes/Settings.php:425
2821
  msgid "Colors &amp; Styles"
2822
  msgstr ""
2823
 
2824
- #: classes/Settings.php:428
2825
  msgid ""
2826
  "Here you can change your forum style. There are six predefined styles "
2827
  "(default, red, green, orange, gray and dark), these are set of different "
@@ -2830,41 +2866,41 @@ msgid ""
2830
  "Also, you can change font size of forums, topics and post content."
2831
  msgstr ""
2832
 
2833
- #: classes/Settings.php:439
2834
  msgid "Font Sizes"
2835
  msgstr ""
2836
 
2837
- #: classes/Settings.php:441
2838
  msgid ""
2839
  "These options allow you to change the font sizes of forum and topic titles as "
2840
  "well as the font size of post content."
2841
  msgstr ""
2842
 
2843
- #: classes/Settings.php:448
2844
  msgid "Forums font size:"
2845
  msgstr ""
2846
 
2847
- #: classes/Settings.php:474
2848
  msgid "Topics font size:"
2849
  msgstr ""
2850
 
2851
- #: classes/Settings.php:500
2852
  msgid "Post content font size:"
2853
  msgstr ""
2854
 
2855
- #: classes/Settings.php:526 includes/phrases.php:247
2856
  msgid "Custom CSS Code"
2857
  msgstr ""
2858
 
2859
- #: classes/Settings.php:534
2860
  msgid "Forum Color Styles"
2861
  msgstr ""
2862
 
2863
- #: classes/Settings.php:543
2864
  msgid "Display Topics &amp; Posts"
2865
  msgstr ""
2866
 
2867
- #: classes/Settings.php:546
2868
  msgid ""
2869
  "This is the right place to manage topics and posts displaying options. Here "
2870
  "you can manage the number of topics and posts per page, also you can display "
@@ -2872,93 +2908,93 @@ msgid ""
2872
  "are grouped by forum layouts."
2873
  msgstr ""
2874
 
2875
- #: classes/Settings.php:557
2876
  msgid "Extended Layout - Recent posts"
2877
  msgstr ""
2878
 
2879
- #: classes/Settings.php:570
2880
  msgid "Extended Layout - Number of Recent posts"
2881
  msgstr ""
2882
 
2883
- #: classes/Settings.php:572
2884
  msgid ""
2885
  "Set this option value 0 if you want to show all posts in recent posts area."
2886
  msgstr ""
2887
 
2888
- #: classes/Settings.php:579
2889
  msgid "Extended Layout - Recent post length"
2890
  msgstr ""
2891
 
2892
- #: classes/Settings.php:588
2893
  msgid "Q&A Layout - Number of Answers per Page"
2894
  msgstr ""
2895
 
2896
- #: classes/Settings.php:597
2897
  msgid "Q&A Layout - Number of Comments per Answer"
2898
  msgstr ""
2899
 
2900
- #: classes/Settings.php:599
2901
  msgid ""
2902
  "This is the number of comments under the answers before clicking the [load "
2903
  "more comments] button. Set this option value 0 if you want to show all "
2904
  "comments."
2905
  msgstr ""
2906
 
2907
- #: classes/Settings.php:605
2908
  msgid "Q&A Layout - Enable Comments on the First Post (question)"
2909
  msgstr ""
2910
 
2911
- #: classes/Settings.php:614
2912
  msgid "Threaded Layout - Number of Parent Posts per Page"
2913
  msgstr ""
2914
 
2915
- #: classes/Settings.php:624
2916
  msgid "Threaded Layout - Replies Nesting Levels Deep"
2917
  msgstr ""
2918
 
2919
- #: classes/Settings.php:632
2920
  msgid "Threaded Layout - First Post Reply Button"
2921
  msgstr ""
2922
 
2923
- #: classes/Settings.php:641 includes/phrases.php:399
2924
  msgid "Number of Topics per Page"
2925
  msgstr ""
2926
 
2927
- #: classes/Settings.php:650 includes/phrases.php:398
2928
  msgid "Number of Posts per Page"
2929
  msgstr ""
2930
 
2931
- #: classes/Settings.php:659
2932
  msgid "Maximum Number of Search Results"
2933
  msgstr ""
2934
 
2935
- #: classes/Settings.php:667
2936
  msgid "Stick Topic's First Post on Top for Certain Forum Layout"
2937
  msgstr ""
2938
 
2939
- #: classes/Settings.php:669
2940
  msgid ""
2941
  "This option keeps the first topic post on top when you navigate through pages "
2942
  "of that topic. You can manage this option by forum layouts."
2943
  msgstr ""
2944
 
2945
- #: classes/Settings.php:675
2946
  msgid "Recent Posts Display Type"
2947
  msgstr ""
2948
 
2949
- #: classes/Settings.php:687
2950
  msgid "Display Topic Statistics and Overview Panel"
2951
  msgstr ""
2952
 
2953
- #: classes/Settings.php:695
2954
  msgid "Keep Expanded Topic Overview in the Statistic Panel"
2955
  msgstr ""
2956
 
2957
- #: classes/Settings.php:704 includes/phrases.php:987
2958
  msgid "Topic Tags"
2959
  msgstr ""
2960
 
2961
- #: classes/Settings.php:707
2962
  msgid ""
2963
  "Tags are a free form method of categorization, currently being used to group "
2964
  "and categorize similar topics. The goal of using these tags in the forum is to "
@@ -2966,37 +3002,37 @@ msgid ""
2966
  "the size of the tag, the more discussions about the topic."
2967
  msgstr ""
2968
 
2969
- #: classes/Settings.php:719
2970
  msgid "Maximum Number of Tags per Topic"
2971
  msgstr ""
2972
 
2973
- #: classes/Settings.php:728
2974
  msgid "Number of Tags per Page"
2975
  msgstr ""
2976
 
2977
- #: classes/Settings.php:738
2978
  msgid "Maximum Tag Length"
2979
  msgstr ""
2980
 
2981
- #: classes/Settings.php:747
2982
  msgid "Maximum Number of Suggested Tags"
2983
  msgstr ""
2984
 
2985
- #: classes/Settings.php:749
2986
  msgid ""
2987
  "Tags are suggested while you type in the tag field. Using this option you can "
2988
  "limit the maximum number of suggested tags."
2989
  msgstr ""
2990
 
2991
- #: classes/Settings.php:755
2992
  msgid "Force Lowercase Tags"
2993
  msgstr ""
2994
 
2995
- #: classes/Settings.php:764
2996
  msgid "Posting &amp; Editor Settings"
2997
  msgstr ""
2998
 
2999
- #: classes/Settings.php:767
3000
  msgid ""
3001
  "Here, you can find all settings related to topic and post creation including "
3002
  "rich editor settings, text limitations, attachments control, option to enable "
@@ -3005,202 +3041,202 @@ msgid ""
3005
  "general for all forum layouts."
3006
  msgstr ""
3007
 
3008
- #: classes/Settings.php:778
3009
  msgid "Q&A Layout - Display Answer Editor"
3010
  msgstr ""
3011
 
3012
- #: classes/Settings.php:786
3013
  msgid "Q&A Layout - Comment Form Type"
3014
  msgstr ""
3015
 
3016
- #: classes/Settings.php:791 classes/Settings.php:803
3017
  msgid "Text Editor"
3018
  msgstr ""
3019
 
3020
- #: classes/Settings.php:792 classes/Settings.php:804
3021
  msgid "Visual Editor"
3022
  msgstr ""
3023
 
3024
- #: classes/Settings.php:798
3025
  msgid "Threaded Layout - Reply Form Type"
3026
  msgstr ""
3027
 
3028
- #: classes/Settings.php:811
3029
  msgid "Topic Title Minimum Length"
3030
  msgstr ""
3031
 
3032
- #: classes/Settings.php:821
3033
  msgid "Topic Title Maximum Length"
3034
  msgstr ""
3035
 
3036
- #: classes/Settings.php:823
3037
  msgid "Topic title length cannot be set more than 250 character."
3038
  msgstr ""
3039
 
3040
- #: classes/Settings.php:830
3041
  msgid "Topic Content Minimum Length"
3042
  msgstr ""
3043
 
3044
- #: classes/Settings.php:839
3045
  msgid "Topic Content Maximum Length"
3046
  msgstr ""
3047
 
3048
- #: classes/Settings.php:841 classes/Settings.php:859 classes/Settings.php:877
3049
  msgid "Set this option value 0 to remove this limit."
3050
  msgstr ""
3051
 
3052
- #: classes/Settings.php:848
3053
  msgid "Reply Content Minimum Length"
3054
  msgstr ""
3055
 
3056
- #: classes/Settings.php:857
3057
  msgid "Reply Content Maximum Length"
3058
  msgstr ""
3059
 
3060
- #: classes/Settings.php:866
3061
  msgid "Comment Content Minimum Length"
3062
  msgstr ""
3063
 
3064
- #: classes/Settings.php:875
3065
  msgid "Comment Content Maximum Length"
3066
  msgstr ""
3067
 
3068
- #: classes/Settings.php:884
3069
  msgid "Allow Edit Own Topic within (minutes)"
3070
  msgstr ""
3071
 
3072
- #: classes/Settings.php:886 classes/Settings.php:904 classes/Settings.php:913
3073
  msgid "Set this option value 0 to remove time limit."
3074
  msgstr ""
3075
 
3076
- #: classes/Settings.php:893
3077
  msgid "Allow Delete Own Topic within (minutes)"
3078
  msgstr ""
3079
 
3080
- #: classes/Settings.php:902
3081
  msgid "Allow Edit Own Post within (minutes)"
3082
  msgstr ""
3083
 
3084
- #: classes/Settings.php:911
3085
  msgid "Allow Delete Own Post within (minutes)"
3086
  msgstr ""
3087
 
3088
- #: classes/Settings.php:919
3089
  msgid "Display Topic Editing Information"
3090
  msgstr ""
3091
 
3092
- #: classes/Settings.php:921
3093
  msgid ""
3094
  "The topic edit logging information 'This post was modified 2 hours ago by "
3095
  "John' is displayed under modified topic first post content..."
3096
  msgstr ""
3097
 
3098
- #: classes/Settings.php:927
3099
  msgid "Display Post Editing Information"
3100
  msgstr ""
3101
 
3102
- #: classes/Settings.php:929
3103
  msgid ""
3104
  "The post edit logging information 'This post was modified 2 hours ago by John' "
3105
  "is displayed under modified post content..."
3106
  msgstr ""
3107
 
3108
- #: classes/Settings.php:936
3109
  msgid "Limit Post Editing Information"
3110
  msgstr ""
3111
 
3112
- #: classes/Settings.php:938
3113
  msgid ""
3114
  "Limit the post edit logging information 'This post was modified 2 hours ago by "
3115
  "John'. Set this option value 0 if you want to disable limiting."
3116
  msgstr ""
3117
 
3118
- #: classes/Settings.php:944
3119
  msgid "Post Preview"
3120
  msgstr ""
3121
 
3122
- #: classes/Settings.php:952
3123
  msgid "Post Revisions and Draft Saving"
3124
  msgstr ""
3125
 
3126
- #: classes/Settings.php:960
3127
  msgid "Auto Drafting Interval"
3128
  msgstr ""
3129
 
3130
- #: classes/Settings.php:965
3131
  msgid "disabled"
3132
  msgstr ""
3133
 
3134
- #: classes/Settings.php:966
3135
  msgid "15 seconds"
3136
  msgstr ""
3137
 
3138
- #: classes/Settings.php:967
3139
  msgid "30 seconds"
3140
  msgstr ""
3141
 
3142
- #: classes/Settings.php:968
3143
  msgid "1 minute"
3144
  msgstr ""
3145
 
3146
- #: classes/Settings.php:969
3147
  msgid "2 minute"
3148
  msgstr ""
3149
 
3150
- #: classes/Settings.php:970
3151
  msgid "5 minute"
3152
  msgstr ""
3153
 
3154
- #: classes/Settings.php:977
3155
  msgid "Max Number of Revisions"
3156
  msgstr ""
3157
 
3158
- #: classes/Settings.php:986 includes/phrases.php:355
3159
  msgid "Maximum upload file size"
3160
  msgstr ""
3161
 
3162
- #: classes/Settings.php:988
3163
  msgid ""
3164
  "You can not set this value more than 'upload_max_filesize' and "
3165
  "'post_max_size'. If you want to increase server parameters please contact to "
3166
  "your hosting service support."
3167
  msgstr ""
3168
 
3169
- #: classes/Settings.php:994 includes/phrases.php:828
3170
  msgid "Insert Forum Attachments to Media Library"
3171
  msgstr ""
3172
 
3173
- #: classes/Settings.php:996 includes/phrases.php:829
3174
  msgid ""
3175
  "Enable this option to be able manage forum attachments in Dashboard > Media > "
3176
  "Library admin page."
3177
  msgstr ""
3178
 
3179
- #: classes/Settings.php:1002
3180
  msgid "Toolbar Location of the Topic Editor"
3181
  msgstr ""
3182
 
3183
- #: classes/Settings.php:1007 classes/Settings.php:1019
3184
  msgid "Top"
3185
  msgstr ""
3186
 
3187
- #: classes/Settings.php:1008 classes/Settings.php:1020
3188
  msgid "Bottom"
3189
  msgstr ""
3190
 
3191
- #: classes/Settings.php:1014
3192
  msgid "Toolbar Location of the Reply Editor"
3193
  msgstr ""
3194
 
3195
- #: classes/Settings.php:1026
3196
  msgid "Enable WordPress Shortcodes in Post Content"
3197
  msgstr ""
3198
 
3199
- #: classes/Settings.php:1034
3200
  msgid "Allow extra HTML tags"
3201
  msgstr ""
3202
 
3203
- #: classes/Settings.php:1036
3204
  msgid ""
3205
  "By default, wpForo allows all secure HTML tags in post content. Allowing a new "
3206
  "HTML tag may affect your forum security. For example the &lt;iframe&gt; and "
@@ -3210,11 +3246,11 @@ msgid ""
3210
  "</code>"
3211
  msgstr ""
3212
 
3213
- #: classes/Settings.php:1043
3214
  msgid "Display Members"
3215
  msgstr ""
3216
 
3217
- #: classes/Settings.php:1046
3218
  msgid ""
3219
  "This is the members' directory setting page. wpForo forum has a members' page "
3220
  "where you can see all members. The members' page is called members directory, "
@@ -3223,65 +3259,65 @@ msgid ""
3223
  "will be one for all boards."
3224
  msgstr ""
3225
 
3226
- #: classes/Settings.php:1057
3227
  msgid "Members List Ordering"
3228
  msgstr ""
3229
 
3230
- #: classes/Settings.php:1062
3231
  msgid "Last Online time"
3232
  msgstr ""
3233
 
3234
- #: classes/Settings.php:1063
3235
  msgid "Posts Ascending"
3236
  msgstr ""
3237
 
3238
- #: classes/Settings.php:1064
3239
  msgid "Posts Descending"
3240
  msgstr ""
3241
 
3242
- #: classes/Settings.php:1065
3243
  msgid "Join Date Ascending"
3244
  msgstr ""
3245
 
3246
- #: classes/Settings.php:1066
3247
  msgid "Join Date Descending"
3248
  msgstr ""
3249
 
3250
- #: classes/Settings.php:1067
3251
  msgid "Display Name A->Z"
3252
  msgstr ""
3253
 
3254
- #: classes/Settings.php:1068
3255
  msgid "Display Name Z->A"
3256
  msgstr ""
3257
 
3258
- #: classes/Settings.php:1074
3259
  msgid "Hide Inactive Members"
3260
  msgstr ""
3261
 
3262
- #: classes/Settings.php:1076
3263
  msgid ""
3264
  "Members who have not confirmed their email after the registration are set as "
3265
  "'inactive'. In most cases they are spam bots."
3266
  msgstr ""
3267
 
3268
- #: classes/Settings.php:1083
3269
  msgid "Number of Members per Page"
3270
  msgstr ""
3271
 
3272
- #: classes/Settings.php:1091 includes/phrases.php:888
3273
  msgid "Members Search Type"
3274
  msgstr ""
3275
 
3276
- #: classes/Settings.php:1096 includes/phrases.php:461
3277
  msgid "Search"
3278
  msgstr ""
3279
 
3280
- #: classes/Settings.php:1104 includes/phrases.php:835
3281
  msgid "Member Profile"
3282
  msgstr ""
3283
 
3284
- #: classes/Settings.php:1107
3285
  msgid ""
3286
  "wpForo forum has a powerful user profile system which can be managed in this "
3287
  "setting page. Here you can hide/show forum header and footer on profile pages, "
@@ -3290,96 +3326,96 @@ msgid ""
3290
  "plugins, you can switch forum profile page to the plugin profile page."
3291
  msgstr ""
3292
 
3293
- #: classes/Settings.php:1118
3294
  msgid "Profile Page"
3295
  msgstr ""
3296
 
3297
- #: classes/Settings.php:1126
3298
  msgid ""
3299
  "wpForo Profile only for the forum, WordPress Profile for others, including "
3300
  "comment authors, post authors and etc..."
3301
  msgstr ""
3302
 
3303
  #. Plugin Name of the plugin/theme
3304
- #: classes/Settings.php:1130
3305
  msgid "wpForo"
3306
  msgstr ""
3307
 
3308
- #: classes/Settings.php:1131
3309
  msgid ""
3310
  "wpForo Profile for the whole website including forum, comment authors, post "
3311
  "authors and etc..."
3312
  msgstr ""
3313
 
3314
- #: classes/Settings.php:1135
3315
  msgid "BuddyPress"
3316
  msgstr ""
3317
 
3318
- #: classes/Settings.php:1136
3319
  msgid "BuddyPress Profile for the whole website including forum."
3320
  msgstr ""
3321
 
3322
- #: classes/Settings.php:1141
3323
  msgid "Ultimate Member"
3324
  msgstr ""
3325
 
3326
- #: classes/Settings.php:1142
3327
  msgid "Ultimate Member Profile for the whole website including forum."
3328
  msgstr ""
3329
 
3330
- #: classes/Settings.php:1150
3331
  msgid "Show Forum Header on Profile Pages"
3332
  msgstr ""
3333
 
3334
- #: classes/Settings.php:1158
3335
  msgid "Show Forum Footer under Profile Pages"
3336
  msgstr ""
3337
 
3338
- #: classes/Settings.php:1166
3339
  msgid "Members URL Structure"
3340
  msgstr ""
3341
 
3342
- #: classes/Settings.php:1168
3343
  msgid "By default "
3344
  msgstr ""
3345
 
3346
- #: classes/Settings.php:1178
3347
  msgid "Online Status Timeout (minutes)"
3348
  msgstr ""
3349
 
3350
- #: classes/Settings.php:1186
3351
  msgid "Member Custom Titles"
3352
  msgstr ""
3353
 
3354
- #: classes/Settings.php:1194
3355
  msgid "Member Custom Title by Default"
3356
  msgstr ""
3357
 
3358
- #: classes/Settings.php:1202
3359
  msgid "Display Member Primary Usergroup"
3360
  msgstr ""
3361
 
3362
- #: classes/Settings.php:1204
3363
  msgid ""
3364
  "The names of selected usergroups will be displayed under the corresponding "
3365
  "usergroup's users avatar in forum posts."
3366
  msgstr ""
3367
 
3368
- #: classes/Settings.php:1210
3369
  msgid "Display Member Secondary Usergroup"
3370
  msgstr ""
3371
 
3372
- #: classes/Settings.php:1212
3373
  msgid ""
3374
  "The names of selected secondary usergroups will be displayed under the "
3375
  "corresponding usergroup's users avatar in forum posts."
3376
  msgstr ""
3377
 
3378
- #: classes/Settings.php:1218
3379
  msgid "Display Member Nicknames"
3380
  msgstr ""
3381
 
3382
- #: classes/Settings.php:1220
3383
  msgid ""
3384
  "Nicknames are displayed with '@' symbol, like @john and are used for the user "
3385
  "mentioning in posts. Please note, that this is not the user login name "
@@ -3387,11 +3423,11 @@ msgid ""
3387
  "profile account page to secure the login name."
3388
  msgstr ""
3389
 
3390
- #: classes/Settings.php:1226 includes/phrases.php:263
3391
  msgid "Enable Avatars"
3392
  msgstr ""
3393
 
3394
- #: classes/Settings.php:1228
3395
  msgid ""
3396
  "Using this option you can disable user avatars for the forum but you cannot "
3397
  "show avatars if the WordPress native avatar option is disabled. So please make "
@@ -3399,46 +3435,46 @@ msgid ""
3399
  "admin page."
3400
  msgstr ""
3401
 
3402
- #: classes/Settings.php:1234 includes/phrases.php:264
3403
  msgid "Enable Custom Avatars"
3404
  msgstr ""
3405
 
3406
- #: classes/Settings.php:1236
3407
  msgid ""
3408
  "By default wpForo uses WordPress avatars. In most cases it's the Gravatar. If "
3409
  "this option is enabled, users will be able to set their avatars with external "
3410
  "URLs or upload from their devices."
3411
  msgstr ""
3412
 
3413
- #: classes/Settings.php:1242
3414
  msgid "Site-wide Usage of Forum Profile Avatar"
3415
  msgstr ""
3416
 
3417
- #: classes/Settings.php:1244
3418
  msgid ""
3419
  "If this option is enabled, wpForo will try to use its avatar in all available "
3420
  "places."
3421
  msgstr ""
3422
 
3423
- #: classes/Settings.php:1250
3424
  msgid "The Default Profile Cover Image"
3425
  msgstr ""
3426
 
3427
- #: classes/Settings.php:1258 includes/phrases.php:217
3428
  msgid "Allow Member Signature"
3429
  msgstr ""
3430
 
3431
- #: classes/Settings.php:1260
3432
  msgid ""
3433
  "You can edit usergroups and enable/disable the signature for each usergroups "
3434
  "individually."
3435
  msgstr ""
3436
 
3437
- #: classes/Settings.php:1267 includes/phrases.php:358
3438
  msgid "Member Rating"
3439
  msgstr ""
3440
 
3441
- #: classes/Settings.php:1270
3442
  msgid ""
3443
  "wpForo has built-in member reputation system based on points user get when he/"
3444
  "she creates new topic, posts, when gets likes or dislikes. This system grants "
@@ -3446,55 +3482,55 @@ msgid ""
3446
  "posts, titles, badges) can be customized and changed in this admin section."
3447
  msgstr ""
3448
 
3449
- #: classes/Settings.php:1270
3450
  msgid ""
3451
  " For an advanced user ranking and members' point awarding system we recommend "
3452
  "using myCRED plugin with the integration addon: "
3453
  msgstr ""
3454
 
3455
- #: classes/Settings.php:1281
3456
  msgid "Enable Member Rating Badges"
3457
  msgstr ""
3458
 
3459
- #: classes/Settings.php:1289 includes/phrases.php:267
3460
  msgid "Enable Member Rating Titles"
3461
  msgstr ""
3462
 
3463
- #: classes/Settings.php:1305
3464
  msgid "Points for One Topic"
3465
  msgstr ""
3466
 
3467
- #: classes/Settings.php:1314
3468
  msgid "Points for One Post"
3469
  msgstr ""
3470
 
3471
- #: classes/Settings.php:1323
3472
  msgid "Points for One Like"
3473
  msgstr ""
3474
 
3475
- #: classes/Settings.php:1332
3476
  msgid "Points for One Dislike"
3477
  msgstr ""
3478
 
3479
- #: classes/Settings.php:1334
3480
  msgid ""
3481
  "This should be set a negative value like '-1' to decrease the user reputation "
3482
  "points if he/she receives dislikes."
3483
  msgstr ""
3484
 
3485
- #: classes/Settings.php:1340
3486
  msgid "Enable Reputation Titles for Selected Usergroups"
3487
  msgstr ""
3488
 
3489
- #: classes/Settings.php:1348
3490
  msgid "Enable Reputation Badges for Selected Usergroups"
3491
  msgstr ""
3492
 
3493
- #: classes/Settings.php:1365
3494
  msgid "Login &amp; Registration"
3495
  msgstr ""
3496
 
3497
- #: classes/Settings.php:1368
3498
  msgid ""
3499
  "wpForo is one of the very rare plugins which has its own user registration and "
3500
  "login pages. Both features are based on WordPress functions. Here you can "
@@ -3503,59 +3539,59 @@ msgid ""
3503
  "actions."
3504
  msgstr ""
3505
 
3506
- #: classes/Settings.php:1368
3507
  msgid ""
3508
  "If you need to customize the registration form and add custom fields, you "
3509
  "should check out user custom field builder addon:"
3510
  msgstr ""
3511
 
3512
- #: classes/Settings.php:1379 includes/phrases.php:824
3513
  msgid "Enable User Registration"
3514
  msgstr ""
3515
 
3516
- #: classes/Settings.php:1381
3517
  msgid ""
3518
  "This option is not synced with WordPress 'Anyone can register' option in "
3519
  "Dashboard > Settings > General admin page. If this option is enabled new users "
3520
  "will always be able to register."
3521
  msgstr ""
3522
 
3523
- #: classes/Settings.php:1387
3524
  msgid "Enable User Registration email confirmation"
3525
  msgstr ""
3526
 
3527
- #: classes/Settings.php:1389
3528
  msgid ""
3529
  "If you have enabled this option, after registering, user can not login without "
3530
  "confirming the email."
3531
  msgstr ""
3532
 
3533
- #: classes/Settings.php:1395
3534
  msgid "Enable User Manually Approval System"
3535
  msgstr ""
3536
 
3537
- #: classes/Settings.php:1397
3538
  msgid ""
3539
  "If you have enabled this option, after registering, user can not login without "
3540
  "manually approving of administrator."
3541
  msgstr ""
3542
 
3543
- #: classes/Settings.php:1403
3544
  msgid "Admin Contacting Form under the \"Awaiting approval\" Message"
3545
  msgstr ""
3546
 
3547
- #: classes/Settings.php:1405
3548
  msgid ""
3549
  "This option displays a contact form under the 'Awaiting approval' text to "
3550
  "allow inactive users send a message to website administrator. This message "
3551
  "will be sent to the administrator email address."
3552
  msgstr ""
3553
 
3554
- #: classes/Settings.php:1411
3555
  msgid "Role-Usergroup Synchronization"
3556
  msgstr ""
3557
 
3558
- #: classes/Settings.php:1413
3559
  msgid ""
3560
  "Keep enabled this option to synch WordPress User Roles with Forum Usergroups. "
3561
  "This connection allows to automatically change Usergroup of a user when his/"
@@ -3566,11 +3602,11 @@ msgid ""
3566
  "they are only controlled by forum Usergroups."
3567
  msgstr ""
3568
 
3569
- #: classes/Settings.php:1419
3570
  msgid "User Delete Method"
3571
  msgstr ""
3572
 
3573
- #: classes/Settings.php:1421
3574
  msgid ""
3575
  "Choose which method to use when user delete action comes. [Soft] option will "
3576
  "not remove any content this user has already created. It'll only remove the "
@@ -3579,41 +3615,41 @@ msgid ""
3579
  "user has already created."
3580
  msgstr ""
3581
 
3582
- #: classes/Settings.php:1424
3583
  msgid "Soft"
3584
  msgstr ""
3585
 
3586
- #: classes/Settings.php:1424
3587
  msgid ""
3588
  "This method will delete only profile information so all content which created "
3589
  "this user will be kept and renamed as Anonymous."
3590
  msgstr ""
3591
 
3592
- #: classes/Settings.php:1425
3593
  msgid "Hard"
3594
  msgstr ""
3595
 
3596
- #: classes/Settings.php:1425
3597
  msgid "This method will also remove all user information and content."
3598
  msgstr ""
3599
 
3600
- #: classes/Settings.php:1431 includes/phrases.php:446
3601
  msgid "Replace Registration Page URL to Forum Registration Page URL"
3602
  msgstr ""
3603
 
3604
- #: classes/Settings.php:1439 includes/phrases.php:445
3605
  msgid "Replace Login Page URL to Forum Login Page URL"
3606
  msgstr ""
3607
 
3608
- #: classes/Settings.php:1447 includes/phrases.php:886
3609
  msgid "Replace Reset Password Page URL to Forum Reset Password Page URL"
3610
  msgstr ""
3611
 
3612
- #: classes/Settings.php:1455 includes/phrases.php:248
3613
  msgid "Custom Authorization URLs"
3614
  msgstr ""
3615
 
3616
- #: classes/Settings.php:1457
3617
  msgid ""
3618
  "Use this option only if you have set other pages for authorization. wpForo "
3619
  "doesn't change its own URLs, these options are only for other plugin "
@@ -3621,82 +3657,82 @@ msgid ""
3621
  "you can set your profile plugin url"
3622
  msgstr ""
3623
 
3624
- #: classes/Settings.php:1464 includes/phrases.php:348
3625
  msgid "Login URL"
3626
  msgstr ""
3627
 
3628
- #: classes/Settings.php:1472 includes/phrases.php:438
3629
  msgid "Register URL"
3630
  msgstr ""
3631
 
3632
- #: classes/Settings.php:1480
3633
  msgid "Lost Password"
3634
  msgstr ""
3635
 
3636
- #: classes/Settings.php:1488
3637
  msgid "Custom Redirection URLs after following actions:"
3638
  msgstr ""
3639
 
3640
- #: classes/Settings.php:1490
3641
  msgid "For member profile, account and subscription pages use following URLs:"
3642
  msgstr ""
3643
 
3644
- #: classes/Settings.php:1521
3645
  msgid "Facebook API Configuration"
3646
  msgstr ""
3647
 
3648
- #: classes/Settings.php:1523
3649
  msgid ""
3650
  "In order to get an App ID and Secret Key from Facebook, you’ll need to "
3651
  "register a new application. Don’t worry – its very easy, and your application "
3652
  "doesn't need to do anything. We only need the keys."
3653
  msgstr ""
3654
 
3655
- #: classes/Settings.php:1523
3656
  msgid "Please follow to this instruction"
3657
  msgstr ""
3658
 
3659
- #: classes/Settings.php:1530
3660
  msgid "App ID"
3661
  msgstr ""
3662
 
3663
- #: classes/Settings.php:1538
3664
  msgid "App Secret"
3665
  msgstr ""
3666
 
3667
- #: classes/Settings.php:1546
3668
  msgid "Facebook Login"
3669
  msgstr ""
3670
 
3671
- #: classes/Settings.php:1548
3672
  msgid "Adds Facebook Login button on Registration and Login pages."
3673
  msgstr ""
3674
 
3675
- #: classes/Settings.php:1554
3676
  msgid "Facebook Login button on User Login page"
3677
  msgstr ""
3678
 
3679
- #: classes/Settings.php:1562
3680
  msgid "Facebook Login button on User Registration page"
3681
  msgstr ""
3682
 
3683
- #: classes/Settings.php:1570
3684
  msgid "Redirect to this page after success login"
3685
  msgstr ""
3686
 
3687
- #: classes/Settings.php:1583
3688
  msgid "Custom URL, e.g.:"
3689
  msgstr ""
3690
 
3691
- #: classes/Settings.php:1584
3692
  msgid "Redirect to custom URL after success login"
3693
  msgstr ""
3694
 
3695
- #: classes/Settings.php:1593
3696
  msgid "Email Settings"
3697
  msgstr ""
3698
 
3699
- #: classes/Settings.php:1596
3700
  msgid ""
3701
  "Here, you can configure header information (FROM name and email) of forum "
3702
  "specific emails. You can set administrators and moderators email addresses to "
@@ -3704,119 +3740,135 @@ msgid ""
3704
  "find user registration, password resetting and post reporting email templates."
3705
  msgstr ""
3706
 
3707
- #: classes/Settings.php:1607
3708
  msgid "FROM Name"
3709
  msgstr ""
3710
 
3711
- #: classes/Settings.php:1615
3712
  msgid "FROM Email Address"
3713
  msgstr ""
3714
 
3715
- #: classes/Settings.php:1623
3716
  msgid "Forum Admins Email Addresses"
3717
  msgstr ""
3718
 
3719
- #: classes/Settings.php:1625 includes/phrases.php:243
3720
  msgid ""
3721
  "Comma separated email addresses of forum administrators to get forum "
3722
  "notifications. For example post report messages."
3723
  msgstr ""
3724
 
3725
- #: classes/Settings.php:1631
3726
  msgid "Notify Admins via Email on New Topic"
3727
  msgstr ""
3728
 
3729
- #: classes/Settings.php:1633
3730
  msgid ""
3731
  "Send Notification emails to all email addresses (comma separated ) of forum "
3732
  "administrators when a new Topic is created."
3733
  msgstr ""
3734
 
3735
- #: classes/Settings.php:1639
3736
  msgid "Notify Admins via Email on New Post"
3737
  msgstr ""
3738
 
3739
- #: classes/Settings.php:1641
3740
  msgid ""
3741
  "Send Notification emails to all email addresses (comma separated ) of forum "
3742
  "administrators when a new Reply is created."
3743
  msgstr ""
3744
 
3745
- #: classes/Settings.php:1647
3746
  msgid "Stop Sending Emails to Admins on New User Registration"
3747
  msgstr ""
3748
 
3749
- #: classes/Settings.php:1649
3750
  msgid ""
3751
  "If you have enabled this option, after registering, the admin will not receive "
3752
  "an email notification for newly registered user."
3753
  msgstr ""
3754
 
3755
- #: classes/Settings.php:1655
3756
  msgid "Report Message Subject"
3757
  msgstr ""
3758
 
3759
- #: classes/Settings.php:1664
3760
  msgid "Report Message Body"
3761
  msgstr ""
3762
 
3763
- #: classes/Settings.php:1672
3764
  msgid "Reporter user display name"
3765
  msgstr ""
3766
 
3767
- #: classes/Settings.php:1673
3768
  msgid "Reporter user message"
3769
  msgstr ""
3770
 
3771
- #: classes/Settings.php:1674
3772
  msgid "Reported post URL"
3773
  msgstr ""
3774
 
3775
- #: classes/Settings.php:1681
3776
  msgid "Overwrite WordPress New User Registration Email for Admins"
3777
  msgstr ""
3778
 
3779
- #: classes/Settings.php:1689 classes/Settings.php:1723
3780
  msgid "Message Subject"
3781
  msgstr ""
3782
 
3783
- #: classes/Settings.php:1698 classes/Settings.php:1732
3784
  msgid "Message Body"
3785
  msgstr ""
3786
 
3787
- #: classes/Settings.php:1706
3788
  msgid "Website name"
3789
  msgstr ""
3790
 
3791
- #: classes/Settings.php:1707 classes/Settings.php:1739 classes/Settings.php:1763
3792
  msgid "Registered user login"
3793
  msgstr ""
3794
 
3795
- #: classes/Settings.php:1708
3796
  msgid "Registered user email"
3797
  msgstr ""
3798
 
3799
- #: classes/Settings.php:1715
3800
  msgid "Overwrite WordPress New User Registration Email for Users"
3801
  msgstr ""
3802
 
3803
- #: classes/Settings.php:1740 classes/Settings.php:1764
3804
  msgid "Link to open password reset form"
3805
  msgstr ""
3806
 
3807
- #: classes/Settings.php:1747
3808
  msgid "Overwrite WordPress Reset Password Emails"
3809
  msgstr ""
3810
 
3811
- #: classes/Settings.php:1756
3812
  msgid "Reset Password message body"
3813
  msgstr ""
3814
 
3815
- #: classes/Settings.php:1772
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3816
  msgid "Subscriptions &amp; Mentioning"
3817
  msgstr ""
3818
 
3819
- #: classes/Settings.php:1775
3820
  msgid ""
3821
  "wpForo has almost all kind of way to keep forum users updated about the latest "
3822
  "posted content. Users can subscribe to forums and topics, they can be "
@@ -3825,49 +3877,49 @@ msgid ""
3825
  "this admin section."
3826
  msgstr ""
3827
 
3828
- #: classes/Settings.php:1786 includes/phrases.php:800
3829
  msgid "Enable Subscription Confirmation"
3830
  msgstr ""
3831
 
3832
- #: classes/Settings.php:1788 includes/phrases.php:801
3833
  msgid "Forum and Topic subscription with double opt-in/confirmation system."
3834
  msgstr ""
3835
 
3836
- #: classes/Settings.php:1794
3837
  msgid "Topic subscription option on post editor"
3838
  msgstr ""
3839
 
3840
- #: classes/Settings.php:1796
3841
  msgid ""
3842
  "This option adds topic subscription checkbox next to new topic and post submit "
3843
  "button."
3844
  msgstr ""
3845
 
3846
- #: classes/Settings.php:1802
3847
  msgid "Topic subscription option on post editor - checked/enabled"
3848
  msgstr ""
3849
 
3850
- #: classes/Settings.php:1804
3851
  msgid ""
3852
  "Enable this option if you want the topic subscription checkbox to be checked "
3853
  "by default."
3854
  msgstr ""
3855
 
3856
- #: classes/Settings.php:1810
3857
  msgid "Enable User Mentioning"
3858
  msgstr ""
3859
 
3860
- #: classes/Settings.php:1812
3861
  msgid ""
3862
  "If this option is enabled, users will receive email notification when someone "
3863
  "uses @nickname of the user in posts."
3864
  msgstr ""
3865
 
3866
- #: classes/Settings.php:1818
3867
  msgid "Enable User Following"
3868
  msgstr ""
3869
 
3870
- #: classes/Settings.php:1820
3871
  msgid ""
3872
  "If this option is enabled, the [Follow] button will be displayed on user's "
3873
  "profile pages, allowing users to subscribe to certain users topics and posts. "
@@ -3875,155 +3927,155 @@ msgid ""
3875
  "a new topic or post."
3876
  msgstr ""
3877
 
3878
- #: classes/Settings.php:1826 includes/phrases.php:500
3879
  msgid "Subscribe confirmation email subject"
3880
  msgstr ""
3881
 
3882
- #: classes/Settings.php:1835 includes/phrases.php:499
3883
  msgid "Subscribe confirmation email message"
3884
  msgstr ""
3885
 
3886
- #: classes/Settings.php:1843
3887
  msgid "Subscribed forum or topic title"
3888
  msgstr ""
3889
 
3890
- #: classes/Settings.php:1844 classes/Settings.php:1873 classes/Settings.php:1906
3891
- #: classes/Settings.php:1967
3892
  msgid "Subscriber display name"
3893
  msgstr ""
3894
 
3895
- #: classes/Settings.php:1845
3896
  msgid "Link to confirm subscription"
3897
  msgstr ""
3898
 
3899
- #: classes/Settings.php:1852 includes/phrases.php:381
3900
  msgid "New topic notification email subject"
3901
  msgstr ""
3902
 
3903
- #: classes/Settings.php:1861 includes/phrases.php:380
3904
  msgid "New topic notification email message"
3905
  msgstr ""
3906
 
3907
- #: classes/Settings.php:1874
3908
  msgid "New topic author display name"
3909
  msgstr ""
3910
 
3911
- #: classes/Settings.php:1875
3912
  msgid "Forum title / link"
3913
  msgstr ""
3914
 
3915
- #: classes/Settings.php:1876 classes/Settings.php:1908
3916
  msgid "Topic title / link"
3917
  msgstr ""
3918
 
3919
- #: classes/Settings.php:1877
3920
  msgid "New topic title"
3921
  msgstr ""
3922
 
3923
- #: classes/Settings.php:1878
3924
  msgid "New topic excerpt"
3925
  msgstr ""
3926
 
3927
- #: classes/Settings.php:1879 classes/Settings.php:1911 classes/Settings.php:1971
3928
  msgid "Link to unsubscribe"
3929
  msgstr ""
3930
 
3931
- #: classes/Settings.php:1886 includes/phrases.php:379
3932
  msgid "New reply notification email subject"
3933
  msgstr ""
3934
 
3935
- #: classes/Settings.php:1895 includes/phrases.php:378
3936
  msgid "New reply notification email message"
3937
  msgstr ""
3938
 
3939
- #: classes/Settings.php:1907
3940
  msgid "New reply author display name"
3941
  msgstr ""
3942
 
3943
- #: classes/Settings.php:1909
3944
  msgid "New reply title"
3945
  msgstr ""
3946
 
3947
- #: classes/Settings.php:1910
3948
  msgid "New reply excerpt"
3949
  msgstr ""
3950
 
3951
- #: classes/Settings.php:1918
3952
  msgid "User mention message subject"
3953
  msgstr ""
3954
 
3955
- #: classes/Settings.php:1927
3956
  msgid "User Mention message body"
3957
  msgstr ""
3958
 
3959
- #: classes/Settings.php:1937
3960
  msgid "Mentioned user display name"
3961
  msgstr ""
3962
 
3963
- #: classes/Settings.php:1938
3964
  msgid "Post author display name"
3965
  msgstr ""
3966
 
3967
- #: classes/Settings.php:1939 includes/phrases.php:523
3968
  msgid "Topic title"
3969
  msgstr ""
3970
 
3971
- #: classes/Settings.php:1940
3972
  msgid "Link to the post"
3973
  msgstr ""
3974
 
3975
- #: classes/Settings.php:1941
3976
  msgid "Mentioned post excerpt"
3977
  msgstr ""
3978
 
3979
- #: classes/Settings.php:1948
3980
  msgid "User following notification email subject"
3981
  msgstr ""
3982
 
3983
- #: classes/Settings.php:1957
3984
  msgid "User following notification email message"
3985
  msgstr ""
3986
 
3987
- #: classes/Settings.php:1968
3988
  msgid "New post author display name"
3989
  msgstr ""
3990
 
3991
- #: classes/Settings.php:1969
3992
  msgid "New post title"
3993
  msgstr ""
3994
 
3995
- #: classes/Settings.php:1970
3996
  msgid "New post excerpt"
3997
  msgstr ""
3998
 
3999
- #: classes/Settings.php:1979
4000
  msgid "Forum Notifications"
4001
  msgstr ""
4002
 
4003
- #: classes/Settings.php:1982
4004
  msgid ""
4005
  "As an addition to email notification functions, wpForo has in-forum "
4006
  "notification system. You can see the notification bell on forum menu bar or in "
4007
  "the sidebar with 'My Profile and Notifications' widget."
4008
  msgstr ""
4009
 
4010
- #: classes/Settings.php:1993
4011
  msgid "Enable User Notification"
4012
  msgstr ""
4013
 
4014
- #: classes/Settings.php:2001
4015
  msgid "Enable User Notification Live Update"
4016
  msgstr ""
4017
 
4018
- #: classes/Settings.php:2009
4019
  msgid "Display User Notification Bell on Menu Bar"
4020
  msgstr ""
4021
 
4022
- #: classes/Settings.php:2018
4023
  msgid "Action Logging &amp; Views"
4024
  msgstr ""
4025
 
4026
- #: classes/Settings.php:2021
4027
  msgid ""
4028
  "wpForo logging system allows tracking and providing live information about "
4029
  "forum viewers. It detects read/unread status of forums and posts for guests "
@@ -4031,80 +4083,80 @@ msgid ""
4031
  "features of the forum logging system."
4032
  msgstr ""
4033
 
4034
- #: classes/Settings.php:2032 includes/phrases.php:885
4035
  msgid "Log Viewed Forums and Topics"
4036
  msgstr ""
4037
 
4038
- #: classes/Settings.php:2040
4039
  msgid "Track Forum and Topic Current Viewers"
4040
  msgstr ""
4041
 
4042
- #: classes/Settings.php:2048
4043
  msgid "Topic Links - Jump to First Unread Post"
4044
  msgstr ""
4045
 
4046
- #: classes/Settings.php:2050
4047
  msgid ""
4048
  "If this option is enabled, all topic links on forums page and on topics page "
4049
  "will refer to the first unread post. This behavior is only enabled for logged-"
4050
  "in users."
4051
  msgstr ""
4052
 
4053
- #: classes/Settings.php:2056
4054
  msgid "Jump to First Unread Post with [new] Button in Topic Link"
4055
  msgstr ""
4056
 
4057
- #: classes/Settings.php:2058
4058
  msgid ""
4059
  "Adds [new] button at the and of topic links, which jumps to the first unread "
4060
  "post."
4061
  msgstr ""
4062
 
4063
- #: classes/Settings.php:2064
4064
  msgid "Display Forum Current Viewers"
4065
  msgstr ""
4066
 
4067
- #: classes/Settings.php:2066
4068
  msgid ""
4069
  "Displays information about forum current viewers (x viewing) next to forum "
4070
  "title."
4071
  msgstr ""
4072
 
4073
- #: classes/Settings.php:2072
4074
  msgid "Display Topic Current Viewers"
4075
  msgstr ""
4076
 
4077
- #: classes/Settings.php:2074
4078
  msgid ""
4079
  "Displays information about topic current viewers (x viewing) next to topic "
4080
  "title"
4081
  msgstr ""
4082
 
4083
- #: classes/Settings.php:2080
4084
  msgid "Display Recent Viewers in the Topic Footer"
4085
  msgstr ""
4086
 
4087
- #: classes/Settings.php:2082
4088
  msgid ""
4089
  "Displays information about topic recent viewers (users visited within last one "
4090
  "hour)"
4091
  msgstr ""
4092
 
4093
- #: classes/Settings.php:2088
4094
  msgid "Display Administrators in the Topic Recent Viewers Section"
4095
  msgstr ""
4096
 
4097
- #: classes/Settings.php:2090
4098
  msgid ""
4099
  "By disabling this option you can exclude forum administrators from the topic "
4100
  "viewers section."
4101
  msgstr ""
4102
 
4103
- #: classes/Settings.php:2097
4104
  msgid "wpForo SEO"
4105
  msgstr ""
4106
 
4107
- #: classes/Settings.php:2100
4108
  msgid ""
4109
  "wpForo comes with built-in powerful forum SEO features. wpForo doesn't need "
4110
  "any SEO plugin, however you should use SEO plugins for other parts of your "
@@ -4112,56 +4164,56 @@ msgid ""
4112
  "pages and generates all necessary SEO meta tags."
4113
  msgstr ""
4114
 
4115
- #: classes/Settings.php:2111
4116
  msgid "Enable Meta Titles"
4117
  msgstr ""
4118
 
4119
- #: classes/Settings.php:2119
4120
  msgid "Enable Meta Tags"
4121
  msgstr ""
4122
 
4123
- #: classes/Settings.php:2127
4124
  msgid "Enable User Profile Page indexing"
4125
  msgstr ""
4126
 
4127
- #: classes/Settings.php:2135
4128
  msgid "Enable Forums Sitemap"
4129
  msgstr ""
4130
 
4131
- #: classes/Settings.php:2143
4132
  msgid "Enable Topics Sitemap"
4133
  msgstr ""
4134
 
4135
- #: classes/Settings.php:2151
4136
  msgid "Enable Members Sitemap"
4137
  msgstr ""
4138
 
4139
- #: classes/Settings.php:2160
4140
  msgid "Allowed dofollow domains"
4141
  msgstr ""
4142
 
4143
- #: classes/Settings.php:2162
4144
  msgid ""
4145
  "wpForo adds nofollow to all links with external URLs. If you want to keep some "
4146
  "domains as internal please insert domains one per line in the textarea bellow."
4147
  msgstr ""
4148
 
4149
- #: classes/Settings.php:2169
4150
  msgid "Noindex forum page URLs"
4151
  msgstr ""
4152
 
4153
- #: classes/Settings.php:2171
4154
  msgid ""
4155
  "The noIndex code tells Google and other search engines to NOT index the page, "
4156
  "so that it cannot be found in search results. Please insert page URLs you do "
4157
  "not want to be indexed one per line in the textarea bellow."
4158
  msgstr ""
4159
 
4160
- #: classes/Settings.php:2178
4161
  msgid "Spam Protection"
4162
  msgstr ""
4163
 
4164
- #: classes/Settings.php:2181
4165
  msgid ""
4166
  "Here you can find many ways to protect your forum from spammers. Most of them "
4167
  "are already configured and enabled with default values. You can make spam "
@@ -4170,59 +4222,59 @@ msgid ""
4170
  "Akismet."
4171
  msgstr ""
4172
 
4173
- #: classes/Settings.php:2192
4174
  msgid "Enable wpForo Spam Control"
4175
  msgstr ""
4176
 
4177
- #: classes/Settings.php:2200
4178
  msgid "Ban user when spam is suspected"
4179
  msgstr ""
4180
 
4181
- #: classes/Settings.php:2210
4182
  msgid "Spam Suspicion Level for Topics"
4183
  msgstr ""
4184
 
4185
- #: classes/Settings.php:2220
4186
  msgid "Spam Suspicion Level for Posts"
4187
  msgstr ""
4188
 
4189
- #: classes/Settings.php:2229
4190
  msgid "User is New (under hard spam control) during first [X] posts"
4191
  msgstr ""
4192
 
4193
- #: classes/Settings.php:2237
4194
  msgid "Posts must be manually approved"
4195
  msgstr ""
4196
 
4197
- #: classes/Settings.php:2246
4198
  msgid "Min number of posts to be able to edit profile information"
4199
  msgstr ""
4200
 
4201
- #: classes/Settings.php:2255
4202
  msgid "Min number of posts to be able to attach files"
4203
  msgstr ""
4204
 
4205
- #: classes/Settings.php:2264
4206
  msgid "Min number of posts to be able to post links"
4207
  msgstr ""
4208
 
4209
- #: classes/Settings.php:2272
4210
  msgid "Do not allow attaching files with following extensions"
4211
  msgstr ""
4212
 
4213
- #: classes/Settings.php:2280
4214
  msgid "Enable File Scanner"
4215
  msgstr ""
4216
 
4217
- #: classes/Settings.php:2288
4218
  msgid "Exclude file extensions"
4219
  msgstr ""
4220
 
4221
- #: classes/Settings.php:2297 includes/hooks.php:2647
4222
  msgid "Google reCAPTCHA"
4223
  msgstr ""
4224
 
4225
- #: classes/Settings.php:2300
4226
  msgid ""
4227
  "reCAPTCHA protects you against spam and other types of automated abuse. It "
4228
  "makes secure topic and post editors when Guest Posting is allowed, also it "
@@ -4230,65 +4282,65 @@ msgid ""
4230
  "built-in reCAPTCHA version 2, \"I'm not a robot\" checkbox."
4231
  msgstr ""
4232
 
4233
- #: classes/Settings.php:2311
4234
  msgid "reCAPTCHA API Keys"
4235
  msgstr ""
4236
 
4237
- #: classes/Settings.php:2311
4238
  msgid "(version 2, \"I'm not a robot\" checkbox)"
4239
  msgstr ""
4240
 
4241
- #: classes/Settings.php:2313
4242
  msgid ""
4243
  "To start using reCAPTCHA, you need to sign up for an API key pair for your "
4244
  "site."
4245
  msgstr ""
4246
 
4247
- #: classes/Settings.php:2313
4248
  msgid "Register your site and get API keys here &raquo;"
4249
  msgstr ""
4250
 
4251
- #: classes/Settings.php:2336
4252
  msgid "reCAPTCHA Theme"
4253
  msgstr ""
4254
 
4255
- #: classes/Settings.php:2348
4256
  msgid "Guest Topic Editor"
4257
  msgstr ""
4258
 
4259
- #: classes/Settings.php:2356
4260
  msgid "Guest Post Editor"
4261
  msgstr ""
4262
 
4263
- #: classes/Settings.php:2364
4264
  msgid "wpForo Login Form"
4265
  msgstr ""
4266
 
4267
- #: classes/Settings.php:2372
4268
  msgid "wpForo Registration Form"
4269
  msgstr ""
4270
 
4271
- #: classes/Settings.php:2380
4272
  msgid "wpForo Reset Password Form"
4273
  msgstr ""
4274
 
4275
- #: classes/Settings.php:2388
4276
  msgid "WordPress Login Form"
4277
  msgstr ""
4278
 
4279
- #: classes/Settings.php:2396
4280
  msgid "WordPress Registration Form"
4281
  msgstr ""
4282
 
4283
- #: classes/Settings.php:2404
4284
  msgid "WordPress Reset Password Form"
4285
  msgstr ""
4286
 
4287
- #: classes/Settings.php:2413
4288
  msgid "Akismet Antispam Integration"
4289
  msgstr ""
4290
 
4291
- #: classes/Settings.php:2416
4292
  msgid ""
4293
  "Akismet checks your forum posts with authors form submissions against their "
4294
  "global database of spam to prevent your site from publishing malicious "
@@ -4296,21 +4348,21 @@ msgid ""
4296
  "Control more intuitive and productive."
4297
  msgstr ""
4298
 
4299
- #: classes/Settings.php:2427
4300
  msgid "Enable Akismet Integration"
4301
  msgstr ""
4302
 
4303
- #: classes/Settings.php:2429
4304
  msgid ""
4305
  "Please make sure the Akismet plugin installed and the Akismet API keys are "
4306
  "configured."
4307
  msgstr ""
4308
 
4309
- #: classes/Settings.php:2436
4310
  msgid "Forum Feed / RSS"
4311
  msgstr ""
4312
 
4313
- #: classes/Settings.php:2439
4314
  msgid ""
4315
  "RSS (Rich Site Summary; originally RDF Site Summary; often called Really "
4316
  "Simple Syndication) uses a family of standard web feed formats to publish "
@@ -4319,27 +4371,27 @@ msgid ""
4319
  "post  titles/links/excerpt publishing date and author’s name."
4320
  msgstr ""
4321
 
4322
- #: classes/Settings.php:2450 includes/phrases.php:887
4323
  msgid "Enable RSS Feed"
4324
  msgstr ""
4325
 
4326
- #: classes/Settings.php:2458
4327
  msgid "Enable General RSS Feed"
4328
  msgstr ""
4329
 
4330
- #: classes/Settings.php:2466
4331
  msgid "Enable Forum RSS Feed"
4332
  msgstr ""
4333
 
4334
- #: classes/Settings.php:2474
4335
  msgid "Enable Topic RSS Feed"
4336
  msgstr ""
4337
 
4338
- #: classes/Settings.php:2483
4339
  msgid "Social Share"
4340
  msgstr ""
4341
 
4342
- #: classes/Settings.php:2486
4343
  msgid ""
4344
  "Here you can find social network sharing options. wpForo allows sharing almost "
4345
  "all forum content (forums, topics, posts individually). The share button style "
@@ -4347,11 +4399,11 @@ msgid ""
4347
  "type, location, etc..."
4348
  msgstr ""
4349
 
4350
- #: classes/Settings.php:2496
4351
  msgid "Active Share Buttons"
4352
  msgstr ""
4353
 
4354
- #: classes/Settings.php:2498
4355
  msgid ""
4356
  "Check the checkbox share options to activate. Please note, that the Facebook "
4357
  "share button cannot be activated without Facebook API ID. Please follow to the "
@@ -4360,30 +4412,30 @@ msgid ""
4360
  "button."
4361
  msgstr ""
4362
 
4363
- #: classes/Settings.php:2504
4364
  msgid "Enable General Share Buttons"
4365
  msgstr ""
4366
 
4367
- #: classes/Settings.php:2506
4368
  msgid ""
4369
  "General share buttons are forum and topic sharing buttons. They are located on "
4370
  "the top and the bottom of each page. You can manage location of these buttons "
4371
  "using 'Share Buttons Location' options below."
4372
  msgstr ""
4373
 
4374
- #: classes/Settings.php:2512
4375
  msgid "Enable Post Sharing Toggle"
4376
  msgstr ""
4377
 
4378
- #: classes/Settings.php:2520
4379
  msgid "General Share Buttons Color"
4380
  msgstr ""
4381
 
4382
- #: classes/Settings.php:2532
4383
  msgid "General Share Buttons Type"
4384
  msgstr ""
4385
 
4386
- #: classes/Settings.php:2546
4387
  msgid ""
4388
  "Post sharing toggle allows you to share posts individually. You can see post "
4389
  "sharing toggles on the left, right side or in top bar of each post. The toggle "
@@ -4393,38 +4445,38 @@ msgid ""
4393
  "original colors on mouse hover."
4394
  msgstr ""
4395
 
4396
- #: classes/Settings.php:2552
4397
  msgid "Post Sharing Toggle View"
4398
  msgstr ""
4399
 
4400
- #: classes/Settings.php:2564
4401
  msgid "Post Sharing Toggle Icon"
4402
  msgstr ""
4403
 
4404
- #: classes/Settings.php:2576
4405
  msgid "General Share Button Locations"
4406
  msgstr ""
4407
 
4408
- #: classes/Settings.php:2578
4409
  msgid ""
4410
  "The general share buttons can be displayed on both (top and bottom) locations."
4411
  msgstr ""
4412
 
4413
- #: classes/Settings.php:2583
4414
  msgid "Post Sharing Toggle Locations"
4415
  msgstr ""
4416
 
4417
- #: classes/Settings.php:2585
4418
  msgid ""
4419
  "The post sharing toggle can be displayed either on the left side or on the top "
4420
  "of each post."
4421
  msgstr ""
4422
 
4423
- #: classes/Settings.php:2592
4424
  msgid "BuddyPress Integration"
4425
  msgstr ""
4426
 
4427
- #: classes/Settings.php:2595
4428
  msgid ""
4429
  "wpForo is well integrated with BuddyPress and with all plugins and themes "
4430
  "based on BuddyPress. The integration includes changing forum profile page URL "
@@ -4432,41 +4484,41 @@ msgid ""
4432
  "BuddyPress profile page."
4433
  msgstr ""
4434
 
4435
- #: classes/Settings.php:2606
4436
  msgid "BuddyPress Activity Integration"
4437
  msgstr ""
4438
 
4439
- #: classes/Settings.php:2608
4440
  msgid ""
4441
  "Posts members activity (new topic, new reply, post like) to BuddyPress Profile "
4442
  "Activity page."
4443
  msgstr ""
4444
 
4445
- #: classes/Settings.php:2614
4446
  msgid "BuddyPress Notification Integration"
4447
  msgstr ""
4448
 
4449
- #: classes/Settings.php:2616
4450
  msgid ""
4451
  "Creates notification on new forum reply in BuddyPress Profile Notification "
4452
  "page."
4453
  msgstr ""
4454
 
4455
- #: classes/Settings.php:2622
4456
  msgid "BuddyPress Profile Forum Tab Integration"
4457
  msgstr ""
4458
 
4459
- #: classes/Settings.php:2624
4460
  msgid ""
4461
  "Adds 'Forums' tab with 'Created Topics', 'Posted Replies', 'Liked Posts' and "
4462
  "'Subscriptions' sub-tabs to BuddyPress Profile page."
4463
  msgstr ""
4464
 
4465
- #: classes/Settings.php:2631
4466
  msgid "Ultimate Members Integration"
4467
  msgstr ""
4468
 
4469
- #: classes/Settings.php:2634
4470
  msgid ""
4471
  "wpForo is well integrated with Ultimate Members plugin. The integration "
4472
  "includes changing forum profile page URL to Ultimate Members profile page URL, "
@@ -4474,80 +4526,80 @@ msgid ""
4474
  "Ultimate Members' Real-time Notifications addon."
4475
  msgstr ""
4476
 
4477
- #: classes/Settings.php:2645
4478
  msgid "Ultimate Member Notification Integration"
4479
  msgstr ""
4480
 
4481
- #: classes/Settings.php:2647
4482
  msgid ""
4483
  "Creates notification on new forum reply in Ultimate Member Real-time "
4484
  "Notification system. This integration requires"
4485
  msgstr ""
4486
 
4487
- #: classes/Settings.php:2647
4488
  msgid "plugin."
4489
  msgstr ""
4490
 
4491
- #: classes/Settings.php:2653
4492
  msgid "Ultimate Member Profile Forum Tab Integration"
4493
  msgstr ""
4494
 
4495
- #: classes/Settings.php:2655
4496
  msgid ""
4497
  "Adds 'Forums' tab with 'Created Topics', 'Posted Replies', 'Liked Posts' and "
4498
  "'Subscriptions' sub-tabs to Ultimate Member Profile page."
4499
  msgstr ""
4500
 
4501
- #: classes/Settings.php:2662
4502
  msgid "Privacy & Forum Rules"
4503
  msgstr ""
4504
 
4505
- #: classes/Settings.php:2675
4506
  msgid "Contact Information"
4507
  msgstr ""
4508
 
4509
- #: classes/Settings.php:2677
4510
  msgid ""
4511
  "According to the GDPR, all users should have an option to contact website "
4512
  "administrator in following cases: "
4513
  msgstr ""
4514
 
4515
- #: classes/Settings.php:2677
4516
  msgid "Obtain personal data and created content"
4517
  msgstr ""
4518
 
4519
- #: classes/Settings.php:2677
4520
  msgid "Delete account with created content"
4521
  msgstr ""
4522
 
4523
- #: classes/Settings.php:2677
4524
  msgid "Report user data access and control issue"
4525
  msgstr ""
4526
 
4527
- #: classes/Settings.php:2677
4528
  msgid "Report user rights violation"
4529
  msgstr ""
4530
 
4531
- #: classes/Settings.php:2680
4532
  msgid "URL to contact forum administrator"
4533
  msgstr ""
4534
 
4535
- #: classes/Settings.php:2684
4536
  msgid "Checkbox: I Accept Website Terms and Privacy Policy"
4537
  msgstr ""
4538
 
4539
- #: classes/Settings.php:2686
4540
  msgid ""
4541
  "If this option is enabled, users must accept forum Terms and Privacy Policy by "
4542
  "checking the required checkbox on registration form to be able create a forum "
4543
  "account. The checkbox label can be managed in Forums > Phrases admin page."
4544
  msgstr ""
4545
 
4546
- #: classes/Settings.php:2692
4547
  msgid "Checkbox: I Agree to Receive an Email Confirmation"
4548
  msgstr ""
4549
 
4550
- #: classes/Settings.php:2694
4551
  msgid ""
4552
  "If this option is enabled, users must agree to receive an email confirmation "
4553
  "with a link to set a password by checking the required checkbox on "
@@ -4555,26 +4607,26 @@ msgid ""
4555
  "managed in Forums > Phrases admin page."
4556
  msgstr ""
4557
 
4558
- #: classes/Settings.php:2700
4559
  msgid "Page URL to Website Terms"
4560
  msgstr ""
4561
 
4562
- #: classes/Settings.php:2702
4563
  msgid ""
4564
  "Please insert URLs to your website Terms and Conditions. Links to these pages "
4565
  "will be included in registration form checkbox label (I'm agree with website "
4566
  "terms and privacy policy)."
4567
  msgstr ""
4568
 
4569
- #: classes/Settings.php:2705
4570
  msgid "Page URL to website terms"
4571
  msgstr ""
4572
 
4573
- #: classes/Settings.php:2709
4574
  msgid "Page URL to Website Privacy Policy"
4575
  msgstr ""
4576
 
4577
- #: classes/Settings.php:2711
4578
  msgid ""
4579
  "Please insert URLs to your website Terms and Privacy Policy pages. Links to "
4580
  "these pages will be included in registration form checkbox label (I'm agree "
@@ -4583,26 +4635,26 @@ msgid ""
4583
  "your website main Privacy Policy. Thus it should be linked to according pages."
4584
  msgstr ""
4585
 
4586
- #: classes/Settings.php:2714
4587
  msgid "Page URL to website privacy policy"
4588
  msgstr ""
4589
 
4590
- #: classes/Settings.php:2718
4591
  msgid "Checkbox: I Agree to Forum Privacy Policy"
4592
  msgstr ""
4593
 
4594
- #: classes/Settings.php:2720
4595
  msgid ""
4596
  "If this option is enabled, users must accept forum Terms and Privacy Policy by "
4597
  "checking the required checkbox on registration form to be able create a forum "
4598
  "account. The checkbox label can be managed in Forums > Phrases admin page"
4599
  msgstr ""
4600
 
4601
- #: classes/Settings.php:2729
4602
  msgid "Forum Privacy Policy with GDPR compliant Template"
4603
  msgstr ""
4604
 
4605
- #: classes/Settings.php:2731
4606
  msgid ""
4607
  "This is an example of forum Privacy Policy with GDPR compliant. It adapted to "
4608
  "wpForo plugin functions and features. <u>In case you enable this privacy "
@@ -4616,11 +4668,11 @@ msgid ""
4616
  "privacy policy page for website please add a link to that page."
4617
  msgstr ""
4618
 
4619
- #: classes/Settings.php:2736
4620
  msgid "Checkbox: I Agree to create a forum account on Facebook Login"
4621
  msgstr ""
4622
 
4623
- #: classes/Settings.php:2738
4624
  msgid ""
4625
  "If this option is enabled, the Facebook Login button becomes not-clickable "
4626
  "until user accept automatic account creation process based on his/her Facebook "
@@ -4628,18 +4680,18 @@ msgid ""
4628
  "displayed with Facebook Login button to comply with the GDPR"
4629
  msgstr ""
4630
 
4631
- #: classes/Settings.php:2738
4632
  msgid ""
4633
  "The note text and the label of this checkbox can be managed in Forums &gt; "
4634
  "Phrases admin page. Search the label phrase, click on edit button and change "
4635
  "it."
4636
  msgstr ""
4637
 
4638
- #: classes/Settings.php:2744
4639
  msgid "Forum Cookies"
4640
  msgstr ""
4641
 
4642
- #: classes/Settings.php:2746
4643
  msgid ""
4644
  "Please note, that this option is only related to wpForo cookies. This doesn't "
4645
  "disable WordPress and other plugins cookies. wpForo stores a small amount of "
@@ -4652,11 +4704,11 @@ msgid ""
4652
  "these fields when he/she posts a new reply or creates a new topic."
4653
  msgstr ""
4654
 
4655
- #: classes/Settings.php:2752
4656
  msgid "Checkbox: I Accept Forum Rules"
4657
  msgstr ""
4658
 
4659
- #: classes/Settings.php:2754
4660
  msgid ""
4661
  "If this option is enabled, users must accept forum rules by checking the "
4662
  "required checkbox on registration form to be able create a forum account. The "
@@ -4664,117 +4716,117 @@ msgid ""
4664
  "Search the label phrase, click on edit button and change it."
4665
  msgstr ""
4666
 
4667
- #: classes/Settings.php:2763
4668
  msgid "Forum Rules Text"
4669
  msgstr ""
4670
 
4671
- #: classes/Settings.php:2765
4672
  msgid "This is a basic example of forum rules provided by"
4673
  msgstr ""
4674
 
4675
- #: classes/Settings.php:2765
4676
  msgid "You should edit this text and adapt it to your community rules."
4677
  msgstr ""
4678
 
4679
- #: classes/Settings.php:3025
4680
  msgid "TB"
4681
  msgstr ""
4682
 
4683
- #: classes/Settings.php:3030
4684
  msgid "GB"
4685
  msgstr ""
4686
 
4687
- #: classes/Settings.php:3035 includes/phrases.php:352
4688
  msgid "MB"
4689
  msgstr ""
4690
 
4691
- #: classes/Settings.php:3040
4692
  msgid "KB"
4693
  msgstr ""
4694
 
4695
- #: classes/Settings.php:3045
4696
  msgid "B"
4697
  msgstr ""
4698
 
4699
- #: classes/Settings.php:3064
4700
  msgid "Min Allowed Size is "
4701
  msgstr ""
4702
 
4703
- #: classes/Settings.php:3065
4704
  msgid "Max Allowed Size is "
4705
  msgstr ""
4706
 
4707
- #: classes/Settings.php:3066 includes/phrases.php:474
4708
  msgid "Server \"upload_max_filesize\" is "
4709
  msgstr ""
4710
 
4711
- #: classes/Settings.php:3067 includes/phrases.php:473
4712
  msgid "Server \"post_max_size\" is "
4713
  msgstr ""
4714
 
4715
- #: classes/Settings.php:3073
4716
  msgid "Minute"
4717
  msgstr ""
4718
 
4719
- #: classes/Settings.php:3285 includes/hooks.php:1538 includes/phrases.php:433
4720
  msgid "Rating Level"
4721
  msgstr ""
4722
 
4723
- #: classes/Settings.php:3286
4724
  msgid "Min Number of Points"
4725
  msgstr ""
4726
 
4727
- #: classes/Settings.php:3287 includes/phrases.php:362
4728
  msgid "Member Title"
4729
  msgstr ""
4730
 
4731
- #: classes/Settings.php:3288 includes/phrases.php:479
4732
  msgid "Short Badge"
4733
  msgstr ""
4734
 
4735
- #: classes/Settings.php:3289 includes/phrases.php:314
4736
  msgid "Full Badge"
4737
  msgstr ""
4738
 
4739
- #: classes/Settings.php:3290 includes/phrases.php:431
4740
  msgid "Rating Color"
4741
  msgstr ""
4742
 
4743
- #: classes/Settings.php:3291 includes/phrases.php:432
4744
  msgid "Rating Icon"
4745
  msgstr ""
4746
 
4747
- #: classes/Settings.php:3293 includes/phrases.php:373
4748
  msgid "More"
4749
  msgstr ""
4750
 
4751
- #: classes/Settings.php:3298 includes/hooks.php:1551 includes/phrases.php:344
4752
  msgid "Level"
4753
  msgstr ""
4754
 
4755
- #: classes/Settings.php:3302 includes/phrases.php:397
4756
  msgid "Number of Posts"
4757
  msgstr ""
4758
 
4759
- #: classes/Settings.php:3308 includes/phrases.php:249
4760
  msgid "Custom Title"
4761
  msgstr ""
4762
 
4763
- #: classes/Settings.php:3329 includes/phrases.php:234
4764
  msgid "Badge Icon"
4765
  msgstr ""
4766
 
4767
- #: classes/Settings.php:3782 includes/installation.php:542
4768
- #: includes/installation.php:1472 includes/options-migration.php:19
4769
  #: includes/options-migration.php:98 includes/phrases.php:287
4770
  msgid "Forum"
4771
  msgstr ""
4772
 
4773
- #: classes/Settings.php:3788 includes/options-migration.php:111
4774
  msgid "Forum Post Report"
4775
  msgstr ""
4776
 
4777
- #: classes/Settings.php:3789 includes/options-migration.php:112
4778
  msgid ""
4779
  "<strong>Report details:</strong>\n"
4780
  " Reporter: [reporter], <br>\n"
@@ -4783,11 +4835,11 @@ msgid ""
4783
  " [post_url]"
4784
  msgstr ""
4785
 
4786
- #: classes/Settings.php:3791 includes/options-migration.php:114
4787
  msgid "[blogname] New User Registration"
4788
  msgstr ""
4789
 
4790
- #: classes/Settings.php:3792 includes/options-migration.php:115
4791
  msgid ""
4792
  "New user registration on your site [blogname]:\n"
4793
  "\n"
@@ -4796,11 +4848,11 @@ msgid ""
4796
  "Email: [user_email]\n"
4797
  msgstr ""
4798
 
4799
- #: classes/Settings.php:3794 includes/options-migration.php:117
4800
  msgid "[blogname] Your username and password info"
4801
  msgstr ""
4802
 
4803
- #: classes/Settings.php:3795 includes/options-migration.php:118
4804
  msgid ""
4805
  "Username: [user_login]\n"
4806
  "\n"
@@ -4810,7 +4862,7 @@ msgid ""
4810
  "\n"
4811
  msgstr ""
4812
 
4813
- #: classes/Settings.php:3797 includes/options-migration.php:120
4814
  msgid ""
4815
  "Hello! \n"
4816
  "\n"
@@ -4827,11 +4879,21 @@ msgid ""
4827
  " Thanks!"
4828
  msgstr ""
4829
 
4830
- #: classes/Settings.php:3805 includes/options-migration.php:103
 
 
 
 
 
 
 
 
 
 
4831
  msgid "Please confirm subscription to [entry_title]"
4832
  msgstr ""
4833
 
4834
- #: classes/Settings.php:3806
4835
  msgid ""
4836
  "Hello [user_display_name]!<br>\n"
4837
  " Thank you for subscribing.<br>\n"
@@ -4842,11 +4904,11 @@ msgid ""
4842
  " [confirm_link]"
4843
  msgstr ""
4844
 
4845
- #: classes/Settings.php:3807 includes/options-migration.php:105
4846
  msgid "New Topic"
4847
  msgstr ""
4848
 
4849
- #: classes/Settings.php:3808
4850
  msgid ""
4851
  "Hello [user_display_name]!<br>\n"
4852
  " New topic has been created on your subscribed forum - [forum_link].\n"
@@ -4860,12 +4922,12 @@ msgid ""
4860
  " [unsubscribe_link]"
4861
  msgstr ""
4862
 
4863
- #: classes/Settings.php:3809 includes/options-migration.php:107
4864
  #: includes/phrases.php:1071
4865
  msgid "New Reply"
4866
  msgstr ""
4867
 
4868
- #: classes/Settings.php:3810
4869
  msgid ""
4870
  "Hello [user_display_name]!<br>\n"
4871
  " New reply has been posted on your subscribed topic - [topic_link].\n"
@@ -4879,11 +4941,11 @@ msgid ""
4879
  " [unsubscribe_link]"
4880
  msgstr ""
4881
 
4882
- #: classes/Settings.php:3811 includes/options-migration.php:122
4883
  msgid "You have been mentioned in forum post"
4884
  msgstr ""
4885
 
4886
- #: classes/Settings.php:3812
4887
  msgid ""
4888
  "Hi [user_display_name]! <br>\n"
4889
  "\n"
@@ -4893,11 +4955,11 @@ msgid ""
4893
  " [post_link]"
4894
  msgstr ""
4895
 
4896
- #: classes/Settings.php:3813
4897
  msgid "New Post from [owner_display_name]"
4898
  msgstr ""
4899
 
4900
- #: classes/Settings.php:3814
4901
  msgid ""
4902
  "Hello [user_display_name]!<br>\n"
4903
  " New content has been posted by [owner_display_name] you are following.\n"
@@ -4911,23 +4973,23 @@ msgid ""
4911
  " [unsubscribe_link]"
4912
  msgstr ""
4913
 
4914
- #: classes/Template.php:850
4915
  msgid "Insert link"
4916
  msgstr ""
4917
 
4918
- #: classes/Template.php:851
4919
  msgid "Link Text"
4920
  msgstr ""
4921
 
4922
- #: classes/Template.php:852
4923
  msgid "Open link in a new tab"
4924
  msgstr ""
4925
 
4926
- #: classes/Template.php:853
4927
  msgid "Insert Spoiler"
4928
  msgstr ""
4929
 
4930
- #: classes/Template.php:854 includes/phrases.php:1214
4931
  msgid "Spoiler"
4932
  msgstr ""
4933
 
@@ -5031,7 +5093,7 @@ msgstr ""
5031
  msgid "wpForo Menu"
5032
  msgstr ""
5033
 
5034
- #: includes/functions-template.php:2232
5035
  msgid "No Title"
5036
  msgstr ""
5037
 
@@ -5182,7 +5244,7 @@ msgstr ""
5182
  msgid "Apply"
5183
  msgstr ""
5184
 
5185
- #: includes/functions.php:1258
5186
  #, php-format
5187
  msgid "Could not write file %s"
5188
  msgstr ""
@@ -5201,66 +5263,66 @@ msgstr ""
5201
  msgid "Uninstall"
5202
  msgstr ""
5203
 
5204
- #: includes/hooks.php:1263
5205
  msgid "Clear"
5206
  msgstr ""
5207
 
5208
- #: includes/hooks.php:1265
5209
  msgid "Select Color"
5210
  msgstr ""
5211
 
5212
- #: includes/hooks.php:1271 includes/phrases.php:183
5213
  msgid "Move"
5214
  msgstr ""
5215
 
5216
- #: includes/hooks.php:1289
5217
  msgid "Please choose one reasons before sending a feedback!"
5218
  msgstr ""
5219
 
5220
- #: includes/hooks.php:1291
5221
  msgid ""
5222
  "With the email address, please check the \"I agree to receive email\" checkbox "
5223
  "to proceed."
5224
  msgstr ""
5225
 
5226
- #: includes/hooks.php:1292
5227
  msgid "Please fill your email address for feedback"
5228
  msgstr ""
5229
 
5230
- #: includes/hooks.php:1293
5231
  msgid "Your email address is not valid"
5232
  msgstr ""
5233
 
5234
- #: includes/hooks.php:1358
5235
  msgid ""
5236
  "IMPORTANT: wpForo can't work with default permalink, please change permalink "
5237
  "structure"
5238
  msgstr ""
5239
 
5240
- #: includes/hooks.php:1443
5241
  msgid "Forum Profile Fields - wpForo"
5242
  msgstr ""
5243
 
5244
- #: includes/hooks.php:1452
5245
  msgid "Forum - Usergroup"
5246
  msgstr ""
5247
 
5248
- #: includes/hooks.php:1457
5249
  #, php-format
5250
  msgid ""
5251
  "Forum Usergroups are synched with User Roles based on the %s. When you change "
5252
  "this user Role the Usergroup is automatically changed according to that table."
5253
  msgstr ""
5254
 
5255
- #: includes/hooks.php:1464
5256
  msgid "Synced with user role"
5257
  msgstr ""
5258
 
5259
- #: includes/hooks.php:1469
5260
  msgid "Role-Usergroup Synchronization is Turned ON!"
5261
  msgstr ""
5262
 
5263
- #: includes/hooks.php:1472
5264
  msgid ""
5265
  "This user Usergroup is automatically changed according to current Role. If you "
5266
  "want to disable Role-Usergroup synchronization and manage Usergroups and User "
@@ -5268,19 +5330,19 @@ msgid ""
5268
  "admin page and disable \"Role-Usergroup Synchronization\" option."
5269
  msgstr ""
5270
 
5271
- #: includes/hooks.php:1486
5272
  msgid "Forum - Secondary Usergroups"
5273
  msgstr ""
5274
 
5275
- #: includes/hooks.php:1510
5276
  msgid "Forum - User Timezone"
5277
  msgstr ""
5278
 
5279
- #: includes/hooks.php:1521
5280
  msgid "User Reputation"
5281
  msgstr ""
5282
 
5283
- #: includes/hooks.php:1523
5284
  msgid ""
5285
  "By default all members get rating badges and titles based on number of posts. "
5286
  "However, using this option you can grant lower or higher rating to certain "
@@ -5288,49 +5350,49 @@ msgid ""
5288
  "be managed in Forums > Settings > Members Tab."
5289
  msgstr ""
5290
 
5291
- #: includes/hooks.php:1528
5292
  msgid "Default Rating"
5293
  msgstr ""
5294
 
5295
- #: includes/hooks.php:1531
5296
  msgid "Custom Rating"
5297
  msgstr ""
5298
 
5299
- #: includes/hooks.php:1539 includes/phrases.php:865
5300
  msgid "Rating Title"
5301
  msgstr ""
5302
 
5303
- #: includes/hooks.php:1540 includes/phrases.php:430
5304
  msgid "Rating Badge"
5305
  msgstr ""
5306
 
5307
- #: includes/hooks.php:2157 includes/hooks.php:2205 includes/hooks.php:2341
5308
- #: includes/hooks.php:2409
5309
  msgid "Add New Forum"
5310
  msgstr ""
5311
 
5312
- #: includes/hooks.php:2164 includes/hooks.php:2348
5313
  msgid "Add New User Group"
5314
  msgstr ""
5315
 
5316
- #: includes/hooks.php:2171 includes/hooks.php:2289 includes/hooks.php:2355
5317
- #: includes/hooks.php:2452
5318
  msgid "Add New Phrase"
5319
  msgstr ""
5320
 
5321
- #: includes/hooks.php:2180 includes/hooks.php:2392
5322
  msgid "Visit Forum"
5323
  msgstr ""
5324
 
5325
- #: includes/hooks.php:2273 includes/hooks.php:2505
5326
  msgid "Add New Usergroup"
5327
  msgstr ""
5328
 
5329
- #: includes/hooks.php:2473
5330
  msgid "Add New Board"
5331
  msgstr ""
5332
 
5333
- #: includes/hooks.php:2646 includes/phrases.php:1086
5334
  #, php-format
5335
  msgid ""
5336
  "IMPORTANT! The forum registration form is probably under risk of spam attacks. "
@@ -5340,98 +5402,98 @@ msgid ""
5340
  "dismiss this message."
5341
  msgstr ""
5342
 
5343
- #: includes/hooks.php:2676
5344
  msgid "wpForo Polls addon is disabled!"
5345
  msgstr ""
5346
 
5347
- #: includes/hooks.php:2676
5348
  msgid ""
5349
  " Your addon version is not compatible with the current version of wpForo. "
5350
  "Please update the addon or downgrade wpForo to 1.7.7"
5351
  msgstr ""
5352
 
5353
- #: includes/hooks.php:2677
5354
  msgid "dismiss"
5355
  msgstr ""
5356
 
5357
- #: includes/installation.php:437
5358
  msgid "Start Profile Synchronization"
5359
  msgstr ""
5360
 
5361
- #: includes/installation.php:437
5362
  msgid "Continue Synchronization"
5363
  msgstr ""
5364
 
5365
- #: includes/installation.php:440
5366
  msgid ""
5367
  "This process may take a few seconds or dozens of minutes, please be patient "
5368
  "and don't close this page."
5369
  msgstr ""
5370
 
5371
- #: includes/installation.php:441
5372
  msgid "You can permanently disable this message using this documentation"
5373
  msgstr ""
5374
 
5375
- #: includes/installation.php:443
5376
  msgid "wpForo Forum Installation | "
5377
  msgstr ""
5378
 
5379
- #: includes/installation.php:444
5380
  msgid ""
5381
  "Forum users' profile data are not synchronized yet, this step is required! "
5382
  "Please click the button below to complete installation."
5383
  msgstr ""
5384
 
5385
- #: includes/installation.php:452
5386
  msgid "wpForo Database Update Problem - Action Required!"
5387
  msgstr ""
5388
 
5389
- #: includes/installation.php:453
5390
  msgid ""
5391
  "Forum database is not updated properly. Please click the button below for "
5392
  "further instruction."
5393
  msgstr ""
5394
 
5395
- #: includes/installation.php:464
5396
  msgid "Exclude forum page(s) from"
5397
  msgstr ""
5398
 
5399
- #: includes/installation.php:464
5400
  msgid "plugin"
5401
  msgstr ""
5402
 
5403
- #: includes/installation.php:468
5404
  #, php-format
5405
  msgid ""
5406
  "If you have already excluded the forum page from your cache plugin please "
5407
  "ignore and close this message using the top %s (x) button."
5408
  msgstr ""
5409
 
5410
- #: includes/installation.php:468
5411
  msgid "left"
5412
  msgstr ""
5413
 
5414
- #: includes/installation.php:468
5415
  msgid "right"
5416
  msgstr ""
5417
 
5418
- #: includes/installation.php:469
5419
  msgid "Please find more information here: "
5420
  msgstr ""
5421
 
5422
- #: includes/installation.php:470
5423
  msgid " and "
5424
  msgstr ""
5425
 
5426
- #: includes/installation.php:470
5427
  msgid "conflict"
5428
  msgstr ""
5429
 
5430
- #: includes/installation.php:470
5431
  msgid "Action Required!"
5432
  msgstr ""
5433
 
5434
- #: includes/installation.php:471
5435
  msgid ""
5436
  "Please exclude the forum page from your cache plugin! wpForo has a built-in "
5437
  "cache system. It does dynamic cache of all forum pages, which will be affected "
@@ -5439,24 +5501,24 @@ msgid ""
5439
  "The user login and logout actions will also be corrupted."
5440
  msgstr ""
5441
 
5442
- #: includes/installation.php:543 includes/installation.php:1473
5443
  #: includes/options-migration.php:20
5444
  msgid "Discussion Board"
5445
  msgstr ""
5446
 
5447
- #: includes/installation.php:1171
5448
  msgid "Main Category"
5449
  msgstr ""
5450
 
5451
- #: includes/installation.php:1171
5452
  msgid "This is a simple category / section"
5453
  msgstr ""
5454
 
5455
- #: includes/installation.php:1172
5456
  msgid "Main Forum"
5457
  msgstr ""
5458
 
5459
- #: includes/installation.php:1172
5460
  msgid "This is a simple parent forum"
5461
  msgstr ""
5462
 
@@ -6442,11 +6504,11 @@ msgstr ""
6442
  msgid "Dismiss this notice."
6443
  msgstr ""
6444
 
6445
- #: includes/phrases.php:256 widgets/OnlineMembers.php:85
6446
  msgid "Display Avatars"
6447
  msgstr ""
6448
 
6449
- #: includes/phrases.php:258 widgets/RecentPosts.php:285
6450
  msgid "Display with Avatars"
6451
  msgstr ""
6452
 
@@ -6753,7 +6815,7 @@ msgstr ""
6753
  msgid "My Profile"
6754
  msgstr ""
6755
 
6756
- #: includes/phrases.php:377 wpforo.php:306
6757
  msgid ""
6758
  "NOTE: If you're going to add widgets in this sidebar, please use 'Full Width' "
6759
  "template for wpForo index page to avoid sidebar duplication."
@@ -6787,8 +6849,8 @@ msgstr ""
6787
  msgid "No topics were found here"
6788
  msgstr ""
6789
 
6790
- #: includes/phrases.php:396 widgets/OnlineMembers.php:74
6791
- #: widgets/RecentPosts.php:276 widgets/RecentTopics.php:171 widgets/Tags.php:63
6792
  msgid "Number of Items"
6793
  msgstr ""
6794
 
@@ -7408,7 +7470,7 @@ msgstr ""
7408
  msgid "wpForo Navigation"
7409
  msgstr ""
7410
 
7411
- #: includes/phrases.php:596 wpforo.php:305
7412
  msgid "wpForo Sidebar"
7413
  msgstr ""
7414
 
@@ -9254,10 +9316,6 @@ msgstr ""
9254
  msgid "Role-Usergroup synchronization is complete!"
9255
  msgstr ""
9256
 
9257
- #: includes/phrases.php:1204
9258
- msgid "Secondary Groups"
9259
- msgstr ""
9260
-
9261
  #: includes/phrases.php:1205
9262
  msgid "Secondary Usergroup"
9263
  msgstr ""
@@ -9418,29 +9476,29 @@ msgstr ""
9418
  msgid "Search Forums..."
9419
  msgstr ""
9420
 
9421
- #: integrations/UltimateMember.php:50 integrations/UltimateMember.php:433
9422
  msgid "User leaves a reply to wpForo topic"
9423
  msgstr ""
9424
 
9425
- #: integrations/UltimateMember.php:52 integrations/UltimateMember.php:435
9426
  msgid "When a member replies to one of my forum topics"
9427
  msgstr ""
9428
 
9429
- #: integrations/UltimateMember.php:55 integrations/UltimateMember.php:438
9430
  msgid "User replied to wpForo post"
9431
  msgstr ""
9432
 
9433
- #: integrations/UltimateMember.php:57 integrations/UltimateMember.php:440
9434
  msgid "When a member replies to one of my post in forum topics"
9435
  msgstr ""
9436
 
9437
- #: integrations/UltimateMember.php:434
9438
  msgid ""
9439
  "<strong>{member}</strong> has <strong>replied</strong> to a topic you started "
9440
  "on the forum."
9441
  msgstr ""
9442
 
9443
- #: integrations/UltimateMember.php:439
9444
  msgid ""
9445
  "<strong>{member}</strong> has <strong>replied</strong> to your post on the "
9446
  "forum."
@@ -9463,14 +9521,33 @@ msgid ""
9463
  "Forums &raquo; Moderation admin page."
9464
  msgstr ""
9465
 
9466
- #: widgets/Forums.php:71
9467
  msgid "Display as dropdown"
9468
  msgstr ""
9469
 
9470
- #: widgets/OnlineMembers.php:66
 
 
 
 
9471
  msgid "User Groups"
9472
  msgstr ""
9473
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
9474
  #: widgets/Profile.php:130
9475
  msgid "Title for Users"
9476
  msgstr ""
@@ -9503,67 +9580,75 @@ msgstr ""
9503
  msgid "Hide this widget for guests"
9504
  msgstr ""
9505
 
9506
- #: widgets/RecentPosts.php:32 widgets/RecentTopics.php:30
9507
  msgid "Created Date"
9508
  msgstr ""
9509
 
9510
- #: widgets/RecentPosts.php:33 widgets/RecentTopics.php:31
9511
  msgid "Modified Date"
9512
  msgstr ""
9513
 
9514
- #: widgets/RecentPosts.php:36 widgets/RecentTopics.php:36
9515
  msgid "DESC"
9516
  msgstr ""
9517
 
9518
- #: widgets/RecentPosts.php:37 widgets/RecentTopics.php:37
9519
  msgid "ASC"
9520
  msgstr ""
9521
 
9522
- #: widgets/RecentPosts.php:236 widgets/RecentTopics.php:136
9523
  msgid "Filter by forums"
9524
  msgstr ""
9525
 
9526
- #: widgets/RecentPosts.php:243 widgets/RecentTopics.php:148
9527
  msgid "Autofilter by current forum"
9528
  msgstr ""
9529
 
9530
- #: widgets/RecentPosts.php:250 widgets/RecentTopics.php:155
9531
  msgid "Order by"
9532
  msgstr ""
9533
 
9534
- #: widgets/RecentPosts.php:268
9535
  msgid "Limit Per Topic"
9536
  msgstr ""
9537
 
9538
- #: widgets/RecentPosts.php:273
9539
  msgid "set 0 to remove this limit"
9540
  msgstr ""
9541
 
9542
- #: widgets/RecentPosts.php:292
 
 
 
 
 
 
 
 
9543
  msgid "Display Only Unread Posts"
9544
  msgstr ""
9545
 
9546
- #: widgets/RecentPosts.php:299
9547
  msgid "Display [new] indicator"
9548
  msgstr ""
9549
 
9550
- #: widgets/RecentTopics.php:32
9551
  msgid "Posts Count"
9552
  msgstr ""
9553
 
9554
- #: widgets/RecentTopics.php:33
9555
  msgid "Views Count"
9556
  msgstr ""
9557
 
9558
- #: widgets/RecentTopics.php:178
9559
- msgid "Display with avatars"
9560
  msgstr ""
9561
 
9562
- #: widgets/RecentTopics.php:184
9563
- msgid "Refer topics to first unread post"
9564
  msgstr ""
9565
 
9566
- #: widgets/Tags.php:54
9567
  msgid "Topic Counts"
9568
  msgstr ""
9569
 
4
  msgid ""
5
  msgstr ""
6
  "Project-Id-Version: Forum - wpForo\n"
7
+ "POT-Creation-Date: 2022-11-09 00:21+0400\n"
8
  "PO-Revision-Date: 2016-06-28 21:09+0400\n"
9
  "Last-Translator: \n"
10
  "Language-Team: \n"
123
  msgid "Other"
124
  msgstr ""
125
 
126
+ #: admin/includes/deactivation-dialog.php:142 includes/hooks.php:1299
127
  msgid "Please provide more information"
128
  msgstr ""
129
 
148
  msgstr ""
149
 
150
  #: admin/index.php:54 admin/index.php:201 admin/pages/dashboard.php:25
151
+ #: admin/tools-tabs/misc.php:67 includes/hooks.php:2233 includes/hooks.php:2437
152
  #: includes/phrases.php:309 integrations/BuddyPress.php:12
153
  #: integrations/BuddyPress.php:44 integrations/BuddyPress.php:117
154
+ #: widgets/Forums.php:23
155
  msgid "Forums"
156
  msgstr ""
157
 
158
  #: admin/index.php:59 admin/index.php:151 admin/index.php:206
159
+ #: admin/pages/settings.php:163 includes/hooks.php:2249 includes/hooks.php:2453
160
+ #: includes/hooks.php:2558
161
  msgid "Settings"
162
  msgstr ""
163
 
164
+ #: admin/index.php:64 admin/index.php:211 includes/hooks.php:2267
165
+ #: includes/hooks.php:2471
166
  msgid "Moderation"
167
  msgstr ""
168
 
169
+ #: admin/index.php:69 admin/index.php:216 includes/hooks.php:2317
170
+ #: includes/hooks.php:2480 includes/phrases.php:791
171
  msgid "Phrases"
172
  msgstr ""
173
 
174
+ #: admin/index.php:74 admin/index.php:221 includes/hooks.php:2258
175
+ #: includes/hooks.php:2462 includes/phrases.php:916
176
  msgid "Tools"
177
  msgstr ""
178
 
179
  #: admin/index.php:82 admin/index.php:136 admin/pages/board.php:16
180
+ #: includes/hooks.php:10 includes/hooks.php:2501
181
  msgid "Boards"
182
  msgstr ""
183
 
184
+ #: admin/index.php:86 admin/index.php:140 includes/hooks.php:2276
185
+ #: includes/hooks.php:2517
186
  msgid "Accesses"
187
  msgstr ""
188
 
189
  #: admin/index.php:90 admin/index.php:144 admin/pages/usergroup.php:12
190
+ #: admin/pages/usergroup.php:160 includes/hooks.php:2301 includes/hooks.php:2533
191
  msgid "Usergroups"
192
  msgstr ""
193
 
194
  #: admin/index.php:93 admin/index.php:147 admin/pages/dashboard.php:37
195
  #: admin/pages/member.php:10 admin/pages/usergroup.php:37
196
+ #: admin/tools-tabs/misc.php:87 includes/hooks.php:2292 includes/hooks.php:2549
197
  #: includes/phrases.php:364
198
  msgid "Members"
199
  msgstr ""
200
 
201
+ #: admin/index.php:97 admin/index.php:156 includes/hooks.php:2333
202
+ #: includes/hooks.php:2567 includes/phrases.php:792
203
  msgid "Themes"
204
  msgstr ""
205
 
206
  #: admin/index.php:102 admin/index.php:161 admin/pages/board.php:116
207
+ #: admin/pages/settings.php:22 includes/hooks.php:2342 includes/hooks.php:2576
208
  #: includes/phrases.php:211
209
  msgid "Addons"
210
  msgstr ""
243
  msgstr ""
244
 
245
  #: admin/listtables/Boards.php:86 admin/listtables/Moderations.php:94
246
+ #: admin/pages/forum.php:273 admin/pages/usergroup.php:78 classes/Forums.php:854
247
  #: includes/phrases.php:541
248
  msgid "View"
249
  msgstr ""
256
  msgid "Are you sure you want to DELETE this board and his data permanently?"
257
  msgstr ""
258
 
259
+ #: admin/listtables/Boards.php:88 admin/listtables/Members.php:106
260
+ #: admin/listtables/Members.php:263 admin/listtables/Moderations.php:103
261
  #: admin/listtables/Moderations.php:208 admin/pages/forum.php:272
262
  #: admin/pages/themes.php:68 admin/pages/usergroup.php:76
263
  #: admin/pages/usergroup.php:295 admin/settings/antispam.php:64
264
+ #: includes/hooks.php:1281 includes/phrases.php:252
265
  msgid "Delete"
266
  msgstr ""
267
 
298
  msgid "default"
299
  msgstr ""
300
 
301
+ #: admin/listtables/Members.php:100
302
  msgid "Edit User"
303
  msgstr ""
304
 
305
+ #: admin/listtables/Members.php:101
306
  msgid "Edit Profile"
307
  msgstr ""
308
 
309
+ #: admin/listtables/Members.php:102 admin/listtables/Members.php:261
310
  msgid "Ban"
311
  msgstr ""
312
 
313
+ #: admin/listtables/Members.php:102
314
  msgid "Are you sure, you want to BAN this user?"
315
  msgstr ""
316
 
317
+ #: admin/listtables/Members.php:103 admin/listtables/Members.php:262
318
  msgid "Unban"
319
  msgstr ""
320
 
321
+ #: admin/listtables/Members.php:103
322
  msgid "Are you sure, you want to UNBAN this user?"
323
  msgstr ""
324
 
325
+ #: admin/listtables/Members.php:104 admin/listtables/Members.php:259
326
  #: admin/pages/themes.php:67 includes/phrases.php:203
327
  msgid "Activate"
328
  msgstr ""
329
 
330
+ #: admin/listtables/Members.php:104
331
  msgid "Are you sure, you want to activate this user?"
332
  msgstr ""
333
 
334
+ #: admin/listtables/Members.php:105 admin/listtables/Members.php:260
335
  msgid "Deactivate"
336
  msgstr ""
337
 
338
+ #: admin/listtables/Members.php:105
339
  msgid "Are you sure, you want to deactivate this user?"
340
  msgstr ""
341
 
342
+ #: admin/listtables/Members.php:176 admin/listtables/Moderations.php:151
343
  #: admin/listtables/Phrases.php:133 admin/pages/usergroup.php:41
344
+ #: classes/Settings.php:203
345
  msgid "ID"
346
  msgstr ""
347
 
348
+ #: admin/listtables/Members.php:177 includes/phrases.php:257
349
  msgid "Display Name"
350
  msgstr ""
351
 
352
+ #: admin/listtables/Members.php:178 includes/phrases.php:347
353
  msgid "Login"
354
  msgstr ""
355
 
356
+ #: admin/listtables/Members.php:179 includes/phrases.php:261
357
  msgid "Email"
358
  msgstr ""
359
 
360
+ #: admin/listtables/Members.php:180 includes/phrases.php:317
361
  msgid "Group"
362
  msgstr ""
363
 
364
+ #: admin/listtables/Members.php:181 includes/phrases.php:1204
365
+ msgid "Secondary Groups"
366
+ msgstr ""
367
+
368
+ #: admin/listtables/Members.php:182 admin/pages/board.php:173
369
  #: admin/pages/usergroup.php:162 includes/phrases.php:17
370
  msgid "Status"
371
  msgstr ""
372
 
373
+ #: admin/listtables/Members.php:183
374
  msgid "Last Login"
375
  msgstr ""
376
 
377
+ #: admin/listtables/Members.php:184 includes/phrases.php:831
378
  msgid "Forum Posts"
379
  msgstr ""
380
 
381
+ #: admin/listtables/Members.php:185 includes/phrases.php:832
382
  msgid "Blog Posts"
383
  msgstr ""
384
 
385
+ #: admin/listtables/Members.php:186 includes/phrases.php:833
386
  msgid "Blog Comments"
387
  msgstr ""
388
 
389
+ #: admin/listtables/Members.php:289
390
  msgid "Change usergroup to…"
391
  msgstr ""
392
 
393
+ #: admin/listtables/Members.php:292 admin/pages/phrase.php:176
394
  msgid "Change"
395
  msgstr ""
396
 
397
+ #: admin/listtables/Members.php:403 includes/phrases.php:536
398
  msgid "filter by group"
399
  msgstr ""
400
 
401
+ #: admin/listtables/Members.php:425
402
  msgid "filter by status"
403
  msgstr ""
404
 
422
  msgid "Are you sure you want to DELETE this item?"
423
  msgstr ""
424
 
425
+ #: admin/listtables/Moderations.php:152 classes/Settings.php:204
426
+ #: includes/phrases.php:520 widgets/Forums.php:85 widgets/OnlineMembers.php:87
427
+ #: widgets/RecentPosts.php:231 widgets/RecentTopics.php:152 widgets/Search.php:63
428
+ #: widgets/Tags.php:78
429
  msgid "Title"
430
  msgstr ""
431
 
498
  #: admin/pages/forum.php:238 admin/pages/forum.php:285 admin/pages/forum.php:325
499
  #: admin/pages/forum.php:401 admin/pages/forum.php:409 admin/pages/phrase.php:167
500
  #: admin/pages/usergroup.php:30 admin/pages/usergroup.php:36
501
+ #: admin/pages/usergroup.php:342 admin/settings/board.php:16
502
  #: admin/settings/general.php:24 admin/settings/styles.php:12
503
+ #: classes/Settings.php:2877
504
  msgid "Read the documentation"
505
  msgstr ""
506
 
507
+ #: admin/pages/accesses.php:29 includes/hooks.php:2283 includes/hooks.php:2524
508
  #: includes/phrases.php:207
509
  msgid "Add New Forum Access"
510
  msgstr ""
531
  msgid "Admin"
532
  msgstr ""
533
 
534
+ #: admin/pages/accesses.php:68 classes/Forums.php:842 includes/phrases.php:567
535
  msgid "edit"
536
  msgstr ""
537
 
541
  "this access will lost all forum permissions."
542
  msgstr ""
543
 
544
+ #: admin/pages/accesses.php:75 classes/Forums.php:848 includes/phrases.php:566
545
  msgid "delete"
546
  msgstr ""
547
 
703
  msgid "one URL per line"
704
  msgstr ""
705
 
706
+ #: admin/pages/dashboard.php:7 includes/hooks.php:2225
707
  msgid "Forum Dashboard"
708
  msgstr ""
709
 
711
  msgid "Board Statistic"
712
  msgstr ""
713
 
714
+ #: admin/pages/dashboard.php:29 classes/Forums.php:834 includes/phrases.php:524
715
  msgid "Topics"
716
  msgstr ""
717
 
718
+ #: admin/pages/dashboard.php:33 classes/Forums.php:834 includes/phrases.php:418
719
  msgid "Posts"
720
  msgstr ""
721
 
1020
  msgstr ""
1021
 
1022
  #: admin/pages/member.php:17 admin/pages/moderation.php:18
1023
+ #: admin/pages/phrase.php:142 classes/Settings.php:1109
1024
  msgid "Filter"
1025
  msgstr ""
1026
 
1298
  msgid "Usergroup"
1299
  msgstr ""
1300
 
1301
+ #: admin/pages/usergroup.php:38 classes/Settings.php:1137 includes/hooks.php:1272
1302
  msgid "Default"
1303
  msgstr ""
1304
 
1310
  #: admin/settings/styles.php:64 admin/settings/styles.php:72
1311
  #: admin/settings/styles.php:77 admin/settings/styles.php:83
1312
  #: admin/settings/styles.php:93 admin/settings/styles.php:98
1313
+ #: admin/settings/styles.php:104 classes/Settings.php:3362
1314
  #: includes/phrases.php:242
1315
  msgid "Color"
1316
  msgstr ""
1581
  msgid "Facebook API"
1582
  msgstr ""
1583
 
1584
+ #: admin/settings/board.php:14 admin/settings/general.php:22
1585
  msgid "Permalinks"
1586
  msgstr ""
1587
 
1613
  msgid "This message comes from Reset Password form."
1614
  msgstr ""
1615
 
1616
+ #: admin/settings/email.php:55
1617
+ msgid "After User Approve Email"
1618
+ msgstr ""
1619
+
1620
+ #: admin/settings/email.php:56
1621
+ msgid "This message comes when moderators has been manually approved a user"
1622
+ msgstr ""
1623
+
1624
  #: admin/settings/forums.php:8 admin/settings/topics.php:8
1625
  msgid "Extended Forum Layout"
1626
  msgstr ""
1688
  msgid "Post Content"
1689
  msgstr ""
1690
 
1691
+ #: admin/settings/rating.php:12 classes/Settings.php:1308
1692
+ #: classes/Settings.php:1368 includes/phrases.php:361
1693
  msgid "Member Reputation and Titles"
1694
  msgstr ""
1695
 
1720
  msgid "General Share Buttons"
1721
  msgstr ""
1722
 
1723
+ #: admin/settings/social.php:113 classes/Settings.php:2584
1724
  msgid "Post Sharing Toggle"
1725
  msgstr ""
1726
 
1884
  msgstr ""
1885
 
1886
  #: admin/settings/topics.php:68 admin/tools-tabs/cleanup.php:40
1887
+ #: classes/Settings.php:2831 includes/phrases.php:552 widgets/Forums.php:99
1888
+ #: widgets/OnlineMembers.php:103 widgets/RecentPosts.php:245
1889
+ #: widgets/RecentPosts.php:261 widgets/RecentPosts.php:307
1890
+ #: widgets/RecentPosts.php:315 widgets/RecentPosts.php:323
1891
+ #: widgets/RecentPosts.php:332 widgets/RecentTopics.php:166
1892
+ #: widgets/RecentTopics.php:182 widgets/RecentTopics.php:211
1893
+ #: widgets/RecentTopics.php:220 widgets/Tags.php:90
1894
  msgid "Yes"
1895
  msgstr ""
1896
 
1897
  #: admin/settings/topics.php:69 admin/tools-tabs/cleanup.php:41
1898
+ #: classes/Settings.php:2832 includes/phrases.php:382 widgets/Forums.php:102
1899
+ #: widgets/OnlineMembers.php:106 widgets/RecentPosts.php:248
1900
+ #: widgets/RecentPosts.php:264 widgets/RecentPosts.php:310
1901
+ #: widgets/RecentPosts.php:318 widgets/RecentPosts.php:326
1902
+ #: widgets/RecentPosts.php:335 widgets/RecentTopics.php:169
1903
+ #: widgets/RecentTopics.php:185 widgets/RecentTopics.php:214
1904
+ #: widgets/RecentTopics.php:223 widgets/Tags.php:93
1905
  msgid "No"
1906
  msgstr ""
1907
 
2251
  msgid "User registration is disabled"
2252
  msgstr ""
2253
 
2254
+ #: classes/Actions.php:2130 classes/Template.php:2361 includes/phrases.php:513
2255
  msgid "Theme file not readable"
2256
  msgstr ""
2257
 
2258
+ #: classes/Actions.php:2136
2259
  msgid "Theme Successfully Activated"
2260
  msgstr ""
2261
 
2262
+ #: classes/Actions.php:2157
2263
  msgid "Theme delete error"
2264
  msgstr ""
2265
 
2266
+ #: classes/Actions.php:2164
2267
  msgid "Theme delete success"
2268
  msgstr ""
2269
 
2270
+ #: classes/Cache.php:447
2271
  msgid "Please navigate in Dashboard to Settings > WP Super Cache"
2272
  msgstr ""
2273
 
2274
+ #: classes/Cache.php:448
2275
  msgid "Go to Advanced Tab, scroll down to \"Rejected URL Strings\" option"
2276
  msgstr ""
2277
 
2278
+ #: classes/Cache.php:449 classes/Cache.php:457
2279
  msgid ""
2280
  "Insert the URL path(s) of your forum page(s) one per line in the option "
2281
  "textarea:"
2282
  msgstr ""
2283
 
2284
+ #: classes/Cache.php:450 classes/Cache.php:458 classes/Cache.php:466
2285
+ #: classes/Cache.php:483 classes/Cache.php:491 classes/Cache.php:499
2286
  msgid "Save it and delete all caches."
2287
  msgstr ""
2288
 
2289
+ #: classes/Cache.php:455
2290
  msgid "Please navigate in Dashboard to LiteSpeed Cache > Cache admin page"
2291
  msgstr ""
2292
 
2293
+ #: classes/Cache.php:456
2294
  msgid "Go to Exclude Tab, find the \"Do Not Cache URIs\" option"
2295
  msgstr ""
2296
 
2297
+ #: classes/Cache.php:463
2298
  msgid "Please navigate in Dashboard to WP Rocket > Advanced Rules Tab"
2299
  msgstr ""
2300
 
2301
+ #: classes/Cache.php:464
2302
  msgid "Scroll down to \"Never cache (URLs)\" option"
2303
  msgstr ""
2304
 
2305
+ #: classes/Cache.php:465
2306
  msgid ""
2307
  "Insert the URL path(s) of your forum page(s) one per line with wildcard (.*) "
2308
  "in the option textarea:"
2309
  msgstr ""
2310
 
2311
+ #: classes/Cache.php:471
2312
  msgid "Please navigate in Dashboard to WP Fastest Cache > Exclude Tab"
2313
  msgstr ""
2314
 
2315
+ #: classes/Cache.php:472
2316
  msgid "In the \"Exclude Pages\" section click the [Add New Rule] button"
2317
  msgstr ""
2318
 
2319
+ #: classes/Cache.php:473
2320
  msgid ""
2321
  "Select [Start with] option in the drop-down menu and insert the URL path(s) of "
2322
  "your forum page(s) one per rule in the next field:"
2323
  msgstr ""
2324
 
2325
+ #: classes/Cache.php:474
2326
  msgid ""
2327
  "If you have more than one forum pages (boards) you should create separate "
2328
  "rules for each forum board."
2329
  msgstr ""
2330
 
2331
+ #: classes/Cache.php:475
2332
  msgid "Save rules and delete all caches."
2333
  msgstr ""
2334
 
2335
+ #: classes/Cache.php:480
2336
  msgid "Please navigate in Dashboard to Performance > Page Cache admin page"
2337
  msgstr ""
2338
 
2339
+ #: classes/Cache.php:481
2340
  msgid "Go to Advanced Tab, scroll down to Rejected URL Strings option"
2341
  msgstr ""
2342
 
2343
+ #: classes/Cache.php:482
2344
  msgid ""
2345
  "Scroll to Advanced section and insert the URL path(s) of your forum page(s) "
2346
  "one per line in the \"Never cache the following pages\" textarea:"
2347
  msgstr ""
2348
 
2349
+ #: classes/Cache.php:488
2350
  msgid "Please navigate in Dashboard to WP-Optimize > Cache admin page"
2351
  msgstr ""
2352
 
2353
+ #: classes/Cache.php:489
2354
  msgid ""
2355
  "Go to Advanced Settings Tab, find the \"URLs to exclude from caching\" option"
2356
  msgstr ""
2357
 
2358
+ #: classes/Cache.php:490
2359
  msgid ""
2360
  "Insert the URL path(s) of your forum page(s) one per line with wildcard [*] in "
2361
  "the option textarea:"
2362
  msgstr ""
2363
 
2364
+ #: classes/Cache.php:496
2365
  msgid "Please navigate in Dashboard to SG Optimizer > Caching admin page"
2366
  msgstr ""
2367
 
2368
+ #: classes/Cache.php:497
2369
  msgid ""
2370
  "Scroll to Exclude URLs from Caching section and click the \"pencil\" button, "
2371
  "enable it, and click the button again"
2372
  msgstr ""
2373
 
2374
+ #: classes/Cache.php:498
2375
  msgid ""
2376
  "Insert the URL path(s) of your forum page(s) with wildcard [*] in the pop-up "
2377
  "filed:"
2378
  msgstr ""
2379
 
2380
+ #: classes/Forums.php:837
2381
  msgid "Add a new Subforum"
2382
  msgstr ""
2383
 
2384
+ #: classes/Forums.php:837
2385
  msgid "Add a new Forum in this Category"
2386
  msgstr ""
2387
 
2388
+ #: classes/Members.php:409
2389
  msgid "<strong>ERROR</strong>: Please enter a username."
2390
  msgstr ""
2391
 
2392
+ #: classes/Members.php:414
2393
  msgid ""
2394
  "<strong>ERROR</strong>: This username is invalid because it uses illegal "
2395
  "characters. Please enter a valid username."
2396
  msgstr ""
2397
 
2398
+ #: classes/Members.php:423
2399
  msgid ""
2400
  "<strong>ERROR</strong>: This username is already registered. Please choose "
2401
  "another one."
2402
  msgstr ""
2403
 
2404
+ #: classes/Members.php:428
2405
  msgid "<strong>ERROR</strong>: Sorry, that username is not allowed."
2406
  msgstr ""
2407
 
2408
+ #: classes/Members.php:433
2409
  msgid "<strong>ERROR</strong>: Please type your email address."
2410
  msgstr ""
2411
 
2412
+ #: classes/Members.php:438
2413
  msgid "<strong>ERROR</strong>: The email address isn&#8217;t correct."
2414
  msgstr ""
2415
 
2416
+ #: classes/Members.php:443
2417
  msgid ""
2418
  "<strong>ERROR</strong>: This email is already registered, please choose "
2419
  "another one."
2420
  msgstr ""
2421
 
2422
+ #: classes/Members.php:1845
2423
  msgid "What should be done with wpForo content owned by this user?"
2424
  msgstr ""
2425
 
2426
+ #: classes/Members.php:1848
2427
  msgid "What should be done with wpForo content owned by these users?"
2428
  msgstr ""
2429
 
2430
+ #: classes/Members.php:1852
2431
  msgid "Delete all wpForo content."
2432
  msgstr ""
2433
 
2434
+ #: classes/Members.php:1854
2435
  msgid "Attribute all content to:"
2436
  msgstr ""
2437
 
2686
  "forum run faster."
2687
  msgstr ""
2688
 
2689
+ #: classes/Settings.php:198
2690
+ msgid "URL Structure"
2691
+ msgstr ""
2692
+
2693
+ #: classes/Settings.php:200
2694
+ msgid ""
2695
+ "This option allows managing topic and post URL structure. By default, URLs are "
2696
+ "built based on topic titles. You can change them to ID and make them shorter."
2697
+ msgstr ""
2698
+
2699
+ #: classes/Settings.php:211
2700
  msgid "Display Components"
2701
  msgstr ""
2702
 
2703
+ #: classes/Settings.php:214
2704
  msgid ""
2705
  "wpForo is a forum plugin which is loaded in one WordPress page, so the whole "
2706
  "forum with its categories, forums, topics, members and profile pages are "
2709
  "settings, especially here, in the Display Components admin page."
2710
  msgstr ""
2711
 
2712
+ #: classes/Settings.php:225
2713
  msgid "Frontend Admin Control Panel"
2714
  msgstr ""
2715
 
2716
+ #: classes/Settings.php:227
2717
  msgid ""
2718
  "This is a section with some important buttons for quick actions and accesses "
2719
  "to certain admin pages. it's located in the forum home page under the forum "
2720
  "list. This section is only available for website administrators."
2721
  msgstr ""
2722
 
2723
+ #: classes/Settings.php:233 includes/phrases.php:482
2724
  msgid "Show Forum Page Title"
2725
  msgstr ""
2726
 
2727
+ #: classes/Settings.php:241
2728
  msgid "Show Forum Menu Bar"
2729
  msgstr ""
2730
 
2731
+ #: classes/Settings.php:243
2732
  msgid ""
2733
  "This menu bar contains the forum menu, notification bell and forum search "
2734
  "section."
2735
  msgstr ""
2736
 
2737
+ #: classes/Settings.php:249
2738
  msgid "Show Search Section in the Forum Menu Bar"
2739
  msgstr ""
2740
 
2741
+ #: classes/Settings.php:257 includes/phrases.php:481
2742
  msgid "Show Breadcrumb"
2743
  msgstr ""
2744
 
2745
+ #: classes/Settings.php:265
2746
  msgid "Show Forum Footer"
2747
  msgstr ""
2748
 
2749
+ #: classes/Settings.php:267
2750
  msgid ""
2751
  "Forum footer is located at the bottom of all forum content. It includes forum "
2752
  "statistic, last registered user and post information. As well as it contains "
2753
  "the 'Mark all read' button and forums/topics icon description."
2754
  msgstr ""
2755
 
2756
+ #: classes/Settings.php:273 includes/phrases.php:483
2757
  msgid "Show Forum Statistic"
2758
  msgstr ""
2759
 
2760
+ #: classes/Settings.php:281 includes/phrases.php:320
2761
  msgid "Help wpForo to grow, show plugin info"
2762
  msgstr ""
2763
 
2764
+ #: classes/Settings.php:283 includes/phrases.php:412
2765
  msgid ""
2766
  "Please enable this option to help wpForo get more popularity as your thank to "
2767
  "the hard work we do for you totally free. This option adds a very small icon "
2769
  "forum solution you use."
2770
  msgstr ""
2771
 
2772
+ #: classes/Settings.php:290
2773
  msgid "Display Forums"
2774
  msgstr ""
2775
 
2776
+ #: classes/Settings.php:294
2777
  msgid ""
2778
  "Here you can manage forum specific components which are displayed on the "
2779
  "frontend. All options are grouped by forum layouts. You can find all necessary "
2781
  "own specific features."
2782
  msgstr ""
2783
 
2784
+ #: classes/Settings.php:305
2785
  msgid "Extended Layout - Recent topics"
2786
  msgstr ""
2787
 
2788
+ #: classes/Settings.php:310 classes/Settings.php:348 classes/Settings.php:386
2789
+ #: classes/Settings.php:574 classes/Settings.php:2597 includes/phrases.php:241
2790
  msgid "Collapsed"
2791
  msgstr ""
2792
 
2793
+ #: classes/Settings.php:311 classes/Settings.php:349 classes/Settings.php:387
2794
+ #: classes/Settings.php:575 classes/Settings.php:2598 includes/phrases.php:275
2795
  msgid "Expanded"
2796
  msgstr ""
2797
 
2798
+ #: classes/Settings.php:318
2799
  msgid "Extended Layout - Number of Recent topics"
2800
  msgstr ""
2801
 
2802
+ #: classes/Settings.php:327
2803
  msgid "Extended Layout - Recent topic length"
2804
  msgstr ""
2805
 
2806
+ #: classes/Settings.php:329 classes/Settings.php:367
2807
  msgid ""
2808
  "Set this option value 0 if you want to show the whole title in recent topic "
2809
  "area."
2810
  msgstr ""
2811
 
2812
+ #: classes/Settings.php:335
2813
  msgid "Simplified Layout - Display Add Topic Button on Forum List"
2814
  msgstr ""
2815
 
2816
+ #: classes/Settings.php:343
2817
  msgid "Q&A Layout - Recent topics"
2818
  msgstr ""
2819
 
2820
+ #: classes/Settings.php:356
2821
  msgid "Q&A Layout - Number of Recent topics"
2822
  msgstr ""
2823
 
2824
+ #: classes/Settings.php:365
2825
  msgid "Q&A Layout - Recent topic length"
2826
  msgstr ""
2827
 
2828
+ #: classes/Settings.php:373
2829
  msgid "Q&A Layout - Display Add Topic Button on Forum List"
2830
  msgstr ""
2831
 
2832
+ #: classes/Settings.php:381
2833
  msgid "Threaded Layout - Forums List"
2834
  msgstr ""
2835
 
2836
+ #: classes/Settings.php:393
2837
  msgid "Threaded Layout - Display Sub Forums with Parent Forums"
2838
  msgstr ""
2839
 
2840
+ #: classes/Settings.php:401
2841
  msgid "Threaded Layout - Display Thread Filtering Buttons"
2842
  msgstr ""
2843
 
2844
+ #: classes/Settings.php:409
2845
  msgid "Threaded Layout - Display Add Topic Button on Forum List"
2846
  msgstr ""
2847
 
2848
+ #: classes/Settings.php:418
2849
  msgid "Threaded Layout - Number of Recent topics"
2850
  msgstr ""
2851
 
2852
+ #: classes/Settings.php:427
2853
  msgid "Threaded Layout - Recent topic length"
2854
  msgstr ""
2855
 
2856
+ #: classes/Settings.php:437
2857
  msgid "Colors &amp; Styles"
2858
  msgstr ""
2859
 
2860
+ #: classes/Settings.php:440
2861
  msgid ""
2862
  "Here you can change your forum style. There are six predefined styles "
2863
  "(default, red, green, orange, gray and dark), these are set of different "
2866
  "Also, you can change font size of forums, topics and post content."
2867
  msgstr ""
2868
 
2869
+ #: classes/Settings.php:451
2870
  msgid "Font Sizes"
2871
  msgstr ""
2872
 
2873
+ #: classes/Settings.php:453
2874
  msgid ""
2875
  "These options allow you to change the font sizes of forum and topic titles as "
2876
  "well as the font size of post content."
2877
  msgstr ""
2878
 
2879
+ #: classes/Settings.php:460
2880
  msgid "Forums font size:"
2881
  msgstr ""
2882
 
2883
+ #: classes/Settings.php:486
2884
  msgid "Topics font size:"
2885
  msgstr ""
2886
 
2887
+ #: classes/Settings.php:512
2888
  msgid "Post content font size:"
2889
  msgstr ""
2890
 
2891
+ #: classes/Settings.php:538 includes/phrases.php:247
2892
  msgid "Custom CSS Code"
2893
  msgstr ""
2894
 
2895
+ #: classes/Settings.php:546
2896
  msgid "Forum Color Styles"
2897
  msgstr ""
2898
 
2899
+ #: classes/Settings.php:555
2900
  msgid "Display Topics &amp; Posts"
2901
  msgstr ""
2902
 
2903
+ #: classes/Settings.php:558
2904
  msgid ""
2905
  "This is the right place to manage topics and posts displaying options. Here "
2906
  "you can manage the number of topics and posts per page, also you can display "
2908
  "are grouped by forum layouts."
2909
  msgstr ""
2910
 
2911
+ #: classes/Settings.php:569
2912
  msgid "Extended Layout - Recent posts"
2913
  msgstr ""
2914
 
2915
+ #: classes/Settings.php:582
2916
  msgid "Extended Layout - Number of Recent posts"
2917
  msgstr ""
2918
 
2919
+ #: classes/Settings.php:584
2920
  msgid ""
2921
  "Set this option value 0 if you want to show all posts in recent posts area."
2922
  msgstr ""
2923
 
2924
+ #: classes/Settings.php:591
2925
  msgid "Extended Layout - Recent post length"
2926
  msgstr ""
2927
 
2928
+ #: classes/Settings.php:600
2929
  msgid "Q&A Layout - Number of Answers per Page"
2930
  msgstr ""
2931
 
2932
+ #: classes/Settings.php:609
2933
  msgid "Q&A Layout - Number of Comments per Answer"
2934
  msgstr ""
2935
 
2936
+ #: classes/Settings.php:611
2937
  msgid ""
2938
  "This is the number of comments under the answers before clicking the [load "
2939
  "more comments] button. Set this option value 0 if you want to show all "
2940
  "comments."
2941
  msgstr ""
2942
 
2943
+ #: classes/Settings.php:617
2944
  msgid "Q&A Layout - Enable Comments on the First Post (question)"
2945
  msgstr ""
2946
 
2947
+ #: classes/Settings.php:626
2948
  msgid "Threaded Layout - Number of Parent Posts per Page"
2949
  msgstr ""
2950
 
2951
+ #: classes/Settings.php:636
2952
  msgid "Threaded Layout - Replies Nesting Levels Deep"
2953
  msgstr ""
2954
 
2955
+ #: classes/Settings.php:644
2956
  msgid "Threaded Layout - First Post Reply Button"
2957
  msgstr ""
2958
 
2959
+ #: classes/Settings.php:653 includes/phrases.php:399
2960
  msgid "Number of Topics per Page"
2961
  msgstr ""
2962
 
2963
+ #: classes/Settings.php:662 includes/phrases.php:398
2964
  msgid "Number of Posts per Page"
2965
  msgstr ""
2966
 
2967
+ #: classes/Settings.php:671
2968
  msgid "Maximum Number of Search Results"
2969
  msgstr ""
2970
 
2971
+ #: classes/Settings.php:679
2972
  msgid "Stick Topic's First Post on Top for Certain Forum Layout"
2973
  msgstr ""
2974
 
2975
+ #: classes/Settings.php:681
2976
  msgid ""
2977
  "This option keeps the first topic post on top when you navigate through pages "
2978
  "of that topic. You can manage this option by forum layouts."
2979
  msgstr ""
2980
 
2981
+ #: classes/Settings.php:687
2982
  msgid "Recent Posts Display Type"
2983
  msgstr ""
2984
 
2985
+ #: classes/Settings.php:699
2986
  msgid "Display Topic Statistics and Overview Panel"
2987
  msgstr ""
2988
 
2989
+ #: classes/Settings.php:707
2990
  msgid "Keep Expanded Topic Overview in the Statistic Panel"
2991
  msgstr ""
2992
 
2993
+ #: classes/Settings.php:716 includes/phrases.php:987 widgets/Tags.php:22
2994
  msgid "Topic Tags"
2995
  msgstr ""
2996
 
2997
+ #: classes/Settings.php:719
2998
  msgid ""
2999
  "Tags are a free form method of categorization, currently being used to group "
3000
  "and categorize similar topics. The goal of using these tags in the forum is to "
3002
  "the size of the tag, the more discussions about the topic."
3003
  msgstr ""
3004
 
3005
+ #: classes/Settings.php:731
3006
  msgid "Maximum Number of Tags per Topic"
3007
  msgstr ""
3008
 
3009
+ #: classes/Settings.php:740
3010
  msgid "Number of Tags per Page"
3011
  msgstr ""
3012
 
3013
+ #: classes/Settings.php:750
3014
  msgid "Maximum Tag Length"
3015
  msgstr ""
3016
 
3017
+ #: classes/Settings.php:759
3018
  msgid "Maximum Number of Suggested Tags"
3019
  msgstr ""
3020
 
3021
+ #: classes/Settings.php:761
3022
  msgid ""
3023
  "Tags are suggested while you type in the tag field. Using this option you can "
3024
  "limit the maximum number of suggested tags."
3025
  msgstr ""
3026
 
3027
+ #: classes/Settings.php:767
3028
  msgid "Force Lowercase Tags"
3029
  msgstr ""
3030
 
3031
+ #: classes/Settings.php:776
3032
  msgid "Posting &amp; Editor Settings"
3033
  msgstr ""
3034
 
3035
+ #: classes/Settings.php:779
3036
  msgid ""
3037
  "Here, you can find all settings related to topic and post creation including "
3038
  "rich editor settings, text limitations, attachments control, option to enable "
3041
  "general for all forum layouts."
3042
  msgstr ""
3043
 
3044
+ #: classes/Settings.php:790
3045
  msgid "Q&A Layout - Display Answer Editor"
3046
  msgstr ""
3047
 
3048
+ #: classes/Settings.php:798
3049
  msgid "Q&A Layout - Comment Form Type"
3050
  msgstr ""
3051
 
3052
+ #: classes/Settings.php:803 classes/Settings.php:815
3053
  msgid "Text Editor"
3054
  msgstr ""
3055
 
3056
+ #: classes/Settings.php:804 classes/Settings.php:816
3057
  msgid "Visual Editor"
3058
  msgstr ""
3059
 
3060
+ #: classes/Settings.php:810
3061
  msgid "Threaded Layout - Reply Form Type"
3062
  msgstr ""
3063
 
3064
+ #: classes/Settings.php:823
3065
  msgid "Topic Title Minimum Length"
3066
  msgstr ""
3067
 
3068
+ #: classes/Settings.php:833
3069
  msgid "Topic Title Maximum Length"
3070
  msgstr ""
3071
 
3072
+ #: classes/Settings.php:835
3073
  msgid "Topic title length cannot be set more than 250 character."
3074
  msgstr ""
3075
 
3076
+ #: classes/Settings.php:842
3077
  msgid "Topic Content Minimum Length"
3078
  msgstr ""
3079
 
3080
+ #: classes/Settings.php:851
3081
  msgid "Topic Content Maximum Length"
3082
  msgstr ""
3083
 
3084
+ #: classes/Settings.php:853 classes/Settings.php:871 classes/Settings.php:889
3085
  msgid "Set this option value 0 to remove this limit."
3086
  msgstr ""
3087
 
3088
+ #: classes/Settings.php:860
3089
  msgid "Reply Content Minimum Length"
3090
  msgstr ""
3091
 
3092
+ #: classes/Settings.php:869
3093
  msgid "Reply Content Maximum Length"
3094
  msgstr ""
3095
 
3096
+ #: classes/Settings.php:878
3097
  msgid "Comment Content Minimum Length"
3098
  msgstr ""
3099
 
3100
+ #: classes/Settings.php:887
3101
  msgid "Comment Content Maximum Length"
3102
  msgstr ""
3103
 
3104
+ #: classes/Settings.php:896
3105
  msgid "Allow Edit Own Topic within (minutes)"
3106
  msgstr ""
3107
 
3108
+ #: classes/Settings.php:898 classes/Settings.php:916 classes/Settings.php:925
3109
  msgid "Set this option value 0 to remove time limit."
3110
  msgstr ""
3111
 
3112
+ #: classes/Settings.php:905
3113
  msgid "Allow Delete Own Topic within (minutes)"
3114
  msgstr ""
3115
 
3116
+ #: classes/Settings.php:914
3117
  msgid "Allow Edit Own Post within (minutes)"
3118
  msgstr ""
3119
 
3120
+ #: classes/Settings.php:923
3121
  msgid "Allow Delete Own Post within (minutes)"
3122
  msgstr ""
3123
 
3124
+ #: classes/Settings.php:931
3125
  msgid "Display Topic Editing Information"
3126
  msgstr ""
3127
 
3128
+ #: classes/Settings.php:933
3129
  msgid ""
3130
  "The topic edit logging information 'This post was modified 2 hours ago by "
3131
  "John' is displayed under modified topic first post content..."
3132
  msgstr ""
3133
 
3134
+ #: classes/Settings.php:939
3135
  msgid "Display Post Editing Information"
3136
  msgstr ""
3137
 
3138
+ #: classes/Settings.php:941
3139
  msgid ""
3140
  "The post edit logging information 'This post was modified 2 hours ago by John' "
3141
  "is displayed under modified post content..."
3142
  msgstr ""
3143
 
3144
+ #: classes/Settings.php:948
3145
  msgid "Limit Post Editing Information"
3146
  msgstr ""
3147
 
3148
+ #: classes/Settings.php:950
3149
  msgid ""
3150
  "Limit the post edit logging information 'This post was modified 2 hours ago by "
3151
  "John'. Set this option value 0 if you want to disable limiting."
3152
  msgstr ""
3153
 
3154
+ #: classes/Settings.php:956
3155
  msgid "Post Preview"
3156
  msgstr ""
3157
 
3158
+ #: classes/Settings.php:964
3159
  msgid "Post Revisions and Draft Saving"
3160
  msgstr ""
3161
 
3162
+ #: classes/Settings.php:972
3163
  msgid "Auto Drafting Interval"
3164
  msgstr ""
3165
 
3166
+ #: classes/Settings.php:977
3167
  msgid "disabled"
3168
  msgstr ""
3169
 
3170
+ #: classes/Settings.php:978
3171
  msgid "15 seconds"
3172
  msgstr ""
3173
 
3174
+ #: classes/Settings.php:979
3175
  msgid "30 seconds"
3176
  msgstr ""
3177
 
3178
+ #: classes/Settings.php:980
3179
  msgid "1 minute"
3180
  msgstr ""
3181
 
3182
+ #: classes/Settings.php:981
3183
  msgid "2 minute"
3184
  msgstr ""
3185
 
3186
+ #: classes/Settings.php:982
3187
  msgid "5 minute"
3188
  msgstr ""
3189
 
3190
+ #: classes/Settings.php:989
3191
  msgid "Max Number of Revisions"
3192
  msgstr ""
3193
 
3194
+ #: classes/Settings.php:998 includes/phrases.php:355
3195
  msgid "Maximum upload file size"
3196
  msgstr ""
3197
 
3198
+ #: classes/Settings.php:1000
3199
  msgid ""
3200
  "You can not set this value more than 'upload_max_filesize' and "
3201
  "'post_max_size'. If you want to increase server parameters please contact to "
3202
  "your hosting service support."
3203
  msgstr ""
3204
 
3205
+ #: classes/Settings.php:1006 includes/phrases.php:828
3206
  msgid "Insert Forum Attachments to Media Library"
3207
  msgstr ""
3208
 
3209
+ #: classes/Settings.php:1008 includes/phrases.php:829
3210
  msgid ""
3211
  "Enable this option to be able manage forum attachments in Dashboard > Media > "
3212
  "Library admin page."
3213
  msgstr ""
3214
 
3215
+ #: classes/Settings.php:1014
3216
  msgid "Toolbar Location of the Topic Editor"
3217
  msgstr ""
3218
 
3219
+ #: classes/Settings.php:1019 classes/Settings.php:1031
3220
  msgid "Top"
3221
  msgstr ""
3222
 
3223
+ #: classes/Settings.php:1020 classes/Settings.php:1032
3224
  msgid "Bottom"
3225
  msgstr ""
3226
 
3227
+ #: classes/Settings.php:1026
3228
  msgid "Toolbar Location of the Reply Editor"
3229
  msgstr ""
3230
 
3231
+ #: classes/Settings.php:1038
3232
  msgid "Enable WordPress Shortcodes in Post Content"
3233
  msgstr ""
3234
 
3235
+ #: classes/Settings.php:1046
3236
  msgid "Allow extra HTML tags"
3237
  msgstr ""
3238
 
3239
+ #: classes/Settings.php:1048
3240
  msgid ""
3241
  "By default, wpForo allows all secure HTML tags in post content. Allowing a new "
3242
  "HTML tag may affect your forum security. For example the &lt;iframe&gt; and "
3246
  "</code>"
3247
  msgstr ""
3248
 
3249
+ #: classes/Settings.php:1055
3250
  msgid "Display Members"
3251
  msgstr ""
3252
 
3253
+ #: classes/Settings.php:1058
3254
  msgid ""
3255
  "This is the members' directory setting page. wpForo forum has a members' page "
3256
  "where you can see all members. The members' page is called members directory, "
3259
  "will be one for all boards."
3260
  msgstr ""
3261
 
3262
+ #: classes/Settings.php:1069
3263
  msgid "Members List Ordering"
3264
  msgstr ""
3265
 
3266
+ #: classes/Settings.php:1074
3267
  msgid "Last Online time"
3268
  msgstr ""
3269
 
3270
+ #: classes/Settings.php:1075
3271
  msgid "Posts Ascending"
3272
  msgstr ""
3273
 
3274
+ #: classes/Settings.php:1076
3275
  msgid "Posts Descending"
3276
  msgstr ""
3277
 
3278
+ #: classes/Settings.php:1077
3279
  msgid "Join Date Ascending"
3280
  msgstr ""
3281
 
3282
+ #: classes/Settings.php:1078
3283
  msgid "Join Date Descending"
3284
  msgstr ""
3285
 
3286
+ #: classes/Settings.php:1079
3287
  msgid "Display Name A->Z"
3288
  msgstr ""
3289
 
3290
+ #: classes/Settings.php:1080
3291
  msgid "Display Name Z->A"
3292
  msgstr ""
3293
 
3294
+ #: classes/Settings.php:1086
3295
  msgid "Hide Inactive Members"
3296
  msgstr ""
3297
 
3298
+ #: classes/Settings.php:1088
3299
  msgid ""
3300
  "Members who have not confirmed their email after the registration are set as "
3301
  "'inactive'. In most cases they are spam bots."
3302
  msgstr ""
3303
 
3304
+ #: classes/Settings.php:1095
3305
  msgid "Number of Members per Page"
3306
  msgstr ""
3307
 
3308
+ #: classes/Settings.php:1103 includes/phrases.php:888
3309
  msgid "Members Search Type"
3310
  msgstr ""
3311
 
3312
+ #: classes/Settings.php:1108 includes/phrases.php:461
3313
  msgid "Search"
3314
  msgstr ""
3315
 
3316
+ #: classes/Settings.php:1116 includes/phrases.php:835
3317
  msgid "Member Profile"
3318
  msgstr ""
3319
 
3320
+ #: classes/Settings.php:1119
3321
  msgid ""
3322
  "wpForo forum has a powerful user profile system which can be managed in this "
3323
  "setting page. Here you can hide/show forum header and footer on profile pages, "
3326
  "plugins, you can switch forum profile page to the plugin profile page."
3327
  msgstr ""
3328
 
3329
+ #: classes/Settings.php:1130
3330
  msgid "Profile Page"
3331
  msgstr ""
3332
 
3333
+ #: classes/Settings.php:1138
3334
  msgid ""
3335
  "wpForo Profile only for the forum, WordPress Profile for others, including "
3336
  "comment authors, post authors and etc..."
3337
  msgstr ""
3338
 
3339
  #. Plugin Name of the plugin/theme
3340
+ #: classes/Settings.php:1142
3341
  msgid "wpForo"
3342
  msgstr ""
3343
 
3344
+ #: classes/Settings.php:1143
3345
  msgid ""
3346
  "wpForo Profile for the whole website including forum, comment authors, post "
3347
  "authors and etc..."
3348
  msgstr ""
3349
 
3350
+ #: classes/Settings.php:1147
3351
  msgid "BuddyPress"
3352
  msgstr ""
3353
 
3354
+ #: classes/Settings.php:1148
3355
  msgid "BuddyPress Profile for the whole website including forum."
3356
  msgstr ""
3357
 
3358
+ #: classes/Settings.php:1153
3359
  msgid "Ultimate Member"
3360
  msgstr ""
3361
 
3362
+ #: classes/Settings.php:1154
3363
  msgid "Ultimate Member Profile for the whole website including forum."
3364
  msgstr ""
3365
 
3366
+ #: classes/Settings.php:1162
3367
  msgid "Show Forum Header on Profile Pages"
3368
  msgstr ""
3369
 
3370
+ #: classes/Settings.php:1170
3371
  msgid "Show Forum Footer under Profile Pages"
3372
  msgstr ""
3373
 
3374
+ #: classes/Settings.php:1178
3375
  msgid "Members URL Structure"
3376
  msgstr ""
3377
 
3378
+ #: classes/Settings.php:1180
3379
  msgid "By default "
3380
  msgstr ""
3381
 
3382
+ #: classes/Settings.php:1190
3383
  msgid "Online Status Timeout (minutes)"
3384
  msgstr ""
3385
 
3386
+ #: classes/Settings.php:1198
3387
  msgid "Member Custom Titles"
3388
  msgstr ""
3389
 
3390
+ #: classes/Settings.php:1206
3391
  msgid "Member Custom Title by Default"
3392
  msgstr ""
3393
 
3394
+ #: classes/Settings.php:1214
3395
  msgid "Display Member Primary Usergroup"
3396
  msgstr ""
3397
 
3398
+ #: classes/Settings.php:1216
3399
  msgid ""
3400
  "The names of selected usergroups will be displayed under the corresponding "
3401
  "usergroup's users avatar in forum posts."
3402
  msgstr ""
3403
 
3404
+ #: classes/Settings.php:1222
3405
  msgid "Display Member Secondary Usergroup"
3406
  msgstr ""
3407
 
3408
+ #: classes/Settings.php:1224
3409
  msgid ""
3410
  "The names of selected secondary usergroups will be displayed under the "
3411
  "corresponding usergroup's users avatar in forum posts."
3412
  msgstr ""
3413
 
3414
+ #: classes/Settings.php:1230
3415
  msgid "Display Member Nicknames"
3416
  msgstr ""
3417
 
3418
+ #: classes/Settings.php:1232
3419
  msgid ""
3420
  "Nicknames are displayed with '@' symbol, like @john and are used for the user "
3421
  "mentioning in posts. Please note, that this is not the user login name "
3423
  "profile account page to secure the login name."
3424
  msgstr ""
3425
 
3426
+ #: classes/Settings.php:1238 includes/phrases.php:263
3427
  msgid "Enable Avatars"
3428
  msgstr ""
3429
 
3430
+ #: classes/Settings.php:1240
3431
  msgid ""
3432
  "Using this option you can disable user avatars for the forum but you cannot "
3433
  "show avatars if the WordPress native avatar option is disabled. So please make "
3435
  "admin page."
3436
  msgstr ""
3437
 
3438
+ #: classes/Settings.php:1246 includes/phrases.php:264
3439
  msgid "Enable Custom Avatars"
3440
  msgstr ""
3441
 
3442
+ #: classes/Settings.php:1248
3443
  msgid ""
3444
  "By default wpForo uses WordPress avatars. In most cases it's the Gravatar. If "
3445
  "this option is enabled, users will be able to set their avatars with external "
3446
  "URLs or upload from their devices."
3447
  msgstr ""
3448
 
3449
+ #: classes/Settings.php:1254
3450
  msgid "Site-wide Usage of Forum Profile Avatar"
3451
  msgstr ""
3452
 
3453
+ #: classes/Settings.php:1256
3454
  msgid ""
3455
  "If this option is enabled, wpForo will try to use its avatar in all available "
3456
  "places."
3457
  msgstr ""
3458
 
3459
+ #: classes/Settings.php:1262
3460
  msgid "The Default Profile Cover Image"
3461
  msgstr ""
3462
 
3463
+ #: classes/Settings.php:1270 includes/phrases.php:217
3464
  msgid "Allow Member Signature"
3465
  msgstr ""
3466
 
3467
+ #: classes/Settings.php:1272
3468
  msgid ""
3469
  "You can edit usergroups and enable/disable the signature for each usergroups "
3470
  "individually."
3471
  msgstr ""
3472
 
3473
+ #: classes/Settings.php:1279 includes/phrases.php:358
3474
  msgid "Member Rating"
3475
  msgstr ""
3476
 
3477
+ #: classes/Settings.php:1282
3478
  msgid ""
3479
  "wpForo has built-in member reputation system based on points user get when he/"
3480
  "she creates new topic, posts, when gets likes or dislikes. This system grants "
3482
  "posts, titles, badges) can be customized and changed in this admin section."
3483
  msgstr ""
3484
 
3485
+ #: classes/Settings.php:1282
3486
  msgid ""
3487
  " For an advanced user ranking and members' point awarding system we recommend "
3488
  "using myCRED plugin with the integration addon: "
3489
  msgstr ""
3490
 
3491
+ #: classes/Settings.php:1293
3492
  msgid "Enable Member Rating Badges"
3493
  msgstr ""
3494
 
3495
+ #: classes/Settings.php:1301 includes/phrases.php:267
3496
  msgid "Enable Member Rating Titles"
3497
  msgstr ""
3498
 
3499
+ #: classes/Settings.php:1317
3500
  msgid "Points for One Topic"
3501
  msgstr ""
3502
 
3503
+ #: classes/Settings.php:1326
3504
  msgid "Points for One Post"
3505
  msgstr ""
3506
 
3507
+ #: classes/Settings.php:1335
3508
  msgid "Points for One Like"
3509
  msgstr ""
3510
 
3511
+ #: classes/Settings.php:1344
3512
  msgid "Points for One Dislike"
3513
  msgstr ""
3514
 
3515
+ #: classes/Settings.php:1346
3516
  msgid ""
3517
  "This should be set a negative value like '-1' to decrease the user reputation "
3518
  "points if he/she receives dislikes."
3519
  msgstr ""
3520
 
3521
+ #: classes/Settings.php:1352
3522
  msgid "Enable Reputation Titles for Selected Usergroups"
3523
  msgstr ""
3524
 
3525
+ #: classes/Settings.php:1360
3526
  msgid "Enable Reputation Badges for Selected Usergroups"
3527
  msgstr ""
3528
 
3529
+ #: classes/Settings.php:1377
3530
  msgid "Login &amp; Registration"
3531
  msgstr ""
3532
 
3533
+ #: classes/Settings.php:1380
3534
  msgid ""
3535
  "wpForo is one of the very rare plugins which has its own user registration and "
3536
  "login pages. Both features are based on WordPress functions. Here you can "
3539
  "actions."
3540
  msgstr ""
3541
 
3542
+ #: classes/Settings.php:1380
3543
  msgid ""
3544
  "If you need to customize the registration form and add custom fields, you "
3545
  "should check out user custom field builder addon:"
3546
  msgstr ""
3547
 
3548
+ #: classes/Settings.php:1391 includes/phrases.php:824
3549
  msgid "Enable User Registration"
3550
  msgstr ""
3551
 
3552
+ #: classes/Settings.php:1393
3553
  msgid ""
3554
  "This option is not synced with WordPress 'Anyone can register' option in "
3555
  "Dashboard > Settings > General admin page. If this option is enabled new users "
3556
  "will always be able to register."
3557
  msgstr ""
3558
 
3559
+ #: classes/Settings.php:1399
3560
  msgid "Enable User Registration email confirmation"
3561
  msgstr ""
3562
 
3563
+ #: classes/Settings.php:1401
3564
  msgid ""
3565
  "If you have enabled this option, after registering, user can not login without "
3566
  "confirming the email."
3567
  msgstr ""
3568
 
3569
+ #: classes/Settings.php:1407
3570
  msgid "Enable User Manually Approval System"
3571
  msgstr ""
3572
 
3573
+ #: classes/Settings.php:1409
3574
  msgid ""
3575
  "If you have enabled this option, after registering, user can not login without "
3576
  "manually approving of administrator."
3577
  msgstr ""
3578
 
3579
+ #: classes/Settings.php:1415
3580
  msgid "Admin Contacting Form under the \"Awaiting approval\" Message"
3581
  msgstr ""
3582
 
3583
+ #: classes/Settings.php:1417
3584
  msgid ""
3585
  "This option displays a contact form under the 'Awaiting approval' text to "
3586
  "allow inactive users send a message to website administrator. This message "
3587
  "will be sent to the administrator email address."
3588
  msgstr ""
3589
 
3590
+ #: classes/Settings.php:1423
3591
  msgid "Role-Usergroup Synchronization"
3592
  msgstr ""
3593
 
3594
+ #: classes/Settings.php:1425
3595
  msgid ""
3596
  "Keep enabled this option to synch WordPress User Roles with Forum Usergroups. "
3597
  "This connection allows to automatically change Usergroup of a user when his/"
3602
  "they are only controlled by forum Usergroups."
3603
  msgstr ""
3604
 
3605
+ #: classes/Settings.php:1431
3606
  msgid "User Delete Method"
3607
  msgstr ""
3608
 
3609
+ #: classes/Settings.php:1433
3610
  msgid ""
3611
  "Choose which method to use when user delete action comes. [Soft] option will "
3612
  "not remove any content this user has already created. It'll only remove the "
3615
  "user has already created."
3616
  msgstr ""
3617
 
3618
+ #: classes/Settings.php:1436
3619
  msgid "Soft"
3620
  msgstr ""
3621
 
3622
+ #: classes/Settings.php:1436
3623
  msgid ""
3624
  "This method will delete only profile information so all content which created "
3625
  "this user will be kept and renamed as Anonymous."
3626
  msgstr ""
3627
 
3628
+ #: classes/Settings.php:1437
3629
  msgid "Hard"
3630
  msgstr ""
3631
 
3632
+ #: classes/Settings.php:1437
3633
  msgid "This method will also remove all user information and content."
3634
  msgstr ""
3635
 
3636
+ #: classes/Settings.php:1443 includes/phrases.php:446
3637
  msgid "Replace Registration Page URL to Forum Registration Page URL"
3638
  msgstr ""
3639
 
3640
+ #: classes/Settings.php:1451 includes/phrases.php:445
3641
  msgid "Replace Login Page URL to Forum Login Page URL"
3642
  msgstr ""
3643
 
3644
+ #: classes/Settings.php:1459 includes/phrases.php:886
3645
  msgid "Replace Reset Password Page URL to Forum Reset Password Page URL"
3646
  msgstr ""
3647
 
3648
+ #: classes/Settings.php:1467 includes/phrases.php:248
3649
  msgid "Custom Authorization URLs"
3650
  msgstr ""
3651
 
3652
+ #: classes/Settings.php:1469
3653
  msgid ""
3654
  "Use this option only if you have set other pages for authorization. wpForo "
3655
  "doesn't change its own URLs, these options are only for other plugin "
3657
  "you can set your profile plugin url"
3658
  msgstr ""
3659
 
3660
+ #: classes/Settings.php:1476 includes/phrases.php:348
3661
  msgid "Login URL"
3662
  msgstr ""
3663
 
3664
+ #: classes/Settings.php:1484 includes/phrases.php:438
3665
  msgid "Register URL"
3666
  msgstr ""
3667
 
3668
+ #: classes/Settings.php:1492
3669
  msgid "Lost Password"
3670
  msgstr ""
3671
 
3672
+ #: classes/Settings.php:1500
3673
  msgid "Custom Redirection URLs after following actions:"
3674
  msgstr ""
3675
 
3676
+ #: classes/Settings.php:1502
3677
  msgid "For member profile, account and subscription pages use following URLs:"
3678
  msgstr ""
3679
 
3680
+ #: classes/Settings.php:1533
3681
  msgid "Facebook API Configuration"
3682
  msgstr ""
3683
 
3684
+ #: classes/Settings.php:1535
3685
  msgid ""
3686
  "In order to get an App ID and Secret Key from Facebook, you’ll need to "
3687
  "register a new application. Don’t worry – its very easy, and your application "
3688
  "doesn't need to do anything. We only need the keys."
3689
  msgstr ""
3690
 
3691
+ #: classes/Settings.php:1535
3692
  msgid "Please follow to this instruction"
3693
  msgstr ""
3694
 
3695
+ #: classes/Settings.php:1542
3696
  msgid "App ID"
3697
  msgstr ""
3698
 
3699
+ #: classes/Settings.php:1550
3700
  msgid "App Secret"
3701
  msgstr ""
3702
 
3703
+ #: classes/Settings.php:1558
3704
  msgid "Facebook Login"
3705
  msgstr ""
3706
 
3707
+ #: classes/Settings.php:1560
3708
  msgid "Adds Facebook Login button on Registration and Login pages."
3709
  msgstr ""
3710
 
3711
+ #: classes/Settings.php:1566
3712
  msgid "Facebook Login button on User Login page"
3713
  msgstr ""
3714
 
3715
+ #: classes/Settings.php:1574
3716
  msgid "Facebook Login button on User Registration page"
3717
  msgstr ""
3718
 
3719
+ #: classes/Settings.php:1582
3720
  msgid "Redirect to this page after success login"
3721
  msgstr ""
3722
 
3723
+ #: classes/Settings.php:1595
3724
  msgid "Custom URL, e.g.:"
3725
  msgstr ""
3726
 
3727
+ #: classes/Settings.php:1596
3728
  msgid "Redirect to custom URL after success login"
3729
  msgstr ""
3730
 
3731
+ #: classes/Settings.php:1605
3732
  msgid "Email Settings"
3733
  msgstr ""
3734
 
3735
+ #: classes/Settings.php:1608
3736
  msgid ""
3737
  "Here, you can configure header information (FROM name and email) of forum "
3738
  "specific emails. You can set administrators and moderators email addresses to "
3740
  "find user registration, password resetting and post reporting email templates."
3741
  msgstr ""
3742
 
3743
+ #: classes/Settings.php:1619
3744
  msgid "FROM Name"
3745
  msgstr ""
3746
 
3747
+ #: classes/Settings.php:1627
3748
  msgid "FROM Email Address"
3749
  msgstr ""
3750
 
3751
+ #: classes/Settings.php:1635
3752
  msgid "Forum Admins Email Addresses"
3753
  msgstr ""
3754
 
3755
+ #: classes/Settings.php:1637 includes/phrases.php:243
3756
  msgid ""
3757
  "Comma separated email addresses of forum administrators to get forum "
3758
  "notifications. For example post report messages."
3759
  msgstr ""
3760
 
3761
+ #: classes/Settings.php:1643
3762
  msgid "Notify Admins via Email on New Topic"
3763
  msgstr ""
3764
 
3765
+ #: classes/Settings.php:1645
3766
  msgid ""
3767
  "Send Notification emails to all email addresses (comma separated ) of forum "
3768
  "administrators when a new Topic is created."
3769
  msgstr ""
3770
 
3771
+ #: classes/Settings.php:1651
3772
  msgid "Notify Admins via Email on New Post"
3773
  msgstr ""
3774
 
3775
+ #: classes/Settings.php:1653
3776
  msgid ""
3777
  "Send Notification emails to all email addresses (comma separated ) of forum "
3778
  "administrators when a new Reply is created."
3779
  msgstr ""
3780
 
3781
+ #: classes/Settings.php:1659
3782
  msgid "Stop Sending Emails to Admins on New User Registration"
3783
  msgstr ""
3784
 
3785
+ #: classes/Settings.php:1661
3786
  msgid ""
3787
  "If you have enabled this option, after registering, the admin will not receive "
3788
  "an email notification for newly registered user."
3789
  msgstr ""
3790
 
3791
+ #: classes/Settings.php:1667
3792
  msgid "Report Message Subject"
3793
  msgstr ""
3794
 
3795
+ #: classes/Settings.php:1676
3796
  msgid "Report Message Body"
3797
  msgstr ""
3798
 
3799
+ #: classes/Settings.php:1684
3800
  msgid "Reporter user display name"
3801
  msgstr ""
3802
 
3803
+ #: classes/Settings.php:1685
3804
  msgid "Reporter user message"
3805
  msgstr ""
3806
 
3807
+ #: classes/Settings.php:1686
3808
  msgid "Reported post URL"
3809
  msgstr ""
3810
 
3811
+ #: classes/Settings.php:1693
3812
  msgid "Overwrite WordPress New User Registration Email for Admins"
3813
  msgstr ""
3814
 
3815
+ #: classes/Settings.php:1701 classes/Settings.php:1735 classes/Settings.php:1783
3816
  msgid "Message Subject"
3817
  msgstr ""
3818
 
3819
+ #: classes/Settings.php:1710 classes/Settings.php:1744 classes/Settings.php:1792
3820
  msgid "Message Body"
3821
  msgstr ""
3822
 
3823
+ #: classes/Settings.php:1718
3824
  msgid "Website name"
3825
  msgstr ""
3826
 
3827
+ #: classes/Settings.php:1719 classes/Settings.php:1751 classes/Settings.php:1775
3828
  msgid "Registered user login"
3829
  msgstr ""
3830
 
3831
+ #: classes/Settings.php:1720
3832
  msgid "Registered user email"
3833
  msgstr ""
3834
 
3835
+ #: classes/Settings.php:1727
3836
  msgid "Overwrite WordPress New User Registration Email for Users"
3837
  msgstr ""
3838
 
3839
+ #: classes/Settings.php:1752 classes/Settings.php:1776
3840
  msgid "Link to open password reset form"
3841
  msgstr ""
3842
 
3843
+ #: classes/Settings.php:1759
3844
  msgid "Overwrite WordPress Reset Password Emails"
3845
  msgstr ""
3846
 
3847
+ #: classes/Settings.php:1768
3848
  msgid "Reset Password message body"
3849
  msgstr ""
3850
 
3851
+ #: classes/Settings.php:1801
3852
+ msgid "WordPress Blog Name"
3853
+ msgstr ""
3854
+
3855
+ #: classes/Settings.php:1802
3856
+ msgid "Approved User Login"
3857
+ msgstr ""
3858
+
3859
+ #: classes/Settings.php:1803
3860
+ msgid "Approved User Login Link"
3861
+ msgstr ""
3862
+
3863
+ #: classes/Settings.php:1804
3864
+ msgid "Approved User Login URL"
3865
+ msgstr ""
3866
+
3867
+ #: classes/Settings.php:1812
3868
  msgid "Subscriptions &amp; Mentioning"
3869
  msgstr ""
3870
 
3871
+ #: classes/Settings.php:1815
3872
  msgid ""
3873
  "wpForo has almost all kind of way to keep forum users updated about the latest "
3874
  "posted content. Users can subscribe to forums and topics, they can be "
3877
  "this admin section."
3878
  msgstr ""
3879
 
3880
+ #: classes/Settings.php:1826 includes/phrases.php:800
3881
  msgid "Enable Subscription Confirmation"
3882
  msgstr ""
3883
 
3884
+ #: classes/Settings.php:1828 includes/phrases.php:801
3885
  msgid "Forum and Topic subscription with double opt-in/confirmation system."
3886
  msgstr ""
3887
 
3888
+ #: classes/Settings.php:1834
3889
  msgid "Topic subscription option on post editor"
3890
  msgstr ""
3891
 
3892
+ #: classes/Settings.php:1836
3893
  msgid ""
3894
  "This option adds topic subscription checkbox next to new topic and post submit "
3895
  "button."
3896
  msgstr ""
3897
 
3898
+ #: classes/Settings.php:1842
3899
  msgid "Topic subscription option on post editor - checked/enabled"
3900
  msgstr ""
3901
 
3902
+ #: classes/Settings.php:1844
3903
  msgid ""
3904
  "Enable this option if you want the topic subscription checkbox to be checked "
3905
  "by default."
3906
  msgstr ""
3907
 
3908
+ #: classes/Settings.php:1850
3909
  msgid "Enable User Mentioning"
3910
  msgstr ""
3911
 
3912
+ #: classes/Settings.php:1852
3913
  msgid ""
3914
  "If this option is enabled, users will receive email notification when someone "
3915
  "uses @nickname of the user in posts."
3916
  msgstr ""
3917
 
3918
+ #: classes/Settings.php:1858
3919
  msgid "Enable User Following"
3920
  msgstr ""
3921
 
3922
+ #: classes/Settings.php:1860
3923
  msgid ""
3924
  "If this option is enabled, the [Follow] button will be displayed on user's "
3925
  "profile pages, allowing users to subscribe to certain users topics and posts. "
3927
  "a new topic or post."
3928
  msgstr ""
3929
 
3930
+ #: classes/Settings.php:1866 includes/phrases.php:500
3931
  msgid "Subscribe confirmation email subject"
3932
  msgstr ""
3933
 
3934
+ #: classes/Settings.php:1875 includes/phrases.php:499
3935
  msgid "Subscribe confirmation email message"
3936
  msgstr ""
3937
 
3938
+ #: classes/Settings.php:1883
3939
  msgid "Subscribed forum or topic title"
3940
  msgstr ""
3941
 
3942
+ #: classes/Settings.php:1884 classes/Settings.php:1913 classes/Settings.php:1946
3943
+ #: classes/Settings.php:2007
3944
  msgid "Subscriber display name"
3945
  msgstr ""
3946
 
3947
+ #: classes/Settings.php:1885
3948
  msgid "Link to confirm subscription"
3949
  msgstr ""
3950
 
3951
+ #: classes/Settings.php:1892 includes/phrases.php:381
3952
  msgid "New topic notification email subject"
3953
  msgstr ""
3954
 
3955
+ #: classes/Settings.php:1901 includes/phrases.php:380
3956
  msgid "New topic notification email message"
3957
  msgstr ""
3958
 
3959
+ #: classes/Settings.php:1914
3960
  msgid "New topic author display name"
3961
  msgstr ""
3962
 
3963
+ #: classes/Settings.php:1915
3964
  msgid "Forum title / link"
3965
  msgstr ""
3966
 
3967
+ #: classes/Settings.php:1916 classes/Settings.php:1948
3968
  msgid "Topic title / link"
3969
  msgstr ""
3970
 
3971
+ #: classes/Settings.php:1917
3972
  msgid "New topic title"
3973
  msgstr ""
3974
 
3975
+ #: classes/Settings.php:1918
3976
  msgid "New topic excerpt"
3977
  msgstr ""
3978
 
3979
+ #: classes/Settings.php:1919 classes/Settings.php:1951 classes/Settings.php:2011
3980
  msgid "Link to unsubscribe"
3981
  msgstr ""
3982
 
3983
+ #: classes/Settings.php:1926 includes/phrases.php:379
3984
  msgid "New reply notification email subject"
3985
  msgstr ""
3986
 
3987
+ #: classes/Settings.php:1935 includes/phrases.php:378
3988
  msgid "New reply notification email message"
3989
  msgstr ""
3990
 
3991
+ #: classes/Settings.php:1947
3992
  msgid "New reply author display name"
3993
  msgstr ""
3994
 
3995
+ #: classes/Settings.php:1949
3996
  msgid "New reply title"
3997
  msgstr ""
3998
 
3999
+ #: classes/Settings.php:1950
4000
  msgid "New reply excerpt"
4001
  msgstr ""
4002
 
4003
+ #: classes/Settings.php:1958
4004
  msgid "User mention message subject"
4005
  msgstr ""
4006
 
4007
+ #: classes/Settings.php:1967
4008
  msgid "User Mention message body"
4009
  msgstr ""
4010
 
4011
+ #: classes/Settings.php:1977
4012
  msgid "Mentioned user display name"
4013
  msgstr ""
4014
 
4015
+ #: classes/Settings.php:1978
4016
  msgid "Post author display name"
4017
  msgstr ""
4018
 
4019
+ #: classes/Settings.php:1979 includes/phrases.php:523
4020
  msgid "Topic title"
4021
  msgstr ""
4022
 
4023
+ #: classes/Settings.php:1980
4024
  msgid "Link to the post"
4025
  msgstr ""
4026
 
4027
+ #: classes/Settings.php:1981
4028
  msgid "Mentioned post excerpt"
4029
  msgstr ""
4030
 
4031
+ #: classes/Settings.php:1988
4032
  msgid "User following notification email subject"
4033
  msgstr ""
4034
 
4035
+ #: classes/Settings.php:1997
4036
  msgid "User following notification email message"
4037
  msgstr ""
4038
 
4039
+ #: classes/Settings.php:2008
4040
  msgid "New post author display name"
4041
  msgstr ""
4042
 
4043
+ #: classes/Settings.php:2009
4044
  msgid "New post title"
4045
  msgstr ""
4046
 
4047
+ #: classes/Settings.php:2010
4048
  msgid "New post excerpt"
4049
  msgstr ""
4050
 
4051
+ #: classes/Settings.php:2019
4052
  msgid "Forum Notifications"
4053
  msgstr ""
4054
 
4055
+ #: classes/Settings.php:2022
4056
  msgid ""
4057
  "As an addition to email notification functions, wpForo has in-forum "
4058
  "notification system. You can see the notification bell on forum menu bar or in "
4059
  "the sidebar with 'My Profile and Notifications' widget."
4060
  msgstr ""
4061
 
4062
+ #: classes/Settings.php:2033
4063
  msgid "Enable User Notification"
4064
  msgstr ""
4065
 
4066
+ #: classes/Settings.php:2041
4067
  msgid "Enable User Notification Live Update"
4068
  msgstr ""
4069
 
4070
+ #: classes/Settings.php:2049
4071
  msgid "Display User Notification Bell on Menu Bar"
4072
  msgstr ""
4073
 
4074
+ #: classes/Settings.php:2058
4075
  msgid "Action Logging &amp; Views"
4076
  msgstr ""
4077
 
4078
+ #: classes/Settings.php:2061
4079
  msgid ""
4080
  "wpForo logging system allows tracking and providing live information about "
4081
  "forum viewers. It detects read/unread status of forums and posts for guests "
4083
  "features of the forum logging system."
4084
  msgstr ""
4085
 
4086
+ #: classes/Settings.php:2072 includes/phrases.php:885
4087
  msgid "Log Viewed Forums and Topics"
4088
  msgstr ""
4089
 
4090
+ #: classes/Settings.php:2080
4091
  msgid "Track Forum and Topic Current Viewers"
4092
  msgstr ""
4093
 
4094
+ #: classes/Settings.php:2088
4095
  msgid "Topic Links - Jump to First Unread Post"
4096
  msgstr ""
4097
 
4098
+ #: classes/Settings.php:2090
4099
  msgid ""
4100
  "If this option is enabled, all topic links on forums page and on topics page "
4101
  "will refer to the first unread post. This behavior is only enabled for logged-"
4102
  "in users."
4103
  msgstr ""
4104
 
4105
+ #: classes/Settings.php:2096
4106
  msgid "Jump to First Unread Post with [new] Button in Topic Link"
4107
  msgstr ""
4108
 
4109
+ #: classes/Settings.php:2098
4110
  msgid ""
4111
  "Adds [new] button at the and of topic links, which jumps to the first unread "
4112
  "post."
4113
  msgstr ""
4114
 
4115
+ #: classes/Settings.php:2104
4116
  msgid "Display Forum Current Viewers"
4117
  msgstr ""
4118
 
4119
+ #: classes/Settings.php:2106
4120
  msgid ""
4121
  "Displays information about forum current viewers (x viewing) next to forum "
4122
  "title."
4123
  msgstr ""
4124
 
4125
+ #: classes/Settings.php:2112
4126
  msgid "Display Topic Current Viewers"
4127
  msgstr ""
4128
 
4129
+ #: classes/Settings.php:2114
4130
  msgid ""
4131
  "Displays information about topic current viewers (x viewing) next to topic "
4132
  "title"
4133
  msgstr ""
4134
 
4135
+ #: classes/Settings.php:2120
4136
  msgid "Display Recent Viewers in the Topic Footer"
4137
  msgstr ""
4138
 
4139
+ #: classes/Settings.php:2122
4140
  msgid ""
4141
  "Displays information about topic recent viewers (users visited within last one "
4142
  "hour)"
4143
  msgstr ""
4144
 
4145
+ #: classes/Settings.php:2128
4146
  msgid "Display Administrators in the Topic Recent Viewers Section"
4147
  msgstr ""
4148
 
4149
+ #: classes/Settings.php:2130
4150
  msgid ""
4151
  "By disabling this option you can exclude forum administrators from the topic "
4152
  "viewers section."
4153
  msgstr ""
4154
 
4155
+ #: classes/Settings.php:2137
4156
  msgid "wpForo SEO"
4157
  msgstr ""
4158
 
4159
+ #: classes/Settings.php:2140
4160
  msgid ""
4161
  "wpForo comes with built-in powerful forum SEO features. wpForo doesn't need "
4162
  "any SEO plugin, however you should use SEO plugins for other parts of your "
4164
  "pages and generates all necessary SEO meta tags."
4165
  msgstr ""
4166
 
4167
+ #: classes/Settings.php:2151
4168
  msgid "Enable Meta Titles"
4169
  msgstr ""
4170
 
4171
+ #: classes/Settings.php:2159
4172
  msgid "Enable Meta Tags"
4173
  msgstr ""
4174
 
4175
+ #: classes/Settings.php:2167
4176
  msgid "Enable User Profile Page indexing"
4177
  msgstr ""
4178
 
4179
+ #: classes/Settings.php:2175
4180
  msgid "Enable Forums Sitemap"
4181
  msgstr ""
4182
 
4183
+ #: classes/Settings.php:2183
4184
  msgid "Enable Topics Sitemap"
4185
  msgstr ""
4186
 
4187
+ #: classes/Settings.php:2191
4188
  msgid "Enable Members Sitemap"
4189
  msgstr ""
4190
 
4191
+ #: classes/Settings.php:2200
4192
  msgid "Allowed dofollow domains"
4193
  msgstr ""
4194
 
4195
+ #: classes/Settings.php:2202
4196
  msgid ""
4197
  "wpForo adds nofollow to all links with external URLs. If you want to keep some "
4198
  "domains as internal please insert domains one per line in the textarea bellow."
4199
  msgstr ""
4200
 
4201
+ #: classes/Settings.php:2209
4202
  msgid "Noindex forum page URLs"
4203
  msgstr ""
4204
 
4205
+ #: classes/Settings.php:2211
4206
  msgid ""
4207
  "The noIndex code tells Google and other search engines to NOT index the page, "
4208
  "so that it cannot be found in search results. Please insert page URLs you do "
4209
  "not want to be indexed one per line in the textarea bellow."
4210
  msgstr ""
4211
 
4212
+ #: classes/Settings.php:2218
4213
  msgid "Spam Protection"
4214
  msgstr ""
4215
 
4216
+ #: classes/Settings.php:2221
4217
  msgid ""
4218
  "Here you can find many ways to protect your forum from spammers. Most of them "
4219
  "are already configured and enabled with default values. You can make spam "
4222
  "Akismet."
4223
  msgstr ""
4224
 
4225
+ #: classes/Settings.php:2232
4226
  msgid "Enable wpForo Spam Control"
4227
  msgstr ""
4228
 
4229
+ #: classes/Settings.php:2240
4230
  msgid "Ban user when spam is suspected"
4231
  msgstr ""
4232
 
4233
+ #: classes/Settings.php:2250
4234
  msgid "Spam Suspicion Level for Topics"
4235
  msgstr ""
4236
 
4237
+ #: classes/Settings.php:2260
4238
  msgid "Spam Suspicion Level for Posts"
4239
  msgstr ""
4240
 
4241
+ #: classes/Settings.php:2269
4242
  msgid "User is New (under hard spam control) during first [X] posts"
4243
  msgstr ""
4244
 
4245
+ #: classes/Settings.php:2277
4246
  msgid "Posts must be manually approved"
4247
  msgstr ""
4248
 
4249
+ #: classes/Settings.php:2286
4250
  msgid "Min number of posts to be able to edit profile information"
4251
  msgstr ""
4252
 
4253
+ #: classes/Settings.php:2295
4254
  msgid "Min number of posts to be able to attach files"
4255
  msgstr ""
4256
 
4257
+ #: classes/Settings.php:2304
4258
  msgid "Min number of posts to be able to post links"
4259
  msgstr ""
4260
 
4261
+ #: classes/Settings.php:2312
4262
  msgid "Do not allow attaching files with following extensions"
4263
  msgstr ""
4264
 
4265
+ #: classes/Settings.php:2320
4266
  msgid "Enable File Scanner"
4267
  msgstr ""
4268
 
4269
+ #: classes/Settings.php:2328
4270
  msgid "Exclude file extensions"
4271
  msgstr ""
4272
 
4273
+ #: classes/Settings.php:2337 includes/hooks.php:2682
4274
  msgid "Google reCAPTCHA"
4275
  msgstr ""
4276
 
4277
+ #: classes/Settings.php:2340
4278
  msgid ""
4279
  "reCAPTCHA protects you against spam and other types of automated abuse. It "
4280
  "makes secure topic and post editors when Guest Posting is allowed, also it "
4282
  "built-in reCAPTCHA version 2, \"I'm not a robot\" checkbox."
4283
  msgstr ""
4284
 
4285
+ #: classes/Settings.php:2351
4286
  msgid "reCAPTCHA API Keys"
4287
  msgstr ""
4288
 
4289
+ #: classes/Settings.php:2351
4290
  msgid "(version 2, \"I'm not a robot\" checkbox)"
4291
  msgstr ""
4292
 
4293
+ #: classes/Settings.php:2353
4294
  msgid ""
4295
  "To start using reCAPTCHA, you need to sign up for an API key pair for your "
4296
  "site."
4297
  msgstr ""
4298
 
4299
+ #: classes/Settings.php:2353
4300
  msgid "Register your site and get API keys here &raquo;"
4301
  msgstr ""
4302
 
4303
+ #: classes/Settings.php:2376
4304
  msgid "reCAPTCHA Theme"
4305
  msgstr ""
4306
 
4307
+ #: classes/Settings.php:2388
4308
  msgid "Guest Topic Editor"
4309
  msgstr ""
4310
 
4311
+ #: classes/Settings.php:2396
4312
  msgid "Guest Post Editor"
4313
  msgstr ""
4314
 
4315
+ #: classes/Settings.php:2404
4316
  msgid "wpForo Login Form"
4317
  msgstr ""
4318
 
4319
+ #: classes/Settings.php:2412
4320
  msgid "wpForo Registration Form"
4321
  msgstr ""
4322
 
4323
+ #: classes/Settings.php:2420
4324
  msgid "wpForo Reset Password Form"
4325
  msgstr ""
4326
 
4327
+ #: classes/Settings.php:2428
4328
  msgid "WordPress Login Form"
4329
  msgstr ""
4330
 
4331
+ #: classes/Settings.php:2436
4332
  msgid "WordPress Registration Form"
4333
  msgstr ""
4334
 
4335
+ #: classes/Settings.php:2444
4336
  msgid "WordPress Reset Password Form"
4337
  msgstr ""
4338
 
4339
+ #: classes/Settings.php:2453
4340
  msgid "Akismet Antispam Integration"
4341
  msgstr ""
4342
 
4343
+ #: classes/Settings.php:2456
4344
  msgid ""
4345
  "Akismet checks your forum posts with authors form submissions against their "
4346
  "global database of spam to prevent your site from publishing malicious "
4348
  "Control more intuitive and productive."
4349
  msgstr ""
4350
 
4351
+ #: classes/Settings.php:2467
4352
  msgid "Enable Akismet Integration"
4353
  msgstr ""
4354
 
4355
+ #: classes/Settings.php:2469
4356
  msgid ""
4357
  "Please make sure the Akismet plugin installed and the Akismet API keys are "
4358
  "configured."
4359
  msgstr ""
4360
 
4361
+ #: classes/Settings.php:2476
4362
  msgid "Forum Feed / RSS"
4363
  msgstr ""
4364
 
4365
+ #: classes/Settings.php:2479
4366
  msgid ""
4367
  "RSS (Rich Site Summary; originally RDF Site Summary; often called Really "
4368
  "Simple Syndication) uses a family of standard web feed formats to publish "
4371
  "post  titles/links/excerpt publishing date and author’s name."
4372
  msgstr ""
4373
 
4374
+ #: classes/Settings.php:2490 includes/phrases.php:887
4375
  msgid "Enable RSS Feed"
4376
  msgstr ""
4377
 
4378
+ #: classes/Settings.php:2498
4379
  msgid "Enable General RSS Feed"
4380
  msgstr ""
4381
 
4382
+ #: classes/Settings.php:2506
4383
  msgid "Enable Forum RSS Feed"
4384
  msgstr ""
4385
 
4386
+ #: classes/Settings.php:2514
4387
  msgid "Enable Topic RSS Feed"
4388
  msgstr ""
4389
 
4390
+ #: classes/Settings.php:2523
4391
  msgid "Social Share"
4392
  msgstr ""
4393
 
4394
+ #: classes/Settings.php:2526
4395
  msgid ""
4396
  "Here you can find social network sharing options. wpForo allows sharing almost "
4397
  "all forum content (forums, topics, posts individually). The share button style "
4399
  "type, location, etc..."
4400
  msgstr ""
4401
 
4402
+ #: classes/Settings.php:2536
4403
  msgid "Active Share Buttons"
4404
  msgstr ""
4405
 
4406
+ #: classes/Settings.php:2538
4407
  msgid ""
4408
  "Check the checkbox share options to activate. Please note, that the Facebook "
4409
  "share button cannot be activated without Facebook API ID. Please follow to the "
4412
  "button."
4413
  msgstr ""
4414
 
4415
+ #: classes/Settings.php:2544
4416
  msgid "Enable General Share Buttons"
4417
  msgstr ""
4418
 
4419
+ #: classes/Settings.php:2546
4420
  msgid ""
4421
  "General share buttons are forum and topic sharing buttons. They are located on "
4422
  "the top and the bottom of each page. You can manage location of these buttons "
4423
  "using 'Share Buttons Location' options below."
4424
  msgstr ""
4425
 
4426
+ #: classes/Settings.php:2552
4427
  msgid "Enable Post Sharing Toggle"
4428
  msgstr ""
4429
 
4430
+ #: classes/Settings.php:2560
4431
  msgid "General Share Buttons Color"
4432
  msgstr ""
4433
 
4434
+ #: classes/Settings.php:2572
4435
  msgid "General Share Buttons Type"
4436
  msgstr ""
4437
 
4438
+ #: classes/Settings.php:2586
4439
  msgid ""
4440
  "Post sharing toggle allows you to share posts individually. You can see post "
4441
  "sharing toggles on the left, right side or in top bar of each post. The toggle "
4445
  "original colors on mouse hover."
4446
  msgstr ""
4447
 
4448
+ #: classes/Settings.php:2592
4449
  msgid "Post Sharing Toggle View"
4450
  msgstr ""
4451
 
4452
+ #: classes/Settings.php:2604
4453
  msgid "Post Sharing Toggle Icon"
4454
  msgstr ""
4455
 
4456
+ #: classes/Settings.php:2616
4457
  msgid "General Share Button Locations"
4458
  msgstr ""
4459
 
4460
+ #: classes/Settings.php:2618
4461
  msgid ""
4462
  "The general share buttons can be displayed on both (top and bottom) locations."
4463
  msgstr ""
4464
 
4465
+ #: classes/Settings.php:2623
4466
  msgid "Post Sharing Toggle Locations"
4467
  msgstr ""
4468
 
4469
+ #: classes/Settings.php:2625
4470
  msgid ""
4471
  "The post sharing toggle can be displayed either on the left side or on the top "
4472
  "of each post."
4473
  msgstr ""
4474
 
4475
+ #: classes/Settings.php:2632
4476
  msgid "BuddyPress Integration"
4477
  msgstr ""
4478
 
4479
+ #: classes/Settings.php:2635
4480
  msgid ""
4481
  "wpForo is well integrated with BuddyPress and with all plugins and themes "
4482
  "based on BuddyPress. The integration includes changing forum profile page URL "
4484
  "BuddyPress profile page."
4485
  msgstr ""
4486
 
4487
+ #: classes/Settings.php:2646
4488
  msgid "BuddyPress Activity Integration"
4489
  msgstr ""
4490
 
4491
+ #: classes/Settings.php:2648
4492
  msgid ""
4493
  "Posts members activity (new topic, new reply, post like) to BuddyPress Profile "
4494
  "Activity page."
4495
  msgstr ""
4496
 
4497
+ #: classes/Settings.php:2654
4498
  msgid "BuddyPress Notification Integration"
4499
  msgstr ""
4500
 
4501
+ #: classes/Settings.php:2656
4502
  msgid ""
4503
  "Creates notification on new forum reply in BuddyPress Profile Notification "
4504
  "page."
4505
  msgstr ""
4506
 
4507
+ #: classes/Settings.php:2662
4508
  msgid "BuddyPress Profile Forum Tab Integration"
4509
  msgstr ""
4510
 
4511
+ #: classes/Settings.php:2664
4512
  msgid ""
4513
  "Adds 'Forums' tab with 'Created Topics', 'Posted Replies', 'Liked Posts' and "
4514
  "'Subscriptions' sub-tabs to BuddyPress Profile page."
4515
  msgstr ""
4516
 
4517
+ #: classes/Settings.php:2671
4518
  msgid "Ultimate Members Integration"
4519
  msgstr ""
4520
 
4521
+ #: classes/Settings.php:2674
4522
  msgid ""
4523
  "wpForo is well integrated with Ultimate Members plugin. The integration "
4524
  "includes changing forum profile page URL to Ultimate Members profile page URL, "
4526
  "Ultimate Members' Real-time Notifications addon."
4527
  msgstr ""
4528
 
4529
+ #: classes/Settings.php:2685
4530
  msgid "Ultimate Member Notification Integration"
4531
  msgstr ""
4532
 
4533
+ #: classes/Settings.php:2687
4534
  msgid ""
4535
  "Creates notification on new forum reply in Ultimate Member Real-time "
4536
  "Notification system. This integration requires"
4537
  msgstr ""
4538
 
4539
+ #: classes/Settings.php:2687
4540
  msgid "plugin."
4541
  msgstr ""
4542
 
4543
+ #: classes/Settings.php:2693
4544
  msgid "Ultimate Member Profile Forum Tab Integration"
4545
  msgstr ""
4546
 
4547
+ #: classes/Settings.php:2695
4548
  msgid ""
4549
  "Adds 'Forums' tab with 'Created Topics', 'Posted Replies', 'Liked Posts' and "
4550
  "'Subscriptions' sub-tabs to Ultimate Member Profile page."
4551
  msgstr ""
4552
 
4553
+ #: classes/Settings.php:2702
4554
  msgid "Privacy & Forum Rules"
4555
  msgstr ""
4556
 
4557
+ #: classes/Settings.php:2715
4558
  msgid "Contact Information"
4559
  msgstr ""
4560
 
4561
+ #: classes/Settings.php:2717
4562
  msgid ""
4563
  "According to the GDPR, all users should have an option to contact website "
4564
  "administrator in following cases: "
4565
  msgstr ""
4566
 
4567
+ #: classes/Settings.php:2717
4568
  msgid "Obtain personal data and created content"
4569
  msgstr ""
4570
 
4571
+ #: classes/Settings.php:2717
4572
  msgid "Delete account with created content"
4573
  msgstr ""
4574
 
4575
+ #: classes/Settings.php:2717
4576
  msgid "Report user data access and control issue"
4577
  msgstr ""
4578
 
4579
+ #: classes/Settings.php:2717
4580
  msgid "Report user rights violation"
4581
  msgstr ""
4582
 
4583
+ #: classes/Settings.php:2720
4584
  msgid "URL to contact forum administrator"
4585
  msgstr ""
4586
 
4587
+ #: classes/Settings.php:2724
4588
  msgid "Checkbox: I Accept Website Terms and Privacy Policy"
4589
  msgstr ""
4590
 
4591
+ #: classes/Settings.php:2726
4592
  msgid ""
4593
  "If this option is enabled, users must accept forum Terms and Privacy Policy by "
4594
  "checking the required checkbox on registration form to be able create a forum "
4595
  "account. The checkbox label can be managed in Forums > Phrases admin page."
4596
  msgstr ""
4597
 
4598
+ #: classes/Settings.php:2732
4599
  msgid "Checkbox: I Agree to Receive an Email Confirmation"
4600
  msgstr ""
4601
 
4602
+ #: classes/Settings.php:2734
4603
  msgid ""
4604
  "If this option is enabled, users must agree to receive an email confirmation "
4605
  "with a link to set a password by checking the required checkbox on "
4607
  "managed in Forums > Phrases admin page."
4608
  msgstr ""
4609
 
4610
+ #: classes/Settings.php:2740
4611
  msgid "Page URL to Website Terms"
4612
  msgstr ""
4613
 
4614
+ #: classes/Settings.php:2742
4615
  msgid ""
4616
  "Please insert URLs to your website Terms and Conditions. Links to these pages "
4617
  "will be included in registration form checkbox label (I'm agree with website "
4618
  "terms and privacy policy)."
4619
  msgstr ""
4620
 
4621
+ #: classes/Settings.php:2745
4622
  msgid "Page URL to website terms"
4623
  msgstr ""
4624
 
4625
+ #: classes/Settings.php:2749
4626
  msgid "Page URL to Website Privacy Policy"
4627
  msgstr ""
4628
 
4629
+ #: classes/Settings.php:2751
4630
  msgid ""
4631
  "Please insert URLs to your website Terms and Privacy Policy pages. Links to "
4632
  "these pages will be included in registration form checkbox label (I'm agree "
4635
  "your website main Privacy Policy. Thus it should be linked to according pages."
4636
  msgstr ""
4637
 
4638
+ #: classes/Settings.php:2754
4639
  msgid "Page URL to website privacy policy"
4640
  msgstr ""
4641
 
4642
+ #: classes/Settings.php:2758
4643
  msgid "Checkbox: I Agree to Forum Privacy Policy"
4644
  msgstr ""
4645
 
4646
+ #: classes/Settings.php:2760
4647
  msgid ""
4648
  "If this option is enabled, users must accept forum Terms and Privacy Policy by "
4649
  "checking the required checkbox on registration form to be able create a forum "
4650
  "account. The checkbox label can be managed in Forums > Phrases admin page"
4651
  msgstr ""
4652
 
4653
+ #: classes/Settings.php:2769
4654
  msgid "Forum Privacy Policy with GDPR compliant Template"
4655
  msgstr ""
4656
 
4657
+ #: classes/Settings.php:2771
4658
  msgid ""
4659
  "This is an example of forum Privacy Policy with GDPR compliant. It adapted to "
4660
  "wpForo plugin functions and features. <u>In case you enable this privacy "
4668
  "privacy policy page for website please add a link to that page."
4669
  msgstr ""
4670
 
4671
+ #: classes/Settings.php:2776
4672
  msgid "Checkbox: I Agree to create a forum account on Facebook Login"
4673
  msgstr ""
4674
 
4675
+ #: classes/Settings.php:2778
4676
  msgid ""
4677
  "If this option is enabled, the Facebook Login button becomes not-clickable "
4678
  "until user accept automatic account creation process based on his/her Facebook "
4680
  "displayed with Facebook Login button to comply with the GDPR"
4681
  msgstr ""
4682
 
4683
+ #: classes/Settings.php:2778
4684
  msgid ""
4685
  "The note text and the label of this checkbox can be managed in Forums &gt; "
4686
  "Phrases admin page. Search the label phrase, click on edit button and change "
4687
  "it."
4688
  msgstr ""
4689
 
4690
+ #: classes/Settings.php:2784
4691
  msgid "Forum Cookies"
4692
  msgstr ""
4693
 
4694
+ #: classes/Settings.php:2786
4695
  msgid ""
4696
  "Please note, that this option is only related to wpForo cookies. This doesn't "
4697
  "disable WordPress and other plugins cookies. wpForo stores a small amount of "
4704
  "these fields when he/she posts a new reply or creates a new topic."
4705
  msgstr ""
4706
 
4707
+ #: classes/Settings.php:2792
4708
  msgid "Checkbox: I Accept Forum Rules"
4709
  msgstr ""
4710
 
4711
+ #: classes/Settings.php:2794
4712
  msgid ""
4713
  "If this option is enabled, users must accept forum rules by checking the "
4714
  "required checkbox on registration form to be able create a forum account. The "
4716
  "Search the label phrase, click on edit button and change it."
4717
  msgstr ""
4718
 
4719
+ #: classes/Settings.php:2803
4720
  msgid "Forum Rules Text"
4721
  msgstr ""
4722
 
4723
+ #: classes/Settings.php:2805
4724
  msgid "This is a basic example of forum rules provided by"
4725
  msgstr ""
4726
 
4727
+ #: classes/Settings.php:2805
4728
  msgid "You should edit this text and adapt it to your community rules."
4729
  msgstr ""
4730
 
4731
+ #: classes/Settings.php:3065
4732
  msgid "TB"
4733
  msgstr ""
4734
 
4735
+ #: classes/Settings.php:3070
4736
  msgid "GB"
4737
  msgstr ""
4738
 
4739
+ #: classes/Settings.php:3075 includes/phrases.php:352
4740
  msgid "MB"
4741
  msgstr ""
4742
 
4743
+ #: classes/Settings.php:3080
4744
  msgid "KB"
4745
  msgstr ""
4746
 
4747
+ #: classes/Settings.php:3085
4748
  msgid "B"
4749
  msgstr ""
4750
 
4751
+ #: classes/Settings.php:3104
4752
  msgid "Min Allowed Size is "
4753
  msgstr ""
4754
 
4755
+ #: classes/Settings.php:3105
4756
  msgid "Max Allowed Size is "
4757
  msgstr ""
4758
 
4759
+ #: classes/Settings.php:3106 includes/phrases.php:474
4760
  msgid "Server \"upload_max_filesize\" is "
4761
  msgstr ""
4762
 
4763
+ #: classes/Settings.php:3107 includes/phrases.php:473
4764
  msgid "Server \"post_max_size\" is "
4765
  msgstr ""
4766
 
4767
+ #: classes/Settings.php:3113
4768
  msgid "Minute"
4769
  msgstr ""
4770
 
4771
+ #: classes/Settings.php:3325 includes/hooks.php:1551 includes/phrases.php:433
4772
  msgid "Rating Level"
4773
  msgstr ""
4774
 
4775
+ #: classes/Settings.php:3326
4776
  msgid "Min Number of Points"
4777
  msgstr ""
4778
 
4779
+ #: classes/Settings.php:3327 includes/phrases.php:362
4780
  msgid "Member Title"
4781
  msgstr ""
4782
 
4783
+ #: classes/Settings.php:3328 includes/phrases.php:479
4784
  msgid "Short Badge"
4785
  msgstr ""
4786
 
4787
+ #: classes/Settings.php:3329 includes/phrases.php:314
4788
  msgid "Full Badge"
4789
  msgstr ""
4790
 
4791
+ #: classes/Settings.php:3330 includes/phrases.php:431
4792
  msgid "Rating Color"
4793
  msgstr ""
4794
 
4795
+ #: classes/Settings.php:3331 includes/phrases.php:432
4796
  msgid "Rating Icon"
4797
  msgstr ""
4798
 
4799
+ #: classes/Settings.php:3333 includes/phrases.php:373
4800
  msgid "More"
4801
  msgstr ""
4802
 
4803
+ #: classes/Settings.php:3338 includes/hooks.php:1564 includes/phrases.php:344
4804
  msgid "Level"
4805
  msgstr ""
4806
 
4807
+ #: classes/Settings.php:3342 includes/phrases.php:397
4808
  msgid "Number of Posts"
4809
  msgstr ""
4810
 
4811
+ #: classes/Settings.php:3348 includes/phrases.php:249
4812
  msgid "Custom Title"
4813
  msgstr ""
4814
 
4815
+ #: classes/Settings.php:3369 includes/phrases.php:234
4816
  msgid "Badge Icon"
4817
  msgstr ""
4818
 
4819
+ #: classes/Settings.php:3824 includes/installation.php:549
4820
+ #: includes/installation.php:1479 includes/options-migration.php:19
4821
  #: includes/options-migration.php:98 includes/phrases.php:287
4822
  msgid "Forum"
4823
  msgstr ""
4824
 
4825
+ #: classes/Settings.php:3830 includes/options-migration.php:111
4826
  msgid "Forum Post Report"
4827
  msgstr ""
4828
 
4829
+ #: classes/Settings.php:3831 includes/options-migration.php:112
4830
  msgid ""
4831
  "<strong>Report details:</strong>\n"
4832
  " Reporter: [reporter], <br>\n"
4835
  " [post_url]"
4836
  msgstr ""
4837
 
4838
+ #: classes/Settings.php:3833 includes/options-migration.php:114
4839
  msgid "[blogname] New User Registration"
4840
  msgstr ""
4841
 
4842
+ #: classes/Settings.php:3834 includes/options-migration.php:115
4843
  msgid ""
4844
  "New user registration on your site [blogname]:\n"
4845
  "\n"
4848
  "Email: [user_email]\n"
4849
  msgstr ""
4850
 
4851
+ #: classes/Settings.php:3836 includes/options-migration.php:117
4852
  msgid "[blogname] Your username and password info"
4853
  msgstr ""
4854
 
4855
+ #: classes/Settings.php:3837 includes/options-migration.php:118
4856
  msgid ""
4857
  "Username: [user_login]\n"
4858
  "\n"
4862
  "\n"
4863
  msgstr ""
4864
 
4865
+ #: classes/Settings.php:3839 includes/options-migration.php:120
4866
  msgid ""
4867
  "Hello! \n"
4868
  "\n"
4879
  " Thanks!"
4880
  msgstr ""
4881
 
4882
+ #: classes/Settings.php:3840
4883
+ msgid "[blogname] - Your Account Has been Approved"
4884
+ msgstr ""
4885
+
4886
+ #: classes/Settings.php:3841
4887
+ msgid ""
4888
+ "Hi [user_login] , Thank you for your registration. Your account has been "
4889
+ "approved. Your can login here: [login_link]"
4890
+ msgstr ""
4891
+
4892
+ #: classes/Settings.php:3849 includes/options-migration.php:103
4893
  msgid "Please confirm subscription to [entry_title]"
4894
  msgstr ""
4895
 
4896
+ #: classes/Settings.php:3850
4897
  msgid ""
4898
  "Hello [user_display_name]!<br>\n"
4899
  " Thank you for subscribing.<br>\n"
4904
  " [confirm_link]"
4905
  msgstr ""
4906
 
4907
+ #: classes/Settings.php:3851 includes/options-migration.php:105
4908
  msgid "New Topic"
4909
  msgstr ""
4910
 
4911
+ #: classes/Settings.php:3852
4912
  msgid ""
4913
  "Hello [user_display_name]!<br>\n"
4914
  " New topic has been created on your subscribed forum - [forum_link].\n"
4922
  " [unsubscribe_link]"
4923
  msgstr ""
4924
 
4925
+ #: classes/Settings.php:3853 includes/options-migration.php:107
4926
  #: includes/phrases.php:1071
4927
  msgid "New Reply"
4928
  msgstr ""
4929
 
4930
+ #: classes/Settings.php:3854
4931
  msgid ""
4932
  "Hello [user_display_name]!<br>\n"
4933
  " New reply has been posted on your subscribed topic - [topic_link].\n"
4941
  " [unsubscribe_link]"
4942
  msgstr ""
4943
 
4944
+ #: classes/Settings.php:3855 includes/options-migration.php:122
4945
  msgid "You have been mentioned in forum post"
4946
  msgstr ""
4947
 
4948
+ #: classes/Settings.php:3856
4949
  msgid ""
4950
  "Hi [user_display_name]! <br>\n"
4951
  "\n"
4955
  " [post_link]"
4956
  msgstr ""
4957
 
4958
+ #: classes/Settings.php:3857
4959
  msgid "New Post from [owner_display_name]"
4960
  msgstr ""
4961
 
4962
+ #: classes/Settings.php:3858
4963
  msgid ""
4964
  "Hello [user_display_name]!<br>\n"
4965
  " New content has been posted by [owner_display_name] you are following.\n"
4973
  " [unsubscribe_link]"
4974
  msgstr ""
4975
 
4976
+ #: classes/Template.php:851
4977
  msgid "Insert link"
4978
  msgstr ""
4979
 
4980
+ #: classes/Template.php:852
4981
  msgid "Link Text"
4982
  msgstr ""
4983
 
4984
+ #: classes/Template.php:853
4985
  msgid "Open link in a new tab"
4986
  msgstr ""
4987
 
4988
+ #: classes/Template.php:854
4989
  msgid "Insert Spoiler"
4990
  msgstr ""
4991
 
4992
+ #: classes/Template.php:855 includes/phrases.php:1214
4993
  msgid "Spoiler"
4994
  msgstr ""
4995
 
5093
  msgid "wpForo Menu"
5094
  msgstr ""
5095
 
5096
+ #: includes/functions-template.php:2244
5097
  msgid "No Title"
5098
  msgstr ""
5099
 
5244
  msgid "Apply"
5245
  msgstr ""
5246
 
5247
+ #: includes/functions.php:1260
5248
  #, php-format
5249
  msgid "Could not write file %s"
5250
  msgstr ""
5263
  msgid "Uninstall"
5264
  msgstr ""
5265
 
5266
+ #: includes/hooks.php:1271
5267
  msgid "Clear"
5268
  msgstr ""
5269
 
5270
+ #: includes/hooks.php:1273
5271
  msgid "Select Color"
5272
  msgstr ""
5273
 
5274
+ #: includes/hooks.php:1280 includes/phrases.php:183
5275
  msgid "Move"
5276
  msgstr ""
5277
 
5278
+ #: includes/hooks.php:1298
5279
  msgid "Please choose one reasons before sending a feedback!"
5280
  msgstr ""
5281
 
5282
+ #: includes/hooks.php:1300
5283
  msgid ""
5284
  "With the email address, please check the \"I agree to receive email\" checkbox "
5285
  "to proceed."
5286
  msgstr ""
5287
 
5288
+ #: includes/hooks.php:1301
5289
  msgid "Please fill your email address for feedback"
5290
  msgstr ""
5291
 
5292
+ #: includes/hooks.php:1302
5293
  msgid "Your email address is not valid"
5294
  msgstr ""
5295
 
5296
+ #: includes/hooks.php:1371
5297
  msgid ""
5298
  "IMPORTANT: wpForo can't work with default permalink, please change permalink "
5299
  "structure"
5300
  msgstr ""
5301
 
5302
+ #: includes/hooks.php:1456
5303
  msgid "Forum Profile Fields - wpForo"
5304
  msgstr ""
5305
 
5306
+ #: includes/hooks.php:1465
5307
  msgid "Forum - Usergroup"
5308
  msgstr ""
5309
 
5310
+ #: includes/hooks.php:1470
5311
  #, php-format
5312
  msgid ""
5313
  "Forum Usergroups are synched with User Roles based on the %s. When you change "
5314
  "this user Role the Usergroup is automatically changed according to that table."
5315
  msgstr ""
5316
 
5317
+ #: includes/hooks.php:1477
5318
  msgid "Synced with user role"
5319
  msgstr ""
5320
 
5321
+ #: includes/hooks.php:1482
5322
  msgid "Role-Usergroup Synchronization is Turned ON!"
5323
  msgstr ""
5324
 
5325
+ #: includes/hooks.php:1485
5326
  msgid ""
5327
  "This user Usergroup is automatically changed according to current Role. If you "
5328
  "want to disable Role-Usergroup synchronization and manage Usergroups and User "
5330
  "admin page and disable \"Role-Usergroup Synchronization\" option."
5331
  msgstr ""
5332
 
5333
+ #: includes/hooks.php:1499
5334
  msgid "Forum - Secondary Usergroups"
5335
  msgstr ""
5336
 
5337
+ #: includes/hooks.php:1523
5338
  msgid "Forum - User Timezone"
5339
  msgstr ""
5340
 
5341
+ #: includes/hooks.php:1534
5342
  msgid "User Reputation"
5343
  msgstr ""
5344
 
5345
+ #: includes/hooks.php:1536
5346
  msgid ""
5347
  "By default all members get rating badges and titles based on number of posts. "
5348
  "However, using this option you can grant lower or higher rating to certain "
5350
  "be managed in Forums > Settings > Members Tab."
5351
  msgstr ""
5352
 
5353
+ #: includes/hooks.php:1541
5354
  msgid "Default Rating"
5355
  msgstr ""
5356
 
5357
+ #: includes/hooks.php:1544
5358
  msgid "Custom Rating"
5359
  msgstr ""
5360
 
5361
+ #: includes/hooks.php:1552 includes/phrases.php:865
5362
  msgid "Rating Title"
5363
  msgstr ""
5364
 
5365
+ #: includes/hooks.php:1553 includes/phrases.php:430
5366
  msgid "Rating Badge"
5367
  msgstr ""
5368
 
5369
+ #: includes/hooks.php:2192 includes/hooks.php:2240 includes/hooks.php:2376
5370
+ #: includes/hooks.php:2444
5371
  msgid "Add New Forum"
5372
  msgstr ""
5373
 
5374
+ #: includes/hooks.php:2199 includes/hooks.php:2383
5375
  msgid "Add New User Group"
5376
  msgstr ""
5377
 
5378
+ #: includes/hooks.php:2206 includes/hooks.php:2324 includes/hooks.php:2390
5379
+ #: includes/hooks.php:2487
5380
  msgid "Add New Phrase"
5381
  msgstr ""
5382
 
5383
+ #: includes/hooks.php:2215 includes/hooks.php:2427
5384
  msgid "Visit Forum"
5385
  msgstr ""
5386
 
5387
+ #: includes/hooks.php:2308 includes/hooks.php:2540
5388
  msgid "Add New Usergroup"
5389
  msgstr ""
5390
 
5391
+ #: includes/hooks.php:2508
5392
  msgid "Add New Board"
5393
  msgstr ""
5394
 
5395
+ #: includes/hooks.php:2681 includes/phrases.php:1086
5396
  #, php-format
5397
  msgid ""
5398
  "IMPORTANT! The forum registration form is probably under risk of spam attacks. "
5402
  "dismiss this message."
5403
  msgstr ""
5404
 
5405
+ #: includes/hooks.php:2711
5406
  msgid "wpForo Polls addon is disabled!"
5407
  msgstr ""
5408
 
5409
+ #: includes/hooks.php:2711
5410
  msgid ""
5411
  " Your addon version is not compatible with the current version of wpForo. "
5412
  "Please update the addon or downgrade wpForo to 1.7.7"
5413
  msgstr ""
5414
 
5415
+ #: includes/hooks.php:2712
5416
  msgid "dismiss"
5417
  msgstr ""
5418
 
5419
+ #: includes/installation.php:444
5420
  msgid "Start Profile Synchronization"
5421
  msgstr ""
5422
 
5423
+ #: includes/installation.php:444
5424
  msgid "Continue Synchronization"
5425
  msgstr ""
5426
 
5427
+ #: includes/installation.php:447
5428
  msgid ""
5429
  "This process may take a few seconds or dozens of minutes, please be patient "
5430
  "and don't close this page."
5431
  msgstr ""
5432
 
5433
+ #: includes/installation.php:448
5434
  msgid "You can permanently disable this message using this documentation"
5435
  msgstr ""
5436
 
5437
+ #: includes/installation.php:450
5438
  msgid "wpForo Forum Installation | "
5439
  msgstr ""
5440
 
5441
+ #: includes/installation.php:451
5442
  msgid ""
5443
  "Forum users' profile data are not synchronized yet, this step is required! "
5444
  "Please click the button below to complete installation."
5445
  msgstr ""
5446
 
5447
+ #: includes/installation.php:459
5448
  msgid "wpForo Database Update Problem - Action Required!"
5449
  msgstr ""
5450
 
5451
+ #: includes/installation.php:460
5452
  msgid ""
5453
  "Forum database is not updated properly. Please click the button below for "
5454
  "further instruction."
5455
  msgstr ""
5456
 
5457
+ #: includes/installation.php:471
5458
  msgid "Exclude forum page(s) from"
5459
  msgstr ""
5460
 
5461
+ #: includes/installation.php:471
5462
  msgid "plugin"
5463
  msgstr ""
5464
 
5465
+ #: includes/installation.php:475
5466
  #, php-format
5467
  msgid ""
5468
  "If you have already excluded the forum page from your cache plugin please "
5469
  "ignore and close this message using the top %s (x) button."
5470
  msgstr ""
5471
 
5472
+ #: includes/installation.php:475
5473
  msgid "left"
5474
  msgstr ""
5475
 
5476
+ #: includes/installation.php:475
5477
  msgid "right"
5478
  msgstr ""
5479
 
5480
+ #: includes/installation.php:476
5481
  msgid "Please find more information here: "
5482
  msgstr ""
5483
 
5484
+ #: includes/installation.php:477
5485
  msgid " and "
5486
  msgstr ""
5487
 
5488
+ #: includes/installation.php:477
5489
  msgid "conflict"
5490
  msgstr ""
5491
 
5492
+ #: includes/installation.php:477
5493
  msgid "Action Required!"
5494
  msgstr ""
5495
 
5496
+ #: includes/installation.php:478
5497
  msgid ""
5498
  "Please exclude the forum page from your cache plugin! wpForo has a built-in "
5499
  "cache system. It does dynamic cache of all forum pages, which will be affected "
5501
  "The user login and logout actions will also be corrupted."
5502
  msgstr ""
5503
 
5504
+ #: includes/installation.php:550 includes/installation.php:1480
5505
  #: includes/options-migration.php:20
5506
  msgid "Discussion Board"
5507
  msgstr ""
5508
 
5509
+ #: includes/installation.php:1178
5510
  msgid "Main Category"
5511
  msgstr ""
5512
 
5513
+ #: includes/installation.php:1178
5514
  msgid "This is a simple category / section"
5515
  msgstr ""
5516
 
5517
+ #: includes/installation.php:1179
5518
  msgid "Main Forum"
5519
  msgstr ""
5520
 
5521
+ #: includes/installation.php:1179
5522
  msgid "This is a simple parent forum"
5523
  msgstr ""
5524
 
6504
  msgid "Dismiss this notice."
6505
  msgstr ""
6506
 
6507
+ #: includes/phrases.php:256
6508
  msgid "Display Avatars"
6509
  msgstr ""
6510
 
6511
+ #: includes/phrases.php:258
6512
  msgid "Display with Avatars"
6513
  msgstr ""
6514
 
6815
  msgid "My Profile"
6816
  msgstr ""
6817
 
6818
+ #: includes/phrases.php:377 wpforo.php:308
6819
  msgid ""
6820
  "NOTE: If you're going to add widgets in this sidebar, please use 'Full Width' "
6821
  "template for wpForo index page to avoid sidebar duplication."
6849
  msgid "No topics were found here"
6850
  msgstr ""
6851
 
6852
+ #: includes/phrases.php:396 widgets/OnlineMembers.php:97
6853
+ #: widgets/RecentPosts.php:294 widgets/RecentTopics.php:205 widgets/Tags.php:97
6854
  msgid "Number of Items"
6855
  msgstr ""
6856
 
7470
  msgid "wpForo Navigation"
7471
  msgstr ""
7472
 
7473
+ #: includes/phrases.php:596 wpforo.php:307
7474
  msgid "wpForo Sidebar"
7475
  msgstr ""
7476
 
9316
  msgid "Role-Usergroup synchronization is complete!"
9317
  msgstr ""
9318
 
 
 
 
 
9319
  #: includes/phrases.php:1205
9320
  msgid "Secondary Usergroup"
9321
  msgstr ""
9476
  msgid "Search Forums..."
9477
  msgstr ""
9478
 
9479
+ #: integrations/UltimateMember.php:49 integrations/UltimateMember.php:432
9480
  msgid "User leaves a reply to wpForo topic"
9481
  msgstr ""
9482
 
9483
+ #: integrations/UltimateMember.php:51 integrations/UltimateMember.php:434
9484
  msgid "When a member replies to one of my forum topics"
9485
  msgstr ""
9486
 
9487
+ #: integrations/UltimateMember.php:54 integrations/UltimateMember.php:437
9488
  msgid "User replied to wpForo post"
9489
  msgstr ""
9490
 
9491
+ #: integrations/UltimateMember.php:56 integrations/UltimateMember.php:439
9492
  msgid "When a member replies to one of my post in forum topics"
9493
  msgstr ""
9494
 
9495
+ #: integrations/UltimateMember.php:433
9496
  msgid ""
9497
  "<strong>{member}</strong> has <strong>replied</strong> to a topic you started "
9498
  "on the forum."
9499
  msgstr ""
9500
 
9501
+ #: integrations/UltimateMember.php:438
9502
  msgid ""
9503
  "<strong>{member}</strong> has <strong>replied</strong> to your post on the "
9504
  "forum."
9521
  "Forums &raquo; Moderation admin page."
9522
  msgstr ""
9523
 
9524
+ #: widgets/Forums.php:97
9525
  msgid "Display as dropdown"
9526
  msgstr ""
9527
 
9528
+ #: widgets/OnlineMembers.php:22
9529
+ msgid "Online Members"
9530
+ msgstr ""
9531
+
9532
+ #: widgets/OnlineMembers.php:91
9533
  msgid "User Groups"
9534
  msgstr ""
9535
 
9536
+ #: widgets/OnlineMembers.php:101 widgets/RecentPosts.php:305
9537
+ #: widgets/RecentTopics.php:209
9538
+ msgid "Display with avatars"
9539
+ msgstr ""
9540
+
9541
+ #: widgets/OnlineMembers.php:110 widgets/RecentPosts.php:339
9542
+ #: widgets/RecentTopics.php:227
9543
+ msgid "Auto Refresh Interval Seconds"
9544
+ msgstr ""
9545
+
9546
+ #: widgets/OnlineMembers.php:112 widgets/RecentPosts.php:302
9547
+ #: widgets/RecentPosts.php:341 widgets/RecentTopics.php:229
9548
+ msgid "Set 0 to disable autorefresh"
9549
+ msgstr ""
9550
+
9551
  #: widgets/Profile.php:130
9552
  msgid "Title for Users"
9553
  msgstr ""
9580
  msgid "Hide this widget for guests"
9581
  msgstr ""
9582
 
9583
+ #: widgets/RecentPosts.php:41 widgets/RecentTopics.php:37
9584
  msgid "Created Date"
9585
  msgstr ""
9586
 
9587
+ #: widgets/RecentPosts.php:42 widgets/RecentTopics.php:38
9588
  msgid "Modified Date"
9589
  msgstr ""
9590
 
9591
+ #: widgets/RecentPosts.php:45 widgets/RecentTopics.php:43
9592
  msgid "DESC"
9593
  msgstr ""
9594
 
9595
+ #: widgets/RecentPosts.php:46 widgets/RecentTopics.php:44
9596
  msgid "ASC"
9597
  msgstr ""
9598
 
9599
+ #: widgets/RecentPosts.php:243 widgets/RecentTopics.php:164
9600
  msgid "Filter by forums"
9601
  msgstr ""
9602
 
9603
+ #: widgets/RecentPosts.php:259 widgets/RecentTopics.php:180
9604
  msgid "Autofilter by current forum"
9605
  msgstr ""
9606
 
9607
+ #: widgets/RecentPosts.php:268 widgets/RecentTopics.php:189
9608
  msgid "Order by"
9609
  msgstr ""
9610
 
9611
+ #: widgets/RecentPosts.php:286
9612
  msgid "Limit Per Topic"
9613
  msgstr ""
9614
 
9615
+ #: widgets/RecentPosts.php:291
9616
  msgid "set 0 to remove this limit"
9617
  msgstr ""
9618
 
9619
+ #: widgets/RecentPosts.php:300
9620
+ msgid "Excerpt Length"
9621
+ msgstr ""
9622
+
9623
+ #: widgets/RecentPosts.php:314
9624
+ msgid "Exclude First Posts"
9625
+ msgstr ""
9626
+
9627
+ #: widgets/RecentPosts.php:322
9628
  msgid "Display Only Unread Posts"
9629
  msgstr ""
9630
 
9631
+ #: widgets/RecentPosts.php:330
9632
  msgid "Display [new] indicator"
9633
  msgstr ""
9634
 
9635
+ #: widgets/RecentTopics.php:39
9636
  msgid "Posts Count"
9637
  msgstr ""
9638
 
9639
+ #: widgets/RecentTopics.php:40
9640
  msgid "Views Count"
9641
  msgstr ""
9642
 
9643
+ #: widgets/RecentTopics.php:218
9644
+ msgid "Refer topics to first unread post"
9645
  msgstr ""
9646
 
9647
+ #: widgets/Search.php:22
9648
+ msgid "Forum Search"
9649
  msgstr ""
9650
 
9651
+ #: widgets/Tags.php:88
9652
  msgid "Topic Counts"
9653
  msgstr ""
9654
 
modules/mentioning/classes/Actions.php CHANGED
@@ -69,7 +69,7 @@ class Actions {
69
  'itemid' => ( wpfval( $item, 'postid' ) ? $item['postid'] : $item['first_postid'] ),
70
  'userid' => $user['userid'],
71
  'content' => ( wpfval( $item, 'body' ) ? $item['body'] : $item['title'] ),
72
- 'permalink' => ( wpfval( $item, 'posturl' ) ? $item['posturl'] : $item['topicurl'] ),
73
  ];
74
  WPF()->activity->add_notification( 'new_mention', $args );
75
  }
69
  'itemid' => ( wpfval( $item, 'postid' ) ? $item['postid'] : $item['first_postid'] ),
70
  'userid' => $user['userid'],
71
  'content' => ( wpfval( $item, 'body' ) ? $item['body'] : $item['title'] ),
72
+ 'permalink' => ( wpfval( $item, 'posturl' ) ? $item['posturl'] : ( wpfval($item, 'topicurl' ) ?: WPF()->topic->get_url( $item ) ) ),
73
  ];
74
  WPF()->activity->add_notification( 'new_mention', $args );
75
  }
modules/reactions/Reactions.php CHANGED
@@ -5,377 +5,554 @@ namespace wpforo\modules\reactions;
5
  use stdClass;
6
  use wpforo\modules\reactions\classes\Template;
7
  use wpforo\modules\reactions\classes\Actions;
 
8
 
9
  // Exit if accessed directly
10
  if( ! defined( 'ABSPATH' ) ) exit;
11
 
12
  class Reactions {
13
- public $default;
14
- /* @var Template */ public $Template;
15
- /* @var Actions */ public $Actions;
16
-
17
- public function __construct() {
18
- $this->init_defaults();
19
- $this->init_classes();
20
- }
21
-
22
- private function init_classes() {
23
- $this->Template = new Template();
24
- $this->Actions = new Actions();
25
- }
26
-
27
- static public function get_types(){
28
- return (array) apply_filters( 'wpforo_reactions_set_types', [
29
- 'up' => [
30
- 'label' => wpforo_phrase( 'Like', false ),
31
- 'icon' => sprintf( '<i class="far fa-thumbs-up" title="%1$s"></i>', wpforo_phrase( 'Like', false ) ),
32
- 'color' => '#3f7796',
33
- 'reaction' => 1,
34
- ],
35
- 'down' => [
36
- 'label' => wpforo_phrase( 'Dislike', false ),
37
- 'icon' => sprintf( '<i class="far fa-thumbs-down" title="%1$s"></i>', wpforo_phrase( 'Dislike', false ) ),
38
- 'color' => '#f42d2c',
39
- 'reaction' => - 1,
40
- ],
41
- ] );
42
- }
43
-
44
- static public function get_type_list() {
45
- return array_keys( self::get_types() );
46
- }
47
-
48
- private function init_defaults() {
49
- $this->default = new stdClass();
50
- $this->default->reaction = [
51
- 'reactionid' => 0,
52
- 'userid' => 0,
53
- 'postid' => 0,
54
- 'post_userid' => 0,
55
- 'reaction' => 1,
56
- 'type' => 'up',
57
- 'name' => '',
58
- 'email' => '',
59
- ];
60
- $this->default->reaction_format = [
61
- 'reactionid' => '%d',
62
- 'userid' => '%d',
63
- 'postid' => '%d',
64
- 'post_userid' => '%d',
65
- 'reaction' => '%d',
66
- 'type' => '%s',
67
- 'name' => '%s',
68
- 'email' => '%s',
69
- ];
70
- $this->default->sql_select_args = [
71
- 'reactionid' => null,
72
- 'userid' => null,
73
- 'postid' => null,
74
- 'postid_include' => [],
75
- 'postid_exclude' => [],
76
- 'post_userid' => null,
77
- 'reaction_include' => [],
78
- 'reaction_exclude' => [],
79
- 'type_include' => [],
80
- 'type_exclude' => [],
81
- 'name' => null,
82
- 'email' => null,
83
- 'orderby' => null,
84
- 'offset' => null,
85
- 'row_count' => null,
86
- ];
87
- }
88
-
89
- /**
90
- * @param $reaction
91
- *
92
- * @return array
93
- */
94
- public function decode( $reaction ) {
95
- $reaction = array_merge( $this->default->reaction, (array) $reaction );
96
- $reaction['reactionid'] = wpforo_bigintval( $reaction['reactionid'] );
97
- $reaction['userid'] = wpforo_bigintval( $reaction['userid'] );
98
- $reaction['postid'] = wpforo_bigintval( $reaction['postid'] );
99
- $reaction['post_userid'] = wpforo_bigintval( $reaction['post_userid'] );
100
- $reaction['reaction'] = intval( $reaction['reaction'] );
101
- $reaction['name'] = trim( strip_tags( $reaction['name'] ) );
102
- $reaction['email'] = sanitize_email( $reaction['email'] );
103
- if( ! ( $reaction['type'] = trim( strip_tags( $reaction['type'] ) ) ) ) $reaction['type'] = 'up';
104
-
105
- return $reaction;
106
- }
107
-
108
- /**
109
- * @param $reaction
110
- *
111
- * @return array
112
- */
113
- private function encode( $reaction ) {
114
- return $this->decode( $reaction );
115
- }
116
-
117
- /**
118
- * @param $reaction
119
- *
120
- * @return false|int
121
- */
122
- public function add( $reaction ) {
123
- $reaction = $this->encode( $reaction );
124
- unset( $reaction['reactionid'] );
125
- $reaction = wpforo_array_ordered_intersect_key( $reaction, $this->default->reaction_format );
126
- if( WPF()->db->insert(
127
- WPF()->tables->reactions,
128
- $reaction,
129
- wpforo_array_ordered_intersect_key( $this->default->reaction_format, $reaction )
130
- ) ) {
131
- $reaction['reactionid'] = WPF()->db->insert_id;
132
- do_action( 'wpforo_after_add_reaction', $reaction );
133
-
134
- return $reaction['reactionid'];
135
- }
136
-
137
- return false;
138
- }
139
-
140
- /**
141
- * @param array $fields
142
- * @param array|int $where
143
- * @param string $table
144
- *
145
- * @return bool
146
- */
147
- public function edit( $fields, $where, $table = '' ) {
148
- if( is_numeric( $where ) ) $where = [ 'reactionid' => wpforo_bigintval( $where ) ];
149
- $fields = wpforo_array_ordered_intersect_key( $fields, $this->default->reaction_format );
150
- if( false !== WPF()->db->update(
151
- $table ?: WPF()->tables->reactions,
152
- $fields = wpforo_array_ordered_intersect_key( $this->encode( $fields ), $fields ),
153
- $where = wpforo_array_ordered_intersect_key( $where, $this->default->reaction_format ),
154
- wpforo_array_ordered_intersect_key( $this->default->reaction_format, $fields ),
155
- wpforo_array_ordered_intersect_key( $this->default->reaction_format, $where )
156
- ) ) {
157
- do_action( 'wpforo_after_edit_reaction', $fields, $where );
158
-
159
- return true;
160
- }
161
-
162
- return false;
163
- }
164
-
165
- public function edit_for_all_active_boards( $fields, $where ) {
166
- foreach( WPF()->get_active_boards_tables( 'reactions' ) as $table ) $this->edit( $fields, $where, $table );
167
- }
168
-
169
- /**
170
- * @param array|int $args
171
- * @param string $operator
172
- * @param string $table
173
- *
174
- * @return bool
175
- */
176
- public function delete( $args, $operator = 'AND', $table = '' ) {
177
- if( is_numeric( $args ) ) $args = [ 'reactionid' => wpforo_bigintval( $args ) ];
178
- $operator = trim( strtoupper( $operator ) );
179
- if( ! in_array( $operator, [ 'AND', 'OR' ], true ) ) $operator = 'AND';
180
-
181
- do_action( 'wpforo_before_delete_reaction', $args, $operator );
182
-
183
- $sql = "DELETE FROM " . ( $table ?: WPF()->tables->reactions );
184
- if( $wheres = $this->build_sql_wheres( $args ) ) $sql .= " WHERE " . implode( " $operator ", $wheres );
185
-
186
- $args = $this->parse_args( $args );
187
- if( $args['orderby'] ) $sql .= " ORDER BY " . $args['orderby'];
188
- if( $args['row_count'] ) $sql .= " LIMIT " . intval( $args['row_count'] );
189
-
190
- $r = WPF()->db->query( $sql );
191
-
192
- do_action( 'wpforo_after_delete_reaction', $args, $operator );
193
-
194
- return false !== $r;
195
- }
196
-
197
- public function delete_for_all_active_boards( $args, $operator = 'AND' ) {
198
- foreach( WPF()->get_active_boards_tables( 'reactions' ) as $table ) $this->delete( $args, $operator, $table );
199
- }
200
-
201
- private function parse_args( $args ) {
202
- $args = wpforo_parse_args( $args, $this->default->sql_select_args );
203
- $args = wpforo_array_ordered_intersect_key( $args, $this->default->sql_select_args );
204
- $args['postid_include'] = wpforo_parse_args( $args['postid_include'] );
205
- $args['postid_exclude'] = wpforo_parse_args( $args['postid_exclude'] );
206
- $args['reaction_include'] = wpforo_parse_args( $args['reaction_include'] );
207
- $args['reaction_exclude'] = wpforo_parse_args( $args['reaction_exclude'] );
208
- $args['type_include'] = wpforo_parse_args( $args['type_include'] );
209
- $args['type_exclude'] = wpforo_parse_args( $args['type_exclude'] );
210
- $args['orderby'] = sanitize_sql_orderby( $args['orderby'] );
211
-
212
- return $args;
213
- }
214
-
215
- private function build_sql_wheres( $args ) {
216
- $args = $this->parse_args( $args );
217
- $wheres = [];
218
-
219
- if( ! is_null( $args['reactionid'] ) ) $wheres[] = "`reactionid` = '" . wpforo_bigintval( $args['reactionid'] ) . "'";
220
- if( ! is_null( $args['userid'] ) ) $wheres[] = "`userid` = '" . wpforo_bigintval( $args['userid'] ) . "'";
221
- if( ! is_null( $args['postid'] ) ) $wheres[] = "`postid` = '" . wpforo_bigintval( $args['postid'] ) . "'";
222
- if( ! is_null( $args['post_userid'] ) ) $wheres[] = "`post_userid` = '" . wpforo_bigintval( $args['post_userid'] ) . "'";
223
-
224
- if( ! is_null( $args['name'] ) ) $wheres[] = "`name` = '" . esc_sql( $args['name'] ) . "'";
225
- if( ! is_null( $args['email'] ) ) $wheres[] = "`email` = '" . esc_sql( $args['email'] ) . "'";
226
-
227
- if( ! empty( $args['postid_include'] ) ) $wheres[] = "`postid` IN(" . implode( ',', array_map( 'wpforo_bigintval', $args['postid_include'] ) ) . ")";
228
- if( ! empty( $args['postid_exclude'] ) ) $wheres[] = "`postid` NOT IN(" . implode( ',', array_map( 'wpforo_bigintval', $args['postid_exclude'] ) ) . ")";
229
-
230
- if( ! empty( $args['reaction_include'] ) ) $wheres[] = "`reaction` IN(" . implode( ',', array_map( 'intval', $args['reaction_include'] ) ) . ")";
231
- if( ! empty( $args['reaction_exclude'] ) ) $wheres[] = "`reaction` NOT IN(" . implode( ',', array_map( 'intval', $args['reaction_exclude'] ) ) . ")";
232
-
233
- if( ! empty( $args['type_include'] ) ) $wheres[] = "`type` IN('" . implode( "','", array_map( 'trim', $args['type_include'] ) ) . "')";
234
- if( ! empty( $args['type_exclude'] ) ) $wheres[] = "`type` NOT IN(" . implode( "','", array_map( 'trim', $args['type_exclude'] ) ) . "')";
235
-
236
- return $wheres;
237
- }
238
-
239
- /**
240
- * @param $args
241
- * @param $select
242
- * @param $operator
243
- *
244
- * @return string
245
- */
246
- private function build_sql_select( $args, $select = '', $operator = 'AND' ) {
247
- if( ! $select ) $select = '*';
248
- $operator = trim( strtoupper( $operator ) );
249
- if( ! in_array( $operator, [ 'AND', 'OR' ], true ) ) $operator = 'AND';
250
-
251
- $sql = "SELECT $select FROM " . WPF()->tables->reactions;
252
- if( $wheres = $this->build_sql_wheres( $args ) ) $sql .= " WHERE " . implode( " $operator ", $wheres );
253
-
254
- $args = $this->parse_args( $args );
255
- if( $args['orderby'] ) $sql .= " ORDER BY " . $args['orderby'];
256
- if( $args['row_count'] ) $sql .= " LIMIT " . intval( $args['offset'] ) . "," . intval( $args['row_count'] );
257
-
258
- return $sql;
259
- }
260
-
261
- /**
262
- * @param array|numeric $args
263
- *
264
- * @return array
265
- */
266
- public function _get_reaction( $args, $operator = 'AND' ) {
267
- if( is_numeric( $args ) ) $args = [ 'reactionid' => wpforo_bigintval( $args ) ];
268
- if( ! wpfkey( $args, 'orderby' ) ) $args['orderby'] = '`reactionid` DESC';
269
- $reaction = (array) WPF()->db->get_row( $this->build_sql_select( $args, '', $operator ), ARRAY_A );
270
- if( $reaction ) $reaction = $this->decode( $reaction );
271
-
272
- return $reaction;
273
- }
274
-
275
- public function get_reaction( $args, $operator = 'AND' ) {
276
- return wpforo_ram_get( [ $this, '_get_reaction' ], $args, $operator );
277
- }
278
-
279
- /**
280
- * @param array $args
281
- *
282
- * @return array
283
- */
284
- public function _get_reactions( $args = [], $operator = 'AND' ) {
285
- return array_map( [ $this, 'decode' ], (array) WPF()->db->get_results( $this->build_sql_select( $args, '', $operator ), ARRAY_A ) );
286
- }
287
-
288
- public function get_reactions( $args = [], $operator = 'AND' ) {
289
- return wpforo_ram_get( [ $this, '_get_reactions' ], $args, $operator );
290
- }
291
-
292
- public function _get_reactions_col( $col, $args = [], $operator = 'AND' ){
293
- $r = WPF()->db->get_col( $this->build_sql_select( $args, "`$col`", $operator ) );
294
- if( $this->default->reaction_format[$col] === '%d' ) $r = array_map( 'wpforo_bigintval', $r );
295
- return $r;
296
- }
297
-
298
- public function get_reactions_col( $col, $args = [], $operator = 'AND' ){
299
- return wpforo_ram_get( [ $this, '_get_reactions_col' ], $col, $args, $operator );
300
- }
301
-
302
- /**
303
- * @param array $args
304
- *
305
- * @return int
306
- */
307
- public function _get_count( $args = [], $operator = 'AND' ) {
308
- return (int) WPF()->db->get_var( $this->build_sql_select( $args, 'COUNT(*)', $operator ) );
309
- }
310
-
311
- public function get_count( $args = [], $operator = 'AND' ) {
312
- return wpforo_ram_get( [$this, '_get_count'], $args, $operator );
313
- }
314
-
315
- /**
316
- * @param array|int $args
317
- *
318
- * @return int
319
- */
320
- public function get_sum( $args = [], $operator = 'AND' ) {
321
- if( is_numeric( $args ) ) $args = [ 'postid' => wpforo_bigintval( $args ) ];
322
- return (int) WPF()->db->get_var( $this->build_sql_select( $args, 'SUM(`reaction`)', $operator ) );
323
- }
324
-
325
- public function get_reacted_count( $userid, $types = [] ){
326
- return $this->get_count( [ 'userid' => $userid, 'type_include' => $types ] );
327
- }
328
-
329
- public function get_received_reactions_count( $userid, $types = [] ){
330
- return $this->get_count( [ 'post_userid' => $userid, 'type_include' => $types ] );
331
- }
332
-
333
- public function get_post_reactions_count( $postid, $types = [] ) {
334
- return $this->get_count( [ 'postid' => $postid, 'type_include' => $types ] );
335
- }
336
-
337
- public function get_post_reactions_user_dnames( $postid ) {
338
- return WPF()->db->get_results(
339
- WPF()->db->prepare(
340
- "SELECT u.`ID` as userid, u.`display_name`
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
341
  FROM `" . WPF()->db->users . "` u
342
  INNER JOIN `" . WPF()->tables->reactions . "` r ON r.`userid` = u.`ID`
343
  WHERE r.`postid` = %d
344
  ORDER BY r.`userid` = %d DESC, r.`reactionid` DESC LIMIT 3",
345
- $postid,
346
- WPF()->current_userid
347
- ),
348
- ARRAY_A
349
- );
350
- }
351
-
352
- public function get_user_reaction( $postid, $userid = 0 ){
353
- if( ! ( $userid = wpforo_bigintval( $userid ) ) ) {
354
- $userid = WPF()->current_userid;
355
- }
356
- if( $reaction = $this->get_reaction( ['postid' => $postid, 'userid' => $userid] ) ) return $reaction;
357
- return null;
358
- }
359
-
360
- public function get_user_reaction_reaction( $postid, $userid = 0 ){
361
- $reaction = $this->get_user_reaction( $postid, $userid );
362
- return wpfval( $reaction, 'reaction' );
363
- }
364
-
365
- public function is_reacted( $postid, $userid = 0, $type = [] ) {
366
- if( ! ( $userid = wpforo_bigintval( $userid ) ) ) {
367
- $userid = WPF()->current_userid;
368
- }
369
- return (bool) $this->get_reaction( ['postid' => $postid, 'userid' => $userid, 'type_include' => (array) $type] );
370
- }
371
-
372
- public function get_likes_for_topic( $topicid ) {
373
- if( $postids = WPF()->topic->get_postids( $topicid ) ){
374
- return $this->get_sum([
375
- 'postid_include' => $postids,
376
- 'type_include' => ['up', 'down'],
 
377
  ]);
378
- }
379
- return 0;
380
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
381
  }
5
  use stdClass;
6
  use wpforo\modules\reactions\classes\Template;
7
  use wpforo\modules\reactions\classes\Actions;
8
+ use wpforo\wpforo;
9
 
10
  // Exit if accessed directly
11
  if( ! defined( 'ABSPATH' ) ) exit;
12
 
13
  class Reactions {
14
+ public $default;
15
+ /* @var Template */ public $Template;
16
+ /* @var Actions */ public $Actions;
17
+
18
+ public function __construct() {
19
+ $this->init_defaults();
20
+ $this->init_classes();
21
+ }
22
+
23
+ private function init_classes() {
24
+ $this->Template = new Template();
25
+ $this->Actions = new Actions();
26
+ }
27
+
28
+ static public function get_types(){
29
+ return (array) apply_filters( 'wpforo_reactions_set_types', [
30
+ 'up' => [
31
+ 'label' => wpforo_phrase( 'Like', false ),
32
+ 'icon' => sprintf( '<i class="far fa-thumbs-up" title="%1$s"></i>', wpforo_phrase( 'Like', false ) ),
33
+ 'color' => '#3f7796',
34
+ 'reaction' => 1,
35
+ ],
36
+ 'down' => [
37
+ 'label' => wpforo_phrase( 'Dislike', false ),
38
+ 'icon' => sprintf( '<i class="far fa-thumbs-down" title="%1$s"></i>', wpforo_phrase( 'Dislike', false ) ),
39
+ 'color' => '#f42d2c',
40
+ 'reaction' => - 1,
41
+ ],
42
+ ] );
43
+ }
44
+
45
+ static public function get_type_list() {
46
+ return array_keys( self::get_types() );
47
+ }
48
+
49
+ private function init_defaults() {
50
+ $this->default = new stdClass();
51
+ $this->default->reaction = [
52
+ 'reactionid' => 0,
53
+ 'userid' => 0,
54
+ 'postid' => 0,
55
+ 'post_userid' => 0,
56
+ 'reaction' => 1,
57
+ 'type' => 'up',
58
+ 'name' => '',
59
+ 'email' => '',
60
+ ];
61
+ $this->default->reaction_format = [
62
+ 'reactionid' => '%d',
63
+ 'userid' => '%d',
64
+ 'postid' => '%d',
65
+ 'post_userid' => '%d',
66
+ 'reaction' => '%d',
67
+ 'type' => '%s',
68
+ 'name' => '%s',
69
+ 'email' => '%s',
70
+ ];
71
+ $this->default->sql_select_args = [
72
+ 'reactionid' => null,
73
+ 'userid' => null,
74
+ 'postid' => null,
75
+ 'postid_include' => [],
76
+ 'postid_exclude' => [],
77
+ 'post_userid' => null,
78
+ 'reaction_include' => [],
79
+ 'reaction_exclude' => [],
80
+ 'type_include' => [],
81
+ 'type_exclude' => [],
82
+ 'name' => null,
83
+ 'email' => null,
84
+ 'orderby' => null,
85
+ 'offset' => null,
86
+ 'row_count' => null,
87
+ ];
88
+ }
89
+
90
+ /**
91
+ * @param $reaction
92
+ *
93
+ * @return array
94
+ */
95
+ public function decode( $reaction ) {
96
+ $reaction = array_merge( $this->default->reaction, (array) $reaction );
97
+ $reaction['reactionid'] = wpforo_bigintval( $reaction['reactionid'] );
98
+ $reaction['userid'] = wpforo_bigintval( $reaction['userid'] );
99
+ $reaction['postid'] = wpforo_bigintval( $reaction['postid'] );
100
+ $reaction['post_userid'] = wpforo_bigintval( $reaction['post_userid'] );
101
+ $reaction['reaction'] = intval( $reaction['reaction'] );
102
+ $reaction['name'] = trim( strip_tags( $reaction['name'] ) );
103
+ $reaction['email'] = sanitize_email( $reaction['email'] );
104
+ if( ! ( $reaction['type'] = trim( strip_tags( $reaction['type'] ) ) ) ) $reaction['type'] = 'up';
105
+
106
+ return $reaction;
107
+ }
108
+
109
+ public function decode_item( $reaction ) {
110
+ if( isset($reaction['reactionid']) ) $reaction['reactionid'] = wpforo_bigintval( $reaction['reactionid'] );
111
+ if( isset($reaction['userid']) ) $reaction['userid'] = wpforo_bigintval( $reaction['userid'] );
112
+ if( isset($reaction['postid']) ) $reaction['postid'] = wpforo_bigintval( $reaction['postid'] );
113
+ if( isset($reaction['post_userid']) ) $reaction['post_userid'] = wpforo_bigintval( $reaction['post_userid'] );
114
+ if( isset($reaction['reaction']) ) $reaction['reaction'] = intval( $reaction['reaction'] );
115
+ if( isset($reaction['name']) ) $reaction['name'] = trim( strip_tags( $reaction['name'] ) );
116
+ if( isset($reaction['email']) ) $reaction['email'] = sanitize_email( $reaction['email'] );
117
+ if( isset($reaction['type']) ) {
118
+ if( ! ( $reaction['type'] = trim( strip_tags( $reaction['type'] ) ) ) ) $reaction['type'] = 'up';
119
+ }
120
+ return $reaction;
121
+ }
122
+
123
+ /**
124
+ * @param $reaction
125
+ *
126
+ * @return array
127
+ */
128
+ private function encode( $reaction ) {
129
+ return $this->decode( $reaction );
130
+ }
131
+
132
+ /**
133
+ * @param $reaction
134
+ *
135
+ * @return false|int
136
+ */
137
+ public function add( $reaction ) {
138
+ $reaction = $this->encode( $reaction );
139
+ unset( $reaction['reactionid'] );
140
+ $reaction = wpforo_array_ordered_intersect_key( $reaction, $this->default->reaction_format );
141
+ if( WPF()->db->insert(
142
+ WPF()->tables->reactions,
143
+ $reaction,
144
+ wpforo_array_ordered_intersect_key( $this->default->reaction_format, $reaction )
145
+ ) ) {
146
+ $reaction['reactionid'] = WPF()->db->insert_id;
147
+ do_action( 'wpforo_after_add_reaction', $reaction );
148
+ if( wpfval( $fields, 'postid' ) ) {
149
+ $this->create_reaction_cache( $reaction['postid'] );
150
+ }
151
+ return $reaction['reactionid'];
152
+ }
153
+
154
+ return false;
155
+ }
156
+
157
+ /**
158
+ * @param array $fields
159
+ * @param array|int $where
160
+ * @param string $table
161
+ *
162
+ * @return bool
163
+ */
164
+ public function edit( $fields, $where, $table = '' ) {
165
+ if( is_numeric( $where ) ) $where = [ 'reactionid' => wpforo_bigintval( $where ) ];
166
+ $fields = wpforo_array_ordered_intersect_key( $fields, $this->default->reaction_format );
167
+ if( false !== WPF()->db->update(
168
+ $table ?: WPF()->tables->reactions,
169
+ $fields = wpforo_array_ordered_intersect_key( $this->encode( $fields ), $fields ),
170
+ $where = wpforo_array_ordered_intersect_key( $where, $this->default->reaction_format ),
171
+ wpforo_array_ordered_intersect_key( $this->default->reaction_format, $fields ),
172
+ wpforo_array_ordered_intersect_key( $this->default->reaction_format, $where )
173
+ ) ) {
174
+ do_action( 'wpforo_after_edit_reaction', $fields, $where );
175
+ if( wpfval( $fields, 'postid' ) ) {
176
+ wpforo_clean_cache( 'reaction', $fields['postid'] );
177
+ }
178
+ return true;
179
+ }
180
+
181
+ return false;
182
+ }
183
+
184
+ public function edit_for_all_active_boards( $fields, $where ) {
185
+ foreach( WPF()->get_active_boards_tables( 'reactions' ) as $table ) $this->edit( $fields, $where, $table );
186
+ }
187
+
188
+ /**
189
+ * @param array|int $args
190
+ * @param string $operator
191
+ * @param string $table
192
+ *
193
+ * @return bool
194
+ */
195
+ public function delete( $args, $operator = 'AND', $table = '' ) {
196
+ if( is_numeric( $args ) ) $args = [ 'reactionid' => wpforo_bigintval( $args ) ];
197
+ $operator = trim( strtoupper( $operator ) );
198
+ if( ! in_array( $operator, [ 'AND', 'OR' ], true ) ) $operator = 'AND';
199
+
200
+ do_action( 'wpforo_before_delete_reaction', $args, $operator );
201
+
202
+ $sql = "DELETE FROM " . ( $table ?: WPF()->tables->reactions );
203
+ if( $wheres = $this->build_sql_wheres( $args ) ) $sql .= " WHERE " . implode( " $operator ", $wheres );
204
+
205
+ $args = $this->parse_args( $args );
206
+ if( $args['orderby'] ) $sql .= " ORDER BY " . $args['orderby'];
207
+ if( $args['row_count'] ) $sql .= " LIMIT " . intval( $args['row_count'] );
208
+
209
+ $r = WPF()->db->query( $sql );
210
+
211
+ do_action( 'wpforo_after_delete_reaction', $args, $operator );
212
+
213
+ if( wpfval( $args, 'postid' ) ) wpforo_clean_cache( 'reaction', $args['postid'] );
214
+
215
+ return false !== $r;
216
+ }
217
+
218
+ public function delete_for_all_active_boards( $args, $operator = 'AND' ) {
219
+ foreach( WPF()->get_active_boards_tables( 'reactions' ) as $table ) $this->delete( $args, $operator, $table );
220
+ }
221
+
222
+ private function parse_args( $args ) {
223
+ $args = wpforo_parse_args( $args, $this->default->sql_select_args );
224
+ $args = wpforo_array_ordered_intersect_key( $args, $this->default->sql_select_args );
225
+ $args['postid_include'] = wpforo_parse_args( $args['postid_include'] );
226
+ $args['postid_exclude'] = wpforo_parse_args( $args['postid_exclude'] );
227
+ $args['reaction_include'] = wpforo_parse_args( $args['reaction_include'] );
228
+ $args['reaction_exclude'] = wpforo_parse_args( $args['reaction_exclude'] );
229
+ $args['type_include'] = wpforo_parse_args( $args['type_include'] );
230
+ $args['type_exclude'] = wpforo_parse_args( $args['type_exclude'] );
231
+ $args['orderby'] = sanitize_sql_orderby( $args['orderby'] );
232
+
233
+ return $args;
234
+ }
235
+
236
+ private function build_sql_wheres( $args ) {
237
+ $args = $this->parse_args( $args );
238
+ $wheres = [];
239
+
240
+ if( ! is_null( $args['reactionid'] ) ) $wheres[] = "`reactionid` = '" . wpforo_bigintval( $args['reactionid'] ) . "'";
241
+ if( ! is_null( $args['userid'] ) ) $wheres[] = "`userid` = '" . wpforo_bigintval( $args['userid'] ) . "'";
242
+ if( ! is_null( $args['postid'] ) ) $wheres[] = "`postid` = '" . wpforo_bigintval( $args['postid'] ) . "'";
243
+ if( ! is_null( $args['post_userid'] ) ) $wheres[] = "`post_userid` = '" . wpforo_bigintval( $args['post_userid'] ) . "'";
244
+
245
+ if( ! is_null( $args['name'] ) ) $wheres[] = "`name` = '" . esc_sql( $args['name'] ) . "'";
246
+ if( ! is_null( $args['email'] ) ) $wheres[] = "`email` = '" . esc_sql( $args['email'] ) . "'";
247
+
248
+ if( ! empty( $args['postid_include'] ) ) $wheres[] = "`postid` IN(" . implode( ',', array_map( 'wpforo_bigintval', $args['postid_include'] ) ) . ")";
249
+ if( ! empty( $args['postid_exclude'] ) ) $wheres[] = "`postid` NOT IN(" . implode( ',', array_map( 'wpforo_bigintval', $args['postid_exclude'] ) ) . ")";
250
+
251
+ if( ! empty( $args['reaction_include'] ) ) $wheres[] = "`reaction` IN(" . implode( ',', array_map( 'intval', $args['reaction_include'] ) ) . ")";
252
+ if( ! empty( $args['reaction_exclude'] ) ) $wheres[] = "`reaction` NOT IN(" . implode( ',', array_map( 'intval', $args['reaction_exclude'] ) ) . ")";
253
+
254
+ if( ! empty( $args['type_include'] ) ) $wheres[] = "`type` IN('" . implode( "','", array_map( 'trim', $args['type_include'] ) ) . "')";
255
+ if( ! empty( $args['type_exclude'] ) ) $wheres[] = "`type` NOT IN(" . implode( "','", array_map( 'trim', $args['type_exclude'] ) ) . "')";
256
+
257
+ return $wheres;
258
+ }
259
+
260
+ /**
261
+ * @param $args
262
+ * @param $select
263
+ * @param $operator
264
+ *
265
+ * @return string
266
+ */
267
+ private function build_sql_select( $args, $select = '', $operator = 'AND' ) {
268
+ if( ! $select ) $select = '*';
269
+ $operator = trim( strtoupper( $operator ) );
270
+ if( ! in_array( $operator, [ 'AND', 'OR' ], true ) ) $operator = 'AND';
271
+
272
+ $sql = "SELECT $select FROM " . WPF()->tables->reactions;
273
+ if( $wheres = $this->build_sql_wheres( $args ) ) $sql .= " WHERE " . implode( " $operator ", $wheres );
274
+
275
+ $args = $this->parse_args( $args );
276
+ if( $args['orderby'] ) $sql .= " ORDER BY " . $args['orderby'];
277
+ if( $args['row_count'] ) $sql .= " LIMIT " . intval( $args['offset'] ) . "," . intval( $args['row_count'] );
278
+
279
+ return $sql;
280
+ }
281
+
282
+ /**
283
+ * @param array|numeric $args
284
+ *
285
+ * @return array
286
+ */
287
+ public function _get_reaction( $args, $operator = 'AND' ) {
288
+
289
+ $cache = WPF()->cache->on();
290
+ if( is_numeric( $args ) ) $args = [ 'reactionid' => wpforo_bigintval( $args ) ];
291
+
292
+ // get_reaction_cache() returns all reactions of the requested postid
293
+ // and filtered by other $args, so this function always returns
294
+ // an array of reaction arrays, example: array( [0] => array(...) )
295
+ // @TODO: currently the cache filter only works by $operator = 'AND' state
296
+ // Need to add 'OR' filter to $this->filter_reactions() function
297
+ $reactions = $this->get_reaction_cache( $args );
298
+
299
+ // $reactions can be either empty array, array of arrays or NULL
300
+ // 1. empty array: post has no reaction matched to the $args attributes
301
+ // 2. array of arrays: post has some reactions and $args matched
302
+ // 3. NULL: there is no reaction cache for this post or the cache is disabled
303
+ if( !is_null( $reactions ) ) return array_shift( $reactions );
304
+
305
+ // If there is no reaction cache it creates a new cache file
306
+ // The cache is based on postid, each cache item contains all reactions of the postid
307
+ $reactions = $this->get_post_reactions_and_cache( $args );
308
+ if( !is_null( $reactions ) ) return array_shift( $reactions );
309
+
310
+ // In case there is no postid in the $args, the original SQL query is executed
311
+ if( ! wpfkey( $args, 'orderby' ) ) $args['orderby'] = '`reactionid` DESC';
312
+ $reaction = (array) WPF()->db->get_row( $this->build_sql_select( $args, '', $operator ), ARRAY_A );
313
+ if( $reaction ) $reaction = $this->decode( $reaction );
314
+
315
+ return $reaction;
316
+ }
317
+
318
+ public function get_reaction( $args, $operator = 'AND' ) {
319
+ return wpforo_ram_get( [ $this, '_get_reaction' ], $args, $operator );
320
+ }
321
+
322
+ /**
323
+ * @param array $args
324
+ *
325
+ * @return array
326
+ */
327
+ public function _get_reactions( $args = [], $operator = 'AND' ) {
328
+ return array_map( [ $this, 'decode' ], (array) WPF()->db->get_results( $this->build_sql_select( $args, '', $operator ), ARRAY_A ) );
329
+ }
330
+
331
+ public function get_reactions( $args = [], $operator = 'AND' ) {
332
+ return wpforo_ram_get( [ $this, '_get_reactions' ], $args, $operator );
333
+ }
334
+
335
+ public function _get_reactions_col( $col, $args = [], $operator = 'AND' ){
336
+ $r = WPF()->db->get_col( $this->build_sql_select( $args, "`$col`", $operator ) );
337
+ if( $this->default->reaction_format[$col] === '%d' ) $r = array_map( 'wpforo_bigintval', $r );
338
+ return $r;
339
+ }
340
+
341
+ public function get_reactions_col( $col, $args = [], $operator = 'AND' ){
342
+ return wpforo_ram_get( [ $this, '_get_reactions_col' ], $col, $args, $operator );
343
+ }
344
+
345
+ /**
346
+ * @param array $args
347
+ *
348
+ * @return int
349
+ */
350
+ public function _get_count( $args = [], $operator = 'AND' ) {
351
+ $reactions = $this->get_reaction_cache( $args );
352
+ if( !is_null( $reactions ) ) return count( (array) $reactions );
353
+
354
+ // If there is no reaction cache it creates a new cache file
355
+ // The cache is based on postid, each cache item contains all reactions of the postid
356
+ $reactions = $this->get_post_reactions_and_cache( $args );
357
+ if( !is_null( $reactions ) ) return count( $reactions );
358
+
359
+ return (int) WPF()->db->get_var( $this->build_sql_select( $args, 'COUNT(*)', $operator ) );
360
+ }
361
+
362
+ public function get_count( $args = [], $operator = 'AND' ) {
363
+ return wpforo_ram_get( [$this, '_get_count'], $args, $operator );
364
+ }
365
+
366
+ /**
367
+ * @param array|int $args
368
+ *
369
+ * @return int
370
+ */
371
+ public function get_sum( $args = [], $operator = 'AND' ) {
372
+ if( is_numeric( $args ) ) $args = [ 'postid' => wpforo_bigintval( $args ) ];
373
+ return (int) WPF()->db->get_var( $this->build_sql_select( $args, 'SUM(`reaction`)', $operator ) );
374
+ }
375
+
376
+ public function get_reacted_count( $userid, $types = [] ){
377
+ return $this->get_count( [ 'userid' => $userid, 'type_include' => $types ] );
378
+ }
379
+
380
+ public function get_received_reactions_count( $userid, $types = [] ){
381
+ return $this->get_count( [ 'post_userid' => $userid, 'type_include' => $types ] );
382
+ }
383
+
384
+ public function get_post_reactions_count( $postid, $types = [] ) {
385
+ return $this->get_count( [ 'postid' => $postid, 'type_include' => $types ] );
386
+ }
387
+
388
+ public function get_post_reactions_user_dnames( $postid ) {
389
+ return WPF()->db->get_results(
390
+ WPF()->db->prepare(
391
+ "SELECT u.`ID` as userid, u.`display_name`
392
  FROM `" . WPF()->db->users . "` u
393
  INNER JOIN `" . WPF()->tables->reactions . "` r ON r.`userid` = u.`ID`
394
  WHERE r.`postid` = %d
395
  ORDER BY r.`userid` = %d DESC, r.`reactionid` DESC LIMIT 3",
396
+ $postid,
397
+ WPF()->current_userid
398
+ ),
399
+ ARRAY_A
400
+ );
401
+ }
402
+
403
+ public function get_user_reaction( $postid, $userid = 0 ){
404
+ if( ! ( $userid = wpforo_bigintval( $userid ) ) ) {
405
+ $userid = WPF()->current_userid;
406
+ }
407
+ $reaction = $this->get_reaction( ['postid' => $postid, 'userid' => $userid] );
408
+ if( $reaction ) return $reaction;
409
+ return null;
410
+ }
411
+
412
+ public function get_user_reaction_reaction( $postid, $userid = 0 ){
413
+ $reaction = $this->get_user_reaction( $postid, $userid );
414
+ return wpfval( $reaction, 'reaction' );
415
+ }
416
+
417
+ public function is_reacted( $postid, $userid = 0, $type = [] ) {
418
+ if( ! ( $userid = wpforo_bigintval( $userid ) ) ) {
419
+ $userid = WPF()->current_userid;
420
+ }
421
+ return (bool) $this->get_reaction( ['postid' => $postid, 'userid' => $userid, 'type_include' => (array) $type] );
422
+ }
423
+
424
+ public function get_likes_for_topic( $topicid ) {
425
+ if( $postids = WPF()->topic->get_postids( $topicid ) ){
426
+ return $this->get_sum([
427
+ 'postid_include' => $postids,
428
+ 'type_include' => ['up', 'down'],
429
  ]);
430
+ }
431
+ return 0;
432
+ }
433
+
434
+ /**
435
+ * @param array | reaction array, the postid in the array is required
436
+ *
437
+ * @return mixed | NULL: if the cache is not found | []: if there is no reaction | array( array(...), array(...) ): the reaction
438
+ */
439
+ public function get_reaction_cache( $args ){
440
+ $cache = WPF()->cache->on();
441
+ $cache_reaction = apply_filters( 'wpforo_reaction_cache', true, $args );
442
+ if( $cache && $cache_reaction && wpfval($args, 'postid') ) {
443
+ $reactions = WPF()->cache->get_item( $args['postid'], 'reaction');
444
+ if( !empty( $reactions ) ){
445
+ return $this->filter_reactions( $args, $reactions );
446
+ }
447
+ }
448
+ return NULL;
449
+ }
450
+
451
+ public function filter_reactions( $args, $reactions ){
452
+ $args = $this->decode_item( $args );
453
+
454
+ foreach( $reactions as $reaction_key => $reaction ){
455
+ $match = true;
456
+ $reaction = $this->decode_item( $reaction );
457
+
458
+ // The posts with no reactions are also cached with array(reactionid => 0) value
459
+ // This stops another sql query to check and return no value
460
+ // So in the cache files there are at least one array of reaction
461
+ // If we found this array, it means the post doesn't have reactions and [] is returned
462
+ if( wpfkey($reaction, 'reactionid') ){
463
+ if( 0 === intval($reaction['reactionid']) ){
464
+ return [];
465
+ }
466
+ }
467
+
468
+ // Filter reactions based on requested arguments
469
+ foreach( $args as $key => $value ){
470
+ if( !is_array( $value ) ){
471
+ // If even one attribute doesn't match to the
472
+ // corresponding attribute of the reaction,
473
+ // the filter loop is stopped and $match becomes false
474
+ if( $value !== $reaction[$key] ) {
475
+ $match = false; break;
476
+ }
477
+ }
478
+ else {
479
+ // -----------
480
+ if( !empty( $value ) ){
481
+ if( $key === 'reaction_include' ){
482
+ foreach( $value as $v ){
483
+ if( $v !== $reaction['reactionid'] ) {
484
+ $match = false; break 2;
485
+ }
486
+ }
487
+ }
488
+ elseif( $key === 'reaction_exclude' ){
489
+ foreach( $value as $v ){
490
+ if( $v === $reaction['reactionid'] ) {
491
+ $match = false; break 2;
492
+ }
493
+ }
494
+ }
495
+ elseif( $key === 'type_include' ){
496
+ foreach( $value as $v ){
497
+ if( $v !== $reaction['type'] ) {
498
+ $match = false; break 2;
499
+ }
500
+ }
501
+ }
502
+ elseif( $key === 'type_exclude' ){
503
+ foreach( $value as $v ){
504
+ if( $v === $reaction['type'] ) {
505
+ $match = false; break 2;
506
+ }
507
+ }
508
+ }
509
+ else {
510
+ foreach( $value as $v ){
511
+ if( $v !== $reaction[$key] ) {
512
+ $match = false; break 2;
513
+ }
514
+ }
515
+ }
516
+ }
517
+ //------------
518
+ }
519
+ }
520
+
521
+ if( !$match ) {
522
+ unset( $reactions[ $reaction_key ] );
523
+ }
524
+ }
525
+ return $reactions;
526
+ }
527
+
528
+ public function create_reaction_cache( $postid, $post_reactions = [] ){
529
+ $cache = WPF()->cache->on();
530
+ $cache_reaction = apply_filters( 'wpforo_reaction_cache', true, [ 'postid' => $postid ] );
531
+ if( $cache && $cache_reaction && $postid ){
532
+ $post_reactions = ( !empty( $post_reactions ) ) ? $post_reactions : $this->get_reactions( [ 'postid' => $postid ] );
533
+ if( empty( $post_reactions ) ) $post_reactions[0] = $this->default->reaction;
534
+ WPF()->cache->create( 'item', [ $postid => $post_reactions ], 'reaction' );
535
+ }
536
+ }
537
+
538
+ public function get_post_reactions_and_cache( $args ){
539
+ $cache = WPF()->cache->on();
540
+ // If there is no reaction cache it creates a new cache file
541
+ // The cache is based on postid, each cache item contains all reactions of the postid
542
+ if( $cache && wpfval( $args, 'postid' ) ){
543
+ //If no reaction cache found for current postid, it creates new one.
544
+ $reactions = $this->get_reactions( [ 'postid' => $args['postid'] ] );
545
+ $this->create_reaction_cache( $args['postid'], $reactions );
546
+ //The reactions of current postid are filtered for current $args
547
+ if( !empty( $reactions ) ){
548
+ $reactions = $this->filter_reactions( $args, $reactions );
549
+ if( is_array( $reactions ) && !empty( $reactions ) ) {
550
+ return array_map( function( $reaction ) { return $this->decode( $reaction ); }, $reactions );
551
+ }
552
+ } else {
553
+ return [];
554
+ }
555
+ }
556
+ return NULL;
557
+ }
558
  }
modules/subscriptions/Subscriptions.php CHANGED
@@ -330,7 +330,7 @@ class Subscriptions {
330
  if( $args['type'] === 'forum' ) {
331
  $url = WPF()->forum->get_forum_url( $args['itemid'] ) . '/';
332
  } elseif( $args['type'] === 'topic' ) {
333
- $url = WPF()->topic->get_topic_url( $args['itemid'] ) . '/';
334
  } else {
335
  $url = wpforo_home_url();
336
  }
330
  if( $args['type'] === 'forum' ) {
331
  $url = WPF()->forum->get_forum_url( $args['itemid'] ) . '/';
332
  } elseif( $args['type'] === 'topic' ) {
333
+ $url = WPF()->topic->get_url( $args['itemid'] ) . '/';
334
  } else {
335
  $url = wpforo_home_url();
336
  }
readme.txt CHANGED
@@ -2,8 +2,8 @@
2
  Contributors: gVectors Team
3
  Tags: forum, forums, forum plugin, WordPress forum plugin, community, discussion
4
  Requires at least: 5.1
5
- Tested up to: 6.0
6
- Stable tag: 2.0.9
7
  Requires PHP: 5.6 and higher
8
  License: GPLv2 or later
9
  License URI: https://www.gnu.org/licenses/gpl-2.0.html
@@ -163,6 +163,47 @@ Find wpForo forum plugin addons on [gVectors Team website...](https://gvectors.c
163
 
164
  == Changelog ==
165
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
166
  = wpForo Forum 2.0.1 - 2.0.9 | 03.08.2022 - 18.09.2022 =
167
 
168
  [wpForo Forum v2.0 Release Summary](https://wpforo.com/community/wpforo-announcements/wpforo-2-0-1-is-released/)
2
  Contributors: gVectors Team
3
  Tags: forum, forums, forum plugin, WordPress forum plugin, community, discussion
4
  Requires at least: 5.1
5
+ Tested up to: 6.1
6
+ Stable tag: 2.1.0
7
  Requires PHP: 5.6 and higher
8
  License: GPLv2 or later
9
  License URI: https://www.gnu.org/licenses/gpl-2.0.html
163
 
164
  == Changelog ==
165
 
166
+ = wpForo Forum 2.1.0 | 08.11.2022 =
167
+
168
+ [wpForo Forum v2.1.0 Release Summary](https://wpforo.com/community/wpforo-announcements/wpforo-2-1-0-is-released/)
169
+
170
+ * Added: Notification via email when the user become approved
171
+ * Added: User approval email template "subject" and "message body"
172
+ * Added: AJAX powered forum widgets
173
+ * Added: Post reactions caching (likes, dislikes)
174
+ * Added: Filter by Forums for Recent Topics widget
175
+ * Added: Filter by Forums for Recent Posts widget
176
+ * Added: Option to show only replies (skip first post) in Recent Posts widget
177
+ * Added: Option to manage post excerpt length in Recent Posts widget
178
+ * Added: Update-safe way to customize style.css of wpForo themes
179
+ * Added: Button to reset the profile cover image (delete the current one)
180
+ * Added: Insert selected quotes to the reply editor
181
+ * Added: Email shortcodes in the reset password template
182
+ * Added: Secondary usergroup in the Dashboard Members list
183
+ * Security: Strip all tags in a post reporting message
184
+ * Security: Fixed XSS vulnerability
185
+ * Security: Fixed CSRF in user deleting action
186
+ * Optimization: SQL optimization for forum statistic
187
+ * Optimization: Caching of avatar source URLs to decrease sql queries
188
+ * Filter Hook: `wpforo_topic_fields_filter` (allows filtering topic fields)
189
+ * Filter Hook: `wpforo_avatar_cache` (allows disabling avatar cache)
190
+ * Fixed Bug: PHP Warning - undefined array key "topicurl" in Actions.php
191
+ * Fixed Bug: Issue with Classic theme's "Add topic" button
192
+ * Fixed Bug: Usergroup selecting issue in Online Members widget
193
+ * Fixed Bug: Issue with Forum Tab in UM profile page
194
+ * Fixed Bug: Empty widget when recent topics are located in private forums
195
+ * Fixed Bug: Avoid "board slug duplication error" when executing db fixer SQL
196
+ * Fixed Bug: Popup message issue when unsubscribing from a forum or topic
197
+ * Fixed Bug: Banned users become active when they change their passwords
198
+ * Fixed Bug: Twitter link closing tag on profile page
199
+
200
+
201
+ IMPORTANT NOTES for UPDATE
202
+
203
+ - After the update, please delete all caches and purge CDN if you have
204
+ - After the update, please flush Redis Object Cache if you have this cache enabled
205
+
206
+
207
  = wpForo Forum 2.0.1 - 2.0.9 | 03.08.2022 - 18.09.2022 =
208
 
209
  [wpForo Forum v2.0 Release Summary](https://wpforo.com/community/wpforo-announcements/wpforo-2-0-1-is-released/)
themes/2022/members.php CHANGED
@@ -51,7 +51,7 @@ $members = WPF()->current_object['members'];
51
  <?php
52
  switch ($key){
53
  case 'facebook': echo '<a href="' . esc_url_raw($value) . '"><i class="fa-brands fa-facebook-square"></i></a>'; break;
54
- case 'twitter': echo '<a href="' . esc_url_raw($value) . '"><i class="fa-brands fa-twitter-square"></i>'; break;
55
  case 'youtube': echo '<a href="' . esc_url_raw($value) . '"><i class="fa-brands fa-youtube"></i></a>'; break;
56
  case 'vkontakte': echo '<a href="' . esc_url_raw($value) . '"><i class="fa-brands fa-vk"></i></a>'; break;
57
  case 'linkedin': echo '<a href="' . esc_url_raw($value) . '"><i class="fa-brands fa-linkedin"></i></a>'; break;
51
  <?php
52
  switch ($key){
53
  case 'facebook': echo '<a href="' . esc_url_raw($value) . '"><i class="fa-brands fa-facebook-square"></i></a>'; break;
54
+ case 'twitter': echo '<a href="' . esc_url_raw($value) . '"><i class="fa-brands fa-twitter-square"></i></a>'; break;
55
  case 'youtube': echo '<a href="' . esc_url_raw($value) . '"><i class="fa-brands fa-youtube"></i></a>'; break;
56
  case 'vkontakte': echo '<a href="' . esc_url_raw($value) . '"><i class="fa-brands fa-vk"></i></a>'; break;
57
  case 'linkedin': echo '<a href="' . esc_url_raw($value) . '"><i class="fa-brands fa-linkedin"></i></a>'; break;
themes/2022/profile-activity.php CHANGED
@@ -26,7 +26,7 @@ $activities = (array) wpfval( WPF()->current_object, 'activities' );
26
  <div class="wpf-activity-data">
27
  <div class="wpf-activity-top">
28
  <div class="wpf-activity-title">
29
- <a href="<?php echo esc_url_raw( WPF()->topic->get_topic_url( $activity['topicid'] )) ?>">
30
  <?php echo $activity['title'] ?>
31
  </a>
32
  </div>
@@ -63,7 +63,7 @@ $activities = (array) wpfval( WPF()->current_object, 'activities' );
63
  <div class="wpf-activity-data">
64
  <div class="wpf-activity-top">
65
  <div class="wpf-activity-title">
66
- <a href="<?php echo esc_url_raw( WPF()->post->get_post_url( $activity['postid'] ) ) ?>">
67
  <?php echo $activity['title'] ?>
68
  </a>
69
  <p><?php echo wpforo_text( $activity['body'], 150, false ) ?></p>
26
  <div class="wpf-activity-data">
27
  <div class="wpf-activity-top">
28
  <div class="wpf-activity-title">
29
+ <a href="<?php echo esc_url_raw( WPF()->topic->get_url( $activity['topicid'] )) ?>">
30
  <?php echo $activity['title'] ?>
31
  </a>
32
  </div>
63
  <div class="wpf-activity-data">
64
  <div class="wpf-activity-top">
65
  <div class="wpf-activity-title">
66
+ <a href="<?php echo esc_url_raw( WPF()->post->get_url( $activity['postid'] ) ) ?>">
67
  <?php echo $activity['title'] ?>
68
  </a>
69
  <p><?php echo wpforo_text( $activity['body'], 150, false ) ?></p>
themes/2022/profile-favored.php CHANGED
@@ -46,7 +46,7 @@ $posts = (array) wpfval( WPF()->current_object, 'favored_posts' );
46
  <div class="wpf-activity-data">
47
  <div class="wpf-activity-top">
48
  <div class="wpf-activity-title">
49
- <a href="<?php echo esc_url_raw( WPF()->post->get_post_url( $post['postid'] ) ) ?>">
50
  <?php echo $post['title'] ?>
51
  </a>
52
  <p><?php echo wpforo_text( $post['body'], 150, false ) ?></p>
46
  <div class="wpf-activity-data">
47
  <div class="wpf-activity-top">
48
  <div class="wpf-activity-title">
49
+ <a href="<?php echo esc_url_raw( WPF()->post->get_url( $post['postid'] ) ) ?>">
50
  <?php echo $post['title'] ?>
51
  </a>
52
  <p><?php echo wpforo_text( $post['body'], 150, false ) ?></p>
themes/2022/profile-subscriptions.php CHANGED
@@ -18,7 +18,7 @@ $subscribes = (array) wpfval( WPF()->current_object, 'subscribes' );
18
  $item_url = WPF()->forum->get_forum_url( $item['forumid'] );
19
  } elseif( $subscribe['type'] === 'topic' ) {
20
  $item = WPF()->topic->get_topic( $subscribe['itemid'] );
21
- $item_url = WPF()->topic->get_topic_url( $item['topicid'] );
22
  } elseif( in_array( $subscribe['type'], [ 'forums', 'forums-topics' ] ) ) {
23
  $item = [ 'title' => wpforo_phrase( 'All ' . $subscribe['type'], false ) ];
24
  $item_url = '#';
18
  $item_url = WPF()->forum->get_forum_url( $item['forumid'] );
19
  } elseif( $subscribe['type'] === 'topic' ) {
20
  $item = WPF()->topic->get_topic( $subscribe['itemid'] );
21
+ $item_url = WPF()->topic->get_url( $item['topicid'] );
22
  } elseif( in_array( $subscribe['type'], [ 'forums', 'forums-topics' ] ) ) {
23
  $item = [ 'title' => wpforo_phrase( 'All ' . $subscribe['type'], false ) ];
24
  $item_url = '#';
themes/2022/recent.php CHANGED
@@ -218,7 +218,7 @@ if( $type === 'topics' ) {
218
  }
219
  }
220
  $topic_url = wpforo_topic( $topic['topicid'], 'url' );
221
- $topic_posturl = ( $view == 'unread' && wpfval( $last_post, 'url' ) ) ? $last_post['url'] : WPF()->topic->get_topic_url( $topicid );
222
  $post_toglle = wpforo_setting( 'topics', 'layout_extended_intro_posts_toggle' );
223
  ?>
224
  <tr class="wpf-ttr <?php wpforo_unread( $topic['topicid'], 'topic' ); ?>">
@@ -292,7 +292,7 @@ if( $type === 'topics' ) {
292
  <?php endif; ?>
293
  </td>
294
  <td class="wpf-spost-title">
295
- <a href="<?php echo esc_url( WPF()->post->get_post_url( $postid ) ) ?>" class="wpf-spost-title-link" title="<?php wpforo_phrase( 'View entire post' ) ?>"><?php echo esc_html( $title ) ?> &nbsp;<i class="fas fa-chevron-right" style="font-size:11px;"></i></a>
296
  <p style="font-size:12px"><?php wpforo_member_link( $member, 'by' ); ?>, <?php wpforo_date( $post['created'] ); ?></p>
297
  <div class="wpf-spost-forum">
298
  <span class="wpf-spost-forum-label"><?php wpforo_phrase('Forum') ?></span>
218
  }
219
  }
220
  $topic_url = wpforo_topic( $topic['topicid'], 'url' );
221
+ $topic_posturl = ( $view == 'unread' && wpfval( $last_post, 'url' ) ) ? $last_post['url'] : WPF()->topic->get_url( $topicid );
222
  $post_toglle = wpforo_setting( 'topics', 'layout_extended_intro_posts_toggle' );
223
  ?>
224
  <tr class="wpf-ttr <?php wpforo_unread( $topic['topicid'], 'topic' ); ?>">
292
  <?php endif; ?>
293
  </td>
294
  <td class="wpf-spost-title">
295
+ <a href="<?php echo esc_url( WPF()->post->get_url( $postid ) ) ?>" class="wpf-spost-title-link" title="<?php wpforo_phrase( 'View entire post' ) ?>"><?php echo esc_html( $title ) ?> &nbsp;<i class="fas fa-chevron-right" style="font-size:11px;"></i></a>
296
  <p style="font-size:12px"><?php wpforo_member_link( $member, 'by' ); ?>, <?php wpforo_date( $post['created'] ); ?></p>
297
  <div class="wpf-spost-forum">
298
  <span class="wpf-spost-forum-label"><?php wpforo_phrase('Forum') ?></span>
themes/2022/search.php CHANGED
@@ -38,7 +38,7 @@ $posts = WPF()->current_object['posts'];
38
  <tr class="wpf-ttr">
39
  <td class="wpf-spost-icon"><i class="fas fa-comments fa-1x wpfcl-0"></i></td>
40
  <td class="wpf-spost-title">
41
- <a href="<?php echo esc_url( WPF()->post->get_post_url( $post['postid'] ) ) ?>" title="<?php wpforo_phrase( 'View entire post' ) ?>"><?php echo esc_html( $post['title'] ) ?> &nbsp;<i class="fas fa-chevron-right" style="font-size:11px;"></i></a>
42
  </td>
43
  <?php if( ! $is_tag ): ?>
44
  <td class="wpf-spost-result wpfcl-5"><?php echo( isset( $post['matches'] ) ? ceil( $post['matches'] ) : '' ) ?> <?php wpforo_phrase( 'relevance' ) ?></td>
38
  <tr class="wpf-ttr">
39
  <td class="wpf-spost-icon"><i class="fas fa-comments fa-1x wpfcl-0"></i></td>
40
  <td class="wpf-spost-title">
41
+ <a href="<?php echo esc_url( WPF()->post->get_url( $post['postid'] ) ) ?>" title="<?php wpforo_phrase( 'View entire post' ) ?>"><?php echo esc_html( $post['title'] ) ?> &nbsp;<i class="fas fa-chevron-right" style="font-size:11px;"></i></a>
42
  </td>
43
  <?php if( ! $is_tag ): ?>
44
  <td class="wpf-spost-result wpfcl-5"><?php echo( isset( $post['matches'] ) ? ceil( $post['matches'] ) : '' ) ?> <?php wpforo_phrase( 'relevance' ) ?></td>
themes/2022/style-rtl.css CHANGED
@@ -247,6 +247,9 @@ RTL Style of Classic Theme
247
  #wpforo #wpforo-wrap .wpforo-revision-body blockquote{display:block; margin:5px 0 15px 0; width:90%; padding:10px; font-size:13px;}
248
  #wpforo #wpforo-wrap .wpforo-post .wpforo-post-quote-author,
249
  #wpforo #wpforo-wrap .wpforo-revision-body .wpforo-post-quote-author{padding:5px 0; font-weight:bold;}
 
 
 
250
  #wpforo #wpforo-wrap .wpforo-post .wpforo-post-code,
251
  #wpforo #wpforo-wrap .wpforo-revision-body .wpforo-post-code{max-width:90%; overflow-x:auto; padding:5px 10px 15px 10px; margin:10px 0; font-size:12px }
252
  #wpforo #wpforo-wrap .wpforo-post code,
@@ -988,6 +991,9 @@ RTL Style of Classic Theme
988
  #wpforo #wpforo-wrap .wpforo-profile .wpforo-profile-head-panel .wpforo-profile-head-data .wpf-profile-head-right{display: flex; justify-content: flex-end; align-items: flex-end;}
989
  #wpforo #wpforo-wrap .wpforo-profile .wpforo-profile-head-panel .wpf-edit-cover{font-size: 20px; padding: 0 4px; margin: 0; line-height: 18px; color: #555; cursor: pointer;}
990
  #wpforo #wpforo-wrap .wpforo-profile .wpforo-profile-head-panel .wpf-edit-cover i{background-color: #ccc; opacity: 0.7; padding: 1px 2px; border-radius: 3px;}
 
 
 
991
  #wpforo #wpforo-wrap .wpforo-profile .wpforo-profile-head-bottom{padding: 18px 180px 0 0px; display: flex; justify-content: space-between; align-items: flex-start; width: 100%; margin-top: -12px;}
992
  #wpforo #wpforo-wrap .wpforo-profile .wpforo-profile-head-bottom .wpfp-flex{flex-grow: 1;}
993
  #wpforo #wpforo-wrap .wpforo-profile .wpforo-profile-head-bottom .wpfp-box{padding-left: 16px; margin-left: 0;}
247
  #wpforo #wpforo-wrap .wpforo-revision-body blockquote{display:block; margin:5px 0 15px 0; width:90%; padding:10px; font-size:13px;}
248
  #wpforo #wpforo-wrap .wpforo-post .wpforo-post-quote-author,
249
  #wpforo #wpforo-wrap .wpforo-revision-body .wpforo-post-quote-author{padding:5px 0; font-weight:bold;}
250
+ #wpforo #wpforo-wrap .wpforo-post .wpforo-post-quote-head,
251
+ #wpforo #wpforo-wrap .wpforo-comment .wpforo-post-quote-head,
252
+ #wpforo #wpforo-wrap .wpforo-revision-body .wpforo-post-quote-head{ display: flex; justify-content: space-between; flex-wrap: nowrap; }
253
  #wpforo #wpforo-wrap .wpforo-post .wpforo-post-code,
254
  #wpforo #wpforo-wrap .wpforo-revision-body .wpforo-post-code{max-width:90%; overflow-x:auto; padding:5px 10px 15px 10px; margin:10px 0; font-size:12px }
255
  #wpforo #wpforo-wrap .wpforo-post code,
991
  #wpforo #wpforo-wrap .wpforo-profile .wpforo-profile-head-panel .wpforo-profile-head-data .wpf-profile-head-right{display: flex; justify-content: flex-end; align-items: flex-end;}
992
  #wpforo #wpforo-wrap .wpforo-profile .wpforo-profile-head-panel .wpf-edit-cover{font-size: 20px; padding: 0 4px; margin: 0; line-height: 18px; color: #555; cursor: pointer;}
993
  #wpforo #wpforo-wrap .wpforo-profile .wpforo-profile-head-panel .wpf-edit-cover i{background-color: #ccc; opacity: 0.7; padding: 1px 2px; border-radius: 3px;}
994
+ #wpforo #wpforo-wrap .wpforo-profile .wpforo-profile-head-panel .wpf-edit-cover ul.wpf-edit-cover-options{ position: absolute; z-index: 1; min-width: 150px; background-color: white; color: black; display: none; flex-direction: column; font-size: 12px; left: 35px; bottom: 0; }
995
+ #wpforo #wpforo-wrap .wpforo-profile .wpforo-profile-head-panel .wpf-edit-cover ul.wpf-edit-cover-options li{ opacity: 0.7; flex-grow: 1; flex-shrink: 0; width: 100%; white-space: nowrap; padding: 7px 15px; }
996
+ #wpforo #wpforo-wrap .wpforo-profile .wpforo-profile-head-panel .wpf-edit-cover ul.wpf-edit-cover-options li:hover{ opacity: 1; }
997
  #wpforo #wpforo-wrap .wpforo-profile .wpforo-profile-head-bottom{padding: 18px 180px 0 0px; display: flex; justify-content: space-between; align-items: flex-start; width: 100%; margin-top: -12px;}
998
  #wpforo #wpforo-wrap .wpforo-profile .wpforo-profile-head-bottom .wpfp-flex{flex-grow: 1;}
999
  #wpforo #wpforo-wrap .wpforo-profile .wpforo-profile-head-bottom .wpfp-box{padding-left: 16px; margin-left: 0;}
themes/2022/style.css CHANGED
@@ -253,6 +253,9 @@ Author: gVectors Team
253
  #wpforo #wpforo-wrap .wpforo-revision-body blockquote{display:block; margin:5px 0 15px 0; width:90%; padding:10px; font-size:13px;}
254
  #wpforo #wpforo-wrap .wpforo-post .wpforo-post-quote-author,
255
  #wpforo #wpforo-wrap .wpforo-revision-body .wpforo-post-quote-author{padding:5px 0; font-weight:bold;}
 
 
 
256
  #wpforo #wpforo-wrap .wpforo-post .wpforo-post-code,
257
  #wpforo #wpforo-wrap .wpforo-revision-body .wpforo-post-code{max-width:90%; overflow-x:auto; padding:5px 10px 15px 10px; margin:10px 0; font-size:12px }
258
  #wpforo #wpforo-wrap .wpforo-post code,
@@ -992,9 +995,12 @@ Author: gVectors Team
992
  #wpforo #wpforo-wrap .wpforo-profile .wpf-profile-details .wpfp-name .wpf-author-nicename {display: inline-block;border-left: 2px solid #bbb; font-weight: normal; padding-left: 8px; margin-left: 6px; line-height: 20px; vertical-align: initial; color: #111; font-size: 15px;}
993
  #wpforo #wpforo-wrap .wpforo-profile .wpforo-profile-head-panel .wpforo-profile-head-data .wpfp-box{padding-right: 16px; margin-right: 0;}
994
  #wpforo #wpforo-wrap .wpforo-profile .wpforo-profile-head-panel .wpforo-profile-head-data .wpf-profile-head-right{display: flex; justify-content: flex-end; align-items: flex-end;}
995
- #wpforo #wpforo-wrap .wpforo-profile .wpforo-profile-head-panel .wpf-edit-cover{font-size: 20px; padding: 0 4px; margin: 0; line-height: 18px; color: #555; cursor: pointer;}
996
  #wpforo #wpforo-wrap .wpforo-profile .wpforo-profile-head-panel .wpf-edit-cover i{background-color: #ccc; opacity: 0.7; padding: 1px 2px; border-radius: 3px;}
997
- #wpforo #wpforo-wrap .wpforo-profile .wpforo-profile-head-bottom{padding: 18px 0px 0 180px; display: flex; justify-content: space-between; align-items: flex-start; width: 100%; margin-top: -12px;}
 
 
 
998
  #wpforo #wpforo-wrap .wpforo-profile .wpforo-profile-head-bottom .wpfp-flex{flex-grow: 1;}
999
  #wpforo #wpforo-wrap .wpforo-profile .wpforo-profile-head-bottom .wpfp-box{padding-right: 16px; margin-right: 0;}
1000
  #wpforo #wpforo-wrap .wpforo-profile .wpforo-profile-head-bottom .wpfp-reputation{border-right: none; line-height: 30px;}
253
  #wpforo #wpforo-wrap .wpforo-revision-body blockquote{display:block; margin:5px 0 15px 0; width:90%; padding:10px; font-size:13px;}
254
  #wpforo #wpforo-wrap .wpforo-post .wpforo-post-quote-author,
255
  #wpforo #wpforo-wrap .wpforo-revision-body .wpforo-post-quote-author{padding:5px 0; font-weight:bold;}
256
+ #wpforo #wpforo-wrap .wpforo-post .wpforo-post-quote-head,
257
+ #wpforo #wpforo-wrap .wpforo-comment .wpforo-post-quote-head,
258
+ #wpforo #wpforo-wrap .wpforo-revision-body .wpforo-post-quote-head{ display: flex; justify-content: space-between; flex-wrap: nowrap; }
259
  #wpforo #wpforo-wrap .wpforo-post .wpforo-post-code,
260
  #wpforo #wpforo-wrap .wpforo-revision-body .wpforo-post-code{max-width:90%; overflow-x:auto; padding:5px 10px 15px 10px; margin:10px 0; font-size:12px }
261
  #wpforo #wpforo-wrap .wpforo-post code,
995
  #wpforo #wpforo-wrap .wpforo-profile .wpf-profile-details .wpfp-name .wpf-author-nicename {display: inline-block;border-left: 2px solid #bbb; font-weight: normal; padding-left: 8px; margin-left: 6px; line-height: 20px; vertical-align: initial; color: #111; font-size: 15px;}
996
  #wpforo #wpforo-wrap .wpforo-profile .wpforo-profile-head-panel .wpforo-profile-head-data .wpfp-box{padding-right: 16px; margin-right: 0;}
997
  #wpforo #wpforo-wrap .wpforo-profile .wpforo-profile-head-panel .wpforo-profile-head-data .wpf-profile-head-right{display: flex; justify-content: flex-end; align-items: flex-end;}
998
+ #wpforo #wpforo-wrap .wpforo-profile .wpforo-profile-head-panel .wpf-edit-cover{font-size: 20px; padding: 0 4px; margin: 0; line-height: 18px; color: #555; cursor: pointer; position: relative;}
999
  #wpforo #wpforo-wrap .wpforo-profile .wpforo-profile-head-panel .wpf-edit-cover i{background-color: #ccc; opacity: 0.7; padding: 1px 2px; border-radius: 3px;}
1000
+ #wpforo #wpforo-wrap .wpforo-profile .wpforo-profile-head-panel .wpf-edit-cover ul.wpf-edit-cover-options{ position: absolute; z-index: 1; min-width: 150px; background-color: white; color: black; display: none; flex-direction: column; font-size: 12px; right: 35px; bottom: 0; }
1001
+ #wpforo #wpforo-wrap .wpforo-profile .wpforo-profile-head-panel .wpf-edit-cover ul.wpf-edit-cover-options li{ opacity: 0.7; flex-grow: 1; flex-shrink: 0; width: 100%; white-space: nowrap; padding: 7px 15px; }
1002
+ #wpforo #wpforo-wrap .wpforo-profile .wpforo-profile-head-panel .wpf-edit-cover ul.wpf-edit-cover-options li:hover{ opacity: 1; }
1003
+ #wpforo #wpforo-wrap .wpforo-profile .wpforo-profile-head-bottom{padding: 18px 0 0 180px; display: flex; justify-content: space-between; align-items: flex-start; width: 100%; margin-top: -12px;}
1004
  #wpforo #wpforo-wrap .wpforo-profile .wpforo-profile-head-bottom .wpfp-flex{flex-grow: 1;}
1005
  #wpforo #wpforo-wrap .wpforo-profile .wpforo-profile-head-bottom .wpfp-box{padding-right: 16px; margin-right: 0;}
1006
  #wpforo #wpforo-wrap .wpforo-profile .wpforo-profile-head-bottom .wpfp-reputation{border-right: none; line-height: 30px;}
themes/2022/styles/matrix.css CHANGED
@@ -69,6 +69,7 @@
69
  #wpf-widget-profile .wpf-notifications .wpf-notification-content li:hover{background: __WPFCOLOR_9__;}
70
  #wpf-widget-profile .wpf-notifications .wpf-notification-content li:hover .wpf-nleft i{color: __WPFCOLOR_20__;}
71
 
 
72
 
73
  #wpforo #wpforo-wrap #wpforo-poweredby{ color: __WPFCOLOR_3__; }
74
  #wpforo #wpforo-wrap #wpforo-poweredby a{ color: __WPFCOLOR_12__; }
69
  #wpf-widget-profile .wpf-notifications .wpf-notification-content li:hover{background: __WPFCOLOR_9__;}
70
  #wpf-widget-profile .wpf-notifications .wpf-notification-content li:hover .wpf-nleft i{color: __WPFCOLOR_20__;}
71
 
72
+ #wpforo #wpforo-wrap .wpforo-profile .wpforo-profile-head-panel .wpf-edit-cover ul.wpf-edit-cover-options{ background-color: __WPFCOLOR_7__; }
73
 
74
  #wpforo #wpforo-wrap #wpforo-poweredby{ color: __WPFCOLOR_3__; }
75
  #wpforo #wpforo-wrap #wpforo-poweredby a{ color: __WPFCOLOR_12__; }
themes/2022/widgets-rtl.css CHANGED
@@ -74,8 +74,8 @@
74
  #wpf-widget-forums .wpforo-widget-content dl{ display:block; padding:0; margin:0;}
75
  #wpforo #wpf-widget-forums .wpforo-widget-content dd,
76
  #wpf-widget-forums .wpforo-widget-content dd{ display:block; margin-right:15px;}
77
- #wpforo #wpf-widget-forums .wpforo-widget-content dd.wpf-dl-current a,
78
- #wpf-widget-forums .wpforo-widget-content dd.wpf-dl-current a{ font-size:16px;}
79
  #wpforo .wpforo-widget-wrap ul.wpf-widget-tags,
80
  .wpforo-widget-wrap ul.wpf-widget-tags{display: flex;flex-flow: row wrap;justify-content:start;}
81
  #wpforo .wpforo-widget-wrap .wpf-widget-tags li,
@@ -199,4 +199,4 @@
199
  #wpf-widget-recent-replies .wpforo-list-item-right p.postuser{font-size:13px;}
200
  #wpforo #wpf-widget-recent-replies .wpforo-list-item-right p.postdate,
201
  #wpf-widget-recent-replies .wpforo-list-item-right p.postdate{font-size:13px;}
202
- }
74
  #wpf-widget-forums .wpforo-widget-content dl{ display:block; padding:0; margin:0;}
75
  #wpforo #wpf-widget-forums .wpforo-widget-content dd,
76
  #wpf-widget-forums .wpforo-widget-content dd{ display:block; margin-right:15px;}
77
+ #wpforo #wpf-widget-forums .wpforo-widget-content .wpf-dl-current .wpf-dl-item-label,
78
+ #wpf-widget-forums .wpforo-widget-content .wpf-dl-current .wpf-dl-item-label{ font-weight: 700; color: #666; }
79
  #wpforo .wpforo-widget-wrap ul.wpf-widget-tags,
80
  .wpforo-widget-wrap ul.wpf-widget-tags{display: flex;flex-flow: row wrap;justify-content:start;}
81
  #wpforo .wpforo-widget-wrap .wpf-widget-tags li,
199
  #wpf-widget-recent-replies .wpforo-list-item-right p.postuser{font-size:13px;}
200
  #wpforo #wpf-widget-recent-replies .wpforo-list-item-right p.postdate,
201
  #wpf-widget-recent-replies .wpforo-list-item-right p.postdate{font-size:13px;}
202
+ }
themes/2022/widgets.css CHANGED
@@ -78,8 +78,8 @@
78
  #wpf-widget-forums .wpforo-widget-content dl{ display:block; padding:0; margin:0;}
79
  #wpforo #wpf-widget-forums .wpforo-widget-content dd,
80
  #wpf-widget-forums .wpforo-widget-content dd{ display:block; margin-left:15px;}
81
- #wpforo #wpf-widget-forums .wpforo-widget-content dd.wpf-dl-current a,
82
- #wpf-widget-forums .wpforo-widget-content dd.wpf-dl-current a{ font-size:16px;}
83
  #wpforo .wpforo-widget-wrap ul.wpf-widget-tags,
84
  .wpforo-widget-wrap ul.wpf-widget-tags{display: flex;flex-flow: row wrap;justify-content:start;}
85
  #wpforo .wpforo-widget-wrap .wpf-widget-tags li,
@@ -203,4 +203,4 @@
203
  #wpf-widget-recent-replies .wpforo-list-item-right p.postuser{font-size:13px;}
204
  #wpforo #wpf-widget-recent-replies .wpforo-list-item-right p.postdate,
205
  #wpf-widget-recent-replies .wpforo-list-item-right p.postdate{font-size:13px;}
206
- }
78
  #wpf-widget-forums .wpforo-widget-content dl{ display:block; padding:0; margin:0;}
79
  #wpforo #wpf-widget-forums .wpforo-widget-content dd,
80
  #wpf-widget-forums .wpforo-widget-content dd{ display:block; margin-left:15px;}
81
+ #wpforo #wpf-widget-forums .wpforo-widget-content .wpf-dl-current .wpf-dl-item-label,
82
+ #wpf-widget-forums .wpforo-widget-content .wpf-dl-current .wpf-dl-item-label{ font-weight: 700; color: #666; }
83
  #wpforo .wpforo-widget-wrap ul.wpf-widget-tags,
84
  .wpforo-widget-wrap ul.wpf-widget-tags{display: flex;flex-flow: row wrap;justify-content:start;}
85
  #wpforo .wpforo-widget-wrap .wpf-widget-tags li,
203
  #wpf-widget-recent-replies .wpforo-list-item-right p.postuser{font-size:13px;}
204
  #wpforo #wpf-widget-recent-replies .wpforo-list-item-right p.postdate,
205
  #wpf-widget-recent-replies .wpforo-list-item-right p.postdate{font-size:13px;}
206
+ }
themes/classic/layouts/1/forum.php CHANGED
@@ -13,7 +13,7 @@ if( ! defined( 'ABSPATH' ) ) exit;
13
  */
14
  ?>
15
 
16
- <div class="wpfl-1">
17
  <div class="wpforo-category">
18
  <div class="cat-title" title="<?php echo esc_attr( $cat['description'] ); ?>"><?php echo esc_html( $cat['title'] ); ?></div>
19
  <div class="cat-stat-posts"><?php wpforo_phrase( 'Posts' ); ?></div>
13
  */
14
  ?>
15
 
16
+ <div class="wpfl-1 wpforo-section">
17
  <div class="wpforo-category">
18
  <div class="cat-title" title="<?php echo esc_attr( $cat['description'] ); ?>"><?php echo esc_html( $cat['title'] ); ?></div>
19
  <div class="cat-stat-posts"><?php wpforo_phrase( 'Posts' ); ?></div>
themes/classic/layouts/2/forum.php CHANGED
@@ -13,7 +13,7 @@ if( ! defined( 'ABSPATH' ) ) exit;
13
  */
14
  ?>
15
 
16
- <div class="wpfl-2">
17
  <div class="wpforo-category">
18
  <div class="cat-title" title="<?php echo esc_attr( $cat['description'] ); ?>"><?php echo esc_html( $cat['title'] ); ?></div>
19
  <div class="cat-lastpostinfo"><?php wpforo_phrase( 'Last Post Info' ); ?></div>
13
  */
14
  ?>
15
 
16
+ <div class="wpfl-2 wpforo-section">
17
  <div class="wpforo-category">
18
  <div class="cat-title" title="<?php echo esc_attr( $cat['description'] ); ?>"><?php echo esc_html( $cat['title'] ); ?></div>
19
  <div class="cat-lastpostinfo"><?php wpforo_phrase( 'Last Post Info' ); ?></div>
themes/classic/layouts/3/forum.php CHANGED
@@ -13,7 +13,7 @@ if( ! defined( 'ABSPATH' ) ) exit;
13
  */
14
  ?>
15
 
16
- <div class="wpfl-3">
17
  <div class="wpforo-category">
18
  <div class="cat-title" title="<?php echo esc_attr( $cat['description'] ); ?>"><?php echo esc_html( $cat['title'] ); ?></div>
19
  <div class="cat-stat-posts"><?php wpforo_phrase( 'Posts' ) ?></div>
13
  */
14
  ?>
15
 
16
+ <div class="wpfl-3 wpforo-section">
17
  <div class="wpforo-category">
18
  <div class="cat-title" title="<?php echo esc_attr( $cat['description'] ); ?>"><?php echo esc_html( $cat['title'] ); ?></div>
19
  <div class="cat-stat-posts"><?php wpforo_phrase( 'Posts' ) ?></div>
themes/classic/layouts/4/forum.php CHANGED
@@ -27,7 +27,7 @@ if( ! wpforo_setting( 'forums', 'layout_threaded_display_subforums' ) ) {
27
  $childs = apply_filters( 'wpforo_forum_list_threaded_layout', $childs );
28
  ?>
29
 
30
- <div id="wpf-cat-<?php echo $cat['forumid'] ?>" class="wpfl-4">
31
  <div class="wpforo-category">
32
  <div class="cat-title" title="<?php echo esc_attr( $cat['description'] ); ?>"><?php echo esc_html( $cat['title'] ); ?></div>
33
  </div>
27
  $childs = apply_filters( 'wpforo_forum_list_threaded_layout', $childs );
28
  ?>
29
 
30
+ <div id="wpf-cat-<?php echo $cat['forumid'] ?>" class="wpfl-4 wpforo-section">
31
  <div class="wpforo-category">
32
  <div class="cat-title" title="<?php echo esc_attr( $cat['description'] ); ?>"><?php echo esc_html( $cat['title'] ); ?></div>
33
  </div>
themes/classic/profile-activity.php CHANGED
@@ -15,10 +15,10 @@ $activities = (array) wpfval( WPF()->current_object, 'activities' );
15
  <td class="activity-title">
16
  <?php
17
  if( $activity['is_first_post'] ) {
18
- $href = esc_url( WPF()->topic->get_topic_url( $activity['topicid'] ) );
19
  $link_text = wpforo_text( $activity['title'], 60, false );
20
  } else {
21
- $href = esc_url( WPF()->post->get_post_url( $activity['postid'] ) );
22
  if( ! $link_text = wpforo_text( $activity['body'], 60, false ) ) {
23
  $link_text = wpforo_text( $activity['title'], 60, false );
24
  }
15
  <td class="activity-title">
16
  <?php
17
  if( $activity['is_first_post'] ) {
18
+ $href = esc_url( WPF()->topic->get_url( $activity['topicid'] ) );
19
  $link_text = wpforo_text( $activity['title'], 60, false );
20
  } else {
21
+ $href = esc_url( WPF()->post->get_url( $activity['postid'] ) );
22
  if( ! $link_text = wpforo_text( $activity['body'], 60, false ) ) {
23
  $link_text = wpforo_text( $activity['title'], 60, false );
24
  }
themes/classic/profile-favored.php CHANGED
@@ -46,7 +46,7 @@ $posts = (array) wpfval( WPF()->current_object, 'favored_posts' );
46
  <div class="wpf-activity-data">
47
  <div class="wpf-activity-top">
48
  <div class="wpf-activity-title">
49
- <a href="<?php echo esc_url_raw( WPF()->post->get_post_url( $post['postid'] ) ) ?>">
50
  <?php echo $post['title'] ?>
51
  </a>
52
  <p><?php echo wpforo_text( $post['body'], 150, false ) ?></p>
46
  <div class="wpf-activity-data">
47
  <div class="wpf-activity-top">
48
  <div class="wpf-activity-title">
49
+ <a href="<?php echo esc_url_raw( WPF()->post->get_url( $post['postid'] ) ) ?>">
50
  <?php echo $post['title'] ?>
51
  </a>
52
  <p><?php echo wpforo_text( $post['body'], 150, false ) ?></p>
themes/classic/profile-subscriptions.php CHANGED
@@ -17,7 +17,7 @@ $subscribes = (array) wpfval( WPF()->current_object, 'subscribes' );
17
  $item_url = WPF()->forum->get_forum_url( $item['forumid'] );
18
  } elseif( $subscribe['type'] === 'topic' ) {
19
  $item = WPF()->topic->get_topic( $subscribe['itemid'] );
20
- $item_url = WPF()->topic->get_topic_url( $item['topicid'] );
21
  } elseif( in_array( $subscribe['type'], [ 'forums', 'forums-topics' ] ) ) {
22
  $item = [ 'title' => wpforo_phrase( 'All ' . $subscribe['type'], false ) ];
23
  $item_url = '#';
17
  $item_url = WPF()->forum->get_forum_url( $item['forumid'] );
18
  } elseif( $subscribe['type'] === 'topic' ) {
19
  $item = WPF()->topic->get_topic( $subscribe['itemid'] );
20
+ $item_url = WPF()->topic->get_url( $item['topicid'] );
21
  } elseif( in_array( $subscribe['type'], [ 'forums', 'forums-topics' ] ) ) {
22
  $item = [ 'title' => wpforo_phrase( 'All ' . $subscribe['type'], false ) ];
23
  $item_url = '#';
themes/classic/recent.php CHANGED
@@ -218,7 +218,7 @@ if( $type === 'topics' ) {
218
  }
219
  }
220
  $topic_url = wpforo_topic( $topic['topicid'], 'url' );
221
- $topic_posturl = ( $view == 'unread' && wpfval( $last_post, 'url' ) ) ? $last_post['url'] : WPF()->topic->get_topic_url( $topicid );
222
  $post_toglle = wpforo_setting( 'topics', 'layout_extended_intro_posts_toggle' );
223
  ?>
224
  <tr class="wpf-ttr <?php wpforo_unread( $topic['topicid'], 'topic' ); ?>">
@@ -289,7 +289,7 @@ if( $type === 'topics' ) {
289
  <?php endif; ?>
290
  </td>
291
  <td class="wpf-spost-title">
292
- <a href="<?php echo esc_url( WPF()->post->get_post_url( $postid ) ) ?>" class="wpf-spost-title-link" title="<?php wpforo_phrase( 'View entire post' ) ?>"><?php echo esc_html( $title ) ?> &nbsp;<i class="fas fa-chevron-right" style="font-size:11px;"></i></a>
293
  <p style="font-size:12px"><?php wpforo_member_link( $member, 'by' ); ?>, <?php wpforo_date( $post['created'] ); ?></p>
294
  </td>
295
  <td class="wpf-spost-forum"><a href="<?php echo $forum['url'] ?>"><?php echo esc_html( $forum['title'] ); ?></a></td>
218
  }
219
  }
220
  $topic_url = wpforo_topic( $topic['topicid'], 'url' );
221
+ $topic_posturl = ( $view == 'unread' && wpfval( $last_post, 'url' ) ) ? $last_post['url'] : WPF()->topic->get_url( $topicid );
222
  $post_toglle = wpforo_setting( 'topics', 'layout_extended_intro_posts_toggle' );
223
  ?>
224
  <tr class="wpf-ttr <?php wpforo_unread( $topic['topicid'], 'topic' ); ?>">
289
  <?php endif; ?>
290
  </td>
291
  <td class="wpf-spost-title">
292
+ <a href="<?php echo esc_url( WPF()->post->get_url( $postid ) ) ?>" class="wpf-spost-title-link" title="<?php wpforo_phrase( 'View entire post' ) ?>"><?php echo esc_html( $title ) ?> &nbsp;<i class="fas fa-chevron-right" style="font-size:11px;"></i></a>
293
  <p style="font-size:12px"><?php wpforo_member_link( $member, 'by' ); ?>, <?php wpforo_date( $post['created'] ); ?></p>
294
  </td>
295
  <td class="wpf-spost-forum"><a href="<?php echo $forum['url'] ?>"><?php echo esc_html( $forum['title'] ); ?></a></td>
themes/classic/search.php CHANGED
@@ -38,7 +38,7 @@ $posts = WPF()->current_object['posts'];
38
  <tr class="wpf-ttr">
39
  <td class="wpf-spost-icon"><i class="fas fa-comments fa-1x wpfcl-0"></i></td>
40
  <td class="wpf-spost-title">
41
- <a href="<?php echo esc_url( WPF()->post->get_post_url( $post['postid'] ) ) ?>" title="<?php wpforo_phrase( 'View entire post' ) ?>"><?php echo esc_html( $post['title'] ) ?> &nbsp;<i class="fas fa-chevron-right" style="font-size:11px;"></i></a>
42
  </td>
43
  <?php if( ! $is_tag ): ?>
44
  <td class="wpf-spost-result wpfcl-5"><?php echo( isset( $post['matches'] ) ? ceil( $post['matches'] ) : '' ) ?><?php wpforo_phrase( 'relevance' ) ?></td>
38
  <tr class="wpf-ttr">
39
  <td class="wpf-spost-icon"><i class="fas fa-comments fa-1x wpfcl-0"></i></td>
40
  <td class="wpf-spost-title">
41
+ <a href="<?php echo esc_url( WPF()->post->get_url( $post['postid'] ) ) ?>" title="<?php wpforo_phrase( 'View entire post' ) ?>"><?php echo esc_html( $post['title'] ) ?> &nbsp;<i class="fas fa-chevron-right" style="font-size:11px;"></i></a>
42
  </td>
43
  <?php if( ! $is_tag ): ?>
44
  <td class="wpf-spost-result wpfcl-5"><?php echo( isset( $post['matches'] ) ? ceil( $post['matches'] ) : '' ) ?><?php wpforo_phrase( 'relevance' ) ?></td>
themes/classic/style-rtl.css CHANGED
@@ -233,6 +233,9 @@ RTL Style of Classic Theme
233
  #wpforo #wpforo-wrap .wpforo-revision-body blockquote{display:block; margin:5px 0 15px 0; width:90%; padding:10px; font-size:13px;}
234
  #wpforo #wpforo-wrap .wpforo-post .wpforo-post-quote-author,
235
  #wpforo #wpforo-wrap .wpforo-revision-body .wpforo-post-quote-author{padding:5px 0; font-weight:bold;}
 
 
 
236
  #wpforo #wpforo-wrap .wpforo-post .wpforo-post-code,
237
  #wpforo #wpforo-wrap .wpforo-revision-body .wpforo-post-code{max-width:90%; overflow-x:auto; padding:5px 10px 15px 10px; margin:10px 0; font-size:12px }
238
  #wpforo #wpforo-wrap .wpforo-post code,
233
  #wpforo #wpforo-wrap .wpforo-revision-body blockquote{display:block; margin:5px 0 15px 0; width:90%; padding:10px; font-size:13px;}
234
  #wpforo #wpforo-wrap .wpforo-post .wpforo-post-quote-author,
235
  #wpforo #wpforo-wrap .wpforo-revision-body .wpforo-post-quote-author{padding:5px 0; font-weight:bold;}
236
+ #wpforo #wpforo-wrap .wpforo-post .wpforo-post-quote-head,
237
+ #wpforo #wpforo-wrap .wpforo-comment .wpforo-post-quote-head,
238
+ #wpforo #wpforo-wrap .wpforo-revision-body .wpforo-post-quote-head{ display: flex; justify-content: space-between; flex-wrap: nowrap; }
239
  #wpforo #wpforo-wrap .wpforo-post .wpforo-post-code,
240
  #wpforo #wpforo-wrap .wpforo-revision-body .wpforo-post-code{max-width:90%; overflow-x:auto; padding:5px 10px 15px 10px; margin:10px 0; font-size:12px }
241
  #wpforo #wpforo-wrap .wpforo-post code,
themes/classic/style.css CHANGED
@@ -238,6 +238,9 @@ Author: gVectors Team
238
  #wpforo #wpforo-wrap .wpforo-revision-body blockquote{display:block; margin:5px 0 15px 0; width:90%; padding:10px; font-size:13px;}
239
  #wpforo #wpforo-wrap .wpforo-post .wpforo-post-quote-author,
240
  #wpforo #wpforo-wrap .wpforo-revision-body .wpforo-post-quote-author{padding:5px 0; font-weight:bold;}
 
 
 
241
  #wpforo #wpforo-wrap .wpforo-post .wpforo-post-code,
242
  #wpforo #wpforo-wrap .wpforo-revision-body .wpforo-post-code{max-width:90%; overflow-x:auto; padding:5px 10px 15px 10px; margin:10px 0; font-size:12px }
243
  #wpforo #wpforo-wrap .wpforo-post code,
238
  #wpforo #wpforo-wrap .wpforo-revision-body blockquote{display:block; margin:5px 0 15px 0; width:90%; padding:10px; font-size:13px;}
239
  #wpforo #wpforo-wrap .wpforo-post .wpforo-post-quote-author,
240
  #wpforo #wpforo-wrap .wpforo-revision-body .wpforo-post-quote-author{padding:5px 0; font-weight:bold;}
241
+ #wpforo #wpforo-wrap .wpforo-post .wpforo-post-quote-head,
242
+ #wpforo #wpforo-wrap .wpforo-comment .wpforo-post-quote-head,
243
+ #wpforo #wpforo-wrap .wpforo-revision-body .wpforo-post-quote-head{ display: flex; justify-content: space-between; flex-wrap: nowrap; }
244
  #wpforo #wpforo-wrap .wpforo-post .wpforo-post-code,
245
  #wpforo #wpforo-wrap .wpforo-revision-body .wpforo-post-code{max-width:90%; overflow-x:auto; padding:5px 10px 15px 10px; margin:10px 0; font-size:12px }
246
  #wpforo #wpforo-wrap .wpforo-post code,
themes/classic/widgets-rtl.css CHANGED
@@ -73,8 +73,8 @@
73
  #wpf-widget-forums .wpforo-widget-content dl{ display:block; padding:0; margin:0;}
74
  #wpforo #wpf-widget-forums .wpforo-widget-content dd,
75
  #wpf-widget-forums .wpforo-widget-content dd{ display:block; margin-right:15px;}
76
- #wpforo #wpf-widget-forums .wpforo-widget-content dd.wpf-dl-current a,
77
- #wpf-widget-forums .wpforo-widget-content dd.wpf-dl-current a{ font-size:16px;}
78
  #wpforo .wpforo-widget-wrap ul.wpf-widget-tags,
79
  .wpforo-widget-wrap ul.wpf-widget-tags{display: flex;flex-flow: row wrap;justify-content:start;}
80
  #wpforo .wpforo-widget-wrap .wpf-widget-tags li,
@@ -200,4 +200,4 @@
200
  #wpf-widget-recent-replies .wpforo-list-item-right p.postuser{font-size:13px;}
201
  #wpforo #wpf-widget-recent-replies .wpforo-list-item-right p.postdate,
202
  #wpf-widget-recent-replies .wpforo-list-item-right p.postdate{font-size:13px;}
203
- }
73
  #wpf-widget-forums .wpforo-widget-content dl{ display:block; padding:0; margin:0;}
74
  #wpforo #wpf-widget-forums .wpforo-widget-content dd,
75
  #wpf-widget-forums .wpforo-widget-content dd{ display:block; margin-right:15px;}
76
+ #wpforo #wpf-widget-forums .wpforo-widget-content .wpf-dl-current .wpf-dl-item-label,
77
+ #wpf-widget-forums .wpforo-widget-content .wpf-dl-current .wpf-dl-item-label{ font-weight: 700; color: #666; }
78
  #wpforo .wpforo-widget-wrap ul.wpf-widget-tags,
79
  .wpforo-widget-wrap ul.wpf-widget-tags{display: flex;flex-flow: row wrap;justify-content:start;}
80
  #wpforo .wpforo-widget-wrap .wpf-widget-tags li,
200
  #wpf-widget-recent-replies .wpforo-list-item-right p.postuser{font-size:13px;}
201
  #wpforo #wpf-widget-recent-replies .wpforo-list-item-right p.postdate,
202
  #wpf-widget-recent-replies .wpforo-list-item-right p.postdate{font-size:13px;}
203
+ }
themes/classic/widgets.css CHANGED
@@ -73,8 +73,8 @@
73
  #wpf-widget-forums .wpforo-widget-content dl{ display:block; padding:0; margin:0;}
74
  #wpforo #wpf-widget-forums .wpforo-widget-content dd,
75
  #wpf-widget-forums .wpforo-widget-content dd{ display:block; margin-left:15px;}
76
- #wpforo #wpf-widget-forums .wpforo-widget-content dd.wpf-dl-current a,
77
- #wpf-widget-forums .wpforo-widget-content dd.wpf-dl-current a{ font-size:16px;}
78
  #wpforo .wpforo-widget-wrap ul.wpf-widget-tags,
79
  .wpforo-widget-wrap ul.wpf-widget-tags{display: flex;flex-flow: row wrap;justify-content:start;}
80
  #wpforo .wpforo-widget-wrap .wpf-widget-tags li,
@@ -200,4 +200,4 @@
200
  #wpf-widget-recent-replies .wpforo-list-item-right p.postuser{font-size:13px;}
201
  #wpforo #wpf-widget-recent-replies .wpforo-list-item-right p.postdate,
202
  #wpf-widget-recent-replies .wpforo-list-item-right p.postdate{font-size:13px;}
203
- }
73
  #wpf-widget-forums .wpforo-widget-content dl{ display:block; padding:0; margin:0;}
74
  #wpforo #wpf-widget-forums .wpforo-widget-content dd,
75
  #wpf-widget-forums .wpforo-widget-content dd{ display:block; margin-left:15px;}
76
+ #wpforo #wpf-widget-forums .wpforo-widget-content .wpf-dl-current .wpf-dl-item-label,
77
+ #wpf-widget-forums .wpforo-widget-content .wpf-dl-current .wpf-dl-item-label{ font-weight: 700; color: #666; }
78
  #wpforo .wpforo-widget-wrap ul.wpf-widget-tags,
79
  .wpforo-widget-wrap ul.wpf-widget-tags{display: flex;flex-flow: row wrap;justify-content:start;}
80
  #wpforo .wpforo-widget-wrap .wpf-widget-tags li,
200
  #wpf-widget-recent-replies .wpforo-list-item-right p.postuser{font-size:13px;}
201
  #wpforo #wpf-widget-recent-replies .wpforo-list-item-right p.postdate,
202
  #wpf-widget-recent-replies .wpforo-list-item-right p.postdate{font-size:13px;}
203
+ }
widgets/Forums.php CHANGED
@@ -13,22 +13,23 @@ class Forums extends WP_Widget {
13
  function __construct() {
14
  parent::__construct( 'wpforo_forums', 'wpForo Forums', [ 'description' => 'Forum tree.' ] );
15
  $this->init_local_vars();
 
 
16
  }
17
 
18
  private function init_local_vars() {
19
  $this->default_instance = [
 
20
  'title' => __( 'Forums', 'wpforo' ),
21
  'dropdown' => false,
22
  ];
23
  }
24
 
25
- public function widget( $args, $instance ) {
26
- echo $args['before_widget'];//This is an HTML content//
27
- echo '<div id="wpf-widget-forums" class="wpforo-widget-wrap">';
28
- if ( ! empty( $instance['title'] ) ) {
29
- echo $args['before_title'] . apply_filters( 'widget_title', $instance['title'] ) . $args['after_title'];//This is an HTML content//
30
- }
31
- echo '<div class="wpforo-widget-content">';
32
  if ( wpfval( $instance, 'dropdown' ) ) {
33
  $forum_urls = [];
34
  $forums = array_filter( WPF()->forum->get_forums(), function ( $forum ) {
@@ -41,46 +42,76 @@ class Forums extends WP_Widget {
41
  }
42
  if ( ! empty( $forum_urls ) ) {
43
  echo '<select onchange="window.location.href = wpf_forum_urls[\'forum_\' + this.value]">';
44
- WPF()->forum->tree( 'select_box', true, WPF()->current_object['forumid'], true );
45
  echo '</select>';
46
  ?>
47
- <script>var wpf_forum_json = '<?php echo json_encode( $forum_urls ) ?>';
48
- var wpf_forum_urls = JSON.parse(wpf_forum_json);</script>
 
 
49
  <?php
50
  }
51
  } else {
52
- WPF()->forum->tree( 'front_list', true, [], false );
53
  }
54
- echo '</div>';
55
- echo '</div>';
56
- echo $args['after_widget'];//This is an HTML content//
 
 
 
 
 
 
 
 
 
 
 
 
 
 
57
  }
58
 
59
  public function form( $instance ) {
60
- $title = ! empty( $instance['title'] ) ? $instance['title'] : $this->default_instance['title'];
61
- $dropdown = isset( $instance['dropdown'] ) && $instance['dropdown'];
 
 
 
62
  ?>
63
- <p>
64
- <label><?php _e( 'Title', 'wpforo' ); ?>:</label>
65
- <label>
66
- <input class="widefat" name="<?php echo esc_attr( $this->get_field_name( 'title' ) ); ?>" type="text"
67
- value="<?php echo esc_attr( $title ); ?>">
68
- </label>
69
- </p>
70
- <p>
71
- <label for="<?php echo $this->get_field_id( 'dropdown' ) ?>"><?php _e( 'Display as dropdown', 'wpforo' ); ?>
72
- &nbsp;</label>
73
- <input id="<?php echo $this->get_field_id( 'dropdown' ) ?>" class="wpf_wdg_dropdown"
74
- name="<?php echo esc_attr( $this->get_field_name( 'dropdown' ) ); ?>" <?php checked( $dropdown ); ?>
75
- type="checkbox">
76
- </p>
 
 
 
 
 
 
 
 
 
77
  <?php
78
  }
79
 
80
  public function update( $new_instance, $old_instance ) {
 
81
  $instance = [];
82
- $instance['title'] = ( ! empty( $new_instance['title'] ) ) ? strip_tags( $new_instance['title'] ) : '';
83
- $instance['dropdown'] = isset( $new_instance['dropdown'] ) ? (bool) $new_instance['dropdown'] : $this->default_instance['dropdown'];
 
84
 
85
  return $instance;
86
  }
13
  function __construct() {
14
  parent::__construct( 'wpforo_forums', 'wpForo Forums', [ 'description' => 'Forum tree.' ] );
15
  $this->init_local_vars();
16
+ add_action( 'wp_ajax_wpforo_load_ajax_widget_Forums', [ $this, 'load_ajax_widget' ] );
17
+ add_action( 'wp_ajax_nopriv_wpforo_load_ajax_widget_Forums', [ $this, 'load_ajax_widget' ] );
18
  }
19
 
20
  private function init_local_vars() {
21
  $this->default_instance = [
22
+ 'boardid' => 0,
23
  'title' => __( 'Forums', 'wpforo' ),
24
  'dropdown' => false,
25
  ];
26
  }
27
 
28
+ public function load_ajax_widget() {
29
+ $_POST = wp_unslash( $_POST );
30
+ $instance = json_decode( (string) wpfval( $_POST, 'instance' ), true );
31
+ ob_start();
32
+
 
 
33
  if ( wpfval( $instance, 'dropdown' ) ) {
34
  $forum_urls = [];
35
  $forums = array_filter( WPF()->forum->get_forums(), function ( $forum ) {
42
  }
43
  if ( ! empty( $forum_urls ) ) {
44
  echo '<select onchange="window.location.href = wpf_forum_urls[\'forum_\' + this.value]">';
45
+ WPF()->forum->tree( 'select_box', true, WPF()->current_object['forumid'] );
46
  echo '</select>';
47
  ?>
48
+ <script>
49
+ var wpf_forum_json = '<?php echo json_encode( $forum_urls ) ?>';
50
+ var wpf_forum_urls = JSON.parse(wpf_forum_json);
51
+ </script>
52
  <?php
53
  }
54
  } else {
55
+ WPF()->forum->tree( 'front_list', true, WPF()->current_object['forumid'], false );
56
  }
57
+
58
+ wp_send_json_success( [ 'html' => ob_get_clean() ] );
59
+ }
60
+
61
+ public function widget( $args, $instance ) {
62
+ wp_enqueue_script( 'wpforo-widgets-js' );
63
+ $instance = wpforo_parse_args( $instance, $this->default_instance );
64
+ $data = [
65
+ 'boardid' => $instance['boardid'],
66
+ 'action' => 'wpforo_load_ajax_widget_Forums',
67
+ 'instance' => $instance,
68
+ ];
69
+ if( WPF()->board->get_current( 'boardid' ) !== $instance['boardid'] ) $data['referer'] = home_url();
70
+ $json = json_encode( $data );
71
+ echo $args['before_widget'] . '<div id="wpf-widget-forums" class="wpforo-widget-wrap">';
72
+ if ( $instance['title'] ) echo $args['before_title'] . apply_filters( 'widget_title', $instance['title'] ) . $args['after_title'];
73
+ echo '<div class="wpforo-widget-content wpforo-ajax-widget" data-json="' . esc_attr( $json ) . '"></div></div>' . $args['after_widget'];
74
  }
75
 
76
  public function form( $instance ) {
77
+ $instance = wpforo_parse_args( $instance, $this->default_instance );
78
+ $boardid = (int) $instance['boardid'];
79
+ $title = (string) $instance['title'];
80
+ $dropdown = (bool) $instance['dropdown'];
81
+ WPF()->change_board( $boardid );
82
  ?>
83
+ <div class="wpf-wdg-wrapper">
84
+ <p>
85
+ <label><?php _e( 'Title', 'wpforo' ); ?>:</label>
86
+ <label>
87
+ <input class="widefat" name="<?php echo esc_attr( $this->get_field_name( 'title' ) ); ?>" type="text" value="<?php echo esc_attr( $title ); ?>">
88
+ </label>
89
+ </p>
90
+ <p>
91
+ <label for="<?php echo $this->get_field_id( 'boardid' ) ?>"></label>
92
+ <select id="<?php echo $this->get_field_id( 'boardid' ) ?>" name="<?php echo esc_attr( $this->get_field_name( 'boardid' ) ); ?>">
93
+ <?php echo WPF()->board->dropdown( $boardid ) ?>
94
+ </select>
95
+ </p>
96
+ <p>
97
+ <span><?php _e( 'Display as dropdown', 'wpforo' ); ?> : </span>
98
+
99
+ <label for="<?php echo $this->get_field_id( 'dropdown' ) ?>_1"><?php _e( 'Yes', 'wpforo' ); ?></label>
100
+ <input id="<?php echo $this->get_field_id( 'dropdown' ) ?>_1" value="1" <?php checked( $dropdown ); ?> type="radio" name="<?php echo esc_attr( $this->get_field_name( 'dropdown' ) ); ?>">
101
+
102
+ <label for="<?php echo $this->get_field_id( 'dropdown' ) ?>_0"><?php _e( 'No', 'wpforo' ); ?></label>
103
+ <input id="<?php echo $this->get_field_id( 'dropdown' ) ?>_0" value="0" <?php checked( $dropdown, false ); ?> type="radio" name="<?php echo esc_attr( $this->get_field_name( 'dropdown' ) ); ?>">
104
+ </p>
105
+ </div>
106
  <?php
107
  }
108
 
109
  public function update( $new_instance, $old_instance ) {
110
+ $new_instance = wpforo_parse_args( $new_instance, $this->default_instance );
111
  $instance = [];
112
+ $instance['boardid'] = (int) $new_instance['boardid'];
113
+ $instance['title'] = strip_tags( (string) $new_instance['title'] );
114
+ $instance['dropdown'] = (bool) (int) $new_instance['dropdown'];
115
 
116
  return $instance;
117
  }
widgets/OnlineMembers.php CHANGED
@@ -5,22 +5,33 @@ namespace wpforo\widgets;
5
  use WP_Widget;
6
 
7
  class OnlineMembers extends WP_Widget {
 
 
 
 
 
8
  function __construct() {
9
  parent::__construct( 'wpforo_online_members', 'wpForo Online Members', [ 'description' => 'Online members.' ] );
 
 
 
10
  }
11
 
12
- public function widget( $args, $instance ) {
13
- // wp_enqueue_script('wpforo-widgets-js');
 
 
 
 
 
 
 
14
 
15
- echo $args['before_widget']; //This is an HTML content//
16
- echo '<div id="wpf-widget-online-users" class="wpforo-widget-wrap">';
17
- if( ! empty( $instance['title'] ) ) {
18
- echo $args['before_title'] . apply_filters( 'widget_title', $instance['title'] ) . $args['after_title'];
19
- }
20
- $groupids = ( ! empty( $instance['groupids'] ) ? array_filter( wpforo_parse_args( json_decode( $instance['groupids'], true ) ) ) : WPF()->usergroup->get_visible_usergroup_ids() );
21
- // widget content from front end
22
- $online_members = WPF()->member->get_online_members( $instance['count'], $groupids );
23
- echo '<div class="wpforo-widget-content">';
24
  if( ! empty( $online_members ) ) {
25
  echo '<ul>
26
  <li>
@@ -45,55 +56,73 @@ class OnlineMembers extends WP_Widget {
45
  } else {
46
  echo '<p class="wpf-widget-note">&nbsp;' . wpforo_phrase( 'No online members at the moment', false ) . '</p>';
47
  }
48
- echo '</div>';
49
- echo $args['after_widget'];//This is an HTML content//
 
 
 
 
 
 
 
 
 
 
 
 
 
 
50
  }
51
 
52
  public function form( $instance ) {
53
- $title = ! empty( $instance['title'] ) ? $instance['title'] : 'Online Members';
54
- $count = ! empty( $instance['count'] ) ? $instance['count'] : '15';
55
- $display_avatar = isset( $instance['display_avatar'] ) && $instance['display_avatar'];
56
- $groupids = ( ! empty( $instance['groupids'] ) ? array_filter( wpforo_parse_args( json_decode( $instance['groupids'], true ) ) ) : WPF()->usergroup->get_visible_usergroup_ids() );
 
 
57
  ?>
58
- <p>
59
- <label><?php _e( 'Title', 'wpforo' ); ?>:</label>
60
- <label>
61
- <input class="widefat" name="<?php echo esc_attr( $this->get_field_name( 'title' ) ); ?>" type="text"
62
- value="<?php echo esc_attr( $title ); ?>">
63
- </label>
64
- </p>
65
- <p>
66
- <label><?php _e( 'User Groups', 'wpforo' ); ?></label>&nbsp;
67
- <label>
68
- <select name="<?php echo esc_attr( $this->get_field_name( 'groupids' ) ); ?>[]" multiple>
69
- <?php WPF()->usergroup->show_selectbox( $groupids ) ?>
70
  </select>
71
- </label>
72
- </p>
73
- <p>
74
- <label><?php _e( 'Number of Items', 'wpforo' ); ?></label>&nbsp;
75
- <label>
76
- <input type="number" min="1" style="width: 53px;"
77
- name="<?php echo esc_attr( $this->get_field_name( 'count' ) ); ?>"
78
- value="<?php echo esc_attr( $count ); ?>">
79
- </label>
80
- </p>
81
- <p>
82
- <label>
83
- <input<?php checked( $display_avatar ); ?> type="checkbox" value="1"
84
- name="<?php echo esc_attr( $this->get_field_name( 'display_avatar' ) ); ?>"/>
85
- <?php _e( 'Display Avatars', 'wpforo' ); ?>
86
- </label>
87
- </p>
 
 
 
88
  <?php
89
  }
90
 
91
  public function update( $new_instance, $old_instance ) {
92
- $instance = [];
93
- $instance['title'] = ( ! empty( $new_instance['title'] ) ) ? strip_tags( $new_instance['title'] ) : '';
94
- $instance['count'] = ( ! empty( $new_instance['count'] ) ) ? intval( $new_instance['count'] ) : '';
95
- $instance['display_avatar'] = isset( $new_instance['display_avatar'] ) && $new_instance['display_avatar'];
96
- $instance['groupids'] = ( ! empty( $new_instance['groupids'] ) ? json_encode( array_filter( wpforo_parse_args( $new_instance['groupids'] ) ) ) : json_encode( WPF()->usergroup->get_visible_usergroup_ids() ) );
 
 
97
 
98
  return $instance;
99
  }
5
  use WP_Widget;
6
 
7
  class OnlineMembers extends WP_Widget {
8
+ /**
9
+ * @var array
10
+ */
11
+ private $default_instance;
12
+
13
  function __construct() {
14
  parent::__construct( 'wpforo_online_members', 'wpForo Online Members', [ 'description' => 'Online members.' ] );
15
+ $this->init_local_vars();
16
+ add_action( 'wp_ajax_wpforo_load_ajax_widget_OnlineMembers', [ $this, 'load_ajax_widget' ] );
17
+ add_action( 'wp_ajax_nopriv_wpforo_load_ajax_widget_OnlineMembers', [ $this, 'load_ajax_widget' ] );
18
  }
19
 
20
+ private function init_local_vars() {
21
+ $this->default_instance = [
22
+ 'title' => __( 'Online Members', 'wpforo' ),
23
+ 'count' => 15,
24
+ 'display_avatar' => true,
25
+ 'groupids' => WPF()->usergroup->get_visible_usergroup_ids(),
26
+ 'refresh_interval' => 0,
27
+ ];
28
+ }
29
 
30
+ public function load_ajax_widget() {
31
+ $_POST = wp_unslash( $_POST );
32
+ $instance = json_decode( (string) wpfval( $_POST, 'instance' ), true );
33
+ $online_members = WPF()->member->get_online_members( $instance['count'], $instance['groupids'] );
34
+ ob_start();
 
 
 
 
35
  if( ! empty( $online_members ) ) {
36
  echo '<ul>
37
  <li>
56
  } else {
57
  echo '<p class="wpf-widget-note">&nbsp;' . wpforo_phrase( 'No online members at the moment', false ) . '</p>';
58
  }
59
+ wp_send_json_success( ['html' => ob_get_clean()] );
60
+ }
61
+
62
+ public function widget( $args, $instance ) {
63
+ $instance = wpforo_parse_args( $instance, $this->default_instance );
64
+ $data = [
65
+ 'boardid' => 0,
66
+ 'action' => 'wpforo_load_ajax_widget_OnlineMembers',
67
+ 'instance' => $instance,
68
+ ];
69
+ if( WPF()->board->get_current( 'boardid' ) !== 0 ) $data['referer'] = home_url();
70
+ $json = json_encode( $data );
71
+ wp_enqueue_script( 'wpforo-widgets-js' );
72
+ echo $args['before_widget'] . '<div id="wpf-widget-online-users" class="wpforo-widget-wrap">';
73
+ if( $instance['title'] ) echo $args['before_title'] . apply_filters( 'widget_title', $instance['title'] ) . $args['after_title'];
74
+ echo '<div class="wpforo-widget-content wpforo-ajax-widget" data-json="' . esc_attr( $json ) . '"></div></div>' . $args['after_widget'];
75
  }
76
 
77
  public function form( $instance ) {
78
+ $instance = wpforo_parse_args( $instance, $this->default_instance );
79
+ $title = (string) $instance['title'];
80
+ $count = (int) $instance['count'];
81
+ $display_avatar = (bool) $instance['display_avatar'];
82
+ $groupids = array_filter( wpforo_parse_args( ( wpforo_is_json( $instance['groupids'] ) ? json_decode( $instance['groupids'], true ) : $instance['groupids'] ) ) );
83
+ $refresh_interval = (int) $instance['refresh_interval'];
84
  ?>
85
+ <div class="wpf-wdg-wrapper">
86
+ <p>
87
+ <label for="<?php echo $this->get_field_id( 'title' ) ?>"><?php _e( 'Title', 'wpforo' ); ?>:</label>
88
+ <input id="<?php echo $this->get_field_id( 'title' ) ?>" class="widefat" name="<?php echo esc_attr( $this->get_field_name( 'title' ) ); ?>" type="text" value="<?php echo esc_attr( $title ); ?>">
89
+ </p>
90
+ <p>
91
+ <label for="<?php echo $this->get_field_id( 'groupids' ) ?>"><?php _e( 'User Groups', 'wpforo' ); ?></label>&nbsp;
92
+ <select id="<?php echo $this->get_field_id( 'groupids' ) ?>" name="<?php echo esc_attr( $this->get_field_name( 'groupids' ) ); ?>[]" multiple required>
93
+ <?php WPF()->usergroup->show_selectbox( $groupids, 4 ) ?>
 
 
 
94
  </select>
95
+ </p>
96
+ <p>
97
+ <label for="<?php echo $this->get_field_id( 'count' ) ?>"><?php _e( 'Number of Items', 'wpforo' ); ?></label>&nbsp;
98
+ <input id="<?php echo $this->get_field_id( 'count' ) ?>" type="number" min="1" style="width: 53px;" name="<?php echo esc_attr( $this->get_field_name( 'count' ) ); ?>" value="<?php echo esc_attr( $count ); ?>">
99
+ </p>
100
+ <p>
101
+ <span><?php _e( 'Display with avatars', 'wpforo' ); ?> : </span>
102
+
103
+ <label for="<?php echo $this->get_field_id( 'display_avatar' ) ?>_1"><?php _e( 'Yes', 'wpforo' ); ?></label>
104
+ <input id="<?php echo $this->get_field_id( 'display_avatar' ) ?>_1" value="1" <?php checked( $display_avatar ); ?> type="radio" name="<?php echo esc_attr( $this->get_field_name( 'display_avatar' ) ); ?>">
105
+
106
+ <label for="<?php echo $this->get_field_id( 'display_avatar' ) ?>_0"><?php _e( 'No', 'wpforo' ); ?></label>
107
+ <input id="<?php echo $this->get_field_id( 'display_avatar' ) ?>_0" value="0" <?php checked( $display_avatar, false ); ?> type="radio" name="<?php echo esc_attr( $this->get_field_name( 'display_avatar' ) ); ?>">
108
+ </p>
109
+ <p>
110
+ <label for="<?php echo $this->get_field_id( 'refresh_interval' ) ?>"><?php _e( 'Auto Refresh Interval Seconds', 'wpforo' ); ?></label>&nbsp;
111
+ <input id="<?php echo $this->get_field_id( 'refresh_interval' ) ?>" type="number" min="0" style="display: inline-block; width: 53px;" name="<?php echo esc_attr( $this->get_field_name( 'refresh_interval' ) ); ?>" value="<?php echo esc_attr( $refresh_interval ); ?>">
112
+ <span style="color: #ccc"><?php _e( 'Set 0 to disable autorefresh', 'wpforo' ) ?></span>
113
+ </p>
114
+ </div>
115
  <?php
116
  }
117
 
118
  public function update( $new_instance, $old_instance ) {
119
+ $new_instance = wpforo_parse_args( $new_instance, $this->default_instance );
120
+ $instance = [];
121
+ $instance['title'] = strip_tags( (string) $new_instance['title'] );
122
+ $instance['count'] = (int) $new_instance['count'];
123
+ $instance['display_avatar'] = (bool) (int) $new_instance['display_avatar'];
124
+ $instance['groupids'] = array_filter( wpforo_parse_args( $new_instance['groupids'] ) );
125
+ $instance['refresh_interval'] = (int) $new_instance['refresh_interval'];
126
 
127
  return $instance;
128
  }
widgets/RecentPosts.php CHANGED
@@ -12,21 +12,30 @@ class RecentPosts extends WP_Widget {
12
  function __construct() {
13
  parent::__construct( 'wpforo_recent_posts', 'wpForo Recent Posts', [ 'description' => 'Your forum\'s recent posts.' ] );
14
  $this->init_local_vars();
 
 
 
 
 
15
  }
16
 
17
  private function init_local_vars() {
18
  $this->default_instance = [
 
19
  'title' => 'Recent Posts',
20
  'forumids' => [],
21
  'orderby' => 'created',
22
  'order' => 'DESC',
23
  'count' => 9,
24
  'limit_per_topic' => 0,
25
- 'display_avatar' => false,
26
  'forumids_filter' => false,
27
  'current_forumid_filter' => false,
 
28
  'display_only_unread' => false,
29
  'display_new_indicator' => false,
 
 
30
  ];
31
  $this->orderby_fields = [
32
  'created' => __( 'Created Date', 'wpforo' ),
@@ -38,157 +47,158 @@ class RecentPosts extends WP_Widget {
38
  ];
39
  }
40
 
41
- public function widget( $args, $instance ) {
42
- // wp_enqueue_script('wpforo-widgets-js');
43
- $login = is_user_logged_in();
44
- $instance = wpforo_parse_args( $instance, $this->default_instance );
45
- if( $instance['display_only_unread'] ) {
46
- $display_widget = $login;
47
- $display_widget = apply_filters( 'wpforo_widget_display_recent_posts', $display_widget );
48
- } else {
49
- $display_widget = true;
50
- }
51
-
52
- if( $display_widget ) {
53
- if( $instance['current_forumid_filter'] && $current_forumid = wpfval( WPF()->current_object, 'forumid' ) ) {
54
- $instance['forumids'] = (array) $current_forumid;
55
- }
56
-
57
- echo $args['before_widget'];//This is an HTML content//
58
- echo '<div id="wpf-widget-recent-replies" class="wpforo-widget-wrap">';
59
 
60
- if( ! empty( $instance['title'] ) ) {
61
- echo $args['before_title'] . apply_filters( 'widget_title', $instance['title'] ) . $args['after_title'];//This is an HTML content//
 
 
 
 
62
  }
63
- $private = ( ! is_user_logged_in() || ! WPF()->usergroup->can( 'aum' ) ) ? 0 : null;
64
- $status = ( ! is_user_logged_in() || ! WPF()->usergroup->can( 'aum' ) ) ? 0 : null;
65
- // widget content from front end
66
- $ug_can_va = WPF()->usergroup->can( 'va' );
67
- $is_avatar = wpforo_setting( 'profiles', 'avatars' );
68
- $posts_args = [
69
- 'forumids' => ( $instance['forumids'] ?: $this->default_instance['forumids'] ),
70
- 'orderby' => ( key_exists( $instance['orderby'], $this->orderby_fields ) ? $instance['orderby'] : $this->default_instance['orderby'] ),
71
- 'order' => ( key_exists( $instance['order'], $this->order_fields ) ? $instance['order'] : $this->default_instance['order'] ),
72
- 'row_count' => ( ( $count = intval( $instance['count'] ) ) ? $count : $this->default_instance['count'] ),
73
- 'limit_per_topic' => ( ( $limit = intval( $instance['limit_per_topic'] ) ) ? $limit : $this->default_instance['limit_per_topic'] ),
74
- 'private' => $private,
75
- 'status' => $status,
76
- 'check_private' => true,
77
- ];
78
- echo '<div class="wpforo-widget-content"><ul>';
79
- if( $posts_args['limit_per_topic'] ) {
80
- if( $instance['display_only_unread'] && $login ) {
81
- $grouped_postids = WPF()->post->get_unread_posts( $posts_args, $count );
82
- } else {
83
- $grouped_postids = WPF()->post->get_posts( $posts_args );
84
- }
85
- if( ! empty( $grouped_postids ) ) {
86
- $grouped_postids = implode( ',', $grouped_postids );
87
- $postids = array_filter( array_map( 'wpforo_bigintval', explode( ',', $grouped_postids ) ) );
88
- rsort( $postids );
89
- foreach( $postids as $postid ) {
90
- $class = '';
91
- $post = wpforo_post( $postid );
92
- if( ! wpfval($post, 'forumid') ) continue;
93
- if( ! WPF()->post->view_access( $post ) ) continue;
94
- $current = $post['topicid'] == wpfval( WPF()->current_object, 'topicid' );
95
- if( ! $current ) {
96
- $class = 'class="' . ( $instance['display_only_unread'] ? 'wpf-unread-post' : wpforo_unread( $post['topicid'], 'post', false, $post['postid'] ) ) . '"';
97
- }
98
- $member = wpforo_member( $post );
99
- ?>
100
- <li <?php echo $class; ?>>
101
- <div class="wpforo-list-item ">
102
- <?php if( $instance['display_avatar'] ): ?>
103
- <?php if( $ug_can_va && $is_avatar ): ?>
104
- <div class="wpforo-list-item-left">
105
- <?php echo WPF()->member->avatar( $member ); ?>
106
- </div>
107
- <?php endif; ?>
108
- <?php endif; ?>
109
- <div class="wpforo-list-item-right" <?php if( ! $instance['display_avatar'] || !wpforo_setting('profiles', 'avatars') ): ?> style="width:100%"<?php endif; ?>>
110
- <p class="posttitle">
111
- <a href="<?php echo esc_url( $post['url'] ) ?>"><?php
112
- if( $t = esc_html( trim( $post['title'] ) ) ) {
113
- echo $t;
114
- } else {
115
- echo wpforo_phrase( 'RE', false, 'default' ) . ': ' . esc_html( trim( wpforo_topic( $post['topicid'], 'title' ) ) );
116
- } ?>
117
- </a>
118
- <?php if( ! $current && $instance['display_new_indicator'] ) wpforo_unread_button( $post['topicid'], '', true, $post['postid'] ) ?>
119
- </p>
120
- <p class="posttext"><?php echo esc_html( wpforo_text( $post['body'], 55 ) ); ?></p>
121
- <p class="postuser"><?php wpforo_phrase( 'by' ) ?> <?php wpforo_member_link( $member ) ?>
122
- , <?php esc_html( wpforo_date( $post['created'] ) ) ?></p>
123
  </div>
124
- <div class="wpf-clear"></div>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
125
  </div>
126
- </li>
127
- <?php
128
- }
129
- } else {
130
- $error_message = ( $instance['display_only_unread'] ) ? 'No new posts found' : 'No posts found';
131
- echo '<li class="wpf-no-post-found">' . wpforo_phrase( $error_message, false ) . '</li>';
132
  }
133
  } else {
134
- if( $instance['display_only_unread'] && $login ) {
135
- $recent_posts = WPF()->post->get_unread_posts( $posts_args, $count );
136
- } else {
137
- $recent_posts = WPF()->post->get_posts( $posts_args );
138
- }
139
- if( ! empty( $recent_posts ) ) {
140
- foreach( $recent_posts as $post ) {
141
- $class = '';
142
- $post_url = wpforo_post( $post['postid'], 'url' );
143
- $member = wpforo_member( $post );
144
- $current = $post['topicid'] == wpfval( WPF()->current_object, 'topicid' );
145
- if( ! $current ) {
146
- $class = 'class="' . ( $instance['display_only_unread'] ? 'wpf-unread-post' : wpforo_unread( $post['topicid'], 'post', false, $post['postid'] ) ) . '"';
147
- }
148
- ?>
149
- <li <?php echo $class; ?>>
150
- <div class="wpforo-list-item">
151
- <?php if( $instance['display_avatar'] ): ?>
152
- <?php if( $ug_can_va && $is_avatar ): ?>
153
- <div class="wpforo-list-item-left">
154
- <?php echo WPF()->member->avatar( $member ); ?>
155
- </div>
156
- <?php endif; ?>
157
- <?php endif; ?>
158
- <div class="wpforo-list-item-right" <?php if( ! $instance['display_avatar'] || !wpforo_setting('profiles', 'avatars') ): ?> style="width:100%"<?php endif; ?>>
159
- <p class="posttitle">
160
- <a href="<?php echo esc_url( $post_url ) ?>"><?php
161
- if( $t = esc_html( trim( $post['title'] ) ) ) {
162
- echo $t;
163
- } else {
164
- echo wpforo_phrase( 'RE', false, 'default' ) . ': ' . esc_html( trim( wpforo_topic( $post['topicid'], 'title' ) ) );
165
- } ?>
166
- </a>
167
- <?php if( ! $current && $instance['display_new_indicator'] ) wpforo_unread_button( $post['topicid'], '', true, $post['postid'] ) ?>
168
- </p>
169
- <p class="posttext"><?php echo esc_html( wpforo_text( $post['body'], 55 ) ); ?></p>
170
- <p class="postuser"><?php wpforo_phrase( 'by' ) ?> <?php wpforo_member_link( $member ) ?>
171
- , <?php esc_html( wpforo_date( $post['created'] ) ) ?></p>
172
  </div>
173
- <div class="wpf-clear"></div>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
174
  </div>
175
- </li>
176
- <?php
177
- }
178
- } else {
179
- $error_message = ( $instance['display_only_unread'] ) ? 'No new posts found' : 'No posts found';
180
- echo '<li class="wpf-no-post-found">' . wpforo_phrase( $error_message, false ) . '</li>';
181
  }
 
 
 
182
  }
183
- echo '</ul></div>';
184
- echo '</div>';
185
- echo $args['after_widget'];//This is an HTML content//
186
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
187
  }
188
 
189
  public function form( $instance ) {
190
  $instance = wpforo_parse_args( $instance, $this->default_instance );
191
  $title = (string) $instance['title'];
 
192
  $selected = array_unique( array_filter( array_map( 'intval', (array) $instance['forumids'] ) ) );
193
  $orderby = (string) $instance['orderby'];
194
  $order = (string) $instance['order'];
@@ -197,35 +207,26 @@ class RecentPosts extends WP_Widget {
197
  $display_avatar = (bool) $instance['display_avatar'];
198
  $forumids_filter = (bool) $instance['forumids_filter'];
199
  $current_forumid_filter = (bool) $instance['current_forumid_filter'];
 
200
  $display_only_unread = (bool) $instance['display_only_unread'];
201
  $display_new_indicator = (bool) $instance['display_new_indicator'];
 
 
 
202
  ?>
203
  <style>
204
- select.wpf_wdg_forumids {
205
- display: none;
206
- width: 100%;
207
- min-height: 170px;
208
  }
209
 
210
- input.wpf_wdg_forumids_filter:checked ~ select.wpf_wdg_forumids {
211
- display: block;
212
  }
213
-
214
  .wpf_wdg_limit_per_topic {
215
  width: 53px;
216
  }
217
  </style>
218
- <script type="text/javascript">
219
- jQuery(document).ready(function ($) {
220
- $('.wpf_wdg_limit_per_topic').change(function () {
221
- var wrap = $(this).parents('.wpf_wdg_form_wrap')
222
- var disabled = $(this).val() > 0
223
- $('.wpf_wdg_orderby', wrap).attr('disabled', disabled)
224
- $('.wpf_wdg_order', wrap).attr('disabled', disabled)
225
- })
226
- })
227
- </script>
228
- <div class="wpf_wdg_form_wrap">
229
  <p>
230
  <label for="<?php echo $this->get_field_id( 'title' ) ?>"><?php _e( 'Title', 'wpforo' ); ?>:</label>
231
  <input id="<?php echo $this->get_field_id( 'title' ) ?>" class="widefat"
@@ -233,18 +234,35 @@ class RecentPosts extends WP_Widget {
233
  value="<?php echo esc_attr( $title ); ?>">
234
  </p>
235
  <p>
236
- <label for="<?php echo $this->get_field_id('forumids_filter') ?>"><?php _e('Filter by forums', 'wpforo'); ?>:</label>
237
- <input id="<?php echo $this->get_field_id('forumids_filter') ?>" class="wpf_wdg_forumids_filter" name="<?php echo esc_attr( $this->get_field_name( 'forumids_filter' ) ); ?>" <?php checked( $forumids_filter ); ?> type="checkbox">
238
- <select id="<?php echo $this->get_field_id('forumids') ?>" class="wpf_wdg_forumids" name="<?php echo esc_attr( $this->get_field_name( 'forumids' ) ); ?>[]" multiple>
239
- <?php WPF()->forum->tree( 'select_box', false, $selected, false ) ?>
240
  </select>
241
  </p>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
242
  <p>
243
- <label for="<?php echo $this->get_field_id( 'current_forumid_filter' ) ?>"><?php _e( 'Autofilter by current forum', 'wpforo' ); ?>
244
- :</label>
245
- <input id="<?php echo $this->get_field_id( 'current_forumid_filter' ) ?>"
246
- name="<?php echo esc_attr( $this->get_field_name( 'current_forumid_filter' ) ); ?>" <?php checked( $current_forumid_filter ); ?>
247
- type="checkbox">
 
 
248
  </p>
249
  <p>
250
  <label for="<?php echo $this->get_field_id( 'orderby' ) ?>"><?php _e( 'Order by', 'wpforo' ); ?>
@@ -279,24 +297,48 @@ class RecentPosts extends WP_Widget {
279
  value="<?php echo esc_attr( $count ); ?>">
280
  </p>
281
  <p>
282
- <label for="<?php echo $this->get_field_id( 'display_avatar' ) ?>">
283
- <input id="<?php echo $this->get_field_id( 'display_avatar' ) ?>" <?php checked( $display_avatar ); ?>
284
- type="checkbox" name="<?php echo esc_attr( $this->get_field_name( 'display_avatar' ) ); ?>">
285
- <?php _e( 'Display with Avatars', 'wpforo' ); ?></label>
286
  </p>
287
  <p>
288
- <label for="<?php echo $this->get_field_id( 'display_only_unread' ) ?>">
289
- <input id="<?php echo $this->get_field_id( 'display_only_unread' ) ?>" <?php checked( $display_only_unread ); ?>
290
- type="checkbox"
291
- name="<?php echo esc_attr( $this->get_field_name( 'display_only_unread' ) ); ?>">
292
- <?php _e( 'Display Only Unread Posts', 'wpforo' ); ?></label>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
293
  </p>
294
  <p>
295
- <label for="<?php echo $this->get_field_id( 'display_new_indicator' ) ?>">
296
- <input id="<?php echo $this->get_field_id( 'display_new_indicator' ) ?>" <?php checked( $display_new_indicator ); ?>
297
- type="checkbox"
298
- name="<?php echo esc_attr( $this->get_field_name( 'display_new_indicator' ) ); ?>">
299
- <?php _e( 'Display [new] indicator', 'wpforo' ); ?></label>
 
 
 
 
 
 
 
300
  </p>
301
  </div>
302
  <?php
@@ -305,18 +347,28 @@ class RecentPosts extends WP_Widget {
305
  public function update( $new_instance, $old_instance ) {
306
  $new_instance = wpforo_parse_args( $new_instance, $this->default_instance );
307
  $instance = [];
308
- $instance['title'] = ( ! empty( $new_instance['title'] ) ) ? strip_tags( $new_instance['title'] ) : '';
309
- $instance['forumids_filter'] = isset( $new_instance['forumids_filter'] ) ? (bool) $new_instance['forumids_filter'] : $this->default_instance['forumids_filter'];
310
- $instance['forumids'] = ( $instance['forumids_filter'] ? array_unique( array_filter( array_map( 'intval', (array) wpfval( $new_instance, 'forumids' ) ) ) ) : [] );
 
311
  $instance['orderby'] = ( ! empty( $new_instance['orderby'] ) && key_exists( $new_instance['orderby'], $this->orderby_fields ) ) ? $new_instance['orderby'] : $this->default_instance['orderby'];
312
  $instance['order'] = ( ! empty( $new_instance['order'] ) && key_exists( $new_instance['order'], $this->order_fields ) ) ? $new_instance['order'] : $this->default_instance['order'];
313
- $instance['count'] = ( ! empty( $new_instance['count'] ) ) ? intval( $new_instance['count'] ) : $this->default_instance['count'];
314
- $instance['limit_per_topic'] = ( ! empty( $new_instance['limit_per_topic'] ) ) ? intval( $new_instance['limit_per_topic'] ) : $this->default_instance['limit_per_topic'];
315
- $instance['display_avatar'] = isset( $new_instance['display_avatar'] ) ? (bool) $new_instance['display_avatar'] : $this->default_instance['display_avatar'];
316
- $instance['current_forumid_filter'] = isset( $new_instance['current_forumid_filter'] ) ? (bool) $new_instance['current_forumid_filter'] : $this->default_instance['current_forumid_filter'];
317
- $instance['display_only_unread'] = isset( $new_instance['display_only_unread'] ) ? (bool) $new_instance['display_only_unread'] : $this->default_instance['display_only_unread'];
318
- $instance['display_new_indicator'] = isset( $new_instance['display_new_indicator'] ) ? (bool) $new_instance['display_new_indicator'] : $this->default_instance['display_new_indicator'];
 
 
 
319
 
320
  return $instance;
321
  }
 
 
 
 
 
 
322
  }
12
  function __construct() {
13
  parent::__construct( 'wpforo_recent_posts', 'wpForo Recent Posts', [ 'description' => 'Your forum\'s recent posts.' ] );
14
  $this->init_local_vars();
15
+ add_action( 'wp_ajax_wpforo_load_ajax_widget_RecentPosts', [ $this, 'load_ajax_widget' ] );
16
+ add_action( 'wp_ajax_nopriv_wpforo_load_ajax_widget_RecentPosts', [ $this, 'load_ajax_widget' ] );
17
+ if( is_admin() ) {
18
+ add_action( 'wp_ajax_wpforo_get_forum_tree', [ $this, 'get_forum_tree' ] );
19
+ }
20
  }
21
 
22
  private function init_local_vars() {
23
  $this->default_instance = [
24
+ 'boardid' => 0,
25
  'title' => 'Recent Posts',
26
  'forumids' => [],
27
  'orderby' => 'created',
28
  'order' => 'DESC',
29
  'count' => 9,
30
  'limit_per_topic' => 0,
31
+ 'display_avatar' => true,
32
  'forumids_filter' => false,
33
  'current_forumid_filter' => false,
34
+ 'exclude_firstposts' => false,
35
  'display_only_unread' => false,
36
  'display_new_indicator' => false,
37
+ 'refresh_interval' => 0,
38
+ 'excerpt_length' => 55,
39
  ];
40
  $this->orderby_fields = [
41
  'created' => __( 'Created Date', 'wpforo' ),
47
  ];
48
  }
49
 
50
+ public function load_ajax_widget() {
51
+ $_POST = wp_unslash( $_POST );
52
+ $is_user_logged_in = (bool) WPF()->current_userid;
53
+ $instance = json_decode( (string) wpfval( $_POST, 'instance' ), true );
54
+ $post_args = json_decode( (string) wpfval( $_POST, 'post_args' ), true );
55
+ $post_args['private'] = ( ! $is_user_logged_in || ! WPF()->usergroup->can( 'aum' ) ) ? 0 : null;
56
+ $post_args['status'] = ( ! $is_user_logged_in || ! WPF()->usergroup->can( 'aum' ) ) ? 0 : null;
57
+ $print_avatar = $instance['display_avatar'] && wpforo_setting( 'profiles', 'avatars' ) && WPF()->usergroup->can( 'va' );
 
 
 
 
 
 
 
 
 
 
58
 
59
+ ob_start();
60
+ if( $post_args['limit_per_topic'] ) {
61
+ if( $instance['display_only_unread'] && $is_user_logged_in ) {
62
+ $grouped_postids = WPF()->post->get_unread_posts( $post_args, $post_args['row_count'] );
63
+ } else {
64
+ $grouped_postids = WPF()->post->get_posts( $post_args );
65
  }
66
+ if( ! empty( $grouped_postids ) ) {
67
+ $grouped_postids = implode( ',', $grouped_postids );
68
+ $postids = array_filter( array_map( 'wpforo_bigintval', explode( ',', $grouped_postids ) ) );
69
+ rsort( $postids );
70
+ foreach( $postids as $postid ) {
71
+ $class = '';
72
+ $post = wpforo_post( $postid );
73
+ if( ! wpfval($post, 'forumid') ) continue;
74
+ if( ! WPF()->post->view_access( $post ) ) continue;
75
+ $current = $post['topicid'] == wpfval( WPF()->current_object, 'topicid' );
76
+ if( ! $current ) {
77
+ $class = 'class="' . ( $instance['display_only_unread'] ? 'wpf-unread-post' : wpforo_unread( $post['topicid'], 'post', false, $post['postid'] ) ) . '"';
78
+ }
79
+ $member = wpforo_member( $post );
80
+ ?>
81
+ <li <?php echo $class; ?>>
82
+ <div class="wpforo-list-item ">
83
+ <?php if( $print_avatar ): ?>
84
+ <div class="wpforo-list-item-left">
85
+ <?php echo WPF()->member->avatar( $member ); ?>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
86
  </div>
87
+ <?php endif; ?>
88
+ <div class="wpforo-list-item-right" <?php if( ! $print_avatar ): ?> style="width: 100%"<?php endif; ?>>
89
+ <p class="posttitle">
90
+ <a href="<?php echo esc_url( $post['url'] ) ?>"><?php
91
+ if( $t = esc_html( trim( $post['title'] ) ) ) {
92
+ echo $t;
93
+ } else {
94
+ echo wpforo_phrase( 'RE', false, 'default' ) . ': ' . esc_html( trim( wpforo_topic( $post['topicid'], 'title' ) ) );
95
+ } ?>
96
+ </a>
97
+ <?php if( ! $current && $instance['display_new_indicator'] ) wpforo_unread_button( $post['topicid'], '', true, $post['postid'] ) ?>
98
+ </p>
99
+ <p class="posttext"><?php echo esc_html( wpforo_text( $post['body'], $instance['excerpt_length'] ) ); ?></p>
100
+ <p class="postuser"><?php wpforo_phrase( 'by' ) ?> <?php wpforo_member_link( $member ) ?>
101
+ , <?php esc_html( wpforo_date( $post['created'] ) ) ?></p>
102
  </div>
103
+ <div class="wpf-clear"></div>
104
+ </div>
105
+ </li>
106
+ <?php
 
 
107
  }
108
  } else {
109
+ $error_message = ( $instance['display_only_unread'] ) ? 'No new posts found' : 'No posts found';
110
+ echo '<li class="wpf-no-post-found">' . wpforo_phrase( $error_message, false ) . '</li>';
111
+ }
112
+ } else {
113
+ if( $instance['display_only_unread'] && $is_user_logged_in ) {
114
+ $recent_posts = WPF()->post->get_unread_posts( $post_args, $post_args['row_count'] );
115
+ } else {
116
+ $recent_posts = WPF()->post->get_posts( $post_args );
117
+ }
118
+ if( ! empty( $recent_posts ) ) {
119
+ foreach( $recent_posts as $post ) {
120
+ $class = '';
121
+ $post_url = wpforo_post( $post['postid'], 'url' );
122
+ $member = wpforo_member( $post );
123
+ $current = $post['topicid'] == wpfval( WPF()->current_object, 'topicid' );
124
+ if( ! $current ) {
125
+ $class = 'class="' . ( $instance['display_only_unread'] ? 'wpf-unread-post' : wpforo_unread( $post['topicid'], 'post', false, $post['postid'] ) ) . '"';
126
+ }
127
+ ?>
128
+ <li <?php echo $class; ?>>
129
+ <div class="wpforo-list-item">
130
+ <?php if( $print_avatar ): ?>
131
+ <div class="wpforo-list-item-left">
132
+ <?php echo WPF()->member->avatar( $member ); ?>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
133
  </div>
134
+ <?php endif; ?>
135
+ <div class="wpforo-list-item-right" <?php if( ! $print_avatar ): ?> style="width:100%"<?php endif; ?>>
136
+ <p class="posttitle">
137
+ <a href="<?php echo esc_url( $post_url ) ?>"><?php
138
+ if( $t = esc_html( trim( $post['title'] ) ) ) {
139
+ echo $t;
140
+ } else {
141
+ echo wpforo_phrase( 'RE', false, 'default' ) . ': ' . esc_html( trim( wpforo_topic( $post['topicid'], 'title' ) ) );
142
+ } ?>
143
+ </a>
144
+ <?php if( ! $current && $instance['display_new_indicator'] ) wpforo_unread_button( $post['topicid'], '', true, $post['postid'] ) ?>
145
+ </p>
146
+ <p class="posttext"><?php echo esc_html( wpforo_text( $post['body'], $instance['excerpt_length'] ) ); ?></p>
147
+ <p class="postuser"><?php wpforo_phrase( 'by' ) ?> <?php wpforo_member_link( $member ) ?>
148
+ , <?php esc_html( wpforo_date( $post['created'] ) ) ?></p>
149
  </div>
150
+ <div class="wpf-clear"></div>
151
+ </div>
152
+ </li>
153
+ <?php
 
 
154
  }
155
+ } else {
156
+ $error_message = ( $instance['display_only_unread'] ) ? 'No new posts found' : 'No posts found';
157
+ echo '<li class="wpf-no-post-found">' . wpforo_phrase( $error_message, false ) . '</li>';
158
  }
 
 
 
159
  }
160
+
161
+ wp_send_json_success( [ 'html' => sprintf( '<ul>%1$s</ul>', ob_get_clean() ) ] );
162
+ }
163
+
164
+ public function widget( $args, $instance ) {
165
+ wp_enqueue_script( 'wpforo-widgets-js' );
166
+ $is_user_logged_in = (bool) WPF()->current_userid;
167
+ $instance = wpforo_parse_args( $instance, $this->default_instance );
168
+ if( $instance['display_only_unread'] ) {
169
+ $display_widget = $is_user_logged_in;
170
+ $display_widget = apply_filters( 'wpforo_widget_display_recent_posts', $display_widget );
171
+ } else {
172
+ $display_widget = true;
173
+ }
174
+ if( ! $display_widget ) return;
175
+
176
+ if( $instance['current_forumid_filter'] && $instance['boardid'] === WPF()->board->get_current( 'boardid' ) && $current_forumid = wpfval( WPF()->current_object, 'forumid' ) ) $instance['forumids'] = (array) $current_forumid;
177
+ $data = [
178
+ 'boardid' => $instance['boardid'],
179
+ 'action' => 'wpforo_load_ajax_widget_RecentPosts',
180
+ 'instance' => $instance,
181
+ 'post_args' => [
182
+ 'forumids' => ( $instance['forumids'] ?: $this->default_instance['forumids'] ),
183
+ 'orderby' => ( key_exists( $instance['orderby'], $this->orderby_fields ) ? $instance['orderby'] : $this->default_instance['orderby'] ),
184
+ 'order' => ( key_exists( $instance['order'], $this->order_fields ) ? $instance['order'] : $this->default_instance['order'] ),
185
+ 'row_count' => ( intval( $instance['count'] ) ?: $this->default_instance['count'] ),
186
+ 'limit_per_topic' => ( intval( $instance['limit_per_topic'] ) ?: $this->default_instance['limit_per_topic'] ),
187
+ 'is_first_post' => $instance['exclude_firstposts'] ? false : null,
188
+ 'check_private' => true,
189
+ ]
190
+ ];
191
+ if( WPF()->board->get_current( 'boardid' ) !== $instance['boardid'] ) $data['referer'] = home_url();
192
+ $json = json_encode( $data );
193
+ echo $args['before_widget'] . '<div id="wpf-widget-recent-replies" class="wpforo-widget-wrap">';
194
+ if( ! empty( $instance['title'] ) ) echo $args['before_title'] . apply_filters( 'widget_title', $instance['title'] ) . $args['after_title'];
195
+ echo '<div class="wpforo-widget-content wpforo-ajax-widget" data-json="' . esc_attr( $json ) . '"></div></div>' . $args['after_widget'];
196
  }
197
 
198
  public function form( $instance ) {
199
  $instance = wpforo_parse_args( $instance, $this->default_instance );
200
  $title = (string) $instance['title'];
201
+ $boardid = (int) $instance['boardid'];
202
  $selected = array_unique( array_filter( array_map( 'intval', (array) $instance['forumids'] ) ) );
203
  $orderby = (string) $instance['orderby'];
204
  $order = (string) $instance['order'];
207
  $display_avatar = (bool) $instance['display_avatar'];
208
  $forumids_filter = (bool) $instance['forumids_filter'];
209
  $current_forumid_filter = (bool) $instance['current_forumid_filter'];
210
+ $exclude_firstposts = (bool) $instance['exclude_firstposts'];
211
  $display_only_unread = (bool) $instance['display_only_unread'];
212
  $display_new_indicator = (bool) $instance['display_new_indicator'];
213
+ $refresh_interval = (int) $instance['refresh_interval'];
214
+ $excerpt_length = (int) $instance['excerpt_length'];
215
+ WPF()->change_board( $boardid );
216
  ?>
217
  <style>
218
+ .wpf-wdg-wrapper .wpf_wdg_forumids_wrap {
219
+ display: none !important;
 
 
220
  }
221
 
222
+ .wpf-wdg-wrapper input.wpf_wdg_forumids_filter_1:checked ~ .wpf_wdg_forumids_wrap {
223
+ display: block !important;
224
  }
 
225
  .wpf_wdg_limit_per_topic {
226
  width: 53px;
227
  }
228
  </style>
229
+ <div class="wpf-wdg-wrapper">
 
 
 
 
 
 
 
 
 
 
230
  <p>
231
  <label for="<?php echo $this->get_field_id( 'title' ) ?>"><?php _e( 'Title', 'wpforo' ); ?>:</label>
232
  <input id="<?php echo $this->get_field_id( 'title' ) ?>" class="widefat"
234
  value="<?php echo esc_attr( $title ); ?>">
235
  </p>
236
  <p>
237
+ <label for="<?php echo $this->get_field_id( 'boardid' ) ?>"></label>
238
+ <select id="<?php echo $this->get_field_id( 'boardid' ) ?>" class="wpf_wdg_boardid" name="<?php echo esc_attr( $this->get_field_name( 'boardid' ) ); ?>">
239
+ <?php echo WPF()->board->dropdown( $boardid ) ?>
 
240
  </select>
241
  </p>
242
+ <div>
243
+ <span><?php _e( 'Filter by forums', 'wpforo' ); ?> :</span>
244
+
245
+ <label for="<?php echo $this->get_field_id( 'forumids_filter' ) ?>_1"><?php _e( 'Yes', 'wpforo' ); ?></label>
246
+ <input id="<?php echo $this->get_field_id( 'forumids_filter' ) ?>_1" value="1" class="wpf_wdg_forumids_filter_1" name="<?php echo esc_attr( $this->get_field_name( 'forumids_filter' ) ); ?>" <?php checked( $forumids_filter ); ?> type="radio">
247
+
248
+ <label for="<?php echo $this->get_field_id( 'forumids_filter' ) ?>_0"><?php _e( 'No', 'wpforo' ); ?></label>
249
+ <input id="<?php echo $this->get_field_id( 'forumids_filter' ) ?>_0" value="0" class="wpf_wdg_forumids_filter_0" name="<?php echo esc_attr( $this->get_field_name( 'forumids_filter' ) ); ?>" <?php checked( $forumids_filter, false ); ?> type="radio">
250
+
251
+ <div class="wpf_wdg_forumids_wrap">
252
+ <label for="<?php echo $this->get_field_id( 'forumids' ) ?>"></label>
253
+ <select id="<?php echo $this->get_field_id( 'forumids' ) ?>" class="wpf_wdg_forumids" name="<?php echo esc_attr( $this->get_field_name( 'forumids' ) ); ?>[]" multiple>
254
+ <?php WPF()->forum->tree( 'select_box', false, $selected ) ?>
255
+ </select>
256
+ </div>
257
+ </div>
258
  <p>
259
+ <span><?php _e( 'Autofilter by current forum', 'wpforo' ); ?> : </span>
260
+
261
+ <label for="<?php echo $this->get_field_id( 'current_forumid_filter' ) ?>_1"><?php _e( 'Yes', 'wpforo' ); ?></label>
262
+ <input id="<?php echo $this->get_field_id( 'current_forumid_filter' ) ?>_1" name="<?php echo esc_attr( $this->get_field_name( 'current_forumid_filter' ) ); ?>" value="1" <?php checked( $current_forumid_filter ); ?> type="radio">
263
+
264
+ <label for="<?php echo $this->get_field_id( 'current_forumid_filter' ) ?>_0"><?php _e( 'No', 'wpforo' ); ?></label>
265
+ <input id="<?php echo $this->get_field_id( 'current_forumid_filter' ) ?>_0" name="<?php echo esc_attr( $this->get_field_name( 'current_forumid_filter' ) ); ?>" value="0" <?php checked( $current_forumid_filter, false ); ?> type="radio">
266
  </p>
267
  <p>
268
  <label for="<?php echo $this->get_field_id( 'orderby' ) ?>"><?php _e( 'Order by', 'wpforo' ); ?>
297
  value="<?php echo esc_attr( $count ); ?>">
298
  </p>
299
  <p>
300
+ <label for="<?php echo $this->get_field_id( 'excerpt_length' ) ?>"><?php _e( 'Excerpt Length', 'wpforo' ); ?></label>&nbsp;
301
+ <input id="<?php echo $this->get_field_id( 'excerpt_length' ) ?>" type="number" min="0" style="display: inline-block; width: 53px;" name="<?php echo esc_attr( $this->get_field_name( 'excerpt_length' ) ); ?>" value="<?php echo esc_attr( $excerpt_length ); ?>">
302
+ <span style="color: #ccc"><?php _e( 'Set 0 to disable autorefresh', 'wpforo' ) ?></span>
 
303
  </p>
304
  <p>
305
+ <span><?php _e( 'Display with avatars', 'wpforo' ); ?> : </span>
306
+
307
+ <label for="<?php echo $this->get_field_id( 'display_avatar' ) ?>_1"><?php _e( 'Yes', 'wpforo' ); ?></label>
308
+ <input id="<?php echo $this->get_field_id( 'display_avatar' ) ?>_1" value="1" <?php checked( $display_avatar ); ?> type="radio" name="<?php echo esc_attr( $this->get_field_name( 'display_avatar' ) ); ?>">
309
+
310
+ <label for="<?php echo $this->get_field_id( 'display_avatar' ) ?>_0"><?php _e( 'No', 'wpforo' ); ?></label>
311
+ <input id="<?php echo $this->get_field_id( 'display_avatar' ) ?>_0" value="0" <?php checked( $display_avatar, false ); ?> type="radio" name="<?php echo esc_attr( $this->get_field_name( 'display_avatar' ) ); ?>">
312
+ </p>
313
+ <p>
314
+ <span><?php _e( 'Exclude First Posts', 'wpforo' ); ?></span>
315
+ <label for="<?php echo $this->get_field_id( 'exclude_firstposts' ) ?>_1"><?php _e( 'Yes', 'wpforo' ); ?></label>
316
+ <input id="<?php echo $this->get_field_id( 'exclude_firstposts' ) ?>_1" value="1" <?php checked( $exclude_firstposts ); ?> type="radio" name="<?php echo esc_attr( $this->get_field_name( 'exclude_firstposts' ) ); ?>">
317
+
318
+ <label for="<?php echo $this->get_field_id( 'exclude_firstposts' ) ?>_0"><?php _e( 'No', 'wpforo' ); ?></label>
319
+ <input id="<?php echo $this->get_field_id( 'exclude_firstposts' ) ?>_0" value="0" <?php checked( $exclude_firstposts, false ); ?> type="radio" name="<?php echo esc_attr( $this->get_field_name( 'exclude_firstposts' ) ); ?>">
320
+ </p>
321
+ <p>
322
+ <span><?php _e( 'Display Only Unread Posts', 'wpforo' ); ?></span>
323
+ <label for="<?php echo $this->get_field_id( 'display_only_unread' ) ?>_1"><?php _e( 'Yes', 'wpforo' ); ?></label>
324
+ <input id="<?php echo $this->get_field_id( 'display_only_unread' ) ?>_1" value="1" <?php checked( $display_only_unread ); ?> type="radio" name="<?php echo esc_attr( $this->get_field_name( 'display_only_unread' ) ); ?>">
325
+
326
+ <label for="<?php echo $this->get_field_id( 'display_only_unread' ) ?>_0"><?php _e( 'No', 'wpforo' ); ?></label>
327
+ <input id="<?php echo $this->get_field_id( 'display_only_unread' ) ?>_0" value="0" <?php checked( $display_only_unread, false ); ?> type="radio" name="<?php echo esc_attr( $this->get_field_name( 'display_only_unread' ) ); ?>">
328
  </p>
329
  <p>
330
+ <span><?php _e( 'Display [new] indicator', 'wpforo' ); ?> : </span>
331
+
332
+ <label for="<?php echo $this->get_field_id( 'display_new_indicator' ) ?>_1"><?php _e( 'Yes', 'wpforo' ); ?></label>
333
+ <input id="<?php echo $this->get_field_id( 'display_new_indicator' ) ?>_1" value="1" <?php checked( $display_new_indicator ); ?> type="radio" name="<?php echo esc_attr( $this->get_field_name( 'display_new_indicator' ) ); ?>">
334
+
335
+ <label for="<?php echo $this->get_field_id( 'display_new_indicator' ) ?>_0"><?php _e( 'No', 'wpforo' ); ?></label>
336
+ <input id="<?php echo $this->get_field_id( 'display_new_indicator' ) ?>_0" value="0" <?php checked( $display_new_indicator, false ); ?> type="radio" name="<?php echo esc_attr( $this->get_field_name( 'display_new_indicator' ) ); ?>">
337
+ </p>
338
+ <p>
339
+ <label for="<?php echo $this->get_field_id( 'refresh_interval' ) ?>"><?php _e( 'Auto Refresh Interval Seconds', 'wpforo' ); ?></label>&nbsp;
340
+ <input id="<?php echo $this->get_field_id( 'refresh_interval' ) ?>" type="number" min="0" style="display: inline-block; width: 53px;" name="<?php echo esc_attr( $this->get_field_name( 'refresh_interval' ) ); ?>" value="<?php echo esc_attr( $refresh_interval ); ?>">
341
+ <span style="color: #ccc"><?php _e( 'Set 0 to disable autorefresh', 'wpforo' ) ?></span>
342
  </p>
343
  </div>
344
  <?php
347
  public function update( $new_instance, $old_instance ) {
348
  $new_instance = wpforo_parse_args( $new_instance, $this->default_instance );
349
  $instance = [];
350
+ $instance['title'] = strip_tags( (string) $new_instance['title'] );
351
+ $instance['boardid'] = (int) $new_instance['boardid'];
352
+ $instance['forumids_filter'] = (bool) (int) $new_instance['forumids_filter'];
353
+ $instance['forumids'] = array_unique( array_filter( array_map( 'intval', (array) $new_instance['forumids'] ) ) );
354
  $instance['orderby'] = ( ! empty( $new_instance['orderby'] ) && key_exists( $new_instance['orderby'], $this->orderby_fields ) ) ? $new_instance['orderby'] : $this->default_instance['orderby'];
355
  $instance['order'] = ( ! empty( $new_instance['order'] ) && key_exists( $new_instance['order'], $this->order_fields ) ) ? $new_instance['order'] : $this->default_instance['order'];
356
+ $instance['count'] = (int) $new_instance['count'];
357
+ $instance['display_avatar'] = (bool) (int) $new_instance['display_avatar'];
358
+ $instance['current_forumid_filter'] = (bool) (int) $new_instance['current_forumid_filter'];
359
+ $instance['limit_per_topic'] = (int) $new_instance['limit_per_topic'];
360
+ $instance['exclude_firstposts'] = (bool) (int) $new_instance['exclude_firstposts'];
361
+ $instance['display_only_unread'] = (bool) (int) $new_instance['display_only_unread'];
362
+ $instance['display_new_indicator'] = (bool) (int) $new_instance['display_new_indicator'];
363
+ $instance['refresh_interval'] = (int) $new_instance['refresh_interval'];
364
+ $instance['excerpt_length'] = (int) $new_instance['excerpt_length'];
365
 
366
  return $instance;
367
  }
368
+
369
+ public function get_forum_tree() {
370
+ ob_start();
371
+ WPF()->forum->tree( 'select_box', false, [] );
372
+ wp_send_json_success( [ 'html' => ob_get_clean() ] );
373
+ }
374
  }
widgets/RecentTopics.php CHANGED
@@ -12,19 +12,26 @@ class RecentTopics extends WP_Widget {
12
  function __construct() {
13
  parent::__construct( 'wpforo_recent_topics', 'wpForo Recent Topics', [ 'description' => 'Your forum\'s recent topics.' ] );
14
  $this->init_local_vars();
 
 
 
 
 
15
  }
16
 
17
  private function init_local_vars() {
18
  $this->default_instance = [
 
19
  'title' => 'Recent Topics',
20
  'forumids' => [],
21
  'orderby' => 'created',
22
  'order' => 'DESC',
23
  'count' => 9,
24
- 'display_avatar' => false,
25
  'forumids_filter' => false,
26
  'current_forumid_filter' => false,
27
  'goto_unread' => false,
 
28
  ];
29
  $this->orderby_fields = [
30
  'created' => __( 'Created Date', 'wpforo' ),
@@ -38,74 +45,88 @@ class RecentTopics extends WP_Widget {
38
  ];
39
  }
40
 
41
- public function widget( $args, $instance ) {
42
- // wp_enqueue_script('wpforo-widgets-js');
 
 
 
 
 
43
 
44
- $instance = wpforo_parse_args( $instance, $this->default_instance );
45
- if( $instance['current_forumid_filter'] && $current_forumid = wpfval( WPF()->current_object, 'forumid' ) ) {
46
- $instance['forumids'] = (array) $current_forumid;
47
- }
48
- echo $args['before_widget'];//This is an HTML content//
49
- echo '<div id="wpf-widget-recent-replies" class="wpforo-widget-wrap">';
50
- if( ! empty( $instance['title'] ) ) {
51
- echo $args['before_title'] . apply_filters( 'widget_title', $instance['title'] ) . $args['after_title'];//This is an HTML content//
52
- }
53
- // widget content from front end
54
- $private = ( ! is_user_logged_in() || ! WPF()->usergroup->can( 'aum' ) ) ? 0 : null;
55
- $status = ( ! is_user_logged_in() || ! WPF()->usergroup->can( 'aum' ) ) ? 0 : null;
56
- $topic_args = [
57
- 'forumids' => ( $instance['forumids'] ?: $this->default_instance['forumids'] ),
58
- 'orderby' => ( key_exists( $instance['orderby'], $this->orderby_fields ) ? $instance['orderby'] : $this->default_instance['orderby'] ),
59
- 'order' => ( key_exists( $instance['order'], $this->order_fields ) ? $instance['order'] : $this->default_instance['order'] ),
60
- 'row_count' => ( ( $count = intval( $instance['count'] ) ) ? $count : $this->default_instance['count'] ),
61
- 'private' => $private,
62
- 'status' => $status,
63
- ];
64
- $topics = WPF()->topic->get_topics( $topic_args );
65
- $ug_can_va = WPF()->usergroup->can( 'va' );
66
- $is_avatar = wpforo_setting( 'profiles', 'avatars' );
67
- echo '<div class="wpforo-widget-content"><ul>';
68
  foreach( $topics as $topic ) {
69
  $topic_url = wpforo_topic( $topic['topicid'], 'url' );
70
  $member = wpforo_member( $topic );
71
- ?>
72
- <li>
73
- <div class="wpforo-list-item">
74
- <?php if( $instance['display_avatar'] ): ?>
75
- <?php if( $ug_can_va && $is_avatar ): ?>
76
- <div class="wpforo-list-item-left">
77
- <?php echo WPF()->member->avatar( $member ); ?>
78
- </div>
79
- <?php endif; ?>
80
- <?php endif; ?>
81
- <div class="wpforo-list-item-right" <?php if( ! $instance['display_avatar'] || !wpforo_setting('profiles', 'avatars') ): ?> style="width:100%"<?php endif; ?>>
82
- <p class="posttitle">
83
- <?php if( wpfval( $instance, 'goto_unread' ) ): ?>
84
- <?php wpforo_topic_title( $topic, $topic_url, '{p}{au}{t}{/a}' ) ?>
85
- <?php if( $topic['topicid'] != wpfval( WPF()->current_object, 'topicid' ) ): ?>
86
- <?php wpforo_unread_button( $topic['topicid'], $topic_url ); ?>
87
- <?php endif; ?>
88
- <?php else: ?>
89
- <?php wpforo_topic_title( $topic, $topic_url, '{p}{a}{t}{/a}' ) ?>
90
- <?php endif; ?>
91
- </p>
92
- <p class="postuser"><?php wpforo_phrase( 'by' ) ?> <?php wpforo_member_link( $member ) ?>, <span
93
- style="white-space:nowrap;"><?php esc_html( wpforo_date( $topic['created'] ) ) ?></span>
94
- </p>
95
  </div>
96
- <div class="wpf-clear"></div>
97
- </div>
98
- </li>
99
- <?php
 
 
 
 
 
 
 
 
 
100
  }
101
- echo '</ul></div>';
102
- echo '</div>';
103
- echo $args['after_widget'];//This is an HTML content//
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
104
  }
105
 
106
  public function form( $instance ) {
107
  $instance = wpforo_parse_args( $instance, $this->default_instance );
108
  $title = (string) $instance['title'];
 
109
  $selected = array_unique( array_filter( array_map( 'intval', (array) $instance['forumids'] ) ) );
110
  $orderby = (string) $instance['orderby'];
111
  $order = (string) $instance['order'];
@@ -114,94 +135,124 @@ class RecentTopics extends WP_Widget {
114
  $forumids_filter = (bool) $instance['forumids_filter'];
115
  $current_forumid_filter = (bool) $instance['current_forumid_filter'];
116
  $goto_unread = (bool) $instance['goto_unread'];
 
 
117
  ?>
118
  <style>
119
- select.wpf_wdg_forumids {
120
- display: none;
121
- width: 100%;
122
- min-height: 170px;
123
  }
124
 
125
- input.wpf_wdg_forumids_filter:checked ~ select.wpf_wdg_forumids {
126
- display: block;
127
  }
128
  </style>
129
- <p>
130
- <label for="<?php echo $this->get_field_id( 'title' ) ?>"><?php _e( 'Title', 'wpforo' ); ?>:</label>
131
- <input id="<?php echo $this->get_field_id( 'title' ) ?>" class="widefat"
132
- name="<?php echo esc_attr( $this->get_field_name( 'title' ) ); ?>" type="text"
133
- value="<?php echo esc_attr( $title ); ?>">
134
- </p>
135
- <p>
136
- <label for="<?php echo $this->get_field_id( 'forumids_filter' ) ?>"><?php _e( 'Filter by forums', 'wpforo' ); ?>
137
- :</label>
138
- <input id="<?php echo $this->get_field_id( 'forumids_filter' ) ?>" class="wpf_wdg_forumids_filter"
139
- name="<?php echo esc_attr( $this->get_field_name( 'forumids_filter' ) ); ?>" <?php checked( $forumids_filter ); ?>
140
- type="checkbox">
141
- <label for="<?php echo $this->get_field_id( 'forumids' ) ?>"></label>
142
- <select id="<?php echo $this->get_field_id( 'forumids' ) ?>" class="wpf_wdg_forumids"
143
- name="<?php echo esc_attr( $this->get_field_name( 'forumids' ) ); ?>[]" multiple>
144
- <?php WPF()->forum->tree( 'select_box', false, $selected ) ?>
145
- </select>
146
- </p>
147
- <p>
148
- <label for="<?php echo $this->get_field_id( 'current_forumid_filter' ) ?>"><?php _e( 'Autofilter by current forum', 'wpforo' ); ?>
149
- :</label>
150
- <input id="<?php echo $this->get_field_id( 'current_forumid_filter' ) ?>"
151
- name="<?php echo esc_attr( $this->get_field_name( 'current_forumid_filter' ) ); ?>" <?php checked( $current_forumid_filter ); ?>
152
- type="checkbox">
153
- </p>
154
- <p>
155
- <label for="<?php echo $this->get_field_id( 'orderby' ) ?>"><?php _e( 'Order by', 'wpforo' ); ?>:</label>
156
- <select name="<?php echo esc_attr( $this->get_field_name( 'orderby' ) ); ?>"
157
- id="<?php echo $this->get_field_id( 'orderby' ) ?>">
158
- <?php foreach( $this->orderby_fields as $orderby_key => $orderby_field ) : ?>
159
- <option value="<?php echo $orderby_key; ?>"<?php echo( $orderby_key == $orderby ? ' selected' : '' ); ?>><?php echo $orderby_field; ?></option>
160
- <?php endforeach; ?>
161
- </select>
162
- <label>
163
- <select name="<?php echo esc_attr( $this->get_field_name( 'order' ) ); ?>">
164
- <?php foreach( $this->order_fields as $order_key => $order_field ) : ?>
165
- <option value="<?php echo $order_key; ?>"<?php echo( $order_key == $order ? ' selected' : '' ); ?>><?php echo $order_field; ?></option>
166
- <?php endforeach; ?>
167
  </select>
168
- </label>
169
- </p>
170
- <p>
171
- <label for="<?php echo $this->get_field_id( 'count' ) ?>"><?php _e( 'Number of Items', 'wpforo' ); ?></label>&nbsp;
172
- <input id="<?php echo $this->get_field_id( 'count' ) ?>" type="number" min="1" style="width: 53px;"
173
- name="<?php echo esc_attr( $this->get_field_name( 'count' ) ); ?>"
174
- value="<?php echo esc_attr( $count ); ?>">
175
- </p>
176
- <p>
177
- <label for="<?php echo $this->get_field_id( 'display_avatar' ) ?>">
178
- <?php _e( 'Display with avatars', 'wpforo' ); ?>
179
- <input id="<?php echo $this->get_field_id( 'display_avatar' ) ?>" <?php checked( $display_avatar ); ?>
180
- type="checkbox" name="<?php echo esc_attr( $this->get_field_name( 'display_avatar' ) ); ?>">
181
- </label>
182
- </p>
183
- <p>
184
- <label for="<?php echo $this->get_field_id( 'goto_unread' ) ?>"><?php _e( 'Refer topics to first unread post', 'wpforo' ); ?></label>
185
- <input id="<?php echo $this->get_field_id( 'goto_unread' ) ?>"
186
- name="<?php echo esc_attr( $this->get_field_name( 'goto_unread' ) ); ?>" <?php checked( $goto_unread ); ?>
187
- type="checkbox">
188
- </p>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
189
  <?php
190
  }
191
 
192
  public function update( $new_instance, $old_instance ) {
193
  $new_instance = wpforo_parse_args( $new_instance, $this->default_instance );
194
  $instance = [];
195
- $instance['title'] = ( ! empty( $new_instance['title'] ) ) ? strip_tags( $new_instance['title'] ) : '';
196
- $instance['forumids_filter'] = isset( $new_instance['forumids_filter'] ) ? (bool) $new_instance['forumids_filter'] : $this->default_instance['forumids_filter'];
197
- $instance['forumids'] = ( $instance['forumids_filter'] ? array_unique( array_filter( array_map( 'intval', (array) wpfval( $new_instance, 'forumids' ) ) ) ) : [] );
 
198
  $instance['orderby'] = ( ! empty( $new_instance['orderby'] ) && key_exists( $new_instance['orderby'], $this->orderby_fields ) ) ? $new_instance['orderby'] : $this->default_instance['orderby'];
199
  $instance['order'] = ( ! empty( $new_instance['order'] ) && key_exists( $new_instance['order'], $this->order_fields ) ) ? $new_instance['order'] : $this->default_instance['order'];
200
- $instance['count'] = ( ! empty( $new_instance['count'] ) ) ? intval( $new_instance['count'] ) : $this->default_instance['count'];
201
- $instance['display_avatar'] = isset( $new_instance['display_avatar'] ) ? (bool) $new_instance['display_avatar'] : $this->default_instance['display_avatar'];
202
- $instance['current_forumid_filter'] = isset( $new_instance['current_forumid_filter'] ) ? (bool) $new_instance['current_forumid_filter'] : $this->default_instance['current_forumid_filter'];
203
- $instance['goto_unread'] = isset( $new_instance['goto_unread'] ) ? (bool) $new_instance['goto_unread'] : $this->default_instance['goto_unread'];
 
204
 
205
  return $instance;
206
  }
 
 
 
 
 
 
207
  }
12
  function __construct() {
13
  parent::__construct( 'wpforo_recent_topics', 'wpForo Recent Topics', [ 'description' => 'Your forum\'s recent topics.' ] );
14
  $this->init_local_vars();
15
+ add_action( 'wp_ajax_wpforo_load_ajax_widget_RecentTopics', [ $this, 'load_ajax_widget' ] );
16
+ add_action( 'wp_ajax_nopriv_wpforo_load_ajax_widget_RecentTopics', [ $this, 'load_ajax_widget' ] );
17
+ if( is_admin() ) {
18
+ add_action( 'wp_ajax_wpforo_get_forum_tree', [ $this, 'get_forum_tree' ] );
19
+ }
20
  }
21
 
22
  private function init_local_vars() {
23
  $this->default_instance = [
24
+ 'boardid' => 0,
25
  'title' => 'Recent Topics',
26
  'forumids' => [],
27
  'orderby' => 'created',
28
  'order' => 'DESC',
29
  'count' => 9,
30
+ 'display_avatar' => true,
31
  'forumids_filter' => false,
32
  'current_forumid_filter' => false,
33
  'goto_unread' => false,
34
+ 'refresh_interval' => 0,
35
  ];
36
  $this->orderby_fields = [
37
  'created' => __( 'Created Date', 'wpforo' ),
45
  ];
46
  }
47
 
48
+ public function load_ajax_widget() {
49
+ $_POST = wp_unslash( $_POST );
50
+ $is_user_logged_in = (bool) WPF()->current_userid;
51
+ $instance = json_decode( (string) wpfval( $_POST, 'instance' ), true );
52
+ $topic_args = json_decode( (string) wpfval( $_POST, 'topic_args' ), true );
53
+ $topic_args['private'] = ( ! $is_user_logged_in || ! WPF()->usergroup->can( 'aum' ) ) ? 0 : null;;
54
+ $topic_args['status'] = ( ! $is_user_logged_in || ! WPF()->usergroup->can( 'aum' ) ) ? 0 : null;
55
 
56
+ $row_count = (int) wpfval( $topic_args, 'row_count' );
57
+ $topics = [];
58
+ $topic_args['offset'] = 0;
59
+ while( $row_count && count( $topics ) < $row_count ){
60
+ if( ! ( $_topics = WPF()->topic->get_topics( $topic_args ) ) ) break;
61
+
62
+ $topics = array_merge( $topics, $_topics );
63
+ $topic_args['offset'] += $row_count;
64
+ }
65
+ array_splice( $topics, $row_count );
66
+
67
+ $print_avatar = $instance['display_avatar'] && wpforo_setting( 'profiles', 'avatars' ) && WPF()->usergroup->can( 'va' );
68
+
69
+ $lis = '';
 
 
 
 
 
 
 
 
 
 
70
  foreach( $topics as $topic ) {
71
  $topic_url = wpforo_topic( $topic['topicid'], 'url' );
72
  $member = wpforo_member( $topic );
73
+
74
+ $lis .= sprintf(
75
+ '<li>
76
+ <div class="wpforo-list-item">
77
+ %1$s
78
+ <div class="wpforo-list-item-right" %2$s>
79
+ <p class="posttitle">%3$s</p>
80
+ <p class="postuser">
81
+ %4$s %5$s <span style="white-space: nowrap;">%6$s</span>
82
+ </p>
83
+ </div>
84
+ <div class="wpf-clear"></div>
 
 
 
 
 
 
 
 
 
 
 
 
85
  </div>
86
+ </li>',
87
+ ( $print_avatar ? sprintf( '<div class="wpforo-list-item-left">%1$s</div>', WPF()->member->avatar( $member ) ) : '' ),
88
+ ( !$print_avatar ? 'style="width: 100%"' : '' ),
89
+ ( wpfval( $instance, 'goto_unread' ) ?
90
+ wpforo_topic_title( $topic, $topic_url, '{p}{au}{t}{/a}', false ) .
91
+ ( $topic['topicid'] != wpfval( WPF()->current_object, 'topicid' ) ? wpforo_unread_button( $topic['topicid'], $topic_url, false ) : '' )
92
+ :
93
+ wpforo_topic_title( $topic, $topic_url, '{p}{a}{t}{/a}', false )
94
+ ),
95
+ wpforo_phrase( 'by', false ),
96
+ wpforo_member_link( $member, '', 30, '', false ),
97
+ esc_html( wpforo_date( $topic['created'], 'ago', false ) )
98
+ );
99
  }
100
+
101
+ wp_send_json_success( [ 'html' => sprintf( '<ul>%1$s</ul>', $lis ) ] );
102
+ }
103
+
104
+ public function widget( $args, $instance ) {
105
+ wp_enqueue_script( 'wpforo-widgets-js' );
106
+ $instance = wpforo_parse_args( $instance, $this->default_instance );
107
+ if( $instance['current_forumid_filter'] && $instance['boardid'] === WPF()->board->get_current( 'boardid' ) && $current_forumid = wpfval( WPF()->current_object, 'forumid' ) ) $instance['forumids'] = (array) $current_forumid;
108
+ $data = [
109
+ 'boardid' => $instance['boardid'],
110
+ 'action' => 'wpforo_load_ajax_widget_RecentTopics',
111
+ 'instance' => $instance,
112
+ 'topic_args' => [
113
+ 'forumids' => ( $instance['forumids'] ?: $this->default_instance['forumids'] ),
114
+ 'orderby' => ( key_exists( $instance['orderby'], $this->orderby_fields ) ? $instance['orderby'] : $this->default_instance['orderby'] ),
115
+ 'order' => ( key_exists( $instance['order'], $this->order_fields ) ? $instance['order'] : $this->default_instance['order'] ),
116
+ 'row_count' => ( ( $count = intval( $instance['count'] ) ) ? $count : $this->default_instance['count'] ),
117
+ ],
118
+ ];
119
+ if( WPF()->board->get_current( 'boardid' ) !== $instance['boardid'] ) $data['referer'] = home_url();
120
+ $json = json_encode( $data );
121
+ echo $args['before_widget'] . '<div id="wpf-widget-recent-replies" class="wpforo-widget-wrap">';
122
+ if( ! empty( $instance['title'] ) ) echo $args['before_title'] . apply_filters( 'widget_title', $instance['title'] ) . $args['after_title'];
123
+ echo '<div class="wpforo-widget-content wpforo-ajax-widget" data-json="' . esc_attr( $json ) . '"></div></div>' . $args['after_widget'];
124
  }
125
 
126
  public function form( $instance ) {
127
  $instance = wpforo_parse_args( $instance, $this->default_instance );
128
  $title = (string) $instance['title'];
129
+ $boardid = (int) $instance['boardid'];
130
  $selected = array_unique( array_filter( array_map( 'intval', (array) $instance['forumids'] ) ) );
131
  $orderby = (string) $instance['orderby'];
132
  $order = (string) $instance['order'];
135
  $forumids_filter = (bool) $instance['forumids_filter'];
136
  $current_forumid_filter = (bool) $instance['current_forumid_filter'];
137
  $goto_unread = (bool) $instance['goto_unread'];
138
+ $refresh_interval = (int) $instance['refresh_interval'];
139
+ WPF()->change_board( $boardid );
140
  ?>
141
  <style>
142
+ .wpf-wdg-wrapper .wpf_wdg_forumids_wrap {
143
+ display: none !important;
 
 
144
  }
145
 
146
+ .wpf-wdg-wrapper input.wpf_wdg_forumids_filter_1:checked ~ .wpf_wdg_forumids_wrap {
147
+ display: block !important;
148
  }
149
  </style>
150
+ <div class="wpf-wdg-wrapper">
151
+ <p>
152
+ <label for="<?php echo $this->get_field_id( 'title' ) ?>"><?php _e( 'Title', 'wpforo' ); ?>:</label>
153
+ <input id="<?php echo $this->get_field_id( 'title' ) ?>" class="widefat"
154
+ name="<?php echo esc_attr( $this->get_field_name( 'title' ) ); ?>" type="text"
155
+ value="<?php echo esc_attr( $title ); ?>">
156
+ </p>
157
+ <p>
158
+ <label for="<?php echo $this->get_field_id( 'boardid' ) ?>"></label>
159
+ <select id="<?php echo $this->get_field_id( 'boardid' ) ?>" class="wpf_wdg_boardid" name="<?php echo esc_attr( $this->get_field_name( 'boardid' ) ); ?>">
160
+ <?php echo WPF()->board->dropdown( $boardid ) ?>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
161
  </select>
162
+ </p>
163
+ <div>
164
+ <span><?php _e( 'Filter by forums', 'wpforo' ); ?> :</span>
165
+
166
+ <label for="<?php echo $this->get_field_id( 'forumids_filter' ) ?>_1"><?php _e( 'Yes', 'wpforo' ); ?></label>
167
+ <input id="<?php echo $this->get_field_id( 'forumids_filter' ) ?>_1" value="1" class="wpf_wdg_forumids_filter_1" name="<?php echo esc_attr( $this->get_field_name( 'forumids_filter' ) ); ?>" <?php checked( $forumids_filter ); ?> type="radio">
168
+
169
+ <label for="<?php echo $this->get_field_id( 'forumids_filter' ) ?>_0"><?php _e( 'No', 'wpforo' ); ?></label>
170
+ <input id="<?php echo $this->get_field_id( 'forumids_filter' ) ?>_0" value="0" class="wpf_wdg_forumids_filter_0" name="<?php echo esc_attr( $this->get_field_name( 'forumids_filter' ) ); ?>" <?php checked( $forumids_filter, false ); ?> type="radio">
171
+
172
+ <div class="wpf_wdg_forumids_wrap">
173
+ <label for="<?php echo $this->get_field_id( 'forumids' ) ?>"></label>
174
+ <select id="<?php echo $this->get_field_id( 'forumids' ) ?>" class="wpf_wdg_forumids" name="<?php echo esc_attr( $this->get_field_name( 'forumids' ) ); ?>[]" multiple>
175
+ <?php WPF()->forum->tree( 'select_box', false, $selected ) ?>
176
+ </select>
177
+ </div>
178
+ </div>
179
+ <p>
180
+ <span><?php _e( 'Autofilter by current forum', 'wpforo' ); ?> : </span>
181
+
182
+ <label for="<?php echo $this->get_field_id( 'current_forumid_filter' ) ?>_1"><?php _e( 'Yes', 'wpforo' ); ?></label>
183
+ <input id="<?php echo $this->get_field_id( 'current_forumid_filter' ) ?>_1" name="<?php echo esc_attr( $this->get_field_name( 'current_forumid_filter' ) ); ?>" value="1" <?php checked( $current_forumid_filter ); ?> type="radio">
184
+
185
+ <label for="<?php echo $this->get_field_id( 'current_forumid_filter' ) ?>_0"><?php _e( 'No', 'wpforo' ); ?></label>
186
+ <input id="<?php echo $this->get_field_id( 'current_forumid_filter' ) ?>_0" name="<?php echo esc_attr( $this->get_field_name( 'current_forumid_filter' ) ); ?>" value="0" <?php checked( $current_forumid_filter, false ); ?> type="radio">
187
+ </p>
188
+ <p>
189
+ <label for="<?php echo $this->get_field_id( 'orderby' ) ?>"><?php _e( 'Order by', 'wpforo' ); ?>:</label>
190
+ <select name="<?php echo esc_attr( $this->get_field_name( 'orderby' ) ); ?>"
191
+ id="<?php echo $this->get_field_id( 'orderby' ) ?>">
192
+ <?php foreach( $this->orderby_fields as $orderby_key => $orderby_field ) : ?>
193
+ <option value="<?php echo $orderby_key; ?>"<?php echo( $orderby_key == $orderby ? ' selected' : '' ); ?>><?php echo $orderby_field; ?></option>
194
+ <?php endforeach; ?>
195
+ </select>
196
+ <label>
197
+ <select name="<?php echo esc_attr( $this->get_field_name( 'order' ) ); ?>">
198
+ <?php foreach( $this->order_fields as $order_key => $order_field ) : ?>
199
+ <option value="<?php echo $order_key; ?>"<?php echo( $order_key == $order ? ' selected' : '' ); ?>><?php echo $order_field; ?></option>
200
+ <?php endforeach; ?>
201
+ </select>
202
+ </label>
203
+ </p>
204
+ <p>
205
+ <label for="<?php echo $this->get_field_id( 'count' ) ?>"><?php _e( 'Number of Items', 'wpforo' ); ?></label>&nbsp;
206
+ <input id="<?php echo $this->get_field_id( 'count' ) ?>" type="number" min="1" style="width: 53px;" name="<?php echo esc_attr( $this->get_field_name( 'count' ) ); ?>" value="<?php echo esc_attr( $count ); ?>">
207
+ </p>
208
+ <p>
209
+ <span><?php _e( 'Display with avatars', 'wpforo' ); ?> : </span>
210
+
211
+ <label for="<?php echo $this->get_field_id( 'display_avatar' ) ?>_1"><?php _e( 'Yes', 'wpforo' ); ?></label>
212
+ <input id="<?php echo $this->get_field_id( 'display_avatar' ) ?>_1" value="1" <?php checked( $display_avatar ); ?> type="radio" name="<?php echo esc_attr( $this->get_field_name( 'display_avatar' ) ); ?>">
213
+
214
+ <label for="<?php echo $this->get_field_id( 'display_avatar' ) ?>_0"><?php _e( 'No', 'wpforo' ); ?></label>
215
+ <input id="<?php echo $this->get_field_id( 'display_avatar' ) ?>_0" value="0" <?php checked( $display_avatar, false ); ?> type="radio" name="<?php echo esc_attr( $this->get_field_name( 'display_avatar' ) ); ?>">
216
+ </p>
217
+ <p>
218
+ <span><?php _e( 'Refer topics to first unread post', 'wpforo' ); ?> : </span>
219
+
220
+ <label for="<?php echo $this->get_field_id( 'goto_unread' ) ?>_1"><?php _e( 'Yes', 'wpforo' ); ?></label>
221
+ <input id="<?php echo $this->get_field_id( 'goto_unread' ) ?>_1" <?php checked( $goto_unread ); ?> type="radio" name="<?php echo esc_attr( $this->get_field_name( 'goto_unread' ) ); ?>">
222
+
223
+ <label for="<?php echo $this->get_field_id( 'goto_unread' ) ?>_0"><?php _e( 'No', 'wpforo' ); ?></label>
224
+ <input id="<?php echo $this->get_field_id( 'goto_unread' ) ?>_0" <?php checked( $goto_unread, false ); ?> type="radio" name="<?php echo esc_attr( $this->get_field_name( 'goto_unread' ) ); ?>">
225
+ </p>
226
+ <p>
227
+ <label for="<?php echo $this->get_field_id( 'refresh_interval' ) ?>"><?php _e( 'Auto Refresh Interval Seconds', 'wpforo' ); ?></label>&nbsp;
228
+ <input id="<?php echo $this->get_field_id( 'refresh_interval' ) ?>" type="number" min="0" style="display: inline-block; width: 53px;" name="<?php echo esc_attr( $this->get_field_name( 'refresh_interval' ) ); ?>" value="<?php echo esc_attr( $refresh_interval ); ?>">
229
+ <span style="color: #ccc"><?php _e( 'Set 0 to disable autorefresh', 'wpforo' ) ?></span>
230
+ </p>
231
+ </div>
232
  <?php
233
  }
234
 
235
  public function update( $new_instance, $old_instance ) {
236
  $new_instance = wpforo_parse_args( $new_instance, $this->default_instance );
237
  $instance = [];
238
+ $instance['title'] = strip_tags( (string) $new_instance['title'] );
239
+ $instance['boardid'] = (int) $new_instance['boardid'];
240
+ $instance['forumids_filter'] = (bool) (int) $new_instance['forumids_filter'];
241
+ $instance['forumids'] = array_unique( array_filter( array_map( 'intval', (array) $new_instance['forumids'] ) ) );
242
  $instance['orderby'] = ( ! empty( $new_instance['orderby'] ) && key_exists( $new_instance['orderby'], $this->orderby_fields ) ) ? $new_instance['orderby'] : $this->default_instance['orderby'];
243
  $instance['order'] = ( ! empty( $new_instance['order'] ) && key_exists( $new_instance['order'], $this->order_fields ) ) ? $new_instance['order'] : $this->default_instance['order'];
244
+ $instance['count'] = (int) $new_instance['count'];
245
+ $instance['display_avatar'] = (bool) (int) $new_instance['display_avatar'];
246
+ $instance['current_forumid_filter'] = (bool) (int) $new_instance['current_forumid_filter'];
247
+ $instance['goto_unread'] = (bool) (int) $new_instance['goto_unread'];
248
+ $instance['refresh_interval'] = (int) $new_instance['refresh_interval'];
249
 
250
  return $instance;
251
  }
252
+
253
+ public function get_forum_tree( ) {
254
+ ob_start();
255
+ WPF()->forum->tree( 'select_box', false, [] );
256
+ wp_send_json_success( [ 'html' => ob_get_clean() ] );
257
+ }
258
  }
widgets/Search.php CHANGED
@@ -5,48 +5,78 @@ namespace wpforo\widgets;
5
  use WP_Widget;
6
 
7
  class Search extends WP_Widget {
 
 
 
 
 
8
  function __construct() {
9
  parent::__construct( 'wpforo_search', 'wpForo Search', [ 'description' => 'wpForo search form' ] );
 
 
 
10
  }
11
 
12
- public function widget( $args, $instance ) {
13
- //wp_enqueue_script('wpforo-widgets-js');
14
-
15
- echo $args['before_widget']; //This is an HTML content//
16
- echo '<div id="wpf-widget-search" class="wpforo-widget-wrap">';
17
- if( ! empty( $instance['title'] ) ) {
18
- echo $args['before_title'] . apply_filters( 'widget_title', $instance['title'] ) . $args['after_title']; //This is an HTML content//
19
- }
20
- echo '<div class="wpforo-widget-content">';
21
- ?>
22
- <form action="<?php echo wpforo_home_url() ?>" method="get" id="wpforo-search-form">
23
  <?php wpforo_make_hidden_fields_from_url( wpforo_home_url() ) ?>
24
  <label class="wpf-search-widget-label">
25
  <input type="text" placeholder="<?php wpforo_phrase( 'Search...' ) ?>" name="wpfs" class="wpfw-100" value="<?php echo isset( $_GET['wpfs'] ) ? esc_attr( sanitize_text_field( $_GET['wpfs'] ) ) : '' ?>">
26
- <svg onclick="document.getElementById('wpforo-search-form').submit();" version="1.1" viewBox="0 0 16 16" xml:space="preserve" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"><g id="Guide"/><g id="Layer_2"><path d="M13.85,13.15l-2.69-2.69c0.74-0.9,1.2-2.03,1.2-3.28C12.37,4.33,10.04,2,7.18,2S2,4.33,2,7.18s2.33,5.18,5.18,5.18 c1.25,0,2.38-0.46,3.28-1.2l2.69,2.69c0.1,0.1,0.23,0.15,0.35,0.15s0.26-0.05,0.35-0.15C14.05,13.66,14.05,13.34,13.85,13.15z M3,7.18C3,4.88,4.88,3,7.18,3s4.18,1.88,4.18,4.18s-1.88,4.18-4.18,4.18S3,9.49,3,7.18z"/></g></svg>
27
  </label>
28
  </form>
29
- <?php
30
- echo '</div></div>';
31
- echo $args['after_widget']; //This is an HTML content//
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
32
  }
33
 
34
  public function form( $instance ) {
35
- $title = isset( $instance['title'] ) ? $instance['title'] : 'Forum Search';
 
 
36
  ?>
37
  <p>
38
- <label><?php _e( 'Title', 'wpforo' ); ?>:</label>
39
- <label>
40
- <input class="widefat" name="<?php echo esc_attr( $this->get_field_name( 'title' ) ); ?>" type="text"
41
- value="<?php echo esc_attr( $title ); ?>">
42
- </label>
 
 
 
43
  </p>
44
  <?php
45
  }
46
 
47
  public function update( $new_instance, $old_instance ) {
48
- $instance = [];
49
- $instance['title'] = ( ! empty( $new_instance['title'] ) ) ? strip_tags( $new_instance['title'] ) : '';
 
 
50
 
51
  return $instance;
52
  }
5
  use WP_Widget;
6
 
7
  class Search extends WP_Widget {
8
+ /**
9
+ * @var array
10
+ */
11
+ private $default_instance;
12
+
13
  function __construct() {
14
  parent::__construct( 'wpforo_search', 'wpForo Search', [ 'description' => 'wpForo search form' ] );
15
+ $this->init_local_vars();
16
+ add_action( 'wp_ajax_wpforo_load_ajax_widget_Search', [ $this, 'load_ajax_widget' ] );
17
+ add_action( 'wp_ajax_nopriv_wpforo_load_ajax_widget_Search', [ $this, 'load_ajax_widget' ] );
18
  }
19
 
20
+ private function init_local_vars() {
21
+ $this->default_instance = [
22
+ 'title' => __( 'Forum Search', 'wpforo' ),
23
+ 'boardid' => 0,
24
+ ];
25
+ }
26
+
27
+ public function load_ajax_widget() {
28
+ ob_start(); ?>
29
+
30
+ <form action="<?php echo wpforo_home_url() ?>" method="GET" id="wpforo-search-form">
31
  <?php wpforo_make_hidden_fields_from_url( wpforo_home_url() ) ?>
32
  <label class="wpf-search-widget-label">
33
  <input type="text" placeholder="<?php wpforo_phrase( 'Search...' ) ?>" name="wpfs" class="wpfw-100" value="<?php echo isset( $_GET['wpfs'] ) ? esc_attr( sanitize_text_field( $_GET['wpfs'] ) ) : '' ?>">
34
+ <svg onclick="this.closest('form').submit();" viewBox="0 0 16 16" xml:space="preserve" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"><g id="Guide"/><g id="Layer_2"><path d="M13.85,13.15l-2.69-2.69c0.74-0.9,1.2-2.03,1.2-3.28C12.37,4.33,10.04,2,7.18,2S2,4.33,2,7.18s2.33,5.18,5.18,5.18 c1.25,0,2.38-0.46,3.28-1.2l2.69,2.69c0.1,0.1,0.23,0.15,0.35,0.15s0.26-0.05,0.35-0.15C14.05,13.66,14.05,13.34,13.85,13.15z M3,7.18C3,4.88,4.88,3,7.18,3s4.18,1.88,4.18,4.18s-1.88,4.18-4.18,4.18S3,9.49,3,7.18z"/></g></svg>
35
  </label>
36
  </form>
37
+
38
+ <?php
39
+ wp_send_json_success( [ 'html' => ob_get_clean() ] );
40
+ }
41
+
42
+ public function widget( $args, $instance ) {
43
+ wp_enqueue_script( 'wpforo-widgets-js' );
44
+ $instance = wpforo_parse_args( $instance, $this->default_instance );
45
+ $data = [
46
+ 'boardid' => $instance['boardid'],
47
+ 'action' => 'wpforo_load_ajax_widget_Search',
48
+ ];
49
+ if( WPF()->board->get_current( 'boardid' ) !== $instance['boardid'] ) $data['referer'] = home_url();
50
+ $json = json_encode( $data );
51
+
52
+ echo $args['before_widget'] . '<div id="wpf-widget-search" class="wpforo-widget-wrap">';
53
+ if( $instance['title'] ) echo $args['before_title'] . apply_filters( 'widget_title', $instance['title'] ) . $args['after_title'];
54
+ echo '<div class="wpforo-widget-content wpforo-ajax-widget" data-json="' . esc_attr( $json ) . '"></div></div>' . $args['after_widget'];
55
  }
56
 
57
  public function form( $instance ) {
58
+ $instance = wpforo_parse_args( $instance, $this->default_instance );
59
+ $boardid = (int) $instance['boardid'];
60
+ $title = (string) $instance['title'];
61
  ?>
62
  <p>
63
+ <label for="<?php echo $this->get_field_id( 'title' ) ?>"><?php _e( 'Title', 'wpforo' ); ?>:</label>
64
+ <input id="<?php echo $this->get_field_id( 'title' ) ?>" class="widefat" name="<?php echo esc_attr( $this->get_field_name( 'title' ) ); ?>" type="text" value="<?php echo esc_attr( $title ); ?>">
65
+ </p>
66
+ <p>
67
+ <label for="<?php echo $this->get_field_id( 'boardid' ) ?>"></label>
68
+ <select id="<?php echo $this->get_field_id( 'boardid' ) ?>" name="<?php echo esc_attr( $this->get_field_name( 'boardid' ) ); ?>">
69
+ <?php echo WPF()->board->dropdown( $boardid ) ?>
70
+ </select>
71
  </p>
72
  <?php
73
  }
74
 
75
  public function update( $new_instance, $old_instance ) {
76
+ $new_instance = wpforo_parse_args( $new_instance, $this->default_instance );
77
+ $instance = [];
78
+ $instance['boardid'] = (int) $new_instance['boardid'];
79
+ $instance['title'] = strip_tags( (string) $new_instance['title'] );
80
 
81
  return $instance;
82
  }
widgets/Tags.php CHANGED
@@ -5,21 +5,34 @@ namespace wpforo\widgets;
5
  use WP_Widget;
6
 
7
  class Tags extends WP_Widget {
 
 
 
 
 
8
  function __construct() {
9
  parent::__construct( 'wpforo_tags', 'wpForo Topic Tags', [ 'description' => 'List of most popular tags' ] );
 
 
 
10
  }
11
 
12
- public function widget( $args, $instance ) {
13
- // wp_enqueue_script('wpforo-widgets-js');
 
 
 
 
 
 
14
 
15
- echo $args['before_widget'];
16
- echo '<div id="wpf-widget-tags" class="wpforo-widget-wrap">';
17
- if( ! empty( $instance['title'] ) ) {
18
- echo $args['before_title'] . apply_filters( 'widget_title', $instance['title'] ) . $args['after_title'];
19
- }
20
  $tag_args = [ 'row_count' => (int) wpfval( $instance, 'count' ) ];
21
  $tags = WPF()->topic->get_tags( $tag_args, $items_count );
22
- echo '<div class="wpforo-widget-content">';
 
23
  if( ! empty( $tags ) ) {
24
  echo '<ul class="wpf-widget-tags">';
25
  foreach( $tags as $tag ) {
@@ -33,48 +46,67 @@ class Tags extends WP_Widget {
33
  } else {
34
  echo '<p style="text-align:center">' . wpforo_phrase( 'No tags found', false ) . '</p>';
35
  }
36
- echo '</div>';
37
- echo '</div>';
38
- echo $args['after_widget'];
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
39
  }
40
 
41
  public function form( $instance ) {
42
- $title = ! empty( $instance['title'] ) ? $instance['title'] : 'Topic Tags';
43
- $topics = ! empty( $instance['topics'] ) ? $instance['topics'] : 1;
44
- $count = ! empty( $instance['count'] ) ? $instance['count'] : '20';
 
 
 
45
  ?>
46
  <p>
47
- <label><?php _e( 'Title', 'wpforo' ); ?>:</label>
48
- <label>
49
- <input class="widefat" name="<?php echo esc_attr( $this->get_field_name( 'title' ) ); ?>" type="text"
50
- value="<?php echo esc_attr( $title ); ?>">
51
- </label>
 
 
 
52
  </p>
53
  <p>
54
- <label><?php _e( 'Topic Counts', 'wpforo' ); ?>:</label>&nbsp;&nbsp;&nbsp;&nbsp;
55
- <label><?php _e( 'Yes', 'wpforo' ); ?> <input type="radio"
56
- name="<?php echo esc_attr( $this->get_field_name( 'topics' ) ); ?>"
57
- value="1" <?php if( $topics ) echo 'checked="checked"' ?>></label>&nbsp;&nbsp;
58
- <label><?php _e( 'No', 'wpforo' ); ?> <input type="radio"
59
- name="<?php echo esc_attr( $this->get_field_name( 'topics' ) ); ?>"
60
- value="0" <?php if( ! $topics ) echo 'checked="checked"' ?>></label>
61
  </p>
62
  <p>
63
- <label><?php _e( 'Number of Items', 'wpforo' ); ?>:</label>&nbsp;
64
- <label>
65
- <input type="number" min="1" style="width: 53px;"
66
- name="<?php echo esc_attr( $this->get_field_name( 'count' ) ); ?>"
67
- value="<?php echo esc_attr( $count ); ?>">
68
- </label>
69
  </p>
70
  <?php
71
  }
72
 
73
  public function update( $new_instance, $old_instance ) {
74
- $instance = [];
75
- $instance['title'] = ( ! empty( $new_instance['title'] ) ) ? strip_tags( $new_instance['title'] ) : '';
76
- $instance['topics'] = ( ! empty( $new_instance['topics'] ) ) ? intval( $new_instance['topics'] ) : 0;
77
- $instance['count'] = ( ! empty( $new_instance['count'] ) ) ? intval( $new_instance['count'] ) : 0;
 
 
78
 
79
  return $instance;
80
  }
5
  use WP_Widget;
6
 
7
  class Tags extends WP_Widget {
8
+ /**
9
+ * @var array
10
+ */
11
+ private $default_instance;
12
+
13
  function __construct() {
14
  parent::__construct( 'wpforo_tags', 'wpForo Topic Tags', [ 'description' => 'List of most popular tags' ] );
15
+ $this->init_local_vars();
16
+ add_action( 'wp_ajax_wpforo_load_ajax_widget_Tags', [ $this, 'load_ajax_widget' ] );
17
+ add_action( 'wp_ajax_nopriv_wpforo_load_ajax_widget_Tags', [ $this, 'load_ajax_widget' ] );
18
  }
19
 
20
+ private function init_local_vars() {
21
+ $this->default_instance = [
22
+ 'title' => __( 'Topic Tags', 'wpforo' ),
23
+ 'boardid' => 0,
24
+ 'topics' => true,
25
+ 'count' => 20,
26
+ ];
27
+ }
28
 
29
+ public function load_ajax_widget() {
30
+ $_POST = wp_unslash( $_POST );
31
+ $instance = json_decode( (string) wpfval( $_POST, 'instance' ), true );
 
 
32
  $tag_args = [ 'row_count' => (int) wpfval( $instance, 'count' ) ];
33
  $tags = WPF()->topic->get_tags( $tag_args, $items_count );
34
+ ob_start();
35
+
36
  if( ! empty( $tags ) ) {
37
  echo '<ul class="wpf-widget-tags">';
38
  foreach( $tags as $tag ) {
46
  } else {
47
  echo '<p style="text-align:center">' . wpforo_phrase( 'No tags found', false ) . '</p>';
48
  }
49
+
50
+ wp_send_json_success( [ 'html' => ob_get_clean() ] );
51
+ }
52
+
53
+ public function widget( $args, $instance ) {
54
+ wp_enqueue_script( 'wpforo-widgets-js' );
55
+ $instance = wpforo_parse_args( $instance, $this->default_instance );
56
+ $data = [
57
+ 'boardid' => $instance['boardid'],
58
+ 'action' => 'wpforo_load_ajax_widget_Tags',
59
+ 'instance' => $instance,
60
+ ];
61
+ if( WPF()->board->get_current( 'boardid' ) !== $instance['boardid'] ) $data['referer'] = home_url();
62
+ $json = json_encode( $data );
63
+
64
+ echo $args['before_widget'] . '<div id="wpf-widget-tags" class="wpforo-widget-wrap">';
65
+ if( $instance['title'] ) echo $args['before_title'] . apply_filters( 'widget_title', $instance['title'] ) . $args['after_title'];
66
+ echo '<div class="wpforo-widget-content wpforo-ajax-widget" data-json="' . esc_attr( $json ) . '"></div></div>' . $args['after_widget'];
67
  }
68
 
69
  public function form( $instance ) {
70
+ $instance = wpforo_parse_args( $instance, $this->default_instance );
71
+ $boardid = (int) $instance['boardid'];
72
+ $title = (string) $instance['title'];
73
+ $topics = (bool) $instance['topics'];
74
+ $count = (int) $instance['count'];
75
+ WPF()->change_board( $boardid );
76
  ?>
77
  <p>
78
+ <label for="<?php echo $this->get_field_id( 'title' ) ?>"><?php _e( 'Title', 'wpforo' ); ?>:</label>
79
+ <input id="<?php echo $this->get_field_id( 'title' ) ?>" class="widefat" name="<?php echo esc_attr( $this->get_field_name( 'title' ) ); ?>" type="text" value="<?php echo esc_attr( $title ); ?>">
80
+ </p>
81
+ <p>
82
+ <label for="<?php echo $this->get_field_id( 'boardid' ) ?>"></label>
83
+ <select id="<?php echo $this->get_field_id( 'boardid' ) ?>" name="<?php echo esc_attr( $this->get_field_name( 'boardid' ) ); ?>">
84
+ <?php echo WPF()->board->dropdown( $boardid ) ?>
85
+ </select>
86
  </p>
87
  <p>
88
+ <span><?php _e( 'Topic Counts', 'wpforo' ); ?> : </span>
89
+
90
+ <label for="<?php echo $this->get_field_id( 'topics' ) ?>_1"><?php _e( 'Yes', 'wpforo' ); ?></label>
91
+ <input id="<?php echo $this->get_field_id( 'topics' ) ?>_1" value="1" <?php checked( $topics ); ?> type="radio" name="<?php echo esc_attr( $this->get_field_name( 'topics' ) ); ?>">
92
+
93
+ <label for="<?php echo $this->get_field_id( 'topics' ) ?>_0"><?php _e( 'No', 'wpforo' ); ?></label>
94
+ <input id="<?php echo $this->get_field_id( 'topics' ) ?>_0" value="0" <?php checked( $topics, false ); ?> type="radio" name="<?php echo esc_attr( $this->get_field_name( 'topics' ) ); ?>">
95
  </p>
96
  <p>
97
+ <label for="<?php echo $this->get_field_id( 'count' ) ?>"><?php _e( 'Number of Items', 'wpforo' ); ?>:</label>&nbsp;
98
+ <input id="<?php echo $this->get_field_id( 'count' ) ?>" type="number" min="1" style="width: 53px;" name="<?php echo esc_attr( $this->get_field_name( 'count' ) ); ?>" value="<?php echo esc_attr( $count ); ?>">
 
 
 
 
99
  </p>
100
  <?php
101
  }
102
 
103
  public function update( $new_instance, $old_instance ) {
104
+ $new_instance = wpforo_parse_args( $new_instance, $this->default_instance );
105
+ $instance = [];
106
+ $instance['boardid'] = (int) $new_instance['boardid'];
107
+ $instance['title'] = strip_tags( (string) $new_instance['title'] );
108
+ $instance['topics'] = (bool) (int) $new_instance['topics'];
109
+ $instance['count'] = (int) $new_instance['count'];
110
 
111
  return $instance;
112
  }
wpforo.php CHANGED
@@ -5,14 +5,14 @@
5
  * Description: WordPress Forum plugin. wpForo is a full-fledged forum solution for your community. Comes with multiple modern forum layouts.
6
  * Author: gVectors Team
7
  * Author URI: https://gvectors.com/
8
- * Version: 2.0.9
9
  * Text Domain: wpforo
10
  * Domain Path: /languages
11
  */
12
 
13
  namespace wpforo;
14
 
15
- define( 'WPFORO_VERSION', '2.0.9' );
16
 
17
  //Exit if accessed directly
18
  if( ! defined( 'ABSPATH' ) ) exit;
@@ -212,6 +212,8 @@ final class wpforo {
212
  }
213
 
214
  public function change_board( $args = [] ) {
 
 
215
  do_action( 'wpforo_before_change_board', $args );
216
 
217
  $boardid = $this->board->get_current( 'boardid' );
@@ -537,7 +539,7 @@ final class wpforo {
537
  } elseif( $args['id'] || $args['slug'] ) {
538
  $getid = ( $args['slug'] ?: $args['id'] );
539
  if( $args['item'] === 'topic' ) {
540
- $url = $this->topic->get_topic_url( $getid );
541
  } elseif( $args['item'] === 'profile' ) {
542
  $url = $this->member->get_profile_url( $getid );
543
  } else {
@@ -568,8 +570,11 @@ final class wpforo {
568
  $url = wpforo_home_url();
569
  }
570
  } elseif( is_wpforo_url( $url ) && preg_match( '#/' . preg_quote( wpforo_settings_get_slug( 'postid' ) ) . '/(\d+)/?$#isu', strtok( $url, '?' ), $matches ) ) {
571
- $post_url = $this->post->get_post_url( $matches[1] );
572
  if( $post_url !== wpforo_home_url() ) $url = $post_url;
 
 
 
573
  }
574
 
575
  if( function_exists( 'pll_default_language' ) ) {
@@ -580,7 +585,7 @@ final class wpforo {
580
 
581
  $url = wpforo_fix_url( $url );
582
  $url = preg_replace( '#\#[^/?&]*$#iu', '', $url );
583
- parse_str( parse_url( $url, PHP_URL_QUERY ), $get );
584
  $get = array_merge( (array) $get, $_GET );
585
  $get = wp_unslash( $get );
586
 
@@ -732,7 +737,7 @@ final class wpforo {
732
  $first = key( $posts );
733
  if( isset( $posts[ $first ] ) && ! empty( $posts[ $first ] ) && $this->perm->forum_can( 'vf', $posts[ $first ]['forumid'] ) ) {
734
  $stats['last_post_title'] = $posts[ $first ]['title'];
735
- $stats['last_post_url'] = $this->post->get_post_url( $posts[ $first ]['last_post'] );
736
  }
737
 
738
  $newest_member = $this->member->get_newest_member();
@@ -752,7 +757,7 @@ final class wpforo {
752
  $posts = $this->topic->get_topics( [ 'orderby' => 'modified', 'order' => 'DESC', 'row_count' => 1 ] );
753
  if( isset( $posts[0] ) && ! empty( $posts[0] ) && $this->perm->forum_can( 'vf', $posts[0]['forumid'] ) ) {
754
  $stats['last_post_title'] = $posts[0]['title'];
755
- $stats['last_post_url'] = $this->post->get_post_url( $posts[0]['last_post'] );
756
  }
757
  break;
758
  case 'post':
@@ -760,7 +765,7 @@ final class wpforo {
760
  $posts = $this->topic->get_topics( [ 'orderby' => 'modified', 'order' => 'DESC', 'row_count' => 1 ] );
761
  if( isset( $posts[0] ) && ! empty( $posts[0] ) && $this->perm->forum_can( 'vf', $posts[0]['forumid'] ) ) {
762
  $stats['last_post_title'] = $posts[0]['title'];
763
- $stats['last_post_url'] = $this->post->get_post_url( $posts[0]['last_post'] );
764
  }
765
  break;
766
  case 'user':
@@ -1095,7 +1100,7 @@ final class wpforo {
1095
  $current_object['activities'] = $this->post->get_posts( $args, $current_object['items_count'] );
1096
  break;
1097
  case 'favored':
1098
- $current_object['filter'] = strtolower( wpfval( WPF()->GET, 'filter' ) );
1099
  if( ! in_array( $current_object['filter'], [ 'likes', 'dislikes' ], true ) ) $current_object['filter'] = 'bookmarks';
1100
  if( $current_object['filter'] === 'likes' ) {
1101
  $postids = $this->reaction->get_reactions_col(
@@ -1185,7 +1190,7 @@ final class wpforo {
1185
  $args = ( empty( $topic ) ? [ 'slug' => $current_object['forum_slug'] ] : $topic['forumid'] );
1186
  if( $forum = $this->forum->get_forum( $args ) ) {
1187
  if( ! empty( $topic ) && strtolower( $current_object['forum_slug'] ) !== strtolower( $forum['slug'] ) ) {
1188
- wp_safe_redirect( $this->topic->get_topic_url( $topic, $forum ), 301 );
1189
  exit();
1190
  }
1191
  if( $forum['is_cat'] ) $this->current_object['template'] = 'forum';
5
  * Description: WordPress Forum plugin. wpForo is a full-fledged forum solution for your community. Comes with multiple modern forum layouts.
6
  * Author: gVectors Team
7
  * Author URI: https://gvectors.com/
8
+ * Version: 2.1.0
9
  * Text Domain: wpforo
10
  * Domain Path: /languages
11
  */
12
 
13
  namespace wpforo;
14
 
15
+ define( 'WPFORO_VERSION', '2.1.0' );
16
 
17
  //Exit if accessed directly
18
  if( ! defined( 'ABSPATH' ) ) exit;
212
  }
213
 
214
  public function change_board( $args = [] ) {
215
+ if( is_null( $this->board ) ) return;
216
+
217
  do_action( 'wpforo_before_change_board', $args );
218
 
219
  $boardid = $this->board->get_current( 'boardid' );
539
  } elseif( $args['id'] || $args['slug'] ) {
540
  $getid = ( $args['slug'] ?: $args['id'] );
541
  if( $args['item'] === 'topic' ) {
542
+ $url = $this->topic->get_url( $getid );
543
  } elseif( $args['item'] === 'profile' ) {
544
  $url = $this->member->get_profile_url( $getid );
545
  } else {
570
  $url = wpforo_home_url();
571
  }
572
  } elseif( is_wpforo_url( $url ) && preg_match( '#/' . preg_quote( wpforo_settings_get_slug( 'postid' ) ) . '/(\d+)/?$#isu', strtok( $url, '?' ), $matches ) ) {
573
+ $post_url = $this->post->get_full_url( $matches[1] );
574
  if( $post_url !== wpforo_home_url() ) $url = $post_url;
575
+ }elseif( is_wpforo_url( $url ) && preg_match( '#/' . preg_quote( wpforo_settings_get_slug( 'topicid' ) ) . '/(\d+)/?$#isu', strtok( $url, '?' ), $matches ) ) {
576
+ $topic_url = $this->topic->get_full_url( $matches[1] );
577
+ if( $topic_url !== wpforo_home_url() ) $url = $topic_url;
578
  }
579
 
580
  if( function_exists( 'pll_default_language' ) ) {
585
 
586
  $url = wpforo_fix_url( $url );
587
  $url = preg_replace( '#\#[^/?&]*$#iu', '', $url );
588
+ parse_str( (string) parse_url( $url, PHP_URL_QUERY ), $get );
589
  $get = array_merge( (array) $get, $_GET );
590
  $get = wp_unslash( $get );
591
 
737
  $first = key( $posts );
738
  if( isset( $posts[ $first ] ) && ! empty( $posts[ $first ] ) && $this->perm->forum_can( 'vf', $posts[ $first ]['forumid'] ) ) {
739
  $stats['last_post_title'] = $posts[ $first ]['title'];
740
+ $stats['last_post_url'] = $this->post->get_url( $posts[ $first ]['last_post'] );
741
  }
742
 
743
  $newest_member = $this->member->get_newest_member();
757
  $posts = $this->topic->get_topics( [ 'orderby' => 'modified', 'order' => 'DESC', 'row_count' => 1 ] );
758
  if( isset( $posts[0] ) && ! empty( $posts[0] ) && $this->perm->forum_can( 'vf', $posts[0]['forumid'] ) ) {
759
  $stats['last_post_title'] = $posts[0]['title'];
760
+ $stats['last_post_url'] = $this->post->get_url( $posts[0]['last_post'] );
761
  }
762
  break;
763
  case 'post':
765
  $posts = $this->topic->get_topics( [ 'orderby' => 'modified', 'order' => 'DESC', 'row_count' => 1 ] );
766
  if( isset( $posts[0] ) && ! empty( $posts[0] ) && $this->perm->forum_can( 'vf', $posts[0]['forumid'] ) ) {
767
  $stats['last_post_title'] = $posts[0]['title'];
768
+ $stats['last_post_url'] = $this->post->get_url( $posts[0]['last_post'] );
769
  }
770
  break;
771
  case 'user':
1100
  $current_object['activities'] = $this->post->get_posts( $args, $current_object['items_count'] );
1101
  break;
1102
  case 'favored':
1103
+ $current_object['filter'] = strtolower( (string) wpfval( WPF()->GET, 'filter' ) );
1104
  if( ! in_array( $current_object['filter'], [ 'likes', 'dislikes' ], true ) ) $current_object['filter'] = 'bookmarks';
1105
  if( $current_object['filter'] === 'likes' ) {
1106
  $postids = $this->reaction->get_reactions_col(
1190
  $args = ( empty( $topic ) ? [ 'slug' => $current_object['forum_slug'] ] : $topic['forumid'] );
1191
  if( $forum = $this->forum->get_forum( $args ) ) {
1192
  if( ! empty( $topic ) && strtolower( $current_object['forum_slug'] ) !== strtolower( $forum['slug'] ) ) {
1193
+ wp_safe_redirect( $this->topic->get_url( $topic, $forum ), 301 );
1194
  exit();
1195
  }
1196
  if( $forum['is_cat'] ) $this->current_object['template'] = 'forum';