Print, PDF, Email by PrintFriendly - Version 5.1

Version Description

  • In category pages, the default behaviour of button added by shortcode/template is to link to a printable version of the individual posts. Sometimes, it is desirable to print the category page itself and not the individual posts. Added new template function/shortcode to always print the current page to use in this scenario.
  • Add support for newer google analytics versions and google tag manager
Download this release

Release Info

Developer printfriendly
Plugin Icon 128x128 Print, PDF, Email by PrintFriendly
Version 5.1
Comparing to
See all releases

Code changes from version 5.0 to 5.1

Files changed (9) hide show
  1. assets/css/admin.css +27 -0
  2. assets/js/admin.js +71 -103
  3. languages/printfriendly.pot +117 -104
  4. pf.php +1663 -1476
  5. readme.txt +5 -1
  6. uninstall.php +16 -16
  7. views/pro.php +67 -67
  8. views/settings.php +21 -21
  9. views/tabs.php +635 -585
assets/css/admin.css CHANGED
@@ -339,6 +339,33 @@ code ~ p.description {
339
  margin-top: 10px;
340
  }
341
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
342
  /* do not show any notices that do not belong to us */
343
  .notice:not(.pf-notice) {
344
  display: none;
339
  margin-top: 10px;
340
  }
341
 
342
+ .pf-button-img {
343
+ border: none;
344
+ -webkit-box-shadow: none;
345
+ -moz-box-shadow: none;
346
+ box-shadow: none;
347
+ padding: 0;
348
+ margin: 0;
349
+ display: inline;
350
+ vertical-align: middle;
351
+ }
352
+
353
+ .pf-button-img:not(:empty) ~ .pf-button-text {
354
+ margin-left: 6px;
355
+ }
356
+
357
+ #custom-img-sizes {
358
+ margin-top: 10px;
359
+ }
360
+
361
+ #custom_image_label img {
362
+ max-width: 200px;
363
+ }
364
+
365
+ .small-text {
366
+ font-size: smaller;
367
+ }
368
+
369
  /* do not show any notices that do not belong to us */
370
  .notice:not(.pf-notice) {
371
  display: none;
assets/js/admin.js CHANGED
@@ -86,62 +86,6 @@
86
  }
87
 
88
  function initMisc() {
89
- $('.show_list').change(function() {
90
- if ($('.show_list:checked').length == 0) {
91
- $('.content_placement').hide('slow');
92
- $('.content_placement input').prop('disabled', true);
93
- $('.show_template').prop('checked', true);
94
- } else {
95
- $('.show_template').prop('checked', false);
96
- $('.content_placement').show('slow');
97
- $('.content_placement input').prop('disabled', false);
98
- }
99
-
100
- var postName = 'printfriendly_option[show_on_posts]';
101
- var homeName = 'printfriendly_option[show_on_homepage]';
102
-
103
- var optionName = $(this).attr('name');
104
- if (optionName == homeName || optionName == postName){
105
- if($(this).is(':checked')) {
106
- $('#pf-categories').show('slow');
107
- } else if(!$('input[name="' + homeName + '"]').is(':checked') && !$('input[name="' + postName + '"]').is(':checked')) {
108
- $('#pf-categories').hide('slow');
109
- }
110
- }
111
- }).change();
112
-
113
- $('.show_template').change(function() {
114
- if($(this).is(':checked')) {
115
- $('.show_list').prop('checked', false);
116
- $('.show_list').prop('disabled', true);
117
- $('.content_placement').hide('slow');
118
- $('.content_placement input').prop('disabled',true);
119
- $('#pf-categories-metabox').hide('slow');
120
- $('#pf-snippet').show('slow');
121
- } else {
122
- $('.show_list').prop('disabled', false);
123
- $('.content_placement').show('slow');
124
- $('.content_placement input').prop('disabled', false);
125
- $('#pf-snippet').hide('slow');
126
- }
127
- }).change();
128
-
129
- $('#toggle-categories').click(function() {
130
- if($('#pf-categories-metabox').is(':visible')) {
131
- $('#pf-categories-metabox').hide('slow');
132
- } else {
133
- $('#pf-categories-metabox').show('slow');
134
- }
135
- });
136
-
137
- $(document).mouseup(function (e) {
138
- var container = $("#pf-categories");
139
-
140
- if (container.has(e.target).length === 0) {
141
- $('#pf-categories-metabox').hide('slow');
142
- }
143
- });
144
-
145
  $('.pf-color-picker').wpColorPicker({
146
  change: function (event, ui) {
147
  var hex = ui.color.toString();
@@ -168,59 +112,17 @@
168
  }).change();
169
 
170
  $('#custom_text').on('change keyup', function(){
171
- pf_custom_text_change();
172
  });
173
 
174
  $("[name='printfriendly_option[custom_button_text]']").change(function(){
175
- pf_custom_text_change();
176
  });
177
 
178
- function pf_custom_text_change(){
179
- $('#buttongroup3 span:not(.printandpdf)').text( $('#custom_text').val() );
180
- var newText = $('#custom-text-no').prop('checked') ? '' : $('#custom_text').val();
181
- $('#printfriendly-text2').text( newText );
182
- $('#printfriendly-text2').css('color','#' + $('#text_color').val());
183
- }
184
-
185
- function pf_initialize_preview(urlInputSelector, previewSelector) {
186
- var el = $(urlInputSelector);
187
- var imgUrl = $.trim(el.val());
188
- var preview = $(previewSelector + '-preview');
189
- var error = $(previewSelector + '-error');
190
-
191
- el.on('input paste change keyup', function() {
192
- setTimeout(function() {
193
- // ie shows error if we try to merge the two below into a single statement
194
- var img = $('<img/>');
195
- var customButtonIcon = $("[name='printfriendly_option[custom_button_icon]']:checked").val();
196
-
197
- if (customButtonIcon === 'custom-image') {
198
- imgUrl = $('#custom_image').val();
199
- } else if (customButtonIcon === 'no-image') {
200
- imgUrl = '';
201
- } else {
202
- imgUrl = customButtonIcon;
203
- }
204
 
205
- preview.html('');
206
- error.html('');
207
- if(imgUrl != '') {
208
- img.on('load', function(){
209
- preview.html('').append(img);
210
- });
211
- img.on('error', function(){
212
- error.html('<div class="error settings-error"><p><strong>' + pf_config.i10n.invalid_image_url + '</strong></p></div>');
213
- });
214
- img.attr('src',imgUrl);
215
- }
216
- }, 100);
217
- });
218
- }
219
-
220
- pf_initialize_preview('#custom_image', '#pf-custom-button');
221
- pf_initialize_preview("[name='printfriendly_option[custom_button_icon]']", '#pf-custom-button');
222
- pf_initialize_preview('#upload-an-image', '#pf-image');
223
- //$('#custom_image, #upload-an-image').change();
224
  $('#custom_image').on('focus', function() {
225
  $('#custom-image').prop('checked', true);
226
  $('#pf-custom-button-error').show();
@@ -322,6 +224,72 @@
322
  $("#custom-text-rb").trigger("change");
323
  });
324
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
325
  }
326
 
327
  function initCustomCssSelectors() {
86
  }
87
 
88
  function initMisc() {
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
89
  $('.pf-color-picker').wpColorPicker({
90
  change: function (event, ui) {
91
  var hex = ui.color.toString();
112
  }).change();
113
 
114
  $('#custom_text').on('change keyup', function(){
115
+ custom_text_change();
116
  });
117
 
118
  $("[name='printfriendly_option[custom_button_text]']").change(function(){
119
+ custom_text_change();
120
  });
121
 
122
+ initialize_preview('#custom_image', '#pf-custom-button');
123
+ initialize_preview("[name='printfriendly_option[custom_button_icon]']", '#pf-custom-button');
124
+ initialize_preview('#upload-an-image', '#pf-image');
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
125
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
126
  $('#custom_image').on('focus', function() {
127
  $('#custom-image').prop('checked', true);
128
  $('#pf-custom-button-error').show();
224
  $("#custom-text-rb").trigger("change");
225
  });
226
 
227
+ $('.pf-show-element').on('click', function(e){
228
+ e.preventDefault();
229
+ var that = $(this);
230
+ that.hide('slow');
231
+ $(that.attr('data-element')).show('slow');
232
+ });
233
+
234
+ }
235
+
236
+ function custom_text_change(){
237
+ $('#buttongroup3 span:not(.printandpdf)').text( $('#custom_text').val() );
238
+ var newText = $('#custom-text-no').prop('checked') ? '' : $('#custom_text').val();
239
+ $('#printfriendly-text2').text( newText );
240
+ $('#printfriendly-text2').css('color','#' + $('#text_color').val());
241
+ }
242
+
243
+ function initialize_preview(urlInputSelector, previewSelector) {
244
+ var el = $(urlInputSelector);
245
+ var imgUrl = $.trim(el.val());
246
+ var preview = $(previewSelector + '-preview');
247
+ var error = $(previewSelector + '-error');
248
+
249
+ // set the dimensions of the image
250
+ if(urlInputSelector === '#custom_image'){
251
+ $('#custom-img-width, #custom-img-height').on('change', function(ewh){
252
+ var _width = $('#custom-img-width').val();
253
+ var _height = $('#custom-img-height').val();
254
+ var _img = preview.find('img');
255
+ _img.css('width', '');
256
+ _img.css('height', '');
257
+ if(_img.length > 0 && parseInt(_width) > 0){
258
+ _img.css('width', _width + 'px');
259
+ }
260
+ if(_img.length > 0 && parseInt(_height) > 0){
261
+ _img.css('height', _height + 'px');
262
+ }
263
+ });
264
+ }
265
+
266
+ el.on('input paste change keyup', function() {
267
+ setTimeout(function() {
268
+ // ie shows error if we try to merge the two below into a single statement
269
+ var img = $('<img/>');
270
+ var customButtonIcon = $("[name='printfriendly_option[custom_button_icon]']:checked").val();
271
+
272
+ if (customButtonIcon === 'custom-image') {
273
+ imgUrl = $('#custom_image').val();
274
+ } else if (customButtonIcon === 'no-image') {
275
+ imgUrl = '';
276
+ } else {
277
+ imgUrl = customButtonIcon;
278
+ }
279
+
280
+ preview.html('');
281
+ error.html('');
282
+ if(imgUrl != '') {
283
+ img.on('load', function(){
284
+ preview.html('').append(img);
285
+ });
286
+ img.on('error', function(){
287
+ error.html('<div class="error settings-error"><p><strong>' + pf_config.i10n.invalid_image_url + '</strong></p></div>');
288
+ });
289
+ img.attr('src',imgUrl);
290
+ }
291
+ }, 100);
292
+ });
293
  }
294
 
295
  function initCustomCssSelectors() {
languages/printfriendly.pot CHANGED
@@ -2,112 +2,124 @@
2
  # This file is distributed under the same license as the Print, PDF & Email by PrintFriendly package.
3
  msgid ""
4
  msgstr ""
5
- "Project-Id-Version: Print, PDF & Email by PrintFriendly 4.2\n"
6
  "Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/wp-printfriendly\n"
7
- "POT-Creation-Date: 2021-11-11 05:58:00+00:00\n"
8
  "MIME-Version: 1.0\n"
9
  "Content-Type: text/plain; charset=utf-8\n"
10
  "Content-Transfer-Encoding: 8bit\n"
11
  "Last-Translator: PrintFriendly Translate Team <support@printfriendly.com>\n"
12
  "Language-Team: PrintFriendly Translate Team <support@printfriendly.com>\n"
13
 
14
- #: pf.php:568
15
  msgid ""
16
  "No valid custom image url received, please enter a valid url to use a "
17
  "custom image."
18
  msgstr ""
19
 
20
- #: pf.php:576
21
  msgid "The text size you entered is invalid, please stay between 9px and 25px"
22
  msgstr ""
23
 
24
- #: pf.php:584
25
  msgid ""
26
  "The color you entered is not valid, it must be a valid hexadecimal RGB font "
27
  "color."
28
  msgstr ""
29
 
30
- #: pf.php:644
31
  msgid ""
32
  "No valid custom logo url received, please enter a valid url to use a custom "
33
  "logo."
34
  msgstr ""
35
 
36
- #: pf.php:727
37
  msgid "PrintFriendly Options"
38
  msgstr ""
39
 
40
- #: pf.php:727
41
  msgid "Print Friendly & PDF"
42
  msgstr ""
43
 
44
- #: pf.php:757 views/tabs.php:383
45
  msgid "Custom Image"
46
  msgstr ""
47
 
48
- #: pf.php:758
49
  msgid "Use Image"
50
  msgstr ""
51
 
52
- #: pf.php:759
53
  msgid "Invalid Image URL"
54
  msgstr ""
55
 
56
- #: pf.php:771
57
  msgid "Activation"
58
  msgstr ""
59
 
60
- #: pf.php:772
61
  msgid "Checking status"
62
  msgstr ""
63
 
64
- #: pf.php:773 views/pro.php:45
65
  msgid "Activate"
66
  msgstr ""
67
 
68
- #: pf.php:774
69
  msgid "Active Trial"
70
  msgstr ""
71
 
72
- #: pf.php:775
73
  msgid "Active"
74
  msgstr ""
75
 
76
- #: pf.php:776
77
  msgid "Expired"
78
  msgstr ""
79
 
80
- #: pf.php:777
81
  msgid "Please check Internet connection."
82
  msgstr ""
83
 
84
- #: pf.php:805
85
  msgid "Settings"
86
  msgstr ""
87
 
88
- #: pf.php:828 views/tabs.php:108 views/tabs.php:311 views/tabs.php:424
89
  msgid "Documentation"
90
  msgstr ""
91
 
92
- #: pf.php:1175 views/tabs.php:164
93
  msgid "Custom Button"
94
  msgstr ""
95
 
96
- #: pf.php:1360
97
  msgid "Only display when post is in:"
98
  msgstr ""
99
 
100
- #: pf.php:1452
101
  msgid ""
102
  "You are currently using %1$s%2$s%3$s. You can copy copy its contents into "
103
  "the textbox if you want to update the styles."
104
  msgstr ""
105
 
 
 
 
 
 
 
 
 
 
 
 
 
106
  #: views/pro.php:18
107
  msgid "Learn more"
108
  msgstr ""
109
 
110
- #: views/pro.php:30 views/tabs.php:484
111
  msgid "Email"
112
  msgstr ""
113
 
@@ -275,7 +287,8 @@ msgstr ""
275
  msgid "Show Options Code"
276
  msgstr ""
277
 
278
- #: views/tabs.php:96
 
279
  msgid "Copy Code"
280
  msgstr ""
281
 
@@ -287,294 +300,294 @@ msgstr ""
287
  msgid "Button Style"
288
  msgstr ""
289
 
290
- #: views/tabs.php:169
291
  msgid "Image"
292
  msgstr ""
293
 
294
- #: views/tabs.php:176
295
  msgid "Use Your Image"
296
  msgstr ""
297
 
298
- #: views/tabs.php:179 views/tabs.php:389
299
  msgid "Select Image"
300
  msgstr ""
301
 
302
- #: views/tabs.php:192
303
- msgid "No Image"
304
  msgstr ""
305
 
306
  #: views/tabs.php:197
 
 
 
 
 
 
 
 
307
  msgid "Text"
308
  msgstr ""
309
 
310
- #: views/tabs.php:205
311
  msgid "Text Size"
312
  msgstr ""
313
 
314
- #: views/tabs.php:215
315
  msgid "No Text"
316
  msgstr ""
317
 
318
- #: views/tabs.php:221
319
  msgid "Preview"
320
  msgstr ""
321
 
322
- #: views/tabs.php:233
323
  msgid "Button Position"
324
  msgstr ""
325
 
326
- #: views/tabs.php:239
327
  msgid "Alignment"
328
  msgstr ""
329
 
330
- #: views/tabs.php:242
331
  msgid "Left Align"
332
  msgstr ""
333
 
334
- #: views/tabs.php:243
335
  msgid "Right Align"
336
  msgstr ""
337
 
338
- #: views/tabs.php:244
339
  msgid "Center"
340
  msgstr ""
341
 
342
- #: views/tabs.php:245
343
  msgid "None"
344
  msgstr ""
345
 
346
- #: views/tabs.php:251
347
  msgid "Placement"
348
  msgstr ""
349
 
350
- #: views/tabs.php:254
351
  msgid "Above Content"
352
  msgstr ""
353
 
354
- #: views/tabs.php:255
355
  msgid "Below Content"
356
  msgstr ""
357
 
358
- #: views/tabs.php:265
359
  msgid "Button Display"
360
  msgstr ""
361
 
362
- #: views/tabs.php:270
363
  msgid "Pages to show on"
364
  msgstr ""
365
 
366
- #: views/tabs.php:272
367
  msgid "Posts"
368
  msgstr ""
369
 
370
- #: views/tabs.php:273
371
  msgid "Pages"
372
  msgstr ""
373
 
374
- #: views/tabs.php:274
375
  msgid "Homepage"
376
  msgstr ""
377
 
378
- #: views/tabs.php:275
379
  msgid "Category Pages"
380
  msgstr ""
381
 
382
- #: views/tabs.php:276
383
  msgid "Taxonomy Pages"
384
  msgstr ""
385
 
386
- #: views/tabs.php:278
387
- msgid "Add direct to template"
388
- msgstr ""
389
-
390
- #: views/tabs.php:283
391
- msgid "Copy Snippet"
392
- msgstr ""
393
-
394
- #: views/tabs.php:286
395
- msgid "or use the shortcode inside your page/article"
396
  msgstr ""
397
 
398
- #: views/tabs.php:287
399
- msgid "Copy Shortcode"
400
  msgstr ""
401
 
402
- #: views/tabs.php:291
403
- msgid "Specific categories to show on"
404
  msgstr ""
405
 
406
- #: views/tabs.php:319
407
  msgid "Pro Exclusive Features"
408
  msgstr ""
409
 
410
- #: views/tabs.php:325
411
  msgid "Encode images"
412
  msgstr ""
413
 
414
- #: views/tabs.php:328 views/tabs.php:339 views/tabs.php:441
415
  msgid "No"
416
  msgstr ""
417
 
418
- #: views/tabs.php:329 views/tabs.php:340 views/tabs.php:440
419
  msgid "Yes"
420
  msgstr ""
421
 
422
- #: views/tabs.php:331
423
  msgid ""
424
  "Select \"Yes\" if your site is not publicly accessible or if your provider "
425
  "blocks image requests from third parties or if images are not present in PDF"
426
  msgstr ""
427
 
428
- #: views/tabs.php:336
429
  msgid "Show Hidden Content"
430
  msgstr ""
431
 
432
- #: views/tabs.php:342
433
  msgid ""
434
  "By default PrintFriendly Pro will only show the visible content on the "
435
  "page. Select \"Yes\", if you want PrintFriendly to show hidden content. "
436
  "(Ex. Content in hidden tabs)"
437
  msgstr ""
438
 
439
- #: views/tabs.php:348
440
  msgid "These features require a Pro subscription."
441
  msgstr ""
442
 
443
- #: views/tabs.php:348
444
  msgid "Learn More"
445
  msgstr ""
446
 
447
- #: views/tabs.php:354 views/tabs.php:554
448
  msgid "Save Options"
449
  msgstr ""
450
 
451
- #: views/tabs.php:355 views/tabs.php:555
452
  msgid "Cancel"
453
  msgstr ""
454
 
455
- #: views/tabs.php:367
456
  msgid "Page header"
457
  msgstr ""
458
 
459
- #: views/tabs.php:376
460
  msgid "My Website Icon"
461
  msgstr ""
462
 
463
- #: views/tabs.php:404
464
  msgid "Tagline (optional)"
465
  msgstr ""
466
 
467
- #: views/tabs.php:431
468
  msgid "Features"
469
  msgstr ""
470
 
471
- #: views/tabs.php:437
472
  msgid "Track in Google Analytics"
473
  msgstr ""
474
 
475
- #: views/tabs.php:447
476
  msgid "Click to delete"
477
  msgstr ""
478
 
479
- #: views/tabs.php:450 views/tabs.php:487 views/tabs.php:497 views/tabs.php:508
480
  msgid "Allow"
481
  msgstr ""
482
 
483
- #: views/tabs.php:451 views/tabs.php:488 views/tabs.php:498 views/tabs.php:509
484
  msgid "Not Allow"
485
  msgstr ""
486
 
487
- #: views/tabs.php:453 views/tabs.php:479
488
  msgid "Read documentation about this feature %1$shere%2$s"
489
  msgstr ""
490
 
491
- #: views/tabs.php:458
492
  msgid "Image size"
493
  msgstr ""
494
 
495
- #: views/tabs.php:461
496
  msgid "Full Size"
497
  msgstr ""
498
 
499
- #: views/tabs.php:462
500
  msgid "Large"
501
  msgstr ""
502
 
503
- #: views/tabs.php:463
504
  msgid "Medium"
505
  msgstr ""
506
 
507
- #: views/tabs.php:464
508
  msgid "Small"
509
  msgstr ""
510
 
511
- #: views/tabs.php:465
512
  msgid "Remove Images"
513
  msgstr ""
514
 
515
- #: views/tabs.php:471
516
  msgid "Image style"
517
  msgstr ""
518
 
519
- #: views/tabs.php:474
520
  msgid "Center/Block"
521
  msgstr ""
522
 
523
- #: views/tabs.php:475
524
  msgid "Align Right"
525
  msgstr ""
526
 
527
- #: views/tabs.php:476
528
  msgid "Align Left"
529
  msgstr ""
530
 
531
- #: views/tabs.php:477
532
  msgid "Align None"
533
  msgstr ""
534
 
535
- #: views/tabs.php:494
536
  msgid "PDF"
537
  msgstr ""
538
 
539
- #: views/tabs.php:500
540
  msgid "Developer Note"
541
  msgstr ""
542
 
543
- #: views/tabs.php:500
544
  msgid ""
545
  "On localhost the images can not be included in the PDF. Once the website is "
546
  "live/public images will be included in the PDF."
547
  msgstr ""
548
 
549
- #: views/tabs.php:505
550
  msgid "Print"
551
  msgstr ""
552
 
553
- #: views/tabs.php:520
554
  msgid "Custom CSS"
555
  msgstr ""
556
 
557
- #: views/tabs.php:527
558
  msgid "Custom CSS URL"
559
  msgstr ""
560
 
561
- #: views/tabs.php:542
562
  msgid ""
563
  "Customize the styles of the printed/pdf page using your own CSS. Create "
564
  "your custom CSS, and put the URL to your Custom CSS file in the box above"
565
  msgstr ""
566
 
567
- #: views/tabs.php:544
568
  msgid ""
569
  "Customize the styles of the printed/pdf page using your own CSS. Add your "
570
  "custom CSS (without the %s tags) in the box above"
571
  msgstr ""
572
 
573
- #: views/tabs.php:569
574
  msgid "Debug options"
575
  msgstr ""
576
 
577
- #: views/tabs.php:578
578
  msgid "Currently in Debug Mode. This tab is visible in debug mode only"
579
  msgstr ""
580
 
2
  # This file is distributed under the same license as the Print, PDF & Email by PrintFriendly package.
3
  msgid ""
4
  msgstr ""
5
+ "Project-Id-Version: Print, PDF & Email by PrintFriendly 5.0\n"
6
  "Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/wp-printfriendly\n"
7
+ "POT-Creation-Date: 2021-12-29 15:35:50+00:00\n"
8
  "MIME-Version: 1.0\n"
9
  "Content-Type: text/plain; charset=utf-8\n"
10
  "Content-Transfer-Encoding: 8bit\n"
11
  "Last-Translator: PrintFriendly Translate Team <support@printfriendly.com>\n"
12
  "Language-Team: PrintFriendly Translate Team <support@printfriendly.com>\n"
13
 
14
+ #: pf.php:652
15
  msgid ""
16
  "No valid custom image url received, please enter a valid url to use a "
17
  "custom image."
18
  msgstr ""
19
 
20
+ #: pf.php:660
21
  msgid "The text size you entered is invalid, please stay between 9px and 25px"
22
  msgstr ""
23
 
24
+ #: pf.php:668
25
  msgid ""
26
  "The color you entered is not valid, it must be a valid hexadecimal RGB font "
27
  "color."
28
  msgstr ""
29
 
30
+ #: pf.php:723
31
  msgid ""
32
  "No valid custom logo url received, please enter a valid url to use a custom "
33
  "logo."
34
  msgstr ""
35
 
36
+ #: pf.php:820
37
  msgid "PrintFriendly Options"
38
  msgstr ""
39
 
40
+ #: pf.php:820
41
  msgid "Print Friendly & PDF"
42
  msgstr ""
43
 
44
+ #: pf.php:853 views/tabs.php:433
45
  msgid "Custom Image"
46
  msgstr ""
47
 
48
+ #: pf.php:854
49
  msgid "Use Image"
50
  msgstr ""
51
 
52
+ #: pf.php:855
53
  msgid "Invalid Image URL"
54
  msgstr ""
55
 
56
+ #: pf.php:869
57
  msgid "Activation"
58
  msgstr ""
59
 
60
+ #: pf.php:870
61
  msgid "Checking status"
62
  msgstr ""
63
 
64
+ #: pf.php:871 views/pro.php:45
65
  msgid "Activate"
66
  msgstr ""
67
 
68
+ #: pf.php:872
69
  msgid "Active Trial"
70
  msgstr ""
71
 
72
+ #: pf.php:873
73
  msgid "Active"
74
  msgstr ""
75
 
76
+ #: pf.php:874
77
  msgid "Expired"
78
  msgstr ""
79
 
80
+ #: pf.php:875
81
  msgid "Please check Internet connection."
82
  msgstr ""
83
 
84
+ #: pf.php:904
85
  msgid "Settings"
86
  msgstr ""
87
 
88
+ #: pf.php:928 views/tabs.php:108 views/tabs.php:361 views/tabs.php:474
89
  msgid "Documentation"
90
  msgstr ""
91
 
92
+ #: pf.php:1299 views/tabs.php:165
93
  msgid "Custom Button"
94
  msgstr ""
95
 
96
+ #: pf.php:1497
97
  msgid "Only display when post is in:"
98
  msgstr ""
99
 
100
+ #: pf.php:1593
101
  msgid ""
102
  "You are currently using %1$s%2$s%3$s. You can copy copy its contents into "
103
  "the textbox if you want to update the styles."
104
  msgstr ""
105
 
106
+ #: test/wp/category-cat.php:53 test/wp/category-dog.php:52
107
+ msgid "Previous page"
108
+ msgstr ""
109
+
110
+ #: test/wp/category-cat.php:54 test/wp/category-dog.php:53
111
+ msgid "Next page"
112
+ msgstr ""
113
+
114
+ #: test/wp/category-cat.php:55 test/wp/category-dog.php:54
115
+ msgid "Page"
116
+ msgstr ""
117
+
118
  #: views/pro.php:18
119
  msgid "Learn more"
120
  msgstr ""
121
 
122
+ #: views/pro.php:30 views/tabs.php:534
123
  msgid "Email"
124
  msgstr ""
125
 
287
  msgid "Show Options Code"
288
  msgstr ""
289
 
290
+ #: views/tabs.php:96 views/tabs.php:323 views/tabs.php:331 views/tabs.php:345
291
+ #: views/tabs.php:353
292
  msgid "Copy Code"
293
  msgstr ""
294
 
300
  msgid "Button Style"
301
  msgstr ""
302
 
303
+ #: views/tabs.php:170
304
  msgid "Image"
305
  msgstr ""
306
 
307
+ #: views/tabs.php:184
308
  msgid "Use Your Image"
309
  msgstr ""
310
 
311
+ #: views/tabs.php:187 views/tabs.php:439
312
  msgid "Select Image"
313
  msgstr ""
314
 
315
+ #: views/tabs.php:195
316
+ msgid "Width"
317
  msgstr ""
318
 
319
  #: views/tabs.php:197
320
+ msgid "Height"
321
+ msgstr ""
322
+
323
+ #: views/tabs.php:206
324
+ msgid "No Image"
325
+ msgstr ""
326
+
327
+ #: views/tabs.php:211
328
  msgid "Text"
329
  msgstr ""
330
 
331
+ #: views/tabs.php:219
332
  msgid "Text Size"
333
  msgstr ""
334
 
335
+ #: views/tabs.php:229
336
  msgid "No Text"
337
  msgstr ""
338
 
339
+ #: views/tabs.php:235
340
  msgid "Preview"
341
  msgstr ""
342
 
343
+ #: views/tabs.php:247
344
  msgid "Button Position"
345
  msgstr ""
346
 
347
+ #: views/tabs.php:253
348
  msgid "Alignment"
349
  msgstr ""
350
 
351
+ #: views/tabs.php:256
352
  msgid "Left Align"
353
  msgstr ""
354
 
355
+ #: views/tabs.php:257
356
  msgid "Right Align"
357
  msgstr ""
358
 
359
+ #: views/tabs.php:258
360
  msgid "Center"
361
  msgstr ""
362
 
363
+ #: views/tabs.php:259
364
  msgid "None"
365
  msgstr ""
366
 
367
+ #: views/tabs.php:265
368
  msgid "Placement"
369
  msgstr ""
370
 
371
+ #: views/tabs.php:268
372
  msgid "Above Content"
373
  msgstr ""
374
 
375
+ #: views/tabs.php:269
376
  msgid "Below Content"
377
  msgstr ""
378
 
379
+ #: views/tabs.php:279
380
  msgid "Button Display"
381
  msgstr ""
382
 
383
+ #: views/tabs.php:284
384
  msgid "Pages to show on"
385
  msgstr ""
386
 
387
+ #: views/tabs.php:286
388
  msgid "Posts"
389
  msgstr ""
390
 
391
+ #: views/tabs.php:287
392
  msgid "Pages"
393
  msgstr ""
394
 
395
+ #: views/tabs.php:288
396
  msgid "Homepage"
397
  msgstr ""
398
 
399
+ #: views/tabs.php:289
400
  msgid "Category Pages"
401
  msgstr ""
402
 
403
+ #: views/tabs.php:290
404
  msgid "Taxonomy Pages"
405
  msgstr ""
406
 
407
+ #: views/tabs.php:294
408
+ msgid "Specific categories to show on"
 
 
 
 
 
 
 
 
409
  msgstr ""
410
 
411
+ #: views/tabs.php:316
412
+ msgid "Add direct to template"
413
  msgstr ""
414
 
415
+ #: views/tabs.php:338
416
+ msgid "Use the shortcode"
417
  msgstr ""
418
 
419
+ #: views/tabs.php:369
420
  msgid "Pro Exclusive Features"
421
  msgstr ""
422
 
423
+ #: views/tabs.php:375
424
  msgid "Encode images"
425
  msgstr ""
426
 
427
+ #: views/tabs.php:378 views/tabs.php:389 views/tabs.php:491
428
  msgid "No"
429
  msgstr ""
430
 
431
+ #: views/tabs.php:379 views/tabs.php:390 views/tabs.php:490
432
  msgid "Yes"
433
  msgstr ""
434
 
435
+ #: views/tabs.php:381
436
  msgid ""
437
  "Select \"Yes\" if your site is not publicly accessible or if your provider "
438
  "blocks image requests from third parties or if images are not present in PDF"
439
  msgstr ""
440
 
441
+ #: views/tabs.php:386
442
  msgid "Show Hidden Content"
443
  msgstr ""
444
 
445
+ #: views/tabs.php:392
446
  msgid ""
447
  "By default PrintFriendly Pro will only show the visible content on the "
448
  "page. Select \"Yes\", if you want PrintFriendly to show hidden content. "
449
  "(Ex. Content in hidden tabs)"
450
  msgstr ""
451
 
452
+ #: views/tabs.php:398
453
  msgid "These features require a Pro subscription."
454
  msgstr ""
455
 
456
+ #: views/tabs.php:398
457
  msgid "Learn More"
458
  msgstr ""
459
 
460
+ #: views/tabs.php:404 views/tabs.php:604
461
  msgid "Save Options"
462
  msgstr ""
463
 
464
+ #: views/tabs.php:405 views/tabs.php:605
465
  msgid "Cancel"
466
  msgstr ""
467
 
468
+ #: views/tabs.php:417
469
  msgid "Page header"
470
  msgstr ""
471
 
472
+ #: views/tabs.php:426
473
  msgid "My Website Icon"
474
  msgstr ""
475
 
476
+ #: views/tabs.php:454
477
  msgid "Tagline (optional)"
478
  msgstr ""
479
 
480
+ #: views/tabs.php:481
481
  msgid "Features"
482
  msgstr ""
483
 
484
+ #: views/tabs.php:487
485
  msgid "Track in Google Analytics"
486
  msgstr ""
487
 
488
+ #: views/tabs.php:497
489
  msgid "Click to delete"
490
  msgstr ""
491
 
492
+ #: views/tabs.php:500 views/tabs.php:537 views/tabs.php:547 views/tabs.php:558
493
  msgid "Allow"
494
  msgstr ""
495
 
496
+ #: views/tabs.php:501 views/tabs.php:538 views/tabs.php:548 views/tabs.php:559
497
  msgid "Not Allow"
498
  msgstr ""
499
 
500
+ #: views/tabs.php:503 views/tabs.php:529
501
  msgid "Read documentation about this feature %1$shere%2$s"
502
  msgstr ""
503
 
504
+ #: views/tabs.php:508
505
  msgid "Image size"
506
  msgstr ""
507
 
508
+ #: views/tabs.php:511
509
  msgid "Full Size"
510
  msgstr ""
511
 
512
+ #: views/tabs.php:512
513
  msgid "Large"
514
  msgstr ""
515
 
516
+ #: views/tabs.php:513
517
  msgid "Medium"
518
  msgstr ""
519
 
520
+ #: views/tabs.php:514
521
  msgid "Small"
522
  msgstr ""
523
 
524
+ #: views/tabs.php:515
525
  msgid "Remove Images"
526
  msgstr ""
527
 
528
+ #: views/tabs.php:521
529
  msgid "Image style"
530
  msgstr ""
531
 
532
+ #: views/tabs.php:524
533
  msgid "Center/Block"
534
  msgstr ""
535
 
536
+ #: views/tabs.php:525
537
  msgid "Align Right"
538
  msgstr ""
539
 
540
+ #: views/tabs.php:526
541
  msgid "Align Left"
542
  msgstr ""
543
 
544
+ #: views/tabs.php:527
545
  msgid "Align None"
546
  msgstr ""
547
 
548
+ #: views/tabs.php:544
549
  msgid "PDF"
550
  msgstr ""
551
 
552
+ #: views/tabs.php:550
553
  msgid "Developer Note"
554
  msgstr ""
555
 
556
+ #: views/tabs.php:550
557
  msgid ""
558
  "On localhost the images can not be included in the PDF. Once the website is "
559
  "live/public images will be included in the PDF."
560
  msgstr ""
561
 
562
+ #: views/tabs.php:555
563
  msgid "Print"
564
  msgstr ""
565
 
566
+ #: views/tabs.php:570
567
  msgid "Custom CSS"
568
  msgstr ""
569
 
570
+ #: views/tabs.php:577
571
  msgid "Custom CSS URL"
572
  msgstr ""
573
 
574
+ #: views/tabs.php:592
575
  msgid ""
576
  "Customize the styles of the printed/pdf page using your own CSS. Create "
577
  "your custom CSS, and put the URL to your Custom CSS file in the box above"
578
  msgstr ""
579
 
580
+ #: views/tabs.php:594
581
  msgid ""
582
  "Customize the styles of the printed/pdf page using your own CSS. Add your "
583
  "custom CSS (without the %s tags) in the box above"
584
  msgstr ""
585
 
586
+ #: views/tabs.php:619
587
  msgid "Debug options"
588
  msgstr ""
589
 
590
+ #: views/tabs.php:628
591
  msgid "Currently in Debug Mode. This tab is visible in debug mode only"
592
  msgstr ""
593
 
pf.php CHANGED
@@ -1,16 +1,24 @@
1
  <?php
 
2
  /*
3
- Plugin Name: Print, PDF & Email by PrintFriendly
4
- Plugin URI: http://www.printfriendly.com
5
- Description: PrintFriendly & PDF button for your website. Optimizes your pages and brand for print, pdf, and email.
6
- Name and URL are included to ensure repeat visitors and new visitors when printed versions are shared.
7
- Version: 5.0
8
- Author: Print, PDF, & Email by PrintFriendly
9
- Author URI: http://www.printfriendly.com
10
- Domain Path: /languages
11
- Text Domain: printfriendly
12
  */
13
 
 
 
 
 
 
 
 
14
  /**
15
  * PrintFriendly WordPress plugin. Allows easy embedding of printfriendly.com buttons.
16
  *
@@ -18,1485 +26,1664 @@
18
  * @author PrintFriendly <support@printfriendly.com>
19
  * @copyright Copyright (C) 2012, PrintFriendly
20
  */
21
- if ( ! class_exists( 'PrintFriendly_WordPress' ) ) {
22
-
23
- /**
24
- * Class containing all the plugins functionality.
25
- *
26
- * @package PrintFriendly_WordPress
27
- */
28
- class PrintFriendly_WordPress {
29
-
30
- /**
31
- * Current plugin version.
32
- *
33
- * @var string
34
- */
35
- var $plugin_version = '5.0';
36
-
37
- /**
38
- * The hook, used for text domain as well as hooks on pages and in get requests for admin.
39
- *
40
- * @var string
41
- */
42
- var $hook = 'printfriendly';
43
-
44
- /**
45
- * The option name, used throughout to refer to the plugins option and option group.
46
- *
47
- * @var string
48
- */
49
- var $option_name = 'printfriendly_option';
50
-
51
- /**
52
- * The plugins options, loaded on init containing all the plugins settings.
53
- *
54
- * @var array
55
- */
56
- var $options = array();
57
-
58
- /**
59
- * Database version, used to allow for easy upgrades to / additions in plugin options between plugin versions.
60
- *
61
- * @var int
62
- */
63
- var $db_version = 20;
64
-
65
- /**
66
- * Settings page, used within the plugin to reliably load the plugins admin JS and CSS files only on the admin page.
67
- *
68
- * @var string
69
- */
70
- var $settings_page = '';
71
-
72
- /**
73
- * GetSentry error reporting client
74
- *
75
- * @var Raven_Client
76
- */
77
- var $raven_client = null;
78
-
79
- /**
80
- * Constructor
81
- *
82
- * @since 3.0
83
- */
84
- function __construct() {
85
- define( 'PRINTFRIENDLY_BASEPATH', dirname( __FILE__ ) );
86
- define( 'PRINTFRIENDLY_BASEURL', plugins_url( '/', __FILE__ ) );
87
-
88
- // Retrieve the plugin options
89
- $this->options = get_option( $this->option_name );
90
-
91
- // If the options array is empty, set defaults
92
- if ( ! is_array( $this->options ) ) {
93
- $this->set_defaults();
94
- }
95
-
96
- /**
97
- * Set page content selection option "WordPress Standard/Strict" to "WP Template"
98
- */
99
- if ( isset( $this->options['pf_algo'] ) && $this->options['pf_algo'] === 'ws' ) {
100
- $this->options['pf_algo'] = 'wp';
101
- update_option( $this->option_name, $this->options );
102
- }
103
-
104
- // If the version number doesn't match, upgrade
105
- if ( $this->db_version > $this->options['db_version'] ) {
106
- $this->upgrade();
107
- }
108
-
109
- add_action( 'wp_head', array(&$this, 'front_head') );
110
- // automaticaly add the link
111
- if ( ! $this->is_manual() ) {
112
- add_filter( 'the_content', array(&$this, 'show_link_on_content') );
113
- add_filter( 'the_excerpt', array(&$this, 'show_link_on_excerpt') );
114
- }
115
-
116
- add_action( 'the_content', array(&$this, 'add_pf_content_class_around_content_hook') );
117
-
118
- if ( is_admin() ) {
119
- $this->admin_hooks();
120
- }
121
- }
122
-
123
- /**
124
- * All admin hooks.
125
- */
126
- function admin_hooks() {
127
- // Hook into init for registration of the option and the language files
128
- add_action( 'admin_init', array(&$this, 'init') );
129
-
130
- // Register the settings page
131
- add_action( 'admin_menu', array(&$this, 'add_config_page') );
132
-
133
- // Enqueue the needed scripts and styles
134
- add_action( 'admin_enqueue_scripts', array(&$this, 'admin_enqueue_scripts') );
135
-
136
- // Register a link to the settings page on the plugins overview page
137
- add_filter( 'plugin_action_links', array(&$this, 'filter_plugin_actions'), 10, 2 );
138
- add_filter( 'plugin_row_meta', array(&$this, 'additional_links'), 10, 2 );
139
-
140
- add_filter( 'wp_dropdown_cats', array( &$this, 'wp_dropdown_cats_multiple' ), 10, 2 );
141
- }
142
-
143
- /**
144
- * Adds multiple select support for category dropdown.
145
- *
146
- * @since 4.2
147
- **/
148
- function wp_dropdown_cats_multiple( $output, $attributes ) {
149
- if ( isset( $attributes['multiple'] ) && $attributes['multiple'] ) {
150
- $output = preg_replace( '/^<select/i', '<select multiple', $output );
151
- $output = str_replace( "name='{$attributes['name']}'", "name='{$attributes['name']}[]'", $output );
152
- foreach ( array_map( 'trim', explode( ',', $attributes['selected'] ) ) as $value ) {
153
- $output = str_replace( "value=\"{$value}\"", "value=\"{$value}\" selected", $output );
154
- }
155
- }
156
- return $output;
157
- }
158
-
159
- /**
160
- * Adds wraps content in pf-content class to help Printfriendly algo determine the content
161
- *
162
- * @since 3.2.8
163
- **/
164
- function add_pf_content_class_around_content_hook( $content = false ) {
165
- if ( $this->is_enabled() && $this->is_wp_algo_on( $content ) ) {
166
- add_action( 'wp_footer', array(&$this, 'print_script_footer') );
167
- return '<div class="pf-content">' . $content . '</div>';
168
- } else {
169
- return $content;
170
- }
171
- }
172
-
173
- /**
174
- * Override to check if print-only command is being used
175
- *
176
- * @since 3.3.0
177
- **/
178
- function print_only_override( $content ) {
179
- $pattern = '/class\s*?=\s*?(["\']|["\']([^"\']*?)\s)print-only(["\']|\s([^"\']*?)["\'])/';
180
- $pf_pattern = '/class\s*?=\s*?(["\']|["\']([^"\']*?)\s)pf-content(["\']|\s([^"\']*?)["\'])/';
181
-
182
- return ( preg_match( $pattern, $content ) || preg_match( $pf_pattern, $content ) );
183
- }
184
-
185
- /**
186
- * Check if WP Algorithm is selected and content doesn't use print-only
187
- *
188
- * @since 3.5.4
189
- **/
190
- function is_wp_algo_on( $content ) {
191
- return ! class_exists( 'WooCommerce' ) && isset( $this->options['pf_algo'] ) && $content && $this->options['pf_algo'] === 'wp' && ! $this->print_only_override( $content );
192
- }
193
-
194
- /**
195
- * PHP 4 Compatible Constructor
196
- *
197
- * @since 3.0
198
- */
199
- function PrintFriendly_WordPress() {
200
- $this->__construct();
201
- }
202
-
203
- /**
204
- * Check if button should be visible on particular page
205
- */
206
- function is_enabled() {
207
- if ( ( is_page() && ( isset( $this->options['show_on_pages'] ) && 'on' === $this->options['show_on_pages'] ) )
208
- || ( is_home() && ( ( isset( $this->options['show_on_homepage'] ) && 'on' === $this->options['show_on_homepage'] ) ) )
209
- || ( is_tax() && ( ( isset( $this->options['show_on_taxonomies'] ) && 'on' === $this->options['show_on_taxonomies'] ) && $this->category_included() ) )
210
- || ( is_category() && ( ( isset( $this->options['show_on_categories'] ) && 'on' === $this->options['show_on_categories'] ) && $this->category_included() ) )
211
- || ( is_single() && ( ( isset( $this->options['show_on_posts'] ) && 'on' === $this->options['show_on_posts'] ) && $this->category_included() ) )
212
- ) {
213
- return true;
214
- }
215
- return false;
216
- }
217
-
218
- /**
219
- * Prints the PrintFriendly button CSS, in the header.
220
- *
221
- * @since 3.0
222
- */
223
- function front_head() {
224
- if ( $this->is_enabled() ) {
225
- ?>
226
- <?php
227
- if ( isset( $this->options['enable_css'] ) && $this->options['enable_css'] !== 'on' ) {
228
- return;
229
- }
230
- ?>
231
- <style type="text/css">
232
- @media screen {
233
- .printfriendly {
234
- position: relative;
235
- z-index: 1000;
236
- margin: <?php echo sprintf( '%dpx %dpx %dpx %dpx', $this->val( 'margin_top', false, 0 ), $this->val( 'margin_right', false, 0 ), $this->val( 'margin_bottom', false, 0 ), $this->val( 'margin_left', false, 0 ) ); ?>;
237
- }
238
- .printfriendly a, .printfriendly a:link, .printfriendly a:visited, .printfriendly a:hover, .printfriendly a:active {
239
- font-weight: 600;
240
- cursor: pointer;
241
- text-decoration: none;
242
- border: none;
243
- -webkit-box-shadow: none;
244
- -moz-box-shadow: none;
245
- box-shadow: none;
246
- outline:none;
247
- font-size: <?php echo $this->options['text_size']; ?>px !important;
248
- color: <?php echo $this->options['text_color']; ?> !important;
249
- }
250
- .printfriendly.pf-alignleft {float: left}.printfriendly.pf-alignright {float: right}.printfriendly.pf-aligncenter {display: flex;align-items: center;justify-content: center;}
251
- }
252
-
253
- @media print {
254
- .printfriendly {display: none}
255
- }
256
-
257
- .pf-button.pf-button-excerpt {
258
- display: none;
259
- }
260
-
261
- </style>
262
- <?php
263
- }
264
- }
265
-
266
- /**
267
- * Prints the PrintFriendly JavaScript, in the footer, and loads it asynchronously.
268
- *
269
- * @since 3.0
270
- */
271
- function print_script_footer() {
272
- $tagline = $this->options['tagline'];
273
- $image_url = $this->options['image_url'];
274
- if ( $this->options['logo'] === 'favicon' ) {
275
- $tagline = '';
276
- $image_url = '';
277
- }
278
-
279
- echo $this->getSelectorsFromCustomCSS();
280
-
281
- // Currently we use v3 for both: normal and password protected sites
282
- ?>
283
- <script type="text/javascript" id="pf_script">
284
- var pfHeaderImgUrl = '<?php echo esc_js( esc_url( $image_url ) ); ?>';
285
- var pfHeaderTagline = '<?php echo esc_js( $tagline ); ?>';
286
- var pfdisableClickToDel = '<?php echo esc_js( $this->options['click_to_delete'] ); ?>';
287
- var pfImagesSize = '<?php echo esc_js( $this->options['images-size'] ); ?>';
288
- var pfImageDisplayStyle = '<?php echo esc_js( $this->options['image-style'] ); ?>';
289
- var pfEncodeImages = '<?php echo esc_js( $this->val( 'password_protected', false ) === 'yes' ? 1 : 0 ); ?>';
290
- var pfShowHiddenContent = '<?php echo esc_js( $this->val( 'show_hidden_content', false ) === 'yes' ? 1 : 0 ); ?>';
291
- var pfDisableEmail = '<?php echo esc_js( $this->options['email'] ); ?>';
292
- var pfDisablePDF = '<?php echo esc_js( $this->options['pdf'] ); ?>';
293
- var pfDisablePrint = '<?php echo esc_js( $this->options['print'] ); ?>';
294
- var pfCustomCSS = '<?php echo esc_js( esc_url( $this->get_custom_css() ) ); ?>';
295
- var pfPlatform = 'WordPress';
296
- </script>
297
- <script async src='https://cdn.printfriendly.com/printfriendly.js'></script>
298
- <?php
299
- }
300
-
301
- /**
302
- * Used as a filter for the_content.
303
- *
304
- * @since ?
305
- *
306
- * @param string $content The content of the post, when the function is used as a filter.
307
- *
308
- * @return string The content with the button added to the content.
309
- */
310
- function show_link_on_content( $content ) {
311
- $content = $this->show_link( $content, true );
312
-
313
- return $content;
314
- }
315
-
316
- /**
317
- * Used as a filter for the_excerpt.
318
- *
319
- * @since ?
320
- *
321
- * @param string $content The content of the post, when the function is used as a filter.
322
- *
323
- * @return string The content with the button added to the content.
324
- */
325
- function show_link_on_excerpt( $content ) {
326
- return $this->show_link( $content, false );
327
- }
328
-
329
- /**
330
- * Used to generate the the final content as per the required placement.
331
- *
332
- * @since 3.0
333
- *
334
- * @param string $content The content of the post, when the function is used as a filter.
335
- * @param bool $on_content True if showing on the_content and False if showing on the_excerpt.
336
- *
337
- * @return string $button or $content with the button added to the content when appropriate, just the content when button shouldn't be added or just button when called manually.
338
- */
339
- private function show_link( $content = false, $on_content = true ) {
340
- $is_manual = $this->is_manual();
341
-
342
- if ( ! $content && ! $is_manual ) {
343
- return '';
344
- }
345
-
346
- $button = $this->getButton( false, $on_content ? 'pf-button-content' : 'pf-button-excerpt' );
347
- if ( $is_manual ) {
348
- // Hook the script call now, so it only get's loaded when needed, and need is determined by the user calling pf_button
349
- add_action( 'wp_footer', array(&$this, 'print_script_footer') );
350
- return $button;
351
- } else {
352
- if ( $this->is_enabled() ) {
353
- // Hook the script call now, so it only get's loaded when needed, and need is determined by the user calling pf_button
354
- add_action( 'wp_footer', array(&$this, 'print_script_footer') );
355
-
356
- if ( $this->options['content_placement'] === 'before' ) {
357
- return $button . $content;
358
- } else {
359
- return $content . $button;
360
- }
361
- } else {
362
- return $content;
363
- }
364
- }
365
- }
366
-
367
- /**
368
- * Returns the HTML of the button.
369
- *
370
- * This can be called publicly from `pf_show_link()`.
371
- *
372
- * @since 3.3.8
373
- *
374
- * @param bool $add_footer_script Whether to add the script in the footer.
375
- * @param string $add_class Additional class for the HTML button div.
376
- *
377
- * @return Printfriendly Button HTML
378
- */
379
- public function getButton( $add_footer_script = false, $add_class = '' ) {
380
- if ( $add_footer_script ) {
381
- add_action( 'wp_footer', array(&$this, 'print_script_footer') );
382
- }
383
- $js_enabled = $this->js_enabled();
384
- $analytics_code = '';
385
- $onclick = '';
386
-
387
- if ( $this->google_analytics_enabled() ) {
388
- $title_var = is_singular() ? esc_attr( get_the_title() ) : 'NULL';
389
- $analytics_code = "if(typeof(_gaq) != 'undefined') { _gaq.push(['_trackEvent','PRINTFRIENDLY', 'print', '" . $title_var . "']);
390
- }else if(typeof(ga) != 'undefined') { ga('send', 'event','PRINTFRIENDLY', 'print', '" . $title_var . "'); }";
391
- if ( $js_enabled ) {
392
- $onclick = 'onclick="window.print();' . $analytics_code . ' return false;"';
393
- } else {
394
- $onclick = '';
395
- }
396
- } elseif ( $js_enabled ) {
397
- $onclick = 'onclick="window.print(); return false;"';
398
- }
399
-
400
- if ( $js_enabled ) {
401
- $href = '#';
402
- } else {
403
- $href = 'https://www.printfriendly.com/print?url=' . urlencode( get_permalink() );
404
- }
405
-
406
- if ( ! $js_enabled ) {
407
- if ( $this->google_analytics_enabled() ) {
408
- $onclick = $onclick . ' onclick="' . $analytics_code . '"';
409
- }
410
- $href = 'https://www.printfriendly.com/print?headerImageUrl=' . urlencode( $this->options['image_url'] ) . '&headerTagline=' . urlencode( $this->options['tagline'] ) . '&pfCustomCSS=' . urlencode( $this->options['custom_css_url'] ) . '&imageDisplayStyle=' . urlencode( $this->options['image-style'] ) . '&disableClickToDel=' . urlencode( $this->options['click_to_delete'] ) . '.&disablePDF=' . urlencode( $this->options['pdf'] ) . '&disablePrint=' . urlencode( $this->options['print'] ) . '&disableEmail=' . urlencode( $this->options['email'] ) . '&imagesSize=' . urlencode( $this->options['images-size'] ) . '&url=' . urlencode( get_permalink() ) . '&source=wp';
411
- }
412
- if ( ! is_singular() && ! empty( $onclick ) && $js_enabled ) {
413
- $onclick = '';
414
- $href = add_query_arg( 'pfstyle', 'wp', get_permalink() );
415
- }
416
-
417
- $align = '';
418
- if ( 'none' !== $this->options['content_position'] ) {
419
- $align = ' pf-align' . $this->options['content_position'];
420
- }
421
- $href = str_replace( '&', '&amp;', $href );
422
-
423
- $button = apply_filters( 'printfriendly_button', '<div class="printfriendly pf-button ' . $add_class . $align . '"><a href="' . $href . '" rel="nofollow" ' . $onclick . ' title="Printer Friendly, PDF & Email">' . $this->button() . '</a></div>' );
424
- return $button;
425
- }
426
-
427
- /**
428
- * Returns the custom selector CSS to be added.
429
- *
430
- * @since 5.0
431
- * @returns string
432
- */
433
- private function getSelectorsFromCustomCSS() {
434
- $css = '';
435
-
436
- if ( $this->options['pf_algo'] === 'css' ) {
437
- $attributes = array();
438
- $names = array( 'author', 'date', 'content', 'title', 'primaryImage' );
439
- $data = '';
440
- foreach ( $names as $name ) {
441
- $selector = $this->val( "css-{$name}", false );
442
- $suffix = $name === 'content' ? 'Selectors' : 'Selector';
443
- if ( ! empty( $selector ) ) {
444
- $data .= "{$name}{$suffix}=$selector;";
445
- }
446
- }
447
- $fallback = $this->options['pf_algo_css_content'];
448
- if ( $data ) {
449
- $css = sprintf( '<printfriendly-options data-selectors="%s" data-fallback-strategy="%s"></printfriendly-options>', esc_attr( $data ), esc_attr( $fallback ) );
450
- }
451
- }
452
- return $css;
453
- }
454
-
455
-
456
- /**
457
- * Checks if GA is enabled.
458
- *
459
- * @since 3.2.9
460
- * @returns if google analytics enabled
461
- */
462
- function google_analytics_enabled() {
463
- return isset( $this->options['enable_google_analytics'] ) && $this->options['enable_google_analytics'] === 'yes';
464
- }
465
-
466
- /**
467
- * Is JS enabled?
468
- *
469
- * @since 3.2.6
470
- * @return boolean true if JS is enabled for the plugin
471
- **/
472
- function js_enabled() {
473
- return true;
474
- }
475
-
476
- /**
477
- * Filter posts by category.
478
- *
479
- * @since 3.2.2
480
- * @return boolean true if post belongs to category selected for button display
481
- */
482
- function category_included() {
483
- return isset( $this->options['show_on_cat'] ) ? in_category( $this->options['show_on_cat'] ) : true;
484
- }
485
-
486
- /**
487
- * Register the textdomain and the options array along with the validation function
488
- *
489
- * @since 3.0
490
- */
491
- function init() {
492
- // Allow for localization
493
- load_plugin_textdomain( 'printfriendly', false, basename( dirname( __FILE__ ) ) . '/languages' );
494
-
495
- // Register our option array
496
- register_setting( $this->option_name, $this->option_name, array( 'sanitize_callback' => array(&$this, 'options_validate') ) );
497
- }
498
-
499
- /**
500
- * Validate the saved options.
501
- *
502
- * @since 3.0
503
- * @param array $input with unvalidated options.
504
- * @return array $valid_input with validated options.
505
- */
506
- function options_validate( $input ) {
507
- // Prevent CSRF attack
508
- check_admin_referer( 'pf-options', 'pf-nonce' );
509
-
510
- $valid_input = $input;
511
-
512
- // Section 1 options
513
- if ( ! isset( $input['button_type'] ) || ! in_array(
514
- $input['button_type'], array(
515
- 'buttons/printfriendly-pdf-email-button.png',
516
- 'buttons/printfriendly-pdf-email-button-md.png',
517
- 'buttons/printfriendly-pdf-email-button-notext.png', // buttongroup1
518
- 'buttons/printfriendly-pdf-button.png',
519
- 'buttons/printfriendly-pdf-button-nobg.png',
520
- 'buttons/printfriendly-pdf-button-nobg-md.png', // buttongroup2
521
- 'buttons/printfriendly-button.png',
522
- 'buttons/printfriendly-button-nobg.png',
523
- 'buttons/printfriendly-button-md.png',
524
- 'buttons/printfriendly-button-lg.png', // buttongroup3
525
- 'buttons/print-button.png',
526
- 'buttons/print-button-nobg.png',
527
- 'buttons/print-button-gray.png', // buttongroup3
528
- 'custom-button', // custom
529
- ), true
530
- ) ) {
531
- $valid_input['button_type'] = 'printfriendly-pdf-button.png';
532
- }
533
-
534
- if ( ! isset( $input['custom_button_icon'] ) || ! in_array(
535
- $input['custom_button_icon'], array(
536
- 'https://cdn.printfriendly.com/icons/printfriendly-icon-sm.png',
537
- 'https://cdn.printfriendly.com/icons/printfriendly-icon-md.png',
538
- 'https://cdn.printfriendly.com/icons/printfriendly-icon-lg.png',
539
- 'custom-image',
540
- 'no-image',
541
- ), true
542
- ) ) {
543
- $valid_input['custom_button_icon'] = 'https://cdn.printfriendly.com/icons/printfriendly-icon-md.png';
544
- }
545
-
546
- // if a custom image is not being chosen, reset it in case it existed in the past.
547
- if ( isset( $valid_input['custom_button_icon'] ) && $valid_input['custom_button_icon'] !== 'custom-image' ) {
548
- $valid_input['custom_image'] = '';
549
- }
550
-
551
- // @todo custom image url validation
552
- if ( ! isset( $input['custom_image'] ) || empty( $input['custom_image'] ) ) {
553
- $valid_input['custom_image'] = '';
554
- }
555
-
556
- if ( ! isset( $input['custom_button_text'] ) ) {
557
- $valid_input['custom_button_text'] = 'custom-text';
558
- }
559
-
560
- // @todo validate optional custom text
561
- if ( ! isset( $input['custom_text'] ) ) {
562
- $valid_input['custom_text'] = 'Print Friendly';
563
- }
564
-
565
- // Custom button selected, but no url nor text given, reset button type to default
566
- if ( 'custom-button' === $valid_input['button_type'] && ( '' === $valid_input['custom_image'] && '' === $input['custom_text'] ) ) {
567
- $valid_input['button_type'] = 'buttons/printfriendly-pdf-button.png';
568
- add_settings_error( $this->option_name, 'invalid_custom_image', __( 'No valid custom image url received, please enter a valid url to use a custom image.', 'printfriendly' ) );
569
- }
570
-
571
- $valid_input['text_size'] = (int) $input['text_size'];
572
- if ( ! isset( $valid_input['text_size'] ) || 0 === $valid_input['text_size'] ) {
573
- $valid_input['text_size'] = 14;
574
- } elseif ( 25 < $valid_input['text_size'] || 9 > $valid_input['text_size'] ) {
575
- $valid_input['text_size'] = 14;
576
- add_settings_error( $this->option_name, 'invalid_text_size', __( 'The text size you entered is invalid, please stay between 9px and 25px', 'printfriendly' ) );
577
- }
578
-
579
- if ( ! isset( $input['text_color'] ) ) {
580
- $valid_input['text_color'] = $this->options['text_color'];
581
- } elseif ( ! preg_match( '/^#[a-f0-9]{3,6}$/i', $input['text_color'] ) ) {
582
- // Revert to previous setting and throw error.
583
- $valid_input['text_color'] = $this->options['text_color'];
584
- add_settings_error( $this->option_name, 'invalid_color', __( 'The color you entered is not valid, it must be a valid hexadecimal RGB font color.', 'printfriendly' ) );
585
- }
586
-
587
- /* Section 2 options */
588
- if ( ! isset( $input['enable_css'] ) || 'off' !== $input['enable_css'] ) {
589
- $valid_input['enable_css'] = 'on';
590
- }
591
-
592
- if ( ! isset( $input['content_position'] ) || ! in_array( $input['content_position'], array('none', 'left', 'center', 'right'), true ) ) {
593
- $valid_input['content_position'] = 'left';
594
- }
595
-
596
- if ( ! isset( $input['content_placement'] ) || ! in_array( $input['content_placement'], array('before', 'after'), true ) ) {
597
- $valid_input['content_placement'] = 'after';
598
- }
599
-
600
- foreach ( array('margin_top', 'margin_right', 'margin_bottom', 'margin_left') as $opt ) {
601
- // if margin is not defined, don't throw a PHP notice
602
- if ( isset( $input[ $opt ] ) ) {
603
- $valid_input[ $opt ] = (int) $input[ $opt ];
604
- }
605
- }
606
-
607
- unset( $opt );
608
-
609
- /* Section 3 options */
610
- foreach ( array('show_on_posts', 'show_on_pages', 'show_on_homepage', 'show_on_categories', 'show_on_taxonomies') as $opt ) {
611
- if ( ! isset( $input[ $opt ] ) || 'on' !== $input[ $opt ] ) {
612
- unset( $valid_input[ $opt ] );
613
- }
614
- }
615
- unset( $opt );
616
-
617
- // Just in case
618
- if ( isset( $input['show_on_template'] ) ) {
619
- unset( $valid_input['show_on_template'] );
620
- }
621
-
622
- if ( isset( $input['category_ids'] ) ) {
623
- unset( $valid_input['category_ids'] );
624
- }
625
-
626
- /* Section 4 options */
627
- if ( ! isset( $input['logo'] ) || ! in_array( $input['logo'], array('favicon', 'upload-an-image'), true ) ) {
628
- $valid_input['logo'] = 'favicon';
629
- }
630
-
631
- // @todo custom logo url validation
632
- if ( ! isset( $input['image_url'] ) || empty( $input['image_url'] ) ) {
633
- $valid_input['image_url'] = '';
634
- }
635
-
636
- // @todo validate optional tagline text
637
- if ( ! isset( $input['tagline'] ) ) {
638
- $valid_input['tagline'] = '';
639
- }
640
-
641
- // Custom logo selected, but no valid url given, reset logo to default
642
- if ( 'upload-an-image' === $valid_input['logo'] && '' === $valid_input['image_url'] ) {
643
- $valid_input['logo'] = 'favicon';
644
- add_settings_error( $this->option_name, 'invalid_custom_logo', __( 'No valid custom logo url received, please enter a valid url to use a custom logo.', 'printfriendly' ) );
645
- }
646
-
647
- if ( ! isset( $input['image-style'] ) || ! in_array( $input['image-style'], array('right', 'left', 'none', 'block'), true ) ) {
648
- $valid_input['image-style'] = 'block';
649
- }
650
-
651
- foreach ( array('click_to_delete', 'email', 'pdf', 'print') as $opt ) {
652
- // phpcs:ignore WordPress.PHP.StrictInArray.MissingTrueStrict
653
- if ( ! isset( $input[ $opt ] ) || ! in_array( $input[ $opt ], array('0', '1') ) ) {
654
- $valid_input[ $opt ] = '0';
655
- }
656
- }
657
- unset( $opt );
658
-
659
- if ( ! isset( $input['images-size'] ) || ! in_array( $input['images-size'], array('full-size', 'remove-images', 'large', 'medium', 'small'), true ) ) {
660
- $valid_input['images-size'] = 'full-size';
661
- }
662
-
663
- if ( $this->is_pro( 'custom-css' ) ) {
664
- // a file will be generated even if nothing is provided in the css box.
665
- $css = $input['custom_css'];
666
-
667
- // remove the <style> </style> tags.
668
- $css = str_replace( array( '<style>', '</style>' ), '', $css );
669
- $valid_input['custom_css'] = sanitize_textarea_field( $css );
670
- $file = $this->maybe_generate_custom_css_file( $valid_input['custom_css'] );
671
- if ( ! $file ) {
672
- $file = isset( $this->options['custom_css_url_pro'] ) ? $this->options['custom_css_url_pro'] : '';
673
- }
674
- $valid_input['custom_css_url_pro'] = $file;
675
-
676
- // if no file can be generated
677
- // check if this version is upgraded from the version that was using url instead of textbox
678
- // and reuse it
679
- if ( ! $file && isset( $this->options['custom_css_url'] ) ) {
680
- $valid_input['custom_css_url'] = $this->options['custom_css_url'];
681
- }
682
- }
683
-
684
- /* Section 5 options */
685
- if ( ! isset( $input['password_protected'] ) || ! in_array( $input['password_protected'], array('no', 'yes'), true ) ) {
686
- $valid_input['password_protected'] = 'no';
687
- }
688
- if ( ! isset( $input['show_hidden_content'] ) || ! in_array( $input['show_hidden_content'], array('no', 'yes'), true ) ) {
689
- $valid_input['show_hidden_content'] = 'no';
690
- }
691
-
692
- /*Analytics Options */
693
- if ( ! isset( $input['enable_google_analytics'] ) || ! in_array( $input['enable_google_analytics'], array('no', 'yes'), true ) ) {
694
- $valid_input['enable_google_analytics'] = 'no';
695
- }
696
-
697
- if ( ! isset( $input['pf_algo'] ) || ! in_array( $input['pf_algo'], array('wp', 'pf', 'css'), true ) ) {
698
- $valid_input['pf_algo'] = 'wp';
699
- }
700
-
701
- if ( $valid_input['pf_algo'] === 'css' && empty( $valid_input['pf_algo_css_content'] ) && ! empty( $valid_input['css-content'] ) ) {
702
- $valid_input['pf_algo_css_content'] = 'original';
703
- }
704
-
705
- /* Database version */
706
- $valid_input['db_version'] = $this->db_version;
707
-
708
- // set the current tab from where the settings were saved from
709
- if ( isset( $_POST['tab'] ) ) {
710
- set_transient( 'pf-tab', $_POST['tab'], 5 );
711
- }
712
-
713
- // save the categories as comma-separated
714
- if ( isset( $valid_input['show_on_cat'] ) && ! empty( $valid_input['show_on_cat'] ) ) {
715
- $valid_input['show_on_cat'] = implode( ',', $valid_input['show_on_cat'] );
716
- }
717
-
718
- return $valid_input;
719
- }
720
-
721
- /**
722
- * Register the config page for all users that have the manage_options capability
723
- *
724
- * @since 3.0
725
- */
726
- function add_config_page() {
727
- $this->settings_page = add_options_page( __( 'PrintFriendly Options', 'printfriendly' ), __( 'Print Friendly & PDF', 'printfriendly' ), 'manage_options', $this->hook, array(&$this, 'config_page') );
728
-
729
- // register callback gets call prior your own page gets rendered
730
- add_action( 'load-' . $this->settings_page, array(&$this, 'on_load_printfriendly') );
731
- }
732
-
733
- /**
734
- * Enqueue the scripts for the admin settings page
735
- *
736
- * @since 3.0
737
- * @param string $screen_id check whether the current page is the PrintFriendly settings page.
738
- */
739
- function admin_enqueue_scripts( $screen_id ) {
740
- if ( $this->settings_page === $screen_id ) {
741
- if ( ! did_action( 'wp_enqueue_media' ) ) {
742
- wp_enqueue_media();
743
- }
744
-
745
- if ( ! wp_script_is( 'clipboard' ) ) {
746
- wp_enqueue_script( 'clipboard', plugins_url( 'assets/js/lib/clipboard.min.js', __FILE__ ) );
747
- }
748
-
749
- if ( ! wp_script_is( 'select2' ) ) {
750
- wp_enqueue_script( 'select2', plugins_url( 'assets/js/lib/select2.min.js', __FILE__ ) );
751
- }
752
-
753
- wp_register_script( 'pf-admin', plugins_url( 'assets/js/admin.js', __FILE__ ), array( 'jquery', 'jquery-ui-tabs', 'jquery-ui-accordion', 'media-upload', 'wp-color-picker', 'clipboard', 'select2' ), $this->plugin_version );
754
- wp_localize_script(
755
- 'pf-admin', 'pf_config', array(
756
- 'i10n' => array(
757
- 'upload_window_title' => __( 'Custom Image', 'printfriendly' ),
758
- 'upload_window_button_title' => __( 'Use Image', 'printfriendly' ),
759
- 'invalid_image_url' => __( 'Invalid Image URL', 'printfriendly' ),
760
- ),
761
- )
762
- );
763
-
764
- wp_register_script( 'pf-admin-pro', plugins_url( 'assets/js/admin_pro.js', __FILE__ ), array( 'pf-admin' ), $this->plugin_version );
765
-
766
- wp_localize_script(
767
- 'pf-admin-pro', 'pf_config', array(
768
- 'nonce' => wp_create_nonce( $this->hook . $this->plugin_version ),
769
- 'action' => $this->hook,
770
- 'i10n' => array(
771
- 'activation' => __( 'Activation', 'printfriendly' ),
772
- 'check_status' => __( 'Checking status', 'printfriendly' ),
773
- 'activate' => __( 'Activate', 'printfriendly' ),
774
- 'active_trial' => __( 'Active Trial', 'printfriendly' ),
775
- 'active' => __( 'Active', 'printfriendly' ),
776
- 'expired' => __( 'Expired', 'printfriendly' ),
777
- 'connection' => __( 'Please check Internet connection.', 'printfriendly' ),
778
- ),
779
- )
780
- );
781
- wp_enqueue_script( 'pf-admin-pro' );
782
-
783
- wp_enqueue_style( 'pf-bulma', plugins_url( 'assets/css/lib/bulma.prefixed.min.css', __FILE__ ), array( 'wp-color-picker' ), $this->plugin_version );
784
- wp_enqueue_style( 'pf-select2', plugins_url( 'assets/css/lib/select2.min.css', __FILE__ ), array(), $this->plugin_version );
785
- wp_enqueue_style( 'pf-admin', plugins_url( 'assets/css/admin.css', __FILE__ ), array( 'pf-select2', 'pf-bulma' ), $this->plugin_version );
786
- }
787
- }
788
-
789
- /**
790
- * Register the settings link for the plugins page
791
- *
792
- * @since 3.0
793
- * @param array $links the links for the plugins.
794
- * @param string $file filename to check against plugins filename.
795
- * @return array $links the links with the settings link added to it if appropriate.
796
- */
797
- function filter_plugin_actions( $links, $file ) {
798
- // Static so we don't call plugin_basename on every plugin row.
799
- static $this_plugin;
800
- if ( ! $this_plugin ) {
801
- $this_plugin = plugin_basename( __FILE__ );
802
- }
803
-
804
- if ( $file === $this_plugin ) {
805
- $settings_link = '<a href="options-general.php?page=' . $this->hook . '">' . __( 'Settings', 'printfriendly' ) . '</a>';
806
- array_unshift( $links, $settings_link ); // before other links
807
- }
808
-
809
- return $links;
810
- }
811
-
812
- /**
813
- * Register the additional link for the plugins page in the plugin description column.
814
- *
815
- * @since ?
816
- * @param array $links the links for the plugins.
817
- * @param string $file filename to check against plugins filename.
818
- * @return array $links the links with the links added to it if appropriate.
819
- */
820
- function additional_links( $links, $file ) {
821
- // Static so we don't call plugin_basename on every plugin row.
822
- static $this_plugin;
823
- if ( ! $this_plugin ) {
824
- $this_plugin = plugin_basename( __FILE__ );
825
- }
826
-
827
- if ( $file === $this_plugin ) {
828
- $new_links = array( '<a href="https://printfriendly.freshdesk.com/support/solutions/folders/69000070847" target="_new">' . __( 'Documentation', 'printfriendly' ) . '</a>' );
829
- $links = array_merge( $links, $new_links );
830
- }
831
- return $links;
832
- }
833
-
834
- /**
835
- * Set default values for the plugin. If old, as in pre 1.0, settings are there, use them and then delete them.
836
- *
837
- * @since 3.0
838
- */
839
- function set_defaults() {
840
- // Set some defaults
841
- $this->options = array(
842
- 'button_type' => 'buttons/printfriendly-pdf-button.png',
843
- 'content_position' => 'left',
844
- 'content_placement' => 'after',
845
- 'custom_button_icon' => 'https://cdn.printfriendly.com/icons/printfriendly-icon-md.png',
846
- 'custom_button_text' => 'custom-text',
847
- 'custom_image' => '',
848
- 'custom_text' => 'PrintFriendly',
849
- 'enable_css' => 'on',
850
- 'margin_top' => '12',
851
- 'margin_right' => '12',
852
- 'margin_bottom' => '12',
853
- 'margin_left' => '12',
854
- 'show_on_posts' => 'on',
855
- 'show_on_pages' => 'on',
856
- 'text_color' => '#3AAA11',
857
- 'text_size' => 14,
858
- 'logo' => 'favicon',
859
- 'image_url' => '',
860
- 'tagline' => '',
861
- 'click_to_delete' => '0', // 0 - allow, 1 - do not allow
862
- 'hide-images' => '0', // 0 - show images, 1 - hide images
863
- 'image-style' => 'block', // 'right', 'left', 'none', 'block'
864
- 'email' => '0', // 0 - allow, 1 - do not allow
865
- 'pdf' => '0', // 0 - allow, 1 - do not allow
866
- 'print' => '0', // 0 - allow, 1 - do not allow
867
- 'password_protected' => 'no',
868
- 'enable_google_analytics' => 'no',
869
- 'enable_error_reporting' => 'yes',
870
- 'pf_algo' => 'wp',
871
- 'images-size' => 'full-size',
872
- 'show_hidden_content' => 'no',
873
- );
874
-
875
- // Check whether the old badly named singular options are there, if so, use the data and delete them.
876
- foreach ( array_keys( $this->options ) as $opt ) {
877
- $old_opt = get_option( 'pf_' . $opt );
878
- if ( $old_opt !== false ) {
879
- $this->options[ $opt ] = $old_opt;
880
- delete_option( 'pf_' . $opt );
881
- }
882
- }
883
-
884
- // This should always be set to the latest immediately when defaults are pushed in.
885
- $this->options['db_version'] = $this->db_version;
886
-
887
- update_option( $this->option_name, $this->options );
888
- }
889
-
890
- /**
891
- * Upgrades the stored options, used to add new defaults if needed etc.
892
- *
893
- * @since 3.0
894
- */
895
- function upgrade() {
896
- // update options to version 2
897
- if ( $this->options['db_version'] < 2 ) {
898
-
899
- $additional_options = array(
900
- 'enable_css' => 'on',
901
- 'logo' => 'favicon',
902
- 'image_url' => '',
903
- 'tagline' => '',
904
- 'click_to_delete' => '0',
905
- 'password_protected' => 'no',
906
- );
907
-
908
- // correcting badly named option
909
- if ( isset( $this->options['disable_css'] ) ) {
910
- $additional_options['enable_css'] = $this->options['disable_css'];
911
- unset( $this->options['disable_css'] );
912
- }
913
-
914
- // check whether image we do not list any more was used
915
- if ( in_array( $this->options['button_type'], array('button-print-whgn20.png', 'pf_button_sq_qry_m.png', 'pf_button_sq_qry_l.png', 'pf_button_sq_grn_m.png', 'pf_button_sq_grn_l.png'), true ) ) {
916
- // previous version had a bug with button name
917
- if ( in_array( $this->options['button_type'], array('pf_button_sq_qry_m.png', 'pf_button_sq_qry_l.png'), true ) ) {
918
- $this->options['button_type'] = str_replace( 'qry', 'gry', $this->options['button_type'] );
919
- }
920
-
921
- $image_address = 'https://cdn.printfriendly.com/' . $this->options['button_type'];
922
- $this->options['button_type'] = 'custom-image';
923
- $this->options['custom_text'] = '';
924
- $this->options['custom_image'] = $image_address;
925
- }
926
-
927
- $this->options = array_merge( $this->options, $additional_options );
928
- }
929
-
930
- // update options to version 3
931
- if ( $this->options['db_version'] < 3 ) {
932
-
933
- $old_show_on = $this->options['show_list'];
934
- // 'manual' setting
935
- $additional_options = array('custom_css_url' => '');
936
-
937
- if ( $old_show_on === 'all' ) {
938
- $additional_options = array(
939
- 'show_on_pages' => 'on',
940
- 'show_on_posts' => 'on',
941
- 'show_on_homepage' => 'on',
942
- 'show_on_categories' => 'on',
943
- 'show_on_taxonomies' => 'on',
944
- );
945
- }
946
-
947
- if ( $old_show_on === 'single' ) {
948
- $additional_options = array(
949
- 'show_on_pages' => 'on',
950
- 'show_on_posts' => 'on',
951
- );
952
- }
953
-
954
- if ( $old_show_on === 'posts' ) {
955
- $additional_options = array(
956
- 'show_on_posts' => 'on',
957
- );
958
- }
959
-
960
- unset( $this->options['show_list'] );
961
-
962
- $this->options = array_merge( $this->options, $additional_options );
963
- }
964
-
965
- // update options to version 4
966
- if ( $this->options['db_version'] < 4 ) {
967
-
968
- $additional_options = array(
969
- 'email' => '0',
970
- 'pdf' => '0',
971
- 'print' => '0',
972
- );
973
-
974
- $this->options = array_merge( $this->options, $additional_options );
975
- }
976
-
977
- // update options to version 6
978
- // Replacement for db version 5 - should also be run for those already upgraded
979
- if ( $this->options['db_version'] < 6 ) {
980
- unset( $this->options['category_ids'] );
981
- }
982
-
983
- if ( $this->options['db_version'] < 7 ) {
984
- $additional_options = array(
985
- 'hide-images' => '0',
986
- 'image-style' => 'right',
987
- );
988
-
989
- $this->options = array_merge( $this->options, $additional_options );
990
- }
991
-
992
- if ( $this->options['db_version'] < 8 ) {
993
- $this->options['enable_google_analytics'] = 'no';
994
- }
995
-
996
- if ( $this->options['db_version'] < 9 ) {
997
- $this->options['pf_algo'] = 'wp';
998
- }
999
-
1000
- if ( $this->options['db_version'] < 10 ) {
1001
- $this->options['enable_error_reporting'] = 'yes';
1002
- }
1003
-
1004
- if ( $this->options['db_version'] < 11 ) {
1005
- if ( ! isset( $this->options['custom_css_url'] ) ) {
1006
- $this->options['custom_css_url'] = '';
1007
- }
1008
- }
1009
-
1010
- if ( $this->options['db_version'] < 12 ) {
1011
- // phpcs:ignore WordPress.PHP.StrictComparisons.LooseComparison
1012
- $this->options['images-size'] = $this->options['hide-images'] == '1' ? 'remove-images' : 'full-size';
1013
- }
1014
-
1015
- if ( $this->options['db_version'] < 13 ) {
1016
- switch ( $this->options['button_type'] ) {
1017
- case 'pf-button.gif':
1018
- $this->options['button_type'] = 'buttons/printfriendly-button.png';
1019
- break;
1020
- case 'pf-button-both.gif':
1021
- $this->options['button_type'] = 'buttons/printfriendly-pdf-button.png';
1022
- break;
1023
- case 'pf-button-big.gif':
1024
- $this->options['button_type'] = 'buttons/printfriendly-button-lg.png';
1025
- break;
1026
- case 'pf-button-print-pdf-mail.png':
1027
- $this->options['button_type'] = 'buttons/printfriendly-pdf-email-button-notext.png';
1028
- break;
1029
- case 'button-print-grnw20.png':
1030
- $this->options['button_type'] = 'buttons/print-button.png';
1031
- break;
1032
- case 'button-print-blu20.png':
1033
- $this->options['button_type'] = 'buttons/print-button-nobg.png';
1034
- break;
1035
- case 'button-print-gry20.png':
1036
- $this->options['button_type'] = 'buttons/print-button-gray.png';
1037
- break;
1038
- case 'pf-icon-small.gif':
1039
- case 'pf-icon.gif':
1040
- $this->options['button_type'] = 'custom-button';
1041
- $this->options['custom_button_icon'] = 'icons/printfriendly-icon-md.png';
1042
- $this->options['custom_button_text'] = 'custom-text';
1043
- $this->options['custom_image'] = 'icons/printfriendly-icon-md.png';
1044
- break;
1045
- case 'text-only':
1046
- $this->options['button_type'] = 'custom-button';
1047
- $this->options['custom_button_icon'] = 'no-image';
1048
- $this->options['custom_button_text'] = 'custom-text';
1049
- break;
1050
- }
1051
- }
1052
-
1053
- if ( $this->options['db_version'] < 14 ) {
1054
- if ( $this->options['button_type'] === 'pf-icon-both.gif' ) {
1055
- $this->options['button_type'] = 'buttons/printfriendly-pdf-button-nobg.png';
1056
- }
1057
- }
1058
-
1059
- if ( $this->options['db_version'] < 15 ) {
1060
- if ( $this->options['button_type'] === 'custom-image' ) {
1061
- $this->options['button_type'] = 'custom-button';
1062
-
1063
- switch ( $this->options['custom_image'] ) {
1064
- case 'icons/printfriendly-icon-sm.png':
1065
- case 'icons/printfriendly-icon-md.png':
1066
- case 'icons/printfriendly-icon-lg.png':
1067
- $this->options['custom_button_icon'] = $this->options['custom_image'];
1068
- break;
1069
- case '':
1070
- $this->options['custom_button_icon'] = 'no-image';
1071
- break;
1072
- default:
1073
- $this->options['custom_button_icon'] = 'custom-image';
1074
- }
1075
 
1076
- if ( $this->options['custom_text'] === '' ) {
1077
- $this->options['custom_button_text'] = 'no-text';
1078
- } else {
1079
- $this->options['custom_button_text'] = 'custom-text';
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1080
  }
1081
- }
1082
- }
1083
-
1084
- if ( $this->options['db_version'] < 16 ) {
1085
- if ( $this->options['custom_button_icon'] === 'icons/printfriendly-icon-md.png' ) {
1086
- $this->options['custom_button_icon'] = 'https://cdn.printfriendly.com/icons/printfriendly-icon-md.png';
1087
- }
1088
- }
1089
-
1090
- if ( $this->options['db_version'] < 17 ) {
1091
- $this->options['pro_email'] = get_bloginfo( 'admin_email' );
1092
-
1093
- $url = get_bloginfo( 'url' );
1094
- $parsed_url = parse_url( $url );
1095
- $this->options['pro_domain'] = $parsed_url['host'];
1096
- }
1097
-
1098
- $this->options['db_version'] = $this->db_version;
1099
-
1100
- update_option( $this->option_name, $this->options );
1101
- }
1102
-
1103
- /**
1104
- * Displays radio button in the admin area
1105
- *
1106
- * @since 3.0
1107
- * @param string $name the name of the radio button to generate.
1108
- * @param boolean $br whether or not to add an HTML <br> tag, defaults to true.
1109
- * @param boolean $value if this is null, will have the same value as $name.
1110
- */
1111
- function radio( $name, $br = false, $value = null ) {
1112
- if ( is_null( $value ) ) {
1113
- $value = $name;
1114
- }
1115
-
1116
- $var = '<input id="' . $name . '" class="radio" name="' . $this->option_name . '[button_type]" type="radio" value="' . $value . '" ' . $this->checked( 'button_type', $value, false ) . '/>';
1117
- $button = $this->button( $name );
1118
- if ( ! empty( $button ) ) {
1119
- echo '<label for="' . $name . '">' . $var . $button . '</label>';
1120
- } else {
1121
- echo $var;
1122
- }
1123
-
1124
- if ( $br ) {
1125
- echo '<br>';
1126
- }
1127
- }
1128
-
1129
- /**
1130
- * Displays radio button in the admin area
1131
- *
1132
- * @since 3.12.0
1133
- * @param string $value the value of the radio button to generate.
1134
- */
1135
- function radio_custom_image( $value ) {
1136
- ?>
1137
- <label class="radio-custom-btn">
1138
- <input type="radio" name="<?php echo $this->option_name; ?>[custom_button_icon]" value="<?php echo $value; ?>" <?php $this->checked( 'custom_button_icon', $value ); ?>>
1139
- <img src="<?php echo $value; ?>" alt="Print Friendly, PDF & Email" style="display: inline; vertical-align: text-bottom; margin-right: 6px;" />
1140
- </label>
1141
- <?php
1142
- }
1143
-
1144
- /**
1145
- * Displays button image in the admin area
1146
- *
1147
- * @since 3.0
1148
- * @param string $name the name of the button to generate.
1149
- */
1150
- function button( $name = false ) {
1151
- if ( ! $name ) {
1152
- $name = $this->options['button_type'];
1153
- }
1154
-
1155
- $button_css = 'border:none;-webkit-box-shadow:none; -moz-box-shadow: none; box-shadow:none; padding:0; margin:0';
1156
-
1157
- $img_path = 'https://cdn.printfriendly.com/';
1158
-
1159
- $return = '';
1160
-
1161
- if ( $name === 'custom-button' ) {
1162
- if ( $this->options['custom_button_icon'] === 'custom-image' && '' !== trim( $this->options['custom_image'] ) ) {
1163
- $return = '<img src="' . esc_url( $this->options['custom_image'] ) . '" alt="Print Friendly, PDF & Email" style="display: inline; vertical-align:text-bottom; margin:0; padding:0; border:none; -webkit-box-shadow:none; -moz-box-shadow:none; box-shadow: none;" />';
1164
- } elseif ( $this->options['custom_button_icon'] !== 'no-image' ) {
1165
- $return = '<img src="' . esc_url( $this->options['custom_button_icon'] ) . '" alt="Print Friendly, PDF & Email" style="display:inline; vertical-align:text-bottom; margin: 0 6px 0 0; padding:0; border:none; -webkit-box-shadow:none; -moz-box-shadow:none; box-shadow:none;" />';
1166
- }
1167
-
1168
- /* esc_html was removerd to support custom html, CSRF prevents from attack by using this field */
1169
- if ( $this->options['custom_button_text'] === 'custom-text' ) {
1170
- $return .= $this->options['custom_text'];
1171
- }
1172
-
1173
- return $return;
1174
- } elseif ( $name === 'custom-btn' ) {
1175
- return __( 'Custom Button', 'printfriendly' );
1176
- } else {
1177
- return '<img style="' . $button_css . '" src="' . $img_path . $name . '" alt="Print Friendly, PDF & Email" />';
1178
- }
1179
- }
1180
-
1181
- /**
1182
- * Convenience function to output a value custom button preview elements
1183
- *
1184
- * @since 3.0.9
1185
- */
1186
- function custom_button_preview() {
1187
- $img = $url = $button_text = $style = '';
1188
- switch ( $this->options['custom_button_icon'] ) {
1189
- case 'no-image':
1190
- break;
1191
- case 'custom-image':
1192
- $url = $this->options['custom_image'];
1193
- break;
1194
- default:
1195
- $url = $this->options['custom_button_icon'];
1196
- break;
1197
- }
1198
-
1199
- if ( ! empty( $url ) ) {
1200
- $img = sprintf( '<img src="%s" alt="Print Friendly, PDF & Email">', esc_url( $url ) );
1201
- }
1202
-
1203
- if ( $this->options['custom_button_text'] !== 'no-text' ) {
1204
- $button_text = $this->options['custom_text'];
1205
- }
1206
-
1207
- if ( '' !== $this->options['text_color'] ) {
1208
- $style = 'color: ' . $this->options['text_color'] . ';';
1209
- }
1210
-
1211
- $button_preview = sprintf( '<span><span id="pf-custom-button-preview" style="display:inline; vertical-align:text-bottom; margin: 0 6px 0 0; padding:0; border:none; -webkit-box-shadow:none; -moz-box-shadow:none; box-shadow:none;">%s</span><span id="printfriendly-text2" style="%s">%s</span></span>', $img, $style, esc_html( $button_text ) );
1212
-
1213
- echo $button_preview;
1214
- }
1215
-
1216
- /**
1217
- * Convenience function to output a value for an input
1218
- *
1219
- * @since 3.0
1220
- * @param string $val value to check.
1221
- */
1222
- function val( $val, $echo = true, $default = null ) {
1223
- $value = '';
1224
- if ( isset( $this->options[ $val ] ) ) {
1225
- $value = esc_attr( $this->options[ $val ] );
1226
- }
1227
-
1228
- if ( empty( $value ) && ! is_null( $default ) ) {
1229
- $value = $default;
1230
- }
1231
-
1232
- if ( $echo ) {
1233
- echo $value;
1234
- }
1235
- return $value;
1236
- }
1237
-
1238
-
1239
- /**
1240
- * Like the WordPress checked() function but it doesn't throw notices when the array key isn't set and uses the plugins options array.
1241
- *
1242
- * @since 3.0
1243
- * @param mixed $val value to check.
1244
- * @param mixed $check_against value to check against.
1245
- * @param boolean $echo whether or not to echo the output.
1246
- * @return string checked, when true, empty, when false.
1247
- */
1248
- function checked( $val, $check_against = true, $echo = true ) {
1249
- if ( ! isset( $this->options[ $val ] ) ) {
1250
- return;
1251
- }
1252
-
1253
- // phpcs:ignore WordPress.PHP.StrictComparisons.LooseComparison
1254
- if ( $this->options[ $val ] == $check_against ) {
1255
- if ( $echo ) {
1256
- echo ' checked="checked" ';
1257
- } else {
1258
- return ' checked="checked" ';
1259
- }
1260
- }
1261
- }
1262
-
1263
- /**
1264
- * Helper for creating checkboxes.
1265
- *
1266
- * @since 3.1.5
1267
- * @param string $name string used for various parts of checkbox.
1268
- */
1269
- function create_checkbox( $name, $label = '', $labelid = '' ) {
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1270
  // phpcs:ignore WordPress.WP.I18n.NonSingularStringLiteralText
1271
- $label = ( ! empty( $label ) ? $label : __( ucfirst( $name ), 'printfriendly' ) );
1272
- echo '<label' . ( ! empty( $labelid ) ? ' id=' . $labelid : '' ) . '><input type="checkbox" class="show_list" name="' . $this->option_name . '[show_on_' . $name . ']" value="on" ';
1273
- $this->checked( 'show_on_' . $name, 'on' );
1274
- echo ' />' . $label . "</label>\r\n";
1275
- }
1276
-
1277
-
1278
- /**
1279
- * Helper that checks if any of the content types is checked to display pf button.
1280
- *
1281
- * @since 3.1.5
1282
- * @return boolean true if none of the content types is checked
1283
- */
1284
- function is_manual() {
1285
- return ! ( isset( $this->options['show_on_posts'] ) ||
1286
- isset( $this->options['show_on_pages'] ) ||
1287
- isset( $this->options['show_on_homepage'] ) ||
1288
- isset( $this->options['show_on_categories'] ) ||
1289
- // (isset($this->options['category_ids']) && count($this->options['category_ids']) > 0) ||
1290
- isset( $this->options['show_on_taxonomies'] ) );
1291
- }
1292
-
1293
-
1294
- /**
1295
- * Like the WordPress selected() function but it doesn't throw notices when the array key isn't set and uses the plugins options array.
1296
- *
1297
- * @since 3.0.9
1298
- * @param mixed $val value to check.
1299
- * @param mixed $check_against value to check against.
1300
- * @return string checked, when true, empty, when false.
1301
- */
1302
- function selected( $val, $check_against = true ) {
1303
- if ( ! isset( $this->options[ $val ] ) ) {
1304
- return;
1305
- }
1306
-
1307
- return selected( $this->options[ $val ], $check_against );
1308
- }
1309
-
1310
- /**
1311
- * For use with page metabox.
1312
- *
1313
- * @since 3.2.2
1314
- */
1315
- function get_page_post_type() {
1316
- $post_types = get_post_types( array('name' => 'page'), 'object' );
1317
- // echo '<pre>'.print_r($post_types,1).'</pre>';
1318
- // die;
1319
-
1320
- return $post_types['page'];
1321
- }
1322
-
1323
-
1324
- /**
1325
- * Helper that checks if wp versions is above 3.0.
1326
- *
1327
- * @since 3.2.2
1328
- * @return boolean true wp version is above 3.0
1329
- */
1330
- function wp_version_gt30() {
1331
- global $wp_version;
1332
- return version_compare( $wp_version, '3.0', '>=' );
1333
- }
1334
-
1335
-
1336
- /**
1337
- * Create box for picking individual categories.
1338
- *
1339
- * @since 3.2.2
1340
- */
1341
- function create_category_metabox() {
1342
- $obj = new stdClass();
1343
- $obj->ID = 0;
1344
- do_meta_boxes( 'settings_page_' . $this->hook, 'normal', $obj );
1345
- }
1346
-
1347
-
1348
- /**
1349
- * Load metaboxes advanced button display settings.
1350
- *
1351
- * @since 3.2.2
1352
- */
1353
- function on_load_printfriendly() {
1354
- global $wp_version;
1355
- if ( $this->wp_version_gt30() ) {
1356
- // require_once(dirname(__FILE__).'/includes/meta-boxes.php');
1357
- // require_once(dirname(__FILE__).''includes/nav-menu.php');
1358
- wp_enqueue_script( 'post' );
1359
-
1360
- add_meta_box( 'categorydiv', __( 'Only display when post is in:', 'printfriendly' ), 'post_categories_meta_box', 'settings_page_' . $this->hook, 'normal', 'core' );
1361
- }
1362
- }
1363
-
1364
- /**
1365
- * Returns if the user is a pro user.
1366
- */
1367
- function is_pro( $feature = null ) {
1368
- $licensed = $this->val( 'license_status', false ) === 'pro';
1369
-
1370
- switch ( $feature ) {
1371
- case 'custom-css':
1372
- // custom css needs to be available for all irrespective of the license.
1373
- return true;
1374
- }
1375
-
1376
- return $licensed;
1377
- }
1378
-
1379
- /**
1380
- * Returns the custom css url.
1381
- */
1382
- function get_custom_css() {
1383
- // don't throw a PHP notice if custom_css_url is not defined.
1384
- $css_url = isset( $this->options['custom_css_url'] ) ? $this->options['custom_css_url'] : '';
1385
- if ( ! $this->is_pro( 'custom-css' ) ) {
1386
- return $css_url;
1387
- }
1388
-
1389
- // upgrading from a version that was using urls instead of the textarea?
1390
- if ( ! empty( $css_url ) ) {
1391
- return $css_url;
1392
- }
1393
-
1394
- // don't throw a PHP notice if custom_css_url_pro is not defined.
1395
- $css_url = isset( $this->options['custom_css_url_pro'] ) ? $this->options['custom_css_url_pro'] : '';
1396
- if ( empty( $css_url ) ) {
1397
- return null;
1398
- }
1399
-
1400
- $dirs = wp_get_upload_dir();
1401
-
1402
- return $dirs['baseurl'] . '/' . $this->options['custom_css_url_pro'];
1403
- }
1404
-
1405
- /**
1406
- * Generates the custom css file from the CSS block.
1407
- */
1408
- function maybe_generate_custom_css_file( $css ) {
1409
- $custom_css_old = html_entity_decode( $this->val( 'custom_css', false ) );
1410
-
1411
- // generate a new file if the CSS has changed.
1412
- if ( $custom_css_old === $css ) {
1413
- return false;
1414
- }
1415
-
1416
- $dirs = wp_get_upload_dir();
1417
-
1418
- // delete old file, if it exists
1419
- $file = $this->options['custom_css_url_pro'];
1420
- if ( ! empty( $file ) ) {
1421
- wp_delete_file( $dirs['basedir'] . '/' . $this->options['custom_css_url_pro'] );
1422
- }
1423
-
1424
- // add a comment so that users know whence this file came.
1425
- $date = date_i18n( get_option( 'date_format' ) . ' ' . get_option( 'time_format' ) );
1426
- $comment = sprintf( '/* DO NOT EDIT - FILE AUTO-GENERATED BY PRINTFRIENDLY v%s ON %s */', $this->plugin_version, $date );
1427
- $css = $comment . PHP_EOL . PHP_EOL . $css;
1428
-
1429
- // create new file, suffixed with the current time.
1430
- $file = sprintf( '%s_%s.css', $this->hook, time() );
1431
- require_once( ABSPATH . 'wp-admin/includes/file.php' );
1432
- WP_Filesystem();
1433
- global $wp_filesystem;
1434
- $wp_filesystem->put_contents(
1435
- $dirs['basedir'] . '/' . $file,
1436
- $css,
1437
- FS_CHMOD_FILE
1438
- );
1439
-
1440
- // return the new file name
1441
- return $file;
1442
- }
1443
-
1444
- /**
1445
- * If upgrading from a previous version that was using urls instead of the textarea
1446
- * it will return an appropriate message for the user.
1447
- */
1448
- function get_custom_css_upgrade_message() {
1449
- // upgrading from a version that was using urls instead of the textarea?
1450
- if ( isset( $this->options['custom_css_url'] ) && ! empty( $this->options['custom_css_url'] ) ) {
1451
- $css_url = $this->options['custom_css_url'];
1452
- return sprintf( __( 'You are currently using %1$s%2$s%3$s. You can copy copy its contents into the textbox if you want to update the styles.', 'printfriendly' ), '<a href="' . $css_url . '" target="_blank">', $css_url, '</a>' );
1453
- }
1454
-
1455
- return null;
1456
- }
1457
-
1458
- /**
1459
- * Output the config page
1460
- *
1461
- * @since 3.0
1462
- */
1463
- function config_page() {
1464
-
1465
- // Since WP 3.2 outputs these errors by default, only display them when we're on versions older than 3.2 that do support the settings errors.
1466
- global $wp_version;
1467
- if ( version_compare( $wp_version, '3.2', '<' ) && $this->wp_version_gt30() ) {
1468
- settings_errors();
1469
- }
1470
-
1471
- $customCssOptionCode = $this->getSelectorsFromCustomCSS();
1472
- include_once PRINTFRIENDLY_BASEPATH . '/views/settings.php';
1473
- }
1474
-
1475
- /**
1476
- * Returns the current tab to activate.
1477
- *
1478
- * @since 4.0.1
1479
- */
1480
- function is_tab( $tab_id ) {
1481
- $tab = get_transient( 'pf-tab' );
1482
  // phpcs:ignore WordPress.PHP.StrictComparisons.LooseComparison
1483
- return empty( $tab ) && $tab_id == 0 ? true : $tab == $tab_id;
1484
- }
1485
-
1486
- }
1487
- $printfriendly = new PrintFriendly_WordPress();
1488
  }
1489
 
1490
  // Add shortcode for printfriendly button
1491
- add_shortcode( 'printfriendly', 'pf_show_link' );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1492
 
1493
  /**
1494
  * Convenience function for use in templates.
1495
  *
 
 
1496
  * @since 3.0
 
 
 
 
 
 
 
 
 
 
 
 
 
1497
  * @return string returns a button to be printed.
1498
  */
1499
- function pf_show_link() {
1500
- global $printfriendly;
1501
- return $printfriendly->getButton( true );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1502
  }
1
  <?php
2
+
3
  /*
4
+ Plugin Name: Print, PDF & Email by PrintFriendly
5
+ Plugin URI: http://www.printfriendly.com
6
+ Description: PrintFriendly & PDF button for your website. Optimizes your pages and brand for print, pdf, and email.
7
+ Name and URL are included to ensure repeat visitors and new visitors when printed versions are shared.
8
+ Version: 5.1
9
+ Author: Print, PDF, & Email by PrintFriendly
10
+ Author URI: http://www.printfriendly.com
11
+ Domain Path: /languages
12
+ Text Domain: printfriendly
13
  */
14
 
15
+ // phpcs:disable PSR1.Classes.ClassDeclaration.MissingNamespace
16
+ // phpcs:disable Squiz.Classes.ValidClassName.NotCamelCaps
17
+ // phpcs:disable PSR2.Classes.PropertyDeclaration.VarUsed
18
+ // phpcs:disable PSR2.Classes.PropertyDeclaration.ScopeMissing
19
+ // phpcs:disable Squiz.Scope.MethodScope.Missing
20
+ // phpcs:disable PSR1.Methods.CamelCapsMethodName.NotCamelCaps
21
+
22
  /**
23
  * PrintFriendly WordPress plugin. Allows easy embedding of printfriendly.com buttons.
24
  *
26
  * @author PrintFriendly <support@printfriendly.com>
27
  * @copyright Copyright (C) 2012, PrintFriendly
28
  */
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
29
 
30
+ if (! class_exists('PrintFriendly_WordPress')) {
31
+ /**
32
+ * Class containing all the plugins functionality.
33
+ *
34
+ * @package PrintFriendly_WordPress
35
+ */
36
+ class PrintFriendly_WordPress
37
+ {
38
+
39
+ /**
40
+ * Current plugin version.
41
+ *
42
+ * @var string
43
+ */
44
+ var $plugin_version = '5.1';
45
+ /**
46
+ * The hook, used for text domain as well as hooks on pages and in get requests for admin.
47
+ *
48
+ * @var string
49
+ */
50
+ var $hook = 'printfriendly';
51
+ /**
52
+ * The option name, used throughout to refer to the plugins option and option group.
53
+ *
54
+ * @var string
55
+ */
56
+ var $option_name = 'printfriendly_option';
57
+ /**
58
+ * The plugins options, loaded on init containing all the plugins settings.
59
+ *
60
+ * @var array
61
+ */
62
+ var $options = array();
63
+ /**
64
+ * Database version, used to allow for easy upgrades to / additions in plugin options between plugin versions.
65
+ *
66
+ * @var int
67
+ */
68
+ var $db_version = 20;
69
+ /**
70
+ * Settings page, used within the plugin to reliably load the plugins admin JS and CSS files only on the admin page.
71
+ *
72
+ * @var string
73
+ */
74
+ var $settings_page = '';
75
+ /**
76
+ * GetSentry error reporting client
77
+ *
78
+ * @var Raven_Client
79
+ */
80
+ var $raven_client = null;
81
+ /**
82
+ * List of all buttons with their attributes.
83
+ *
84
+ * @var array
85
+ */
86
+ private static $_buttons = array(
87
+ 'buttons/printfriendly-pdf-email-button.png' => array( 'width' => 170, 'height' => 24 ),
88
+ 'buttons/printfriendly-pdf-email-button-md.png' => array( 'width' => 194, 'height' => 30 ),
89
+ 'buttons/printfriendly-pdf-email-button-notext.png' => array( 'width' => 110, 'height' => 30 ),
90
+ 'buttons/printfriendly-pdf-button.png' => array( 'width' => 112, 'height' => 24 ),
91
+ 'buttons/printfriendly-pdf-button-nobg.png' => array( 'width' => 112, 'height' => 24 ),
92
+ 'buttons/printfriendly-pdf-button-nobg-md.png' => array( 'width' => 124, 'height' => 30 ),
93
+ 'buttons/printfriendly-button.png' => array( 'width' => 112, 'height' => 24 ),
94
+ 'buttons/printfriendly-button-nobg.png' => array( 'width' => 112, 'height' => 24 ),
95
+ 'buttons/printfriendly-button-md.png' => array( 'width' => 124, 'height' => 30 ),
96
+ 'buttons/printfriendly-button-lg.png' => array( 'width' => 154, 'height' => 28 ),
97
+ 'buttons/print-button.png' => array( 'width' => 66, 'height' => 24 ),
98
+ 'buttons/print-button-nobg.png' => array( 'width' => 66, 'height' => 24 ),
99
+ 'buttons/print-button-gray.png' => array( 'width' => 66, 'height' => 24 ),
100
+ 'icons/printfriendly-icon-sm.png' => array( 'width' => 17, 'height' => 17 ),
101
+ 'icons/printfriendly-icon-md.png' => array( 'width' => 16, 'height' => 16 ),
102
+ 'icons/printfriendly-icon-lg.png' => array( 'width' => 25, 'height' => 25 ),
103
+ );
104
+
105
+ /**
106
+ * Constructor
107
+ *
108
+ * @since 3.0
109
+ */
110
+ function __construct()
111
+ {
112
+ define('PRINTFRIENDLY_BASEPATH', dirname(__FILE__));
113
+ define('PRINTFRIENDLY_BASEURL', plugins_url('/', __FILE__));
114
+ // Retrieve the plugin options
115
+ $this->options = get_option($this->option_name);
116
+ // If the options array is empty, set defaults
117
+ if (! is_array($this->options)) {
118
+ $this->set_defaults();
119
+ }
120
+
121
+ /**
122
+ * Set page content selection option "WordPress Standard/Strict" to "WP Template"
123
+ */
124
+ if (isset($this->options['pf_algo']) && $this->options['pf_algo'] === 'ws') {
125
+ $this->options['pf_algo'] = 'wp';
126
+ update_option($this->option_name, $this->options);
127
+ }
128
+
129
+ // If the version number doesn't match, upgrade
130
+ if ($this->db_version > $this->options['db_version']) {
131
+ $this->upgrade();
132
+ }
133
+
134
+ add_action('wp_head', array(&$this, 'front_head'));
135
+
136
+ // automaticaly add the link
137
+ add_filter('the_content', array(&$this, 'show_link_on_content'));
138
+ add_filter('the_excerpt', array(&$this, 'show_link_on_excerpt'));
139
+
140
+ add_action('the_content', array(&$this, 'add_pf_content_class_around_content_hook'));
141
+ if (is_admin()) {
142
+ $this->admin_hooks();
143
+ }
144
+ }
145
+
146
+ /**
147
+ * All admin hooks.
148
+ */
149
+ function admin_hooks()
150
+ {
151
+ // Hook into init for registration of the option and the language files
152
+ add_action('admin_init', array(&$this, 'init'));
153
+ // Register the settings page
154
+ add_action('admin_menu', array(&$this, 'add_config_page'));
155
+ // Enqueue the needed scripts and styles
156
+ add_action('admin_enqueue_scripts', array(&$this, 'admin_enqueue_scripts'));
157
+ // Register a link to the settings page on the plugins overview page
158
+ add_filter('plugin_action_links', array(&$this, 'filter_plugin_actions'), 10, 2);
159
+ add_filter('plugin_row_meta', array(&$this, 'additional_links'), 10, 2);
160
+ add_filter('wp_dropdown_cats', array( &$this, 'wp_dropdown_cats_multiple' ), 10, 2);
161
+ }
162
+
163
+ /**
164
+ * Adds multiple select support for category dropdown.
165
+ *
166
+ * @since 4.2
167
+ **/
168
+ function wp_dropdown_cats_multiple($output, $attributes)
169
+ {
170
+ if (isset($attributes['multiple']) && $attributes['multiple']) {
171
+ $output = preg_replace('/^<select/i', '<select multiple', $output);
172
+ $output = str_replace("name='{$attributes['name']}'", "name='{$attributes['name']}[]'", $output);
173
+ foreach (array_map('trim', explode(',', $attributes['selected'])) as $value) {
174
+ $output = str_replace("value=\"{$value}\"", "value=\"{$value}\" selected", $output);
175
+ }
176
+ }
177
+ return $output;
178
+ }
179
+
180
+ /**
181
+ * Adds wraps content in pf-content class to help Printfriendly algo determine the content
182
+ *
183
+ * @since 3.2.8
184
+ **/
185
+ function add_pf_content_class_around_content_hook($content = false)
186
+ {
187
+ if ($this->is_enabled() && $this->is_wp_algo_on($content)) {
188
+ add_action('wp_footer', array(&$this, 'print_script_footer'));
189
+ return '<div class="pf-content">' . $content . '</div>';
190
+ } else {
191
+ return $content;
192
+ }
193
+ }
194
+
195
+ /**
196
+ * Override to check if print-only command is being used
197
+ *
198
+ * @since 3.3.0
199
+ **/
200
+ function print_only_override($content)
201
+ {
202
+ $pattern = '/class\s*?=\s*?(["\']|["\']([^"\']*?)\s)print-only(["\']|\s([^"\']*?)["\'])/';
203
+ $pf_pattern = '/class\s*?=\s*?(["\']|["\']([^"\']*?)\s)pf-content(["\']|\s([^"\']*?)["\'])/';
204
+ return ( preg_match($pattern, $content) || preg_match($pf_pattern, $content) );
205
+ }
206
+
207
+ /**
208
+ * Check if WP Algorithm is selected and content doesn't use print-only
209
+ *
210
+ * @since 3.5.4
211
+ **/
212
+ function is_wp_algo_on($content)
213
+ {
214
+ return ! class_exists('WooCommerce') && isset($this->options['pf_algo']) && $content && $this->options['pf_algo'] === 'wp' && ! $this->print_only_override($content);
215
+ }
216
+
217
+ /**
218
+ * PHP 4 Compatible Constructor
219
+ *
220
+ * @since 3.0
221
+ */
222
+ function PrintFriendly_WordPress()
223
+ {
224
+ $this->__construct();
225
+ }
226
+
227
+ /**
228
+ * Check if button should be visible on particular page
229
+ */
230
+ function is_enabled()
231
+ {
232
+ if (
233
+ ( is_page() && ( isset($this->options['show_on_pages']) && 'on' === $this->options['show_on_pages'] ) )
234
+ || ( is_home() && ( ( isset($this->options['show_on_homepage']) && 'on' === $this->options['show_on_homepage'] ) ) )
235
+ || ( is_tax() && ( ( isset($this->options['show_on_taxonomies']) && 'on' === $this->options['show_on_taxonomies'] ) && $this->category_included() ) )
236
+ || ( is_category() && ( ( isset($this->options['show_on_categories']) && 'on' === $this->options['show_on_categories'] ) && $this->category_included() ) )
237
+ || ( is_single() && ( ( isset($this->options['show_on_posts']) && 'on' === $this->options['show_on_posts'] ) && $this->category_included() ) )
238
+ ) {
239
+ return true;
240
+ }
241
+ return false;
242
+ }
243
+
244
+ /**
245
+ * Prints the PrintFriendly button CSS, in the header.
246
+ *
247
+ * @since 3.0
248
+ */
249
+ function front_head()
250
+ {
251
+ if ($this->is_enabled()) {
252
+ ?>
253
+ <?php
254
+ if (isset($this->options['enable_css']) && $this->options['enable_css'] !== 'on') {
255
+ return;
256
+ }
257
+ ?>
258
+ <style type="text/css">
259
+ @media screen {
260
+ .printfriendly {
261
+ position: relative;
262
+ z-index: 1000;
263
+ margin:
264
+ <?php
265
+ echo sprintf('%dpx %dpx %dpx %dpx', $this->val('margin_top', false, 0), $this->val('margin_right', false, 0), $this->val('margin_bottom', false, 0), $this->val('margin_left', false, 0));
266
+ ?>
267
+ ;
268
+ }
269
+ .printfriendly a, .printfriendly a:link, .printfriendly a:visited, .printfriendly a:hover, .printfriendly a:active {
270
+ font-weight: 600;
271
+ cursor: pointer;
272
+ text-decoration: none;
273
+ border: none;
274
+ -webkit-box-shadow: none;
275
+ -moz-box-shadow: none;
276
+ box-shadow: none;
277
+ outline:none;
278
+ font-size: <?php echo $this->options['text_size']; ?>px !important;
279
+ color: <?php echo $this->options['text_color']; ?> !important;
280
+ }
281
+ .printfriendly.pf-alignleft {
282
+ float: left
283
+ }
284
+ .printfriendly.pf-alignright {
285
+ float: right;
286
+ }
287
+ .printfriendly.pf-aligncenter {
288
+ display: flex;
289
+ align-items: center;
290
+ justify-content: center;
291
+ }
292
+ }
293
+ }
294
+
295
+ @media print {
296
+ .printfriendly {
297
+ display: none;
298
+ }
299
+ }
300
+
301
+ .pf-button.pf-button-excerpt {
302
+ display: none;
303
+ }
304
+
305
+ .pf-button-img {
306
+ border: none;
307
+ -webkit-box-shadow: none;
308
+ -moz-box-shadow: none;
309
+ box-shadow: none;
310
+ padding: 0;
311
+ margin: 0;
312
+ display: inline;
313
+ vertical-align: middle;
314
+ }
315
+
316
+ img.pf-button-img + .pf-button-text {
317
+ margin-left: 6px;
318
+ }
319
+ </style>
320
+ <?php
321
+ }
322
+ }
323
+
324
+ /**
325
+ * Prints the PrintFriendly JavaScript, in the footer, and loads it asynchronously.
326
+ *
327
+ * @since 3.0
328
+ */
329
+ function print_script_footer()
330
+ {
331
+ $tagline = $this->options['tagline'];
332
+ $image_url = $this->options['image_url'];
333
+ if ($this->options['logo'] === 'favicon') {
334
+ $tagline = '';
335
+ $image_url = '';
336
+ }
337
+
338
+ echo $this->getSelectorsFromCustomCSS();
339
+
340
+ // Currently we use v3 for both: normal and password protected sites
341
+ ?>
342
+ <script type="text/javascript" id="pf_script">
343
+ <?php echo $this->get_analytics_code(); ?>
344
+ var pfHeaderImgUrl = '<?php echo esc_js(esc_url($image_url)); ?>';
345
+ var pfHeaderTagline = '<?php echo esc_js($tagline); ?>';
346
+ var pfdisableClickToDel = '<?php echo esc_js($this->options['click_to_delete']); ?>';
347
+ var pfImagesSize = '<?php echo esc_js($this->options['images-size']); ?>';
348
+ var pfImageDisplayStyle = '<?php echo esc_js($this->options['image-style']); ?>';
349
+ var pfEncodeImages = '<?php echo esc_js($this->val('password_protected', false) === 'yes' ? 1 : 0); ?>';
350
+ var pfShowHiddenContent = '<?php echo esc_js($this->val('show_hidden_content', false) === 'yes' ? 1 : 0); ?>';
351
+ var pfDisableEmail = '<?php echo esc_js($this->options['email']); ?>';
352
+ var pfDisablePDF = '<?php echo esc_js($this->options['pdf']); ?>';
353
+ var pfDisablePrint = '<?php echo esc_js($this->options['print']); ?>';
354
+ var pfCustomCSS = '<?php echo esc_js(esc_url($this->get_custom_css())); ?>';
355
+ var pfPlatform = 'WordPress';
356
+ </script>
357
+ <script async src='https://cdn.printfriendly.com/printfriendly.js'></script>
358
+ <?php
359
+ }
360
+
361
+ /**
362
+ * Used as a filter for the_content.
363
+ *
364
+ * @since ?
365
+ *
366
+ * @param string $content The content of the post, when the function is used as a filter.
367
+ *
368
+ * @return string The content with the button added to the content.
369
+ */
370
+ function show_link_on_content($content)
371
+ {
372
+ $content = $this->show_link($content, true);
373
+ return $content;
374
+ }
375
+
376
+ /**
377
+ * Used as a filter for the_excerpt.
378
+ *
379
+ * @since ?
380
+ *
381
+ * @param string $content The content of the post, when the function is used as a filter.
382
+ *
383
+ * @return string The content with the button added to the content.
384
+ */
385
+ function show_link_on_excerpt($content)
386
+ {
387
+ return $this->show_link($content, false);
388
+ }
389
+
390
+ /**
391
+ * Used to generate the the final content as per the required placement.
392
+ *
393
+ * @since 3.0
394
+ *
395
+ * @param string $content The content of the post, when the function is used as a filter.
396
+ * @param bool $on_content True if showing on the_content and False if showing on the_excerpt.
397
+ *
398
+ * @return string $button or $content with the button added to the content when appropriate, just the content when button shouldn't be added or just button when called manually.
399
+ */
400
+ private function show_link($content = false, $on_content = true)
401
+ {
402
+ if ($this->is_enabled() && $content) {
403
+ $button = $this->getButton(false, $on_content ? 'pf-button-content' : 'pf-button-excerpt');
404
+ // Hook the script call now, so it only get's loaded when needed, and need is determined by the user calling pf_button
405
+ add_action('wp_footer', array(&$this, 'print_script_footer'));
406
+ if ($this->options['content_placement'] === 'before') {
407
+ return $button . $content;
408
+ } else {
409
+ return $content . $button;
410
+ }
411
+ }
412
+ return $content;
413
+ }
414
+
415
+ /**
416
+ * Returns the analytics function to be included in the front end.
417
+ *
418
+ * @since 5.1
419
+ *
420
+ * @return string
421
+ */
422
+ private function get_analytics_code()
423
+ {
424
+ $return = null;
425
+ if ($this->google_analytics_enabled()) {
426
+ $code = apply_filters('printfriendly_analytics_code', "
427
+ if(typeof(_gaq) != 'undefined') {
428
+ _gaq.push(['_trackEvent','PRINTFRIENDLY', 'print', title]);
429
+ }else if(typeof(ga) != 'undefined') {
430
+ ga('send', 'event','PRINTFRIENDLY', 'print', title);
431
+ }else if(typeof(gtag) != 'undefined') {
432
+ gtag('event', 'printfriendly_button_click', {'event_category': 'printfriendly', 'event_label': title})
433
+ }else if(typeof(dataLayer) != 'undefined') {
434
+ dataLayer.push({
435
+ 'event': 'printfriendly_button_click',
436
+ 'pageTitle': title
437
+ })
438
+ }
439
+ ");
440
+ $return = "
441
+ function pfTrackEvent(title) {
442
+ $code
443
  }
444
+ ";
445
+ }
446
+ return $return;
447
+ }
448
+
449
+ /**
450
+ * Returns the HTML of the button.
451
+ *
452
+ * This can be called publicly from `pf_show_link()`.
453
+ *
454
+ * @since 3.3.8
455
+ *
456
+ * @param bool $add_footer_script Whether to add the script in the footer.
457
+ * @param string $add_class Additional class for the HTML button div.
458
+ * @param bool $print_whole_page Whether to print the whole page or follow default behaviour.
459
+ *
460
+ * @return Printfriendly Button HTML
461
+ */
462
+ public function getButton($add_footer_script = false, $add_class = '', $print_whole_page = false)
463
+ {
464
+ if ($add_footer_script) {
465
+ add_action('wp_footer', array(&$this, 'print_script_footer'));
466
+ }
467
+
468
+ $onclick = array();
469
+ $href = '#';
470
+
471
+ if ($print_whole_page) {
472
+ $onclick[] = 'window.print()';
473
+ } else {
474
+ if (is_singular()) {
475
+ $onclick[] = 'window.print()';
476
+ } else {
477
+ $href = add_query_arg('pfstyle', 'wp', get_permalink());
478
+ }
479
+ }
480
+
481
+ if ($this->google_analytics_enabled()) {
482
+ $onclick[] = "pfTrackEvent('" . esc_attr(get_the_title()) . "')";
483
+ }
484
+
485
+ if (! empty($onclick)) {
486
+ $onclick = 'onClick="' . implode('; ', $onclick) . '; return false;"';
487
+ } else {
488
+ $onclick = '';
489
+ }
490
+
491
+ $align = '';
492
+ if ('none' !== $this->options['content_position']) {
493
+ $align = ' pf-align' . $this->options['content_position'];
494
+ }
495
+ $href = str_replace('&', '&amp;', $href);
496
+ $button = apply_filters('printfriendly_button', '<div class="printfriendly pf-button ' . $add_class . $align . '"><a href="' . $href . '" rel="nofollow" ' . $onclick . ' title="Printer Friendly, PDF & Email">' . $this->button() . '</a></div>');
497
+ return $button;
498
+ }
499
+
500
+ /**
501
+ * Returns the custom selector CSS to be added.
502
+ *
503
+ * @since 5.0
504
+ * @returns string
505
+ */
506
+ private function getSelectorsFromCustomCSS()
507
+ {
508
+ $css = '';
509
+ if ($this->options['pf_algo'] === 'css') {
510
+ $attributes = array();
511
+ $names = array( 'author', 'date', 'content', 'title', 'primaryImage' );
512
+ $data = '';
513
+ foreach ($names as $name) {
514
+ $selector = $this->val("css-{$name}", false);
515
+ $suffix = $name === 'content' ? 'Selectors' : 'Selector';
516
+ if (! empty($selector)) {
517
+ $data .= "{$name}{$suffix}=$selector;";
518
+ }
519
+ }
520
+ $fallback = $this->options['pf_algo_css_content'];
521
+ if ($data) {
522
+ $css = sprintf('<printfriendly-options data-selectors="%s" data-fallback-strategy="%s"></printfriendly-options>', esc_attr($data), esc_attr($fallback));
523
+ }
524
+ }
525
+ return $css;
526
+ }
527
+
528
+
529
+ /**
530
+ * Checks if GA is enabled.
531
+ *
532
+ * @since 3.2.9
533
+ * @returns if google analytics enabled
534
+ */
535
+ function google_analytics_enabled()
536
+ {
537
+ return isset($this->options['enable_google_analytics']) && $this->options['enable_google_analytics'] === 'yes';
538
+ }
539
+
540
+ /**
541
+ * Filter posts by category.
542
+ *
543
+ * @since 3.2.2
544
+ * @return boolean true if post belongs to category selected for button display
545
+ */
546
+ function category_included()
547
+ {
548
+ return isset($this->options['show_on_cat']) ? in_category($this->options['show_on_cat']) : true;
549
+ }
550
+
551
+ /**
552
+ * Register the textdomain and the options array along with the validation function
553
+ *
554
+ * @since 3.0
555
+ */
556
+ function init()
557
+ {
558
+ // Allow for localization
559
+ load_plugin_textdomain('printfriendly', false, basename(dirname(__FILE__)) . '/languages');
560
+ // Register our option array
561
+ register_setting($this->option_name, $this->option_name, array( 'sanitize_callback' => array(&$this, 'options_validate') ));
562
+ }
563
+
564
+ /**
565
+ * Validate the saved options.
566
+ *
567
+ * @since 3.0
568
+ * @param array $input with unvalidated options.
569
+ * @return array $valid_input with validated options.
570
+ */
571
+ function options_validate($input)
572
+ {
573
+ // Prevent CSRF attack
574
+ check_admin_referer('pf-options', 'pf-nonce');
575
+ $valid_input = $input;
576
+
577
+ // Section 1 options
578
+ if (
579
+ ! isset($input['button_type']) || ! in_array(
580
+ $input['button_type'],
581
+ array(
582
+ 'buttons/printfriendly-pdf-email-button.png',
583
+ 'buttons/printfriendly-pdf-email-button-md.png',
584
+ 'buttons/printfriendly-pdf-email-button-notext.png', // buttongroup1
585
+ 'buttons/printfriendly-pdf-button.png',
586
+ 'buttons/printfriendly-pdf-button-nobg.png',
587
+ 'buttons/printfriendly-pdf-button-nobg-md.png', // buttongroup2
588
+ 'buttons/printfriendly-button.png',
589
+ 'buttons/printfriendly-button-nobg.png',
590
+ 'buttons/printfriendly-button-md.png',
591
+ 'buttons/printfriendly-button-lg.png', // buttongroup3
592
+ 'buttons/print-button.png',
593
+ 'buttons/print-button-nobg.png',
594
+ 'buttons/print-button-gray.png', // buttongroup3
595
+ 'custom-button', // custom
596
+ ),
597
+ true
598
+ )
599
+ ) {
600
+ $valid_input['button_type'] = 'printfriendly-pdf-button.png';
601
+ }
602
+
603
+ if (
604
+ ! isset($input['custom_button_icon']) || ! in_array(
605
+ $input['custom_button_icon'],
606
+ array(
607
+ 'https://cdn.printfriendly.com/icons/printfriendly-icon-sm.png',
608
+ 'https://cdn.printfriendly.com/icons/printfriendly-icon-md.png',
609
+ 'https://cdn.printfriendly.com/icons/printfriendly-icon-lg.png',
610
+ 'custom-image',
611
+ 'no-image',
612
+ ),
613
+ true
614
+ )
615
+ ) {
616
+ $valid_input['custom_button_icon'] = 'https://cdn.printfriendly.com/icons/printfriendly-icon-md.png';
617
+ }
618
+
619
+ // if a custom image is not being chosen, reset it in case it existed in the past.
620
+ if (isset($valid_input['custom_button_icon']) && $valid_input['custom_button_icon'] !== 'custom-image') {
621
+ $valid_input['custom_image'] = '';
622
+ }
623
+
624
+ // @todo custom image url validation
625
+ if (! isset($input['custom_image']) || empty($input['custom_image'])) {
626
+ $valid_input['custom_image'] = '';
627
+ }
628
+
629
+ if (! isset($input['custom_button_text'])) {
630
+ $valid_input['custom_button_text'] = 'custom-text';
631
+ }
632
+
633
+ // @todo validate optional custom text
634
+ if (! isset($input['custom_text'])) {
635
+ $valid_input['custom_text'] = 'Print Friendly';
636
+ }
637
+
638
+ // Custom button selected, but no url nor text given, reset button type to default
639
+ if ('custom-button' === $valid_input['button_type'] && ( '' === $valid_input['custom_image'] && '' === $input['custom_text'] )) {
640
+ $valid_input['button_type'] = 'buttons/printfriendly-pdf-button.png';
641
+ add_settings_error($this->option_name, 'invalid_custom_image', __('No valid custom image url received, please enter a valid url to use a custom image.', 'printfriendly'));
642
+ }
643
+
644
+ $valid_input['text_size'] = (int) $input['text_size'];
645
+ if (! isset($valid_input['text_size']) || 0 === $valid_input['text_size']) {
646
+ $valid_input['text_size'] = 14;
647
+ } elseif (25 < $valid_input['text_size'] || 9 > $valid_input['text_size']) {
648
+ $valid_input['text_size'] = 14;
649
+ add_settings_error($this->option_name, 'invalid_text_size', __('The text size you entered is invalid, please stay between 9px and 25px', 'printfriendly'));
650
+ }
651
+
652
+ if (! isset($input['text_color'])) {
653
+ $valid_input['text_color'] = $this->options['text_color'];
654
+ } elseif (! preg_match('/^#[a-f0-9]{3,6}$/i', $input['text_color'])) {
655
+ // Revert to previous setting and throw error.
656
+ $valid_input['text_color'] = $this->options['text_color'];
657
+ add_settings_error($this->option_name, 'invalid_color', __('The color you entered is not valid, it must be a valid hexadecimal RGB font color.', 'printfriendly'));
658
+ }
659
+
660
+ /* Section 2 options */
661
+ if (! isset($input['enable_css']) || 'off' !== $input['enable_css']) {
662
+ $valid_input['enable_css'] = 'on';
663
+ }
664
+
665
+ if (! isset($input['content_position']) || ! in_array($input['content_position'], array('none', 'left', 'center', 'right'), true)) {
666
+ $valid_input['content_position'] = 'left';
667
+ }
668
+
669
+ if (! isset($input['content_placement']) || ! in_array($input['content_placement'], array('before', 'after'), true)) {
670
+ $valid_input['content_placement'] = 'after';
671
+ }
672
+
673
+ foreach (array('margin_top', 'margin_right', 'margin_bottom', 'margin_left') as $opt) {
674
+ // if margin is not defined, don't throw a PHP notice
675
+ if (isset($input[ $opt ])) {
676
+ $valid_input[ $opt ] = (int) $input[ $opt ];
677
+ }
678
+ }
679
+
680
+ unset($opt);
681
+
682
+ /* Section 3 options */
683
+ foreach (array('show_on_posts', 'show_on_pages', 'show_on_homepage', 'show_on_categories', 'show_on_taxonomies') as $opt) {
684
+ if (! isset($input[ $opt ]) || 'on' !== $input[ $opt ]) {
685
+ unset($valid_input[ $opt ]);
686
+ }
687
+ }
688
+ unset($opt);
689
+
690
+ if (isset($input['category_ids'])) {
691
+ unset($valid_input['category_ids']);
692
+ }
693
+
694
+ /* Section 4 options */
695
+ if (! isset($input['logo']) || ! in_array($input['logo'], array('favicon', 'upload-an-image'), true)) {
696
+ $valid_input['logo'] = 'favicon';
697
+ }
698
+
699
+ // @todo custom logo url validation
700
+ if (! isset($input['image_url']) || empty($input['image_url'])) {
701
+ $valid_input['image_url'] = '';
702
+ }
703
+
704
+ // @todo validate optional tagline text
705
+ if (! isset($input['tagline'])) {
706
+ $valid_input['tagline'] = '';
707
+ }
708
+
709
+ // Custom logo selected, but no valid url given, reset logo to default
710
+ if ('upload-an-image' === $valid_input['logo'] && '' === $valid_input['image_url']) {
711
+ $valid_input['logo'] = 'favicon';
712
+ add_settings_error($this->option_name, 'invalid_custom_logo', __('No valid custom logo url received, please enter a valid url to use a custom logo.', 'printfriendly'));
713
+ }
714
+
715
+ if (! isset($input['image-style']) || ! in_array($input['image-style'], array('right', 'left', 'none', 'block'), true)) {
716
+ $valid_input['image-style'] = 'block';
717
+ }
718
+
719
+ foreach (array('click_to_delete', 'email', 'pdf', 'print') as $opt) {
720
+ // phpcs:ignore WordPress.PHP.StrictInArray.MissingTrueStrict
721
+ if (! isset($input[ $opt ]) || ! in_array($input[ $opt ], array('0', '1'))) {
722
+ $valid_input[ $opt ] = '0';
723
+ }
724
+ }
725
+ unset($opt);
726
+
727
+ if (! isset($input['images-size']) || ! in_array($input['images-size'], array('full-size', 'remove-images', 'large', 'medium', 'small'), true)) {
728
+ $valid_input['images-size'] = 'full-size';
729
+ }
730
+
731
+ if ($this->is_pro('custom-css')) {
732
+ // a file will be generated even if nothing is provided in the css box.
733
+ $css = $input['custom_css'];
734
+
735
+ // remove the <style> </style> tags.
736
+ $css = str_replace(array( '<style>', '</style>' ), '', $css);
737
+ $valid_input['custom_css'] = sanitize_textarea_field($css);
738
+ $file = $this->maybe_generate_custom_css_file($valid_input['custom_css']);
739
+ if (! $file) {
740
+ $file = isset($this->options['custom_css_url_pro']) ? $this->options['custom_css_url_pro'] : '';
741
+ }
742
+ $valid_input['custom_css_url_pro'] = $file;
743
+
744
+ // if no file can be generated
745
+ // check if this version is upgraded from the version that was using url instead of textbox
746
+ // and reuse it
747
+ if (! $file && isset($this->options['custom_css_url'])) {
748
+ $valid_input['custom_css_url'] = $this->options['custom_css_url'];
749
+ }
750
+ }
751
+
752
+ /* Section 5 options */
753
+ if (! isset($input['password_protected']) || ! in_array($input['password_protected'], array('no', 'yes'), true)) {
754
+ $valid_input['password_protected'] = 'no';
755
+ }
756
+ if (! isset($input['show_hidden_content']) || ! in_array($input['show_hidden_content'], array('no', 'yes'), true)) {
757
+ $valid_input['show_hidden_content'] = 'no';
758
+ }
759
+
760
+ /*Analytics Options */
761
+ if (! isset($input['enable_google_analytics']) || ! in_array($input['enable_google_analytics'], array('no', 'yes'), true)) {
762
+ $valid_input['enable_google_analytics'] = 'no';
763
+ }
764
+
765
+ if (! isset($input['pf_algo']) || ! in_array($input['pf_algo'], array('wp', 'pf', 'css'), true)) {
766
+ $valid_input['pf_algo'] = 'wp';
767
+ }
768
+
769
+ if ($valid_input['pf_algo'] === 'css' && empty($valid_input['pf_algo_css_content']) && ! empty($valid_input['css-content'])) {
770
+ $valid_input['pf_algo_css_content'] = 'original';
771
+ }
772
+
773
+ if (! isset($valid_input['custom_image_width'])) {
774
+ $valid_input['custom_image_width'] = 0;
775
+ }
776
+
777
+ if (! isset($valid_input['custom_image_height'])) {
778
+ $valid_input['custom_image_height'] = 0;
779
+ }
780
+
781
+ if (empty($valid_input['custom_image'])) {
782
+ unset($valid_input['custom_image_width']);
783
+ unset($valid_input['custom_image_height']);
784
+ }
785
+
786
+ /* Database version */
787
+ $valid_input['db_version'] = $this->db_version;
788
+
789
+ // set the current tab from where the settings were saved from
790
+ if (isset($_POST['tab'])) {
791
+ set_transient('pf-tab', $_POST['tab'], 5);
792
+ }
793
+
794
+ // save the categories as comma-separated
795
+ if (isset($valid_input['show_on_cat']) && ! empty($valid_input['show_on_cat'])) {
796
+ $valid_input['show_on_cat'] = implode(',', $valid_input['show_on_cat']);
797
+ }
798
+
799
+ return $valid_input;
800
+ }
801
+
802
+ /**
803
+ * Register the config page for all users that have the manage_options capability
804
+ *
805
+ * @since 3.0
806
+ */
807
+ function add_config_page()
808
+ {
809
+ $this->settings_page = add_options_page(__('PrintFriendly Options', 'printfriendly'), __('Print Friendly & PDF', 'printfriendly'), 'manage_options', $this->hook, array(&$this, 'config_page'));
810
+
811
+ // register callback gets call prior your own page gets rendered
812
+ add_action('load-' . $this->settings_page, array(&$this, 'on_load_printfriendly'));
813
+ }
814
+
815
+ /**
816
+ * Enqueue the scripts for the admin settings page
817
+ *
818
+ * @since 3.0
819
+ * @param string $screen_id check whether the current page is the PrintFriendly settings page.
820
+ */
821
+ function admin_enqueue_scripts($screen_id)
822
+ {
823
+ if ($this->settings_page === $screen_id) {
824
+ if (! did_action('wp_enqueue_media')) {
825
+ wp_enqueue_media();
826
+ }
827
+
828
+ if (! wp_script_is('clipboard')) {
829
+ wp_enqueue_script('clipboard', plugins_url('assets/js/lib/clipboard.min.js', __FILE__));
830
+ }
831
+
832
+ if (! wp_script_is('select2')) {
833
+ wp_enqueue_script('select2', plugins_url('assets/js/lib/select2.min.js', __FILE__));
834
+ }
835
+
836
+ wp_register_script('pf-admin', plugins_url('assets/js/admin.js', __FILE__), array( 'jquery', 'jquery-ui-tabs', 'jquery-ui-accordion', 'media-upload', 'wp-color-picker', 'clipboard', 'select2' ), $this->plugin_version);
837
+ wp_localize_script(
838
+ 'pf-admin',
839
+ 'pf_config',
840
+ array(
841
+ 'i10n' => array(
842
+ 'upload_window_title' => __('Custom Image', 'printfriendly'),
843
+ 'upload_window_button_title' => __('Use Image', 'printfriendly'),
844
+ 'invalid_image_url' => __('Invalid Image URL', 'printfriendly'),
845
+ ),
846
+ )
847
+ );
848
+
849
+ wp_register_script('pf-admin-pro', plugins_url('assets/js/admin_pro.js', __FILE__), array( 'pf-admin' ), $this->plugin_version);
850
+
851
+ wp_localize_script(
852
+ 'pf-admin-pro',
853
+ 'pf_config',
854
+ array(
855
+ 'nonce' => wp_create_nonce($this->hook . $this->plugin_version),
856
+ 'action' => $this->hook,
857
+ 'i10n' => array(
858
+ 'activation' => __('Activation', 'printfriendly'),
859
+ 'check_status' => __('Checking status', 'printfriendly'),
860
+ 'activate' => __('Activate', 'printfriendly'),
861
+ 'active_trial' => __('Active Trial', 'printfriendly'),
862
+ 'active' => __('Active', 'printfriendly'),
863
+ 'expired' => __('Expired', 'printfriendly'),
864
+ 'connection' => __('Please check Internet connection.', 'printfriendly'),
865
+ ),
866
+ )
867
+ );
868
+ wp_enqueue_script('pf-admin-pro');
869
+
870
+ wp_enqueue_style('pf-bulma', plugins_url('assets/css/lib/bulma.prefixed.min.css', __FILE__), array( 'wp-color-picker' ), $this->plugin_version);
871
+ wp_enqueue_style('pf-select2', plugins_url('assets/css/lib/select2.min.css', __FILE__), array(), $this->plugin_version);
872
+ wp_enqueue_style('pf-admin', plugins_url('assets/css/admin.css', __FILE__), array( 'pf-select2', 'pf-bulma' ), $this->plugin_version);
873
+ }
874
+ }
875
+
876
+ /**
877
+ * Register the settings link for the plugins page
878
+ *
879
+ * @since 3.0
880
+ * @param array $links the links for the plugins.
881
+ * @param string $file filename to check against plugins filename.
882
+ * @return array $links the links with the settings link added to it if appropriate.
883
+ */
884
+ function filter_plugin_actions($links, $file)
885
+ {
886
+ // Static so we don't call plugin_basename on every plugin row.
887
+ static $this_plugin;
888
+ if (! $this_plugin) {
889
+ $this_plugin = plugin_basename(__FILE__);
890
+ }
891
+
892
+ if ($file === $this_plugin) {
893
+ $settings_link = '<a href="options-general.php?page=' . $this->hook . '">' . __('Settings', 'printfriendly') . '</a>';
894
+ array_unshift($links, $settings_link); // before other links
895
+ }
896
+
897
+ return $links;
898
+ }
899
+
900
+ /**
901
+ * Register the additional link for the plugins page in the plugin description column.
902
+ *
903
+ * @since ?
904
+ * @param array $links the links for the plugins.
905
+ * @param string $file filename to check against plugins filename.
906
+ * @return array $links the links with the links added to it if appropriate.
907
+ */
908
+ function additional_links($links, $file)
909
+ {
910
+ // Static so we don't call plugin_basename on every plugin row.
911
+ static $this_plugin;
912
+ if (! $this_plugin) {
913
+ $this_plugin = plugin_basename(__FILE__);
914
+ }
915
+
916
+ if ($file === $this_plugin) {
917
+ $new_links = array( '<a href="https://printfriendly.freshdesk.com/support/solutions/folders/69000070847" target="_new">' . __('Documentation', 'printfriendly') . '</a>' );
918
+ $links = array_merge($links, $new_links);
919
+ }
920
+ return $links;
921
+ }
922
+
923
+ /**
924
+ * Set default values for the plugin. If old, as in pre 1.0, settings are there, use them and then delete them.
925
+ *
926
+ * @since 3.0
927
+ */
928
+ function set_defaults()
929
+ {
930
+ // Set some defaults
931
+ $this->options = array(
932
+ 'button_type' => 'buttons/printfriendly-pdf-button.png',
933
+ 'content_position' => 'left',
934
+ 'content_placement' => 'after',
935
+ 'custom_button_icon' => 'https://cdn.printfriendly.com/icons/printfriendly-icon-md.png',
936
+ 'custom_button_text' => 'custom-text',
937
+ 'custom_image' => '',
938
+ 'custom_text' => 'PrintFriendly',
939
+ 'enable_css' => 'on',
940
+ 'margin_top' => '12',
941
+ 'margin_right' => '12',
942
+ 'margin_bottom' => '12',
943
+ 'margin_left' => '12',
944
+ 'show_on_posts' => 'on',
945
+ 'show_on_pages' => 'on',
946
+ 'text_color' => '#3AAA11',
947
+ 'text_size' => 14,
948
+ 'logo' => 'favicon',
949
+ 'image_url' => '',
950
+ 'tagline' => '',
951
+ 'click_to_delete' => '0', // 0 - allow, 1 - do not allow
952
+ 'hide-images' => '0', // 0 - show images, 1 - hide images
953
+ 'image-style' => 'block', // 'right', 'left', 'none', 'block'
954
+ 'email' => '0', // 0 - allow, 1 - do not allow
955
+ 'pdf' => '0', // 0 - allow, 1 - do not allow
956
+ 'print' => '0', // 0 - allow, 1 - do not allow
957
+ 'password_protected' => 'no',
958
+ 'enable_google_analytics' => 'no',
959
+ 'enable_error_reporting' => 'yes',
960
+ 'pf_algo' => 'wp',
961
+ 'images-size' => 'full-size',
962
+ 'show_hidden_content' => 'no',
963
+ );
964
+
965
+ // Check whether the old badly named singular options are there, if so, use the data and delete them.
966
+ foreach (array_keys($this->options) as $opt) {
967
+ $old_opt = get_option('pf_' . $opt);
968
+ if ($old_opt !== false) {
969
+ $this->options[ $opt ] = $old_opt;
970
+ delete_option('pf_' . $opt);
971
+ }
972
+ }
973
+
974
+ // This should always be set to the latest immediately when defaults are pushed in.
975
+ $this->options['db_version'] = $this->db_version;
976
+
977
+ update_option($this->option_name, $this->options);
978
+ }
979
+
980
+ /**
981
+ * Upgrades the stored options, used to add new defaults if needed etc.
982
+ *
983
+ * @since 3.0
984
+ */
985
+ function upgrade()
986
+ {
987
+ // update options to version 2
988
+ if ($this->options['db_version'] < 2) {
989
+ $additional_options = array(
990
+ 'enable_css' => 'on',
991
+ 'logo' => 'favicon',
992
+ 'image_url' => '',
993
+ 'tagline' => '',
994
+ 'click_to_delete' => '0',
995
+ 'password_protected' => 'no',
996
+ );
997
+
998
+ // correcting badly named option
999
+ if (isset($this->options['disable_css'])) {
1000
+ $additional_options['enable_css'] = $this->options['disable_css'];
1001
+ unset($this->options['disable_css']);
1002
+ }
1003
+
1004
+ // check whether image we do not list any more was used
1005
+ if (in_array($this->options['button_type'], array('button-print-whgn20.png', 'pf_button_sq_qry_m.png', 'pf_button_sq_qry_l.png', 'pf_button_sq_grn_m.png', 'pf_button_sq_grn_l.png'), true)) {
1006
+ // previous version had a bug with button name
1007
+ if (in_array($this->options['button_type'], array('pf_button_sq_qry_m.png', 'pf_button_sq_qry_l.png'), true)) {
1008
+ $this->options['button_type'] = str_replace('qry', 'gry', $this->options['button_type']);
1009
+ }
1010
+
1011
+ $image_address = 'https://cdn.printfriendly.com/' . $this->options['button_type'];
1012
+ $this->options['button_type'] = 'custom-image';
1013
+ $this->options['custom_text'] = '';
1014
+ $this->options['custom_image'] = $image_address;
1015
+ }
1016
+
1017
+ $this->options = array_merge($this->options, $additional_options);
1018
+ }
1019
+
1020
+ // update options to version 3
1021
+ if ($this->options['db_version'] < 3) {
1022
+ $old_show_on = $this->options['show_list'];
1023
+ // 'manual' setting
1024
+ $additional_options = array('custom_css_url' => '');
1025
+
1026
+ if ($old_show_on === 'all') {
1027
+ $additional_options = array(
1028
+ 'show_on_pages' => 'on',
1029
+ 'show_on_posts' => 'on',
1030
+ 'show_on_homepage' => 'on',
1031
+ 'show_on_categories' => 'on',
1032
+ 'show_on_taxonomies' => 'on',
1033
+ );
1034
+ }
1035
+
1036
+ if ($old_show_on === 'single') {
1037
+ $additional_options = array(
1038
+ 'show_on_pages' => 'on',
1039
+ 'show_on_posts' => 'on',
1040
+ );
1041
+ }
1042
+
1043
+ if ($old_show_on === 'posts') {
1044
+ $additional_options = array(
1045
+ 'show_on_posts' => 'on',
1046
+ );
1047
+ }
1048
+
1049
+ unset($this->options['show_list']);
1050
+
1051
+ $this->options = array_merge($this->options, $additional_options);
1052
+ }
1053
+
1054
+ // update options to version 4
1055
+ if ($this->options['db_version'] < 4) {
1056
+ $additional_options = array(
1057
+ 'email' => '0',
1058
+ 'pdf' => '0',
1059
+ 'print' => '0',
1060
+ );
1061
+
1062
+ $this->options = array_merge($this->options, $additional_options);
1063
+ }
1064
+
1065
+ // update options to version 6
1066
+ // Replacement for db version 5 - should also be run for those already upgraded
1067
+ if ($this->options['db_version'] < 6) {
1068
+ unset($this->options['category_ids']);
1069
+ }
1070
+
1071
+ if ($this->options['db_version'] < 7) {
1072
+ $additional_options = array(
1073
+ 'hide-images' => '0',
1074
+ 'image-style' => 'right',
1075
+ );
1076
+
1077
+ $this->options = array_merge($this->options, $additional_options);
1078
+ }
1079
+
1080
+ if ($this->options['db_version'] < 8) {
1081
+ $this->options['enable_google_analytics'] = 'no';
1082
+ }
1083
+
1084
+ if ($this->options['db_version'] < 9) {
1085
+ $this->options['pf_algo'] = 'wp';
1086
+ }
1087
+
1088
+ if ($this->options['db_version'] < 10) {
1089
+ $this->options['enable_error_reporting'] = 'yes';
1090
+ }
1091
+
1092
+ if ($this->options['db_version'] < 11) {
1093
+ if (! isset($this->options['custom_css_url'])) {
1094
+ $this->options['custom_css_url'] = '';
1095
+ }
1096
+ }
1097
+
1098
+ if ($this->options['db_version'] < 12) {
1099
+ // phpcs:ignore WordPress.PHP.StrictComparisons.LooseComparison
1100
+ $this->options['images-size'] = $this->options['hide-images'] == '1' ? 'remove-images' : 'full-size';
1101
+ }
1102
+
1103
+ if ($this->options['db_version'] < 13) {
1104
+ switch ($this->options['button_type']) {
1105
+ case 'pf-button.gif':
1106
+ $this->options['button_type'] = 'buttons/printfriendly-button.png';
1107
+ break;
1108
+ case 'pf-button-both.gif':
1109
+ $this->options['button_type'] = 'buttons/printfriendly-pdf-button.png';
1110
+ break;
1111
+ case 'pf-button-big.gif':
1112
+ $this->options['button_type'] = 'buttons/printfriendly-button-lg.png';
1113
+ break;
1114
+ case 'pf-button-print-pdf-mail.png':
1115
+ $this->options['button_type'] = 'buttons/printfriendly-pdf-email-button-notext.png';
1116
+ break;
1117
+ case 'button-print-grnw20.png':
1118
+ $this->options['button_type'] = 'buttons/print-button.png';
1119
+ break;
1120
+ case 'button-print-blu20.png':
1121
+ $this->options['button_type'] = 'buttons/print-button-nobg.png';
1122
+ break;
1123
+ case 'button-print-gry20.png':
1124
+ $this->options['button_type'] = 'buttons/print-button-gray.png';
1125
+ break;
1126
+ case 'pf-icon-small.gif':
1127
+ case 'pf-icon.gif':
1128
+ $this->options['button_type'] = 'custom-button';
1129
+ $this->options['custom_button_icon'] = 'icons/printfriendly-icon-md.png';
1130
+ $this->options['custom_button_text'] = 'custom-text';
1131
+ $this->options['custom_image'] = 'icons/printfriendly-icon-md.png';
1132
+ break;
1133
+ case 'text-only':
1134
+ $this->options['button_type'] = 'custom-button';
1135
+ $this->options['custom_button_icon'] = 'no-image';
1136
+ $this->options['custom_button_text'] = 'custom-text';
1137
+ break;
1138
+ }
1139
+ }
1140
+
1141
+ if ($this->options['db_version'] < 14) {
1142
+ if ($this->options['button_type'] === 'pf-icon-both.gif') {
1143
+ $this->options['button_type'] = 'buttons/printfriendly-pdf-button-nobg.png';
1144
+ }
1145
+ }
1146
+
1147
+ if ($this->options['db_version'] < 15) {
1148
+ if ($this->options['button_type'] === 'custom-image') {
1149
+ $this->options['button_type'] = 'custom-button';
1150
+
1151
+ switch ($this->options['custom_image']) {
1152
+ case 'icons/printfriendly-icon-sm.png':
1153
+ case 'icons/printfriendly-icon-md.png':
1154
+ case 'icons/printfriendly-icon-lg.png':
1155
+ $this->options['custom_button_icon'] = $this->options['custom_image'];
1156
+ break;
1157
+ case '':
1158
+ $this->options['custom_button_icon'] = 'no-image';
1159
+ break;
1160
+ default:
1161
+ $this->options['custom_button_icon'] = 'custom-image';
1162
+ }
1163
+
1164
+ if ($this->options['custom_text'] === '') {
1165
+ $this->options['custom_button_text'] = 'no-text';
1166
+ } else {
1167
+ $this->options['custom_button_text'] = 'custom-text';
1168
+ }
1169
+ }
1170
+ }
1171
+
1172
+ if ($this->options['db_version'] < 16) {
1173
+ if ($this->options['custom_button_icon'] === 'icons/printfriendly-icon-md.png') {
1174
+ $this->options['custom_button_icon'] = 'https://cdn.printfriendly.com/icons/printfriendly-icon-md.png';
1175
+ }
1176
+ }
1177
+
1178
+ if ($this->options['db_version'] < 17) {
1179
+ $this->options['pro_email'] = get_bloginfo('admin_email');
1180
+
1181
+ $url = get_bloginfo('url');
1182
+ $parsed_url = parse_url($url);
1183
+ $this->options['pro_domain'] = $parsed_url['host'];
1184
+ }
1185
+
1186
+ $this->options['db_version'] = $this->db_version;
1187
+
1188
+ update_option($this->option_name, $this->options);
1189
+ }
1190
+
1191
+ /**
1192
+ * Displays radio button in the admin area
1193
+ *
1194
+ * @since 3.0
1195
+ * @param string $name the name of the radio button to generate.
1196
+ * @param boolean $br whether or not to add an HTML <br> tag, defaults to true.
1197
+ * @param boolean $value if this is null, will have the same value as $name.
1198
+ */
1199
+ function radio($name, $br = false, $value = null)
1200
+ {
1201
+ if (is_null($value)) {
1202
+ $value = $name;
1203
+ }
1204
+
1205
+ $var = '<input id="' . $name . '" class="radio" name="' . $this->option_name . '[button_type]" type="radio" value="' . $value . '" ' . $this->checked('button_type', $value, false) . '/>';
1206
+ $button = $this->button($name);
1207
+ if (! empty($button)) {
1208
+ echo '<label for="' . $name . '">' . $var . $button . '</label>';
1209
+ } else {
1210
+ echo $var;
1211
+ }
1212
+
1213
+ if ($br) {
1214
+ echo '<br>';
1215
+ }
1216
+ }
1217
+
1218
+ /**
1219
+ * Displays radio button in the admin area
1220
+ *
1221
+ * @since 3.12.0
1222
+ * @param string $value the value of the radio button to generate.
1223
+ */
1224
+ function radio_custom_image($value)
1225
+ {
1226
+ $button = $this->button($value);
1227
+ $value = "https://cdn.printfriendly.com/{$value}";
1228
+ ?>
1229
+ <label for="<?php echo esc_attr($value); ?>">
1230
+ <input type="radio" id="<?php echo esc_attr($value); ?>" name="<?php echo $this->option_name; ?>[custom_button_icon]" value="<?php echo $value; ?>" <?php $this->checked('custom_button_icon', $value); ?>>
1231
+ <?php echo $button; ?>
1232
+ </label>
1233
+ <?php
1234
+ }
1235
+
1236
+ /**
1237
+ * Displays button image in the admin area
1238
+ *
1239
+ * @since 3.0
1240
+ * @param string $name the name of the button to generate.
1241
+ */
1242
+ function button($name = false)
1243
+ {
1244
+ if (! $name) {
1245
+ $name = $this->options['button_type'];
1246
+ }
1247
+
1248
+ $img_path = 'https://cdn.printfriendly.com/';
1249
+
1250
+ $return = '';
1251
+
1252
+ if ($name === 'custom-button') {
1253
+ if ($this->options['custom_button_icon'] === 'custom-image' && '' !== trim($this->options['custom_image'])) {
1254
+ $width = $this->options['custom_image_width'];
1255
+ $height = $this->options['custom_image_height'];
1256
+ $imgStyle = '';
1257
+ if (! empty($width)) {
1258
+ $imgStyle .= sprintf('width: %dpx;', $width);
1259
+ }
1260
+ if (! empty($height)) {
1261
+ $imgStyle .= sprintf('height: %dpx;', $height);
1262
+ }
1263
+
1264
+ $return = '<img src="' . esc_url($this->options['custom_image']) . '" alt="Print Friendly, PDF & Email" class="pf-button-img" style="' . $imgStyle . '" />';
1265
+ } elseif ($this->options['custom_button_icon'] !== 'no-image') {
1266
+ $icon = str_replace($img_path, '', $this->options['custom_button_icon']);
1267
+ $attributes = self::$_buttons[ $icon ];
1268
+ $atts = '';
1269
+ $width = $attributes['width'];
1270
+ $height = $attributes['height'];
1271
+ if (! empty($width)) {
1272
+ $imgStyle .= sprintf('width: %dpx;', $width);
1273
+ }
1274
+ if (! empty($height)) {
1275
+ $imgStyle .= sprintf('height: %dpx;', $height);
1276
+ }
1277
+
1278
+ $return = '<img src="' . esc_url($this->options['custom_button_icon']) . '" alt="Print Friendly, PDF & Email" class="pf-button-img" style="' . $imgStyle . '" />';
1279
+ }
1280
+
1281
+ /* esc_html was removerd to support custom html, CSRF prevents from attack by using this field */
1282
+ if ($this->options['custom_button_text'] === 'custom-text') {
1283
+ $return .= sprintf('<span id="printfriendly-text2" class="pf-button-text">%s</span>', esc_html($this->options['custom_text']));
1284
+ }
1285
+
1286
+ return $return;
1287
+ } elseif ($name === 'custom-btn') {
1288
+ return __('Custom Button', 'printfriendly');
1289
+ } else {
1290
+ $attributes = self::$_buttons[ $name ];
1291
+ $atts = '';
1292
+ $width = $attributes['width'];
1293
+ $height = $attributes['height'];
1294
+ if (! empty($width)) {
1295
+ $imgStyle .= sprintf('width: %dpx;', $width);
1296
+ }
1297
+ if (! empty($height)) {
1298
+ $imgStyle .= sprintf('height: %dpx;', $height);
1299
+ }
1300
+
1301
+ return '<img class="pf-button-img" src="' . $img_path . $name . '" alt="Print Friendly, PDF & Email" style="' . $imgStyle . '" />';
1302
+ }
1303
+ }
1304
+
1305
+ /**
1306
+ * Convenience function to output a value custom button preview elements
1307
+ *
1308
+ * @since 3.0.9
1309
+ */
1310
+ function custom_button_preview()
1311
+ {
1312
+ $img = $url = $button_text = $style = $width = $height = '';
1313
+ switch ($this->options['custom_button_icon']) {
1314
+ case 'no-image':
1315
+ break;
1316
+ case 'custom-image':
1317
+ $url = $this->options['custom_image'];
1318
+ $width = $this->options['custom_image_width'];
1319
+ $height = $this->options['custom_image_height'];
1320
+ break;
1321
+ default:
1322
+ $url = $this->options['custom_button_icon'];
1323
+ break;
1324
+ }
1325
+
1326
+ if (! empty($url)) {
1327
+ $imgStyle = '';
1328
+ if (! empty($width)) {
1329
+ $imgStyle .= sprintf('width: %dpx;', $width);
1330
+ }
1331
+ if (! empty($height)) {
1332
+ $imgStyle .= sprintf('height: %dpx;', $height);
1333
+ }
1334
+ $img = sprintf('<img src="%s" style="%s" alt="Print Friendly, PDF & Email">', esc_url($url), $imgStyle);
1335
+ }
1336
+
1337
+ if ($this->options['custom_button_text'] !== 'no-text') {
1338
+ $button_text = $this->options['custom_text'];
1339
+ }
1340
+
1341
+ if ('' !== $this->options['text_color']) {
1342
+ $style .= 'color: ' . $this->options['text_color'] . ';';
1343
+ }
1344
+
1345
+ $button_preview = sprintf('<span><span id="pf-custom-button-preview" class="pf-button-img">%s</span><span id="printfriendly-text2" class="pf-button-text" style="%s">%s</span></span>', $img, $style, esc_html($button_text));
1346
+
1347
+ echo $button_preview;
1348
+ }
1349
+
1350
+ /**
1351
+ * Convenience function to output a value for an input
1352
+ *
1353
+ * @since 3.0
1354
+ * @param string $val value to check.
1355
+ */
1356
+ function val($val, $echo = true, $default = null)
1357
+ {
1358
+ $value = '';
1359
+ if (isset($this->options[ $val ])) {
1360
+ $value = esc_attr($this->options[ $val ]);
1361
+ }
1362
+
1363
+ if (empty($value) && ! is_null($default)) {
1364
+ $value = $default;
1365
+ }
1366
+
1367
+ if ($echo) {
1368
+ echo $value;
1369
+ }
1370
+ return $value;
1371
+ }
1372
+
1373
+
1374
+ /**
1375
+ * Like the WordPress checked() function but it doesn't throw notices when the array key isn't set and uses the plugins options array.
1376
+ *
1377
+ * @since 3.0
1378
+ * @param mixed $val value to check.
1379
+ * @param mixed $check_against value to check against.
1380
+ * @param boolean $echo whether or not to echo the output.
1381
+ * @return string checked, when true, empty, when false.
1382
+ */
1383
+ function checked($val, $check_against = true, $echo = true)
1384
+ {
1385
+ if (! isset($this->options[ $val ])) {
1386
+ return;
1387
+ }
1388
+
1389
+ // phpcs:ignore WordPress.PHP.StrictComparisons.LooseComparison
1390
+ if ($this->options[ $val ] == $check_against) {
1391
+ if ($echo) {
1392
+ echo ' checked="checked" ';
1393
+ } else {
1394
+ return ' checked="checked" ';
1395
+ }
1396
+ }
1397
+ }
1398
+
1399
+ /**
1400
+ * Helper for creating checkboxes.
1401
+ *
1402
+ * @since 3.1.5
1403
+ * @param string $name string used for various parts of checkbox.
1404
+ */
1405
+ function create_checkbox($name, $label = '', $labelid = '')
1406
+ {
1407
  // phpcs:ignore WordPress.WP.I18n.NonSingularStringLiteralText
1408
+ $label = ( ! empty($label) ? $label : __(ucfirst($name), 'printfriendly') );
1409
+ echo '<label' . ( ! empty($labelid) ? ' id=' . $labelid : '' ) . '><input type="checkbox" class="show_list" name="' . $this->option_name . '[show_on_' . $name . ']" value="on" ';
1410
+ $this->checked('show_on_' . $name, 'on');
1411
+ echo ' />' . $label . "</label>\r\n";
1412
+ }
1413
+
1414
+
1415
+ /**
1416
+ * Like the WordPress selected() function but it doesn't throw notices when the array key isn't set and uses the plugins options array.
1417
+ *
1418
+ * @since 3.0.9
1419
+ * @param mixed $val value to check.
1420
+ * @param mixed $check_against value to check against.
1421
+ * @return string checked, when true, empty, when false.
1422
+ */
1423
+ function selected($val, $check_against = true)
1424
+ {
1425
+ if (! isset($this->options[ $val ])) {
1426
+ return;
1427
+ }
1428
+
1429
+ return selected($this->options[ $val ], $check_against);
1430
+ }
1431
+
1432
+ /**
1433
+ * For use with page metabox.
1434
+ *
1435
+ * @since 3.2.2
1436
+ */
1437
+ function get_page_post_type()
1438
+ {
1439
+ $post_types = get_post_types(array('name' => 'page'), 'object');
1440
+ // echo '<pre>'.print_r($post_types,1).'</pre>';
1441
+ // die;
1442
+
1443
+ return $post_types['page'];
1444
+ }
1445
+
1446
+
1447
+ /**
1448
+ * Helper that checks if wp versions is above 3.0.
1449
+ *
1450
+ * @since 3.2.2
1451
+ * @return boolean true wp version is above 3.0
1452
+ */
1453
+ function wp_version_gt30()
1454
+ {
1455
+ global $wp_version;
1456
+ return version_compare($wp_version, '3.0', '>=');
1457
+ }
1458
+
1459
+
1460
+ /**
1461
+ * Create box for picking individual categories.
1462
+ *
1463
+ * @since 3.2.2
1464
+ */
1465
+ function create_category_metabox()
1466
+ {
1467
+ $obj = new stdClass();
1468
+ $obj->ID = 0;
1469
+ do_meta_boxes('settings_page_' . $this->hook, 'normal', $obj);
1470
+ }
1471
+
1472
+
1473
+ /**
1474
+ * Load metaboxes advanced button display settings.
1475
+ *
1476
+ * @since 3.2.2
1477
+ */
1478
+ function on_load_printfriendly()
1479
+ {
1480
+ global $wp_version;
1481
+ if ($this->wp_version_gt30()) {
1482
+ // require_once(dirname(__FILE__).'/includes/meta-boxes.php');
1483
+ // require_once(dirname(__FILE__).''includes/nav-menu.php');
1484
+ wp_enqueue_script('post');
1485
+
1486
+ add_meta_box('categorydiv', __('Only display when post is in:', 'printfriendly'), 'post_categories_meta_box', 'settings_page_' . $this->hook, 'normal', 'core');
1487
+ }
1488
+ }
1489
+
1490
+ /**
1491
+ * Returns if the user is a pro user.
1492
+ */
1493
+ function is_pro($feature = null)
1494
+ {
1495
+ $licensed = $this->val('license_status', false) === 'pro';
1496
+
1497
+ switch ($feature) {
1498
+ case 'custom-css':
1499
+ // custom css needs to be available for all irrespective of the license.
1500
+ return true;
1501
+ }
1502
+
1503
+ return $licensed;
1504
+ }
1505
+
1506
+ /**
1507
+ * Returns the custom css url.
1508
+ */
1509
+ function get_custom_css()
1510
+ {
1511
+ // don't throw a PHP notice if custom_css_url is not defined.
1512
+ $css_url = isset($this->options['custom_css_url']) ? $this->options['custom_css_url'] : '';
1513
+ if (! $this->is_pro('custom-css')) {
1514
+ return $css_url;
1515
+ }
1516
+
1517
+ // upgrading from a version that was using urls instead of the textarea?
1518
+ if (! empty($css_url)) {
1519
+ return $css_url;
1520
+ }
1521
+
1522
+ // don't throw a PHP notice if custom_css_url_pro is not defined.
1523
+ $css_url = isset($this->options['custom_css_url_pro']) ? $this->options['custom_css_url_pro'] : '';
1524
+ if (empty($css_url)) {
1525
+ return null;
1526
+ }
1527
+
1528
+ $dirs = wp_get_upload_dir();
1529
+
1530
+ return $dirs['baseurl'] . '/' . $this->options['custom_css_url_pro'];
1531
+ }
1532
+
1533
+ /**
1534
+ * Generates the custom css file from the CSS block.
1535
+ */
1536
+ function maybe_generate_custom_css_file($css)
1537
+ {
1538
+ $custom_css_old = html_entity_decode($this->val('custom_css', false));
1539
+
1540
+ // generate a new file if the CSS has changed.
1541
+ if ($custom_css_old === $css) {
1542
+ return false;
1543
+ }
1544
+
1545
+ $dirs = wp_get_upload_dir();
1546
+
1547
+ // delete old file, if it exists
1548
+ $file = $this->options['custom_css_url_pro'];
1549
+ if (! empty($file)) {
1550
+ wp_delete_file($dirs['basedir'] . '/' . $this->options['custom_css_url_pro']);
1551
+ }
1552
+
1553
+ // add a comment so that users know whence this file came.
1554
+ $date = date_i18n(get_option('date_format') . ' ' . get_option('time_format'));
1555
+ $comment = sprintf('/* DO NOT EDIT - FILE AUTO-GENERATED BY PRINTFRIENDLY v%s ON %s */', $this->plugin_version, $date);
1556
+ $css = $comment . PHP_EOL . PHP_EOL . $css;
1557
+
1558
+ // create new file, suffixed with the current time.
1559
+ $file = sprintf('%s_%s.css', $this->hook, time());
1560
+ require_once(ABSPATH . 'wp-admin/includes/file.php');
1561
+ WP_Filesystem();
1562
+ global $wp_filesystem;
1563
+ $wp_filesystem->put_contents(
1564
+ $dirs['basedir'] . '/' . $file,
1565
+ $css,
1566
+ FS_CHMOD_FILE
1567
+ );
1568
+
1569
+ // return the new file name
1570
+ return $file;
1571
+ }
1572
+
1573
+ /**
1574
+ * If upgrading from a previous version that was using urls instead of the textarea
1575
+ * it will return an appropriate message for the user.
1576
+ */
1577
+ function get_custom_css_upgrade_message()
1578
+ {
1579
+ // upgrading from a version that was using urls instead of the textarea?
1580
+ if (isset($this->options['custom_css_url']) && ! empty($this->options['custom_css_url'])) {
1581
+ $css_url = $this->options['custom_css_url'];
1582
+ return sprintf(__('You are currently using %1$s%2$s%3$s. You can copy copy its contents into the textbox if you want to update the styles.', 'printfriendly'), '<a href="' . $css_url . '" target="_blank">', $css_url, '</a>');
1583
+ }
1584
+
1585
+ return null;
1586
+ }
1587
+
1588
+ /**
1589
+ * Output the config page
1590
+ *
1591
+ * @since 3.0
1592
+ */
1593
+ function config_page()
1594
+ {
1595
+
1596
+ // Since WP 3.2 outputs these errors by default, only display them when we're on versions older than 3.2 that do support the settings errors.
1597
+ global $wp_version;
1598
+ if (version_compare($wp_version, '3.2', '<') && $this->wp_version_gt30()) {
1599
+ settings_errors();
1600
+ }
1601
+
1602
+ $customCssOptionCode = $this->getSelectorsFromCustomCSS();
1603
+ include_once PRINTFRIENDLY_BASEPATH . '/views/settings.php';
1604
+ }
1605
+
1606
+ /**
1607
+ * Returns the current tab to activate.
1608
+ *
1609
+ * @since 4.0.1
1610
+ */
1611
+ function is_tab($tab_id)
1612
+ {
1613
+ $tab = get_transient('pf-tab');
 
 
 
 
 
1614
  // phpcs:ignore WordPress.PHP.StrictComparisons.LooseComparison
1615
+ return empty($tab) && $tab_id == 0 ? true : $tab == $tab_id;
1616
+ }
1617
+ }
1618
+ $printfriendly = new PrintFriendly_WordPress();
 
1619
  }
1620
 
1621
  // Add shortcode for printfriendly button
1622
+ add_shortcode(
1623
+ 'printfriendly',
1624
+ /**
1625
+ * Show the printfriendly button.
1626
+ *
1627
+ * @param array $atts The attributes of the shortcode.
1628
+ * If current="yes", the whole page will be printed (pf_current_page_button is called).
1629
+ * The default behaviour is to call pf_default_button.
1630
+ *
1631
+ * @since 3.0
1632
+ *
1633
+ * @return string The button.
1634
+ */
1635
+ function ($atts) {
1636
+ $atts = shortcode_atts(array(
1637
+ 'current' => '', // yes => print the whole page
1638
+ ), $atts, 'printfriendly');
1639
+
1640
+ if (empty($atts['current'])) {
1641
+ return pf_default_button();
1642
+ } else {
1643
+ return pf_current_page_button();
1644
+ }
1645
+
1646
+ return null;
1647
+ }
1648
+ );
1649
+
1650
 
1651
  /**
1652
  * Convenience function for use in templates.
1653
  *
1654
+ * @deprecated Use pf_default_button instead.
1655
+ *
1656
  * @since 3.0
1657
+ *
1658
+ * @return string returns a button to be printed.
1659
+ */
1660
+ function pf_show_link()
1661
+ {
1662
+ return pf_default_button();
1663
+ }
1664
+
1665
+ /**
1666
+ * Convenience function for use in templates.
1667
+ *
1668
+ * @since 5.1
1669
+ *
1670
  * @return string returns a button to be printed.
1671
  */
1672
+ function pf_default_button()
1673
+ {
1674
+ global $printfriendly;
1675
+ return $printfriendly->getButton(true);
1676
+ }
1677
+
1678
+ /**
1679
+ * Convenience function for use in templates.
1680
+ *
1681
+ * @since 5.1
1682
+ *
1683
+ * @return string returns a button that prints the entire page it is on.
1684
+ */
1685
+ function pf_current_page_button()
1686
+ {
1687
+ global $printfriendly;
1688
+ return $printfriendly->getButton(true, '', true);
1689
  }
readme.txt CHANGED
@@ -3,7 +3,7 @@ Contributors: printfriendly, joostdevalk, jrf, rozroz
3
  Tags: print, pdf, email, woocommerce print, woocommerce pdf, print plugin, print button, pdf plugin, pdf button
4
  Requires at least: 4.9
5
  Tested up to: 5.8
6
- Stable tag: 5.0
7
 
8
 
9
  The #1 Print, PDF, Email button. Stylish, full featured, customizable. Add custom header, footer, and more.
@@ -144,6 +144,10 @@ You can [hide the Print, PDF, and Email button](https://support.printfriendly.co
144
 
145
  == Changelog ==
146
 
 
 
 
 
147
  = 5.0 =
148
  * Add support for custom CSS selectors
149
  * Improve the settings UI
3
  Tags: print, pdf, email, woocommerce print, woocommerce pdf, print plugin, print button, pdf plugin, pdf button
4
  Requires at least: 4.9
5
  Tested up to: 5.8
6
+ Stable tag: 5.1
7
 
8
 
9
  The #1 Print, PDF, Email button. Stylish, full featured, customizable. Add custom header, footer, and more.
144
 
145
  == Changelog ==
146
 
147
+ = 5.1 =
148
+ * In category pages, the default behaviour of button added by shortcode/template is to link to a printable version of the individual posts. Sometimes, it is desirable to print the category page itself and not the individual posts. Added new template function/shortcode to always print the current page to use in this scenario.
149
+ * Add support for newer google analytics versions and google tag manager
150
+
151
  = 5.0 =
152
  * Add support for custom CSS selectors
153
  * Improve the settings UI
uninstall.php CHANGED
@@ -1,22 +1,22 @@
1
  <?php
2
 
3
- if ( ! defined( 'ABSPATH' ) && ! defined( 'WP_UNINSTALL_PLUGIN' ) ) {
4
- exit();
5
  }
6
 
7
- delete_option( 'printfriendly_option' );
8
 
9
  // Make sure any old options which may still lurking about get deleted as well
10
- delete_option( 'pf_button_type' );
11
- delete_option( 'pf_custom_image' );
12
- delete_option( 'pf_custom_text' );
13
- delete_option( 'pf_custom_both' );
14
- delete_option( 'pf_show_list' );
15
- delete_option( 'pf_content_placement' );
16
- delete_option( 'pf_content_position' );
17
- delete_option( 'pf_margin_top' );
18
- delete_option( 'pf_margin_right' );
19
- delete_option( 'pf_margin_bottom' );
20
- delete_option( 'pf_margin_left' );
21
- delete_option( 'pf_text_color' );
22
- delete_option( 'pf_text_size' );
1
  <?php
2
 
3
+ if (! defined('ABSPATH') && ! defined('WP_UNINSTALL_PLUGIN')) {
4
+ exit();
5
  }
6
 
7
+ delete_option('printfriendly_option');
8
 
9
  // Make sure any old options which may still lurking about get deleted as well
10
+ delete_option('pf_button_type');
11
+ delete_option('pf_custom_image');
12
+ delete_option('pf_custom_text');
13
+ delete_option('pf_custom_both');
14
+ delete_option('pf_show_list');
15
+ delete_option('pf_content_placement');
16
+ delete_option('pf_content_position');
17
+ delete_option('pf_margin_top');
18
+ delete_option('pf_margin_right');
19
+ delete_option('pf_margin_bottom');
20
+ delete_option('pf_margin_left');
21
+ delete_option('pf_text_color');
22
+ delete_option('pf_text_size');
views/pro.php CHANGED
@@ -1,84 +1,84 @@
1
  <?php
2
- $urlInfo = parse_url( get_option( 'siteurl' ) );
3
- $domain = ( isset( $urlInfo['host'] ) ? $urlInfo['host'] : '' );
4
 
5
  // don't throw a PHP notice if license_date is not defined
6
- $license_date = isset( $this->options['license_date'] ) ? $this->options['license_date'] : '';
7
 
8
- if ( ! empty( $license_date ) ) {
9
- $license_date = date_i18n( get_option( 'date_format' ) . ' ' . get_option( 'time_format' ), $license_date / 1000 + get_option( 'gmt_offset' ) * HOUR_IN_SECONDS );
10
  }
11
 
12
  ?>
13
- <div class="pf-bu-block pf-bu-card">
14
- <div class="pf-bu-card-content">
15
 
16
- <div id="pf-pro" class="pf-notice pf-pro">
17
- <h3 style="margin: 1rem 0 0 0">Pro - <span id="pf-pro-status-header"></span></h3>
18
- <p class="pf-alert-success">PrintFriendly is <strong>GDPR Compliant</strong> <a href="https://www.printfriendly.com/privacy" target="_blank"><?php _e( 'Learn more', 'printfriendly' ); ?></a>.
19
 
20
- </p>
21
- <div class="pf-col-1 ">
22
- <?php
23
- if ( ! ( empty( $this->val( 'pro_email', false ) ) && in_array( $this->val( 'license_status', false ), array( 'pro' ), true ) ) ) {
24
- $email = $this->val( 'pro_email', false );
25
- if ( empty( $email ) ) {
26
- $email = get_option( 'admin_email' );
27
- }
28
- ?>
29
- <label class="pf-no-margin">
30
- <strong><?php _e( 'Email', 'printfriendly' ); ?></strong><span class="description">(<?php _e( 'To send account details', 'printfriendly' ); ?>)</span><br>
31
- <input id="pf-pro-email" type="email" class="regular-text" maxlength="80" name="<?php echo $this->option_name; ?>[pro_email]" value="<?php echo $email; ?>" placeholder="hello@my-website.com" />
32
- <br>
33
- <span id="pf-pro-email-error" class="pf-error"><?php _e( 'Email is invalid', 'printfriendly' ); ?></span>
34
- </label>
35
- <?php } ?>
36
 
37
- <label>
38
- <strong><?php _e( 'Website Domain', 'printfriendly' ); ?></strong><br/>
39
- <input id="pf-pro-domain" type="text" class="regular-text" readonly name="<?php echo $this->option_name; ?>[pro_domain]" value="<?php echo $domain; ?>" />
40
- <br />
41
- <span id="pf-pro-domain-error" class="pf-error"><?php _e( 'Domain is invalid', 'printfriendly' ); ?></span>
42
- </label>
43
 
44
- <p id="pf-pro-activate" class="pf-hidden">
45
- <button id="pf-pro-activate-btn" type="button" class="button-primary"><?php _e( 'Activate', 'printfriendly' ); ?></button>
46
- <span class="pf-btn-message"><?php _e( 'Free 30 days trial, no credit card required.', 'printfriendly' ); ?></span>
47
- </p>
48
 
49
- <p id="pf-pro-buy" class="pf-hidden">
50
- <a id="pf-pro-buy-btn" class="button-primary"><?php _e( 'Buy Now', 'printfriendly' ); ?></a>
51
- <span id="pf-pro-status-message" class="pf-btn-message"></span>
52
- </p>
53
 
54
- <p id="pf-pro-details" class="pf-hidden">
55
- <span class="pf-btn-message"><?php _e( 'Last Checked', 'printfriendly' ); ?>: <?php echo $license_date; ?></span>
56
- <input type="hidden" name="<?php echo $this->option_name; ?>[license_status]" id="license_status">
57
- <input type="hidden" name="<?php echo $this->option_name; ?>[license_date]" id="license_date">
58
- </p>
59
 
60
- <p id="pf-pro-loading" class="pf-hidden">
61
- <b class="pf-text-success"><span id="pf-pro-loading-message"></span><?php _e( 'Please wait', 'printfriendly' ); ?>...</b>
62
- </p>
63
 
64
- <p id="pf-pro-communication-error" class="pf-hidden">
65
- <b class="pf-text-error"><span id="pf-pro-communication-error-message"></span></b>
66
- </p>
67
- </div>
68
 
69
- <div class="pf-col-2 pf-pro-features">
70
- <strong><?php _e( 'Pro Features', 'printfriendly' ); ?></strong>
71
- <ol>
72
- <li><?php _e( 'Faster, better experience for end-user', 'printfriendly' ); ?></li>
73
- <li><?php _e( 'Cache-free, so any updates are instantly included', 'printfriendly' ); ?></li>
74
- <li><?php _e( 'Ad-Free for companies and organizations', 'printfriendly' ); ?></li>
75
- <li><?php _e( 'Works on all sites (Password protected, Angular/React/Ember)', 'printfriendly' ); ?></li>
76
- <li><?php _e( 'Email support', 'printfriendly' ); ?></li>
77
- </ol>
78
- <p><?php _e( 'Have a development/staging domain?', 'printfriendly' ); ?> <a href="https://support.printfriendly.com/button/pro/development-domain/" target="_blank"><?php _e( 'Add Free Development Domain', 'printfriendly' ); ?></a>.</p>
79
- </div>
80
- <br />
81
- </div>
82
 
83
- </div>
84
- </div>
1
  <?php
2
+ $urlInfo = parse_url(get_option('siteurl'));
3
+ $domain = ( isset($urlInfo['host']) ? $urlInfo['host'] : '' );
4
 
5
  // don't throw a PHP notice if license_date is not defined
6
+ $license_date = isset($this->options['license_date']) ? $this->options['license_date'] : '';
7
 
8
+ if (! empty($license_date)) {
9
+ $license_date = date_i18n(get_option('date_format') . ' ' . get_option('time_format'), $license_date / 1000 + get_option('gmt_offset') * HOUR_IN_SECONDS);
10
  }
11
 
12
  ?>
13
+ <div class="pf-bu-block pf-bu-card">
14
+ <div class="pf-bu-card-content">
15
 
16
+ <div id="pf-pro" class="pf-notice pf-pro">
17
+ <h3 style="margin: 1rem 0 0 0">Pro - <span id="pf-pro-status-header"></span></h3>
18
+ <p class="pf-alert-success">PrintFriendly is <strong>GDPR Compliant</strong> <a href="https://www.printfriendly.com/privacy" target="_blank"><?php _e('Learn more', 'printfriendly'); ?></a>.
19
 
20
+ </p>
21
+ <div class="pf-col-1 ">
22
+ <?php
23
+ if (! ( empty($this->val('pro_email', false)) && in_array($this->val('license_status', false), array( 'pro' ), true) )) {
24
+ $email = $this->val('pro_email', false);
25
+ if (empty($email)) {
26
+ $email = get_option('admin_email');
27
+ }
28
+ ?>
29
+ <label class="pf-no-margin">
30
+ <strong><?php _e('Email', 'printfriendly'); ?></strong><span class="description">(<?php _e('To send account details', 'printfriendly'); ?>)</span><br>
31
+ <input id="pf-pro-email" type="email" class="regular-text" maxlength="80" name="<?php echo $this->option_name; ?>[pro_email]" value="<?php echo $email; ?>" placeholder="hello@my-website.com" />
32
+ <br>
33
+ <span id="pf-pro-email-error" class="pf-error"><?php _e('Email is invalid', 'printfriendly'); ?></span>
34
+ </label>
35
+ <?php } ?>
36
 
37
+ <label>
38
+ <strong><?php _e('Website Domain', 'printfriendly'); ?></strong><br/>
39
+ <input id="pf-pro-domain" type="text" class="regular-text" readonly name="<?php echo $this->option_name; ?>[pro_domain]" value="<?php echo $domain; ?>" />
40
+ <br />
41
+ <span id="pf-pro-domain-error" class="pf-error"><?php _e('Domain is invalid', 'printfriendly'); ?></span>
42
+ </label>
43
 
44
+ <p id="pf-pro-activate" class="pf-hidden">
45
+ <button id="pf-pro-activate-btn" type="button" class="button-primary"><?php _e('Activate', 'printfriendly'); ?></button>
46
+ <span class="pf-btn-message"><?php _e('Free 30 days trial, no credit card required.', 'printfriendly'); ?></span>
47
+ </p>
48
 
49
+ <p id="pf-pro-buy" class="pf-hidden">
50
+ <a id="pf-pro-buy-btn" class="button-primary"><?php _e('Buy Now', 'printfriendly'); ?></a>
51
+ <span id="pf-pro-status-message" class="pf-btn-message"></span>
52
+ </p>
53
 
54
+ <p id="pf-pro-details" class="pf-hidden">
55
+ <span class="pf-btn-message"><?php _e('Last Checked', 'printfriendly'); ?>: <?php echo $license_date; ?></span>
56
+ <input type="hidden" name="<?php echo $this->option_name; ?>[license_status]" id="license_status">
57
+ <input type="hidden" name="<?php echo $this->option_name; ?>[license_date]" id="license_date">
58
+ </p>
59
 
60
+ <p id="pf-pro-loading" class="pf-hidden">
61
+ <b class="pf-text-success"><span id="pf-pro-loading-message"></span><?php _e('Please wait', 'printfriendly'); ?>...</b>
62
+ </p>
63
 
64
+ <p id="pf-pro-communication-error" class="pf-hidden">
65
+ <b class="pf-text-error"><span id="pf-pro-communication-error-message"></span></b>
66
+ </p>
67
+ </div>
68
 
69
+ <div class="pf-col-2 pf-pro-features">
70
+ <strong><?php _e('Pro Features', 'printfriendly'); ?></strong>
71
+ <ol>
72
+ <li><?php _e('Faster, better experience for end-user', 'printfriendly'); ?></li>
73
+ <li><?php _e('Cache-free, so any updates are instantly included', 'printfriendly'); ?></li>
74
+ <li><?php _e('Ad-Free for companies and organizations', 'printfriendly'); ?></li>
75
+ <li><?php _e('Works on all sites (Password protected, Angular/React/Ember)', 'printfriendly'); ?></li>
76
+ <li><?php _e('Email support', 'printfriendly'); ?></li>
77
+ </ol>
78
+ <p><?php _e('Have a development/staging domain?', 'printfriendly'); ?> <a href="https://support.printfriendly.com/button/pro/development-domain/" target="_blank"><?php _e('Add Free Development Domain', 'printfriendly'); ?></a>.</p>
79
+ </div>
80
+ <br />
81
+ </div>
82
 
83
+ </div>
84
+ </div>
views/settings.php CHANGED
@@ -1,26 +1,26 @@
1
- <div id="pf_settings" class="wrap">
2
-
3
- <h2><img src="<?php echo PRINTFRIENDLY_BASEURL . '/assets/images/pf-icon.png'; ?>"><?php _e( 'Print Friendly & PDF Settings', 'printfriendly' ); ?></h2>
4
 
5
- <form id="pf-options-form" action="options.php" method="post">
6
- <?php wp_nonce_field( 'pf-options', 'pf-nonce' ); ?>
7
- <?php settings_fields( $this->option_name ); ?>
8
 
9
- <?php include_once PRINTFRIENDLY_BASEPATH . '/views/tabs.php'; ?>
10
 
11
- <input type="hidden" name="tab" id="current-tab" value="<?php echo get_transient( 'pf-tab' ); ?>">
12
 
13
- <footer id="after-submit" class="pf-bu-footer">
14
- <div class="pf-bu-content pf-bu-has-text-centered">
15
- <p>
16
- <?php echo sprintf( __( 'If you like <strong>PrintFriendly</strong> please leave us a %s rating. A huge thanks in advance!', 'printfriendly' ), '<a href="https://wordpress.org/support/plugin/printfriendly/reviews?rate=5#new-post" target="_blank">&#9733;&#9733;&#9733;&#9733;&#9733;</a>' ); ?>
17
- </p>
18
- <p><?php _e( 'Need professional options for your corporate, education, or agency developed website? Check out', 'printfriendly' ); ?> <a href="https://www.printfriendly.com/button/pro?utm_source=wp&utm_medium=link&utm_campaign=wp-link" target="_blank">PrintFriendly Pro</a>.</p>
19
- <p>
20
- <?php _e( 'Need help or have suggestions?', 'printfriendly' ); ?> <a href="mailto:support@printfriendly.com?subject=Support%20for%20PrintFriendly%20WordPress%20plugin">support@PrintFriendly.com</a>
21
- </p>
22
- </div>
23
- </footer>
24
 
25
- </form>
26
- </div>
1
+ <div id="pf_settings" class="wrap">
2
+
3
+ <h2><img src="<?php echo PRINTFRIENDLY_BASEURL . '/assets/images/pf-icon.png'; ?>"><?php _e('Print Friendly & PDF Settings', 'printfriendly'); ?></h2>
4
 
5
+ <form id="pf-options-form" action="options.php" method="post">
6
+ <?php wp_nonce_field('pf-options', 'pf-nonce'); ?>
7
+ <?php settings_fields($this->option_name); ?>
8
 
9
+ <?php include_once PRINTFRIENDLY_BASEPATH . '/views/tabs.php'; ?>
10
 
11
+ <input type="hidden" name="tab" id="current-tab" value="<?php echo get_transient('pf-tab'); ?>">
12
 
13
+ <footer id="after-submit" class="pf-bu-footer">
14
+ <div class="pf-bu-content pf-bu-has-text-centered">
15
+ <p>
16
+ <?php echo sprintf(__('If you like <strong>PrintFriendly</strong> please leave us a %s rating. A huge thanks in advance!', 'printfriendly'), '<a href="https://wordpress.org/support/plugin/printfriendly/reviews?rate=5#new-post" target="_blank">&#9733;&#9733;&#9733;&#9733;&#9733;</a>'); ?>
17
+ </p>
18
+ <p><?php _e('Need professional options for your corporate, education, or agency developed website? Check out', 'printfriendly'); ?> <a href="https://www.printfriendly.com/button/pro?utm_source=wp&utm_medium=link&utm_campaign=wp-link" target="_blank">PrintFriendly Pro</a>.</p>
19
+ <p>
20
+ <?php _e('Need help or have suggestions?', 'printfriendly'); ?> <a href="mailto:support@printfriendly.com?subject=Support%20for%20PrintFriendly%20WordPress%20plugin">support@PrintFriendly.com</a>
21
+ </p>
22
+ </div>
23
+ </footer>
24
 
25
+ </form>
26
+ </div>
views/tabs.php CHANGED
@@ -1,585 +1,635 @@
1
- <div id="pf-tabs">
2
- <div class="pf-bu-tabs pf-bu-is-centered">
3
- <ul>
4
- <li class="<?php echo $this->is_tab( 0 ) ? 'pf-bu-is-active' : ''; ?>" data-id="0"><a href="#tab-standard"><?php _e( 'Standard', 'printfriendly' ); ?></a></li>
5
- <li class="<?php echo $this->is_tab( 1 ) ? 'pf-bu-is-active' : ''; ?>" data-id="1"><a href="#tab-advanced"><?php _e( 'Advanced', 'printfriendly' ); ?></a></li>
6
- <?php if ( WP_DEBUG ) { ?>
7
- <li><a href="#tab-debug"><?php _e( 'Debug', 'printfriendly' ); ?></a></li>
8
- <?php } ?>
9
- </ul>
10
- </div>
11
-
12
- <section id="tab-standard">
13
- <div class="pf-bu-container">
14
-
15
- <?php include_once PRINTFRIENDLY_BASEPATH . '/views/pro.php'; ?>
16
-
17
- <div class="pf-bu-block pf-bu-card">
18
- <header class="pf-bu-card-header">
19
- <p class="pf-bu-card-header-title">
20
- <?php _e( 'Select content using', 'printfriendly' ); ?>
21
- </p>
22
- </header>
23
-
24
- <div class="pf-bu-card-content">
25
- <?php
26
- $disabled = $message = '';
27
- if ( class_exists( 'WooCommerce' ) ) {
28
- $disabled = 'disabled';
29
- $message = '(' . __( 'Not available for WooCommerce', 'printfriendly' ) . ')';
30
- }
31
- ?>
32
-
33
- <div>
34
- <div>
35
- <label for="pf-algo-wp">
36
- <input id="pf-algo-wp" type="radio" name="<?php echo $this->option_name; ?>[pf_algo]" value="wp" <?php echo $this->options['pf_algo'] === 'wp' ? 'checked' : ''; ?> <?php echo $disabled; ?>>
37
- <?php _e( 'WP Template', 'printfriendly' ); ?> <?php echo $message; ?>
38
- </label>
39
- </div>
40
-
41
- <div>
42
- <label for="pf-algo-pf">
43
- <input id="pf-algo-pf" type="radio" name="<?php echo $this->option_name; ?>[pf_algo]" value="pf" <?php echo $this->options['pf_algo'] === 'pf' ? 'checked' : ''; ?>>
44
- <?php _e( 'Content Algorithm', 'printfriendly' ); ?>
45
- </label>
46
- </div>
47
-
48
- <div>
49
- <label for="pf-algo-css">
50
- <input id="pf-algo-css" type="radio" name="<?php echo $this->option_name; ?>[pf_algo]" value="css" <?php echo $this->options['pf_algo'] === 'css' ? 'checked' : ''; ?>>
51
- <?php _e( 'Custom CSS Selectors', 'printfriendly' ); ?>
52
- </label>
53
- <div class="pf-algo-usage pf-algo-usage-css" style="display: none" data-tag-template="<?php echo esc_attr( '<printfriendly-options data-selectors="#1" data-fallback-strategy="#2"></printfriendly-options>' ); ?>">
54
- <div class="pf-bu-columns">
55
- <div class="pf-bu-column pf-bu-one-sixth pf-algo-usage-css-fields">
56
- <div>
57
- <label for="pf-algo-usage-css-author"><?php _e( 'Author Selector', 'printfriendly' ); ?></label>
58
- <input type="text" id="pf-algo-usage-css-author" name="<?php echo $this->option_name; ?>[css-author]" value="<?php $this->val( 'css-author' ); ?>" data-selector-name="authorSelector">
59
- </div>
60
- <div>
61
- <label for="pf-algo-usage-css-content"><?php _e( 'Content Selector', 'printfriendly' ); ?></label>
62
- <input type="text" id="pf-algo-usage-css-content" name="<?php echo $this->option_name; ?>[css-content]" value="<?php $this->val( 'css-content' ); ?>" data-selector-name="contentSelectors">
63
- </div>
64
- <div>
65
- <label for="pf-algo-usage-css-date"><?php _e( 'Date Selector', 'printfriendly' ); ?></label>
66
- <input type="text" id="pf-algo-usage-css-date" name="<?php echo $this->option_name; ?>[css-date]" value="<?php $this->val( 'css-date' ); ?>" data-selector-name="dateSelector">
67
- </div>
68
- <div>
69
- <label for="pf-algo-usage-css-title"><?php _e( 'Title Selector', 'printfriendly' ); ?></label>
70
- <input type="text" id="pf-algo-usage-css-title" name="<?php echo $this->option_name; ?>[css-title]" value="<?php $this->val( 'css-title' ); ?>" data-selector-name="titleSelector">
71
- </div>
72
- <div>
73
- <label for="pf-algo-usage-css-image"><?php _e( 'Image Selector', 'printfriendly' ); ?></label>
74
- <input type="text" id="pf-algo-usage-css-image" name="<?php echo $this->option_name; ?>[css-primaryImage]" value="<?php $this->val( 'css-primaryImage' ); ?>" data-selector-name="primaryImageSelector">
75
- </div>
76
- </div>
77
- <div class="pf-bu-column pf-bu-one-sixth pf-algo-usage-css-strategy">
78
- <label><?php _e( 'Content Fallback Strategy', 'printfriendly' ); ?></label>
79
- <label>
80
- <input type="radio" id="pf_algo_css_fallback_original" name="<?php echo $this->option_name; ?>[pf_algo_css_content]" value="original" <?php echo ( empty( $this->options['pf_algo_css_content'] ) || $this->options['pf_algo_css_content'] === 'original' ) ? 'checked' : ''; ?>>
81
- <?php _e( 'Use existing rules to find content', 'printfriendly' ); ?>
82
- </label>
83
- <label>
84
- <input type="radio" id="pf_algo_css_fallback_error" name="<?php echo $this->option_name; ?>[pf_algo_css_content]" value="error-message" <?php echo $this->options['pf_algo_css_content'] === 'error-message' ? 'checked' : ''; ?>>
85
- <?php _e( 'Show an error message', 'printfriendly' ); ?>
86
- </label>
87
- <p class="description">
88
- <?php _e( 'This setting can be used to configure the behaviour of the plugin, when content CSS selector does not match any content.', 'printfriendly' ); ?>
89
- <br/>
90
- <?php _e( 'We recommend setting this to "Use existing rules to find content" in production and to "Show an error message" in development.', 'printfriendly' ); ?></p>
91
- <div class="pf-bu-mt-5"></div>
92
- <div class="pf-accordion">
93
- <label><?php _e( 'Show Options Code', 'printfriendly' ); ?></label>
94
- <div>
95
- <code class="pf-custom-css-code"><?php echo esc_html( $customCssOptionCode ); ?></code>
96
- <a class="pf-clipboard pf-custom-css-code-snippet" href="javascript:;" data-clipboard-text="<?php echo esc_attr( $customCssOptionCode ); ?>"><span class="pf-bu-tag pf-bu-is-info pf-bu-is-light"><?php _e( 'Copy Code', 'printfriendly' ); ?></span></a>
97
- </div>
98
- </div>
99
- </div>
100
- </div>
101
- </div>
102
- </div>
103
- </div>
104
- </div>
105
-
106
- <div class="pf-bu-card-footer">
107
- <p class="pf-bu-card-footer-item"><?php _e( 'Change this setting if your content is not showing in the preview.', 'printfriendly' ); ?></p>
108
- <p class="pf-bu-card-footer-item"><a href="https://printfriendly.freshdesk.com/support/solutions/articles/69000080285-page-content-not-selected" target="_new"><?php _e( 'Documentation', 'printfriendly' ); ?></a></p>
109
- </div>
110
- </div>
111
-
112
- <div class="pf-bu-block pf-bu-card">
113
- <header class="pf-bu-card-header">
114
- <p class="pf-bu-card-header-title">
115
- <?php _e( 'Button Style', 'printfriendly' ); ?>
116
- </p>
117
- </header>
118
-
119
- <div class="pf-bu-card-content">
120
-
121
- <div class="pf-bu-columns pf-bu-is-multiline" id="button-style">
122
- <?php
123
- $buttons = array(
124
- 'buttongroup1' => array(
125
- 'printfriendly-pdf-email-button.png',
126
- 'printfriendly-pdf-email-button-md.png',
127
- 'printfriendly-pdf-email-button-notext.png',
128
- ),
129
- 'buttongroup2' => array(
130
- 'printfriendly-pdf-button.png',
131
- 'printfriendly-pdf-button-nobg.png',
132
- 'printfriendly-pdf-button-nobg-md.png',
133
- ),
134
- 'buttongroup3' => array(
135
- 'printfriendly-button.png',
136
- 'printfriendly-button-nobg.png',
137
- 'printfriendly-button-md.png',
138
- 'printfriendly-button-lg.png',
139
- ),
140
- 'buttongroup4' => array(
141
- 'print-button.png',
142
- 'print-button-nobg.png',
143
- 'print-button-gray.png',
144
- ),
145
- );
146
-
147
- foreach ( $buttons as $class => $array ) {
148
- foreach ( $array as $button ) {
149
- ?>
150
- <div class="pf-bu-column pf-bu-is-one-quarter">
151
- <?php $this->radio( 'buttons/' . $button ); ?>
152
- </div>
153
- <?php
154
- }
155
- }
156
- ?>
157
-
158
- </div>
159
-
160
- <div class="pf-bu-columns">
161
- <div class="pf-bu-column">
162
- <label>
163
- <input id="custom-btn" class="radio" name="<?php echo $this->option_name; ?>[button_type]" type="radio" value="custom-button" <?php echo $this->checked( 'button_type', 'custom-button', false ); ?> >
164
- <?php _e( 'Custom Button', 'printfriendly' ); ?>
165
- </label>
166
-
167
- <div class="pf-bu-tile pf-bu-is-ancestor">
168
- <div class="custom-btn pf-bu-tile pf-bu-is-4 pf-bu-is-flex-direction-column" id="custom-img">
169
- <h2><?php _e( 'Image', 'printfriendly' ); ?></h2>
170
- <?php $this->radio_custom_image( 'https://cdn.printfriendly.com/icons/printfriendly-icon-sm.png' ); ?>
171
- <?php $this->radio_custom_image( 'https://cdn.printfriendly.com/icons/printfriendly-icon-md.png' ); ?>
172
- <?php $this->radio_custom_image( 'https://cdn.printfriendly.com/icons/printfriendly-icon-lg.png' ); ?>
173
-
174
- <label for="custom-image-rb" class="radio-custom-btn">
175
- <input id="custom-image-rb" type="radio" name="<?php echo $this->option_name; ?>[custom_button_icon]" value="custom-image" <?php $this->checked( 'custom_button_icon', 'custom-image' ); ?>>
176
- <?php _e( 'Use Your Image', 'printfriendly' ); ?>
177
-
178
- <div id="enter-image-url">
179
- <input type="button" class="pf_upload_image_button button button-secondary" data-pf-element="#custom_image" value="<?php _e( 'Select Image', 'printfriendly' ); ?>">
180
- <input id="custom_image" type="hidden" name="<?php echo $this->option_name; ?>[custom_image]" value="<?php $this->val( 'custom_image' ); ?>" />
181
- <span id="custom_image_label">
182
- <?php if ( ! empty( $this->val( 'custom_image', false ) ) ) { ?>
183
- <img src="<?php $this->val( 'custom_image' ); ?>">
184
- <?php } ?>
185
- </span>
186
- <div id="pf-custom-button-error"></div>
187
- </div>
188
- </label>
189
-
190
- <label class="radio-custom-btn">
191
- <input type="radio" name="<?php echo $this->option_name; ?>[custom_button_icon]" value="no-image" <?php $this->checked( 'custom_button_icon', 'no-image' ); ?>>
192
- <?php _e( 'No Image', 'printfriendly' ); ?>
193
- </label>
194
- </div>
195
-
196
- <div class="custom-btn pf-bu-tile pf-bu-is-4 pf-bu-is-flex-direction-column" id="custom-txt">
197
- <h2><?php _e( 'Text', 'printfriendly' ); ?></h2>
198
- <div id="txt-enter">
199
- <div class="pf-form-element">
200
- <input id="custom-text-rb" type="radio" name="<?php echo $this->option_name; ?>[custom_button_text]" value="custom-text" <?php $this->checked( 'custom_button_text', 'custom-text' ); ?>>
201
- <input id="custom_text" type="text" size="10" class="clear regular-text" name="<?php echo $this->option_name; ?>[custom_text]" value="<?php $this->val( 'custom_text' ); ?>">
202
-
203
- <div id="pf-txt-attributes">
204
- <div id="txt-size">
205
- <?php _e( 'Text Size', 'printfriendly' ); ?>
206
- <input type="number" id="text_size" min="9" max="25" class="small-text" name="<?php echo $this->option_name; ?>[text_size]" value="<?php $this->val( 'text_size' ); ?>" />
207
- <input type="text" class="pf-color-picker" name="<?php echo $this->option_name; ?>[text_color]" id="text_color" value="<?php $this->val( 'text_color' ); ?>" />
208
- </div>
209
- </div>
210
-
211
- </div>
212
-
213
- <label>
214
- <input type="radio" id="custom-text-no" name="<?php echo $this->option_name; ?>[custom_button_text]" value="no-text" <?php $this->checked( 'custom_button_text', 'no-text' ); ?>>
215
- <?php _e( 'No Text', 'printfriendly' ); ?>
216
- </label>
217
- </div>
218
- </div>
219
-
220
- <div class="custom-btn pf-bu-tile pf-bu-is-4 pf-bu-is-flex-direction-column" id="custom-button-preview">
221
- <h2><?php _e( 'Preview', 'printfriendly' ); ?></h2>
222
- <?php $this->custom_button_preview(); ?>
223
- </div>
224
- </div>
225
- </div>
226
- </div>
227
- </div>
228
- </div>
229
-
230
- <div class="pf-bu-block pf-bu-card">
231
- <header class="pf-bu-card-header">
232
- <p class="pf-bu-card-header-title">
233
- <?php _e( 'Button Position', 'printfriendly' ); ?>
234
- </p>
235
- </header>
236
-
237
- <div class="pf-bu-card-content pf-features">
238
- <div class="pf-label-inline">
239
- <label for="pf_content_position" class="pf-bu-label"><?php _e( 'Alignment', 'printfriendly' ); ?></label>
240
- <div>
241
- <select class="pf-bu-select" id="pf_content_position" name="<?php echo $this->option_name; ?>[content_position]">
242
- <option value="left" <?php selected( $this->options['content_position'], 'left' ); ?>><?php _e( 'Left Align', 'printfriendly' ); ?></option>
243
- <option value="right" <?php selected( $this->options['content_position'], 'right' ); ?>><?php _e( 'Right Align', 'printfriendly' ); ?></option>
244
- <option value="center" <?php selected( $this->options['content_position'], 'center' ); ?>><?php _e( 'Center', 'printfriendly' ); ?></option>
245
- <option value="none" <?php selected( $this->options['content_position'], 'none' ); ?>><?php _e( 'None', 'printfriendly' ); ?></option>
246
- </select>
247
- </div>
248
- </div>
249
-
250
- <div class="pf-label-inline">
251
- <label for="pf_content_placement" class="pf-bu-label"><?php _e( 'Placement', 'printfriendly' ); ?></label>
252
- <div>
253
- <select class="pf-bu-select" id="pf_content_placement" name="<?php echo $this->option_name; ?>[content_placement]">
254
- <option value="before" <?php selected( $this->options['content_placement'], 'before' ); ?>><?php _e( 'Above Content', 'printfriendly' ); ?></option>
255
- <option value="after" <?php selected( $this->options['content_placement'], 'after' ); ?>><?php _e( 'Below Content', 'printfriendly' ); ?></option>
256
- </select>
257
- </div>
258
- </div>
259
- </div>
260
- </div>
261
-
262
- <div class="pf-bu-block pf-bu-card">
263
- <header class="pf-bu-card-header">
264
- <p class="pf-bu-card-header-title">
265
- <?php _e( 'Button Display', 'printfriendly' ); ?>
266
- </p>
267
- </header>
268
-
269
- <div class="pf-bu-card-content">
270
- <label for="pages" class="pf-bu-label"><?php _e( 'Pages to show on', 'printfriendly' ); ?></label>
271
- <div id="pages">
272
- <?php $this->create_checkbox( 'posts', __( 'Posts', 'printfriendly' ) ); ?>
273
- <?php $this->create_checkbox( 'pages', __( 'Pages', 'printfriendly' ) ); ?>
274
- <?php $this->create_checkbox( 'homepage', __( 'Homepage', 'printfriendly' ) ); ?>
275
- <?php $this->create_checkbox( 'categories', __( 'Category Pages', 'printfriendly' ) ); ?>
276
- <?php $this->create_checkbox( 'taxonomies', __( 'Taxonomy Pages', 'printfriendly' ) ); ?>
277
- <label for="show_on_template">
278
- <input type="checkbox" class="show_template" name="show_on_template" id="show_on_template" /><?php echo _e( 'Add direct to template', 'printfriendly' ); ?>
279
- </label>
280
-
281
- <div id="pf-snippet">
282
- <code>&lt;?php if( function_exists( 'pf_show_link' ) ){ echo pf_show_link(); } ?&gt;</code>
283
- <a class="pf-clipboard" href="javascript:;" data-clipboard-text="<?php echo '&lt;?php if( function_exists( \'pf_show_link\' ) ) { echo pf_show_link(); } ?&gt;'; ?>"><span class="pf-bu-tag pf-bu-is-info pf-bu-is-light"><?php _e( 'Copy Snippet', 'printfriendly' ); ?></span></a>
284
- </div>
285
-
286
- <label<?php /* for="pf-shortcode2"*/ ?>><?php _e( 'or use the shortcode inside your page/article', 'printfriendly' ); ?></label>
287
- <code>[printfriendly]</code><a class="pf-clipboard" href="javascript:;" data-clipboard-text="<?php echo '[printfriendly]'; ?>"><span class="pf-bu-tag pf-bu-is-info pf-bu-is-light"><?php _e( 'Copy Shortcode', 'printfriendly' ); ?></span></a>
288
- </div>
289
-
290
- <hr/>
291
- <label for="categories" class="pf-bu-label"><?php _e( 'Specific categories to show on', 'printfriendly' ); ?></label>
292
- <?php
293
- wp_dropdown_categories(
294
- apply_filters(
295
- 'printfriendly_category_args', array(
296
- 'show_count' => 0,
297
- 'orderby' => 'name',
298
- 'hide_empty' => false, // show a category even if it has no posts assigned
299
- 'class' => 'pf-select2',
300
- 'name' => 'printfriendly_option[show_on_cat]',
301
- 'id' => 'show_on_cat',
302
- 'selected' => isset( $this->options['show_on_cat'] ) ? $this->options['show_on_cat'] : '',
303
- 'multiple' => true,
304
- )
305
- )
306
- );
307
- ?>
308
- </div>
309
-
310
- <div class="pf-bu-card-footer">
311
- <p class="pf-bu-card-footer-item"><a href="https://printfriendly.freshdesk.com/support/solutions/articles/69000080457-manual-button-placement-in-wordpress" target="_new"><?php _e( 'Documentation', 'printfriendly' ); ?></a></p>
312
- </div>
313
-
314
- </div>
315
-
316
- <div class="pf-bu-block pf-bu-card">
317
- <header class="pf-bu-card-header">
318
- <p class="pf-bu-card-header-title">
319
- <?php _e( 'Pro Exclusive Features', 'printfriendly' ); ?>
320
- </p>
321
- </header>
322
-
323
- <div class="pf-bu-card-content pf-features">
324
- <div class="pf-label-inline">
325
- <label for="password_protected" class="pf-bu-label"><?php _e( 'Encode images', 'printfriendly' ); ?></label>
326
- <div>
327
- <select class="pf-bu-select" id="password_protected" name="<?php echo $this->option_name; ?>[password_protected]">
328
- <option value="no" <?php selected( $this->val( 'password_protected', false ), 'no' ); ?>><?php _e( 'No', 'printfriendly' ); ?></option>
329
- <option value="yes" <?php selected( $this->val( 'password_protected', false ), 'yes' ); ?>><?php _e( 'Yes', 'printfriendly' ); ?></option>
330
- </select>
331
- <p class="description"><?php _e( 'Select "Yes" if your site is not publicly accessible or if your provider blocks image requests from third parties or if images are not present in PDF', 'printfriendly' ); ?></p>
332
- </div>
333
- </div>
334
-
335
- <div class="pf-label-inline">
336
- <label for="show_hidden_content" class="pf-bu-label"><?php _e( 'Show Hidden Content', 'printfriendly' ); ?></label>
337
- <div>
338
- <select class="pf-bu-select" id="show_hidden_content" name="<?php echo $this->option_name; ?>[show_hidden_content]">
339
- <option value="no" <?php selected( $this->val( 'show_hidden_content', false ), 'no' ); ?>><?php _e( 'No', 'printfriendly' ); ?></option>
340
- <option value="yes" <?php selected( $this->val( 'show_hidden_content', false ), 'yes' ); ?>><?php _e( 'Yes', 'printfriendly' ); ?></option>
341
- </select>
342
- <p class="description"><?php _e( 'By default PrintFriendly Pro will only show the visible content on the page. Select "Yes", if you want PrintFriendly to show hidden content. (Ex. Content in hidden tabs)', 'printfriendly' ); ?></p>
343
- </div>
344
- </div>
345
- </div>
346
-
347
- <div class="pf-bu-card-footer">
348
- <p class="pf-bu-card-footer-item"><?php _e( 'These features require a Pro subscription.', 'printfriendly' ); ?>&nbsp;<a href="https://www.printfriendly.com/pro" target="_blank"><?php _e( 'Learn More', 'printfriendly' ); ?></a></p>
349
- </div>
350
- </div>
351
-
352
- <div class="pf-bu-container">
353
- <div class="pf-bu-is-flex pf-bu-is-justify-content-center">
354
- <input type="submit" class="button-primary pf-bu-is-medium pf-bu-button" value="<?php esc_attr_e( 'Save Options', 'printfriendly' ); ?>" />
355
- <input type="reset" class="button-secondary pf-bu-is-medium pf-bu-button" value="<?php esc_attr_e( 'Cancel', 'printfriendly' ); ?>" />
356
- </div>
357
- </div>
358
- </div>
359
- </section>
360
-
361
- <section id="tab-advanced">
362
- <div class="pf-bu-container">
363
-
364
- <div class="pf-bu-block pf-bu-card">
365
- <header class="pf-bu-card-header">
366
- <p class="pf-bu-card-header-title">
367
- <?php _e( 'Page header', 'printfriendly' ); ?>
368
- </p>
369
- </header>
370
-
371
- <div class="pf-bu-card-content">
372
- <div class="pf-bu-columns">
373
- <div class="pf-bu-column pf-bu-is-6">
374
- <label for="icon_favicon">
375
- <input id="icon_favicon" type="radio" name="<?php echo $this->option_name; ?>[logo]" value="favicon" <?php echo $this->options['logo'] === 'favicon' ? 'checked' : ''; ?>>
376
- <?php _e( 'My Website Icon', 'printfriendly' ); ?>
377
- </label>
378
- </div>
379
-
380
- <div class="pf-bu-column pf-bu-is-6">
381
- <label for="icon-upload-an-image">
382
- <input id="icon-upload-an-image" type="radio" name="<?php echo $this->option_name; ?>[logo]" value="upload-an-image" <?php echo $this->options['logo'] === 'upload-an-image' ? 'checked' : ''; ?>>
383
- <?php _e( 'Custom Image', 'printfriendly' ); ?>
384
-
385
- <div id="custom-logo"><div class="pf-bu-tile pf-bu-is-ancestor">
386
- <div class="pf-bu-tile pf-bu-is-vertical">
387
- <div class="pf-bu-tile pf-bu-is-4 pf-bu-is-flex-direction-column">
388
- <div>
389
- <input type="button" class="pf_upload_image_button button button-secondary" data-pf-element="#custom_logo" value="<?php _e( 'Select Image', 'printfriendly' ); ?>">
390
- <input id="custom_logo" type="hidden" name="<?php echo $this->option_name; ?>[image_url]" value="<?php $this->val( 'image_url' ); ?>" />
391
- <span id="custom_logo_label">
392
- <?php if ( ! empty( $this->val( 'image_url', false ) ) ) { ?>
393
- <img src="<?php $this->val( 'image_url' ); ?>">
394
- <?php } ?>
395
- </span>
396
- </div>
397
- </div>
398
-
399
- <div class="pf-bu-tile pf-bu-is-4 pf-bu-is-flex-direction-column">
400
- <div>
401
- <div class="pf-bu-field pf-bu-has-addons">
402
- <p class="pf-bu-control">
403
- <a class="pf-bu-button pf-bu-is-static">
404
- <?php _e( 'Tagline (optional)', 'printfriendly' ); ?>
405
- </a>
406
- </p>
407
- <p class="pf-bu-control">
408
- <input id="image-tagline" type="text" class="pf-bu-input regular-text pf-regular-text" name="<?php echo $this->option_name; ?>[tagline]" value="<?php $this->val( 'tagline' ); ?>" />
409
- </p>
410
- </div>
411
- </div>
412
- </div>
413
- </div>
414
- </div></div>
415
-
416
- </label>
417
- </div>
418
- </div>
419
- <div id="pf-image-error"></div>
420
- <div id="pf-image-preview"></div>
421
- </div>
422
-
423
- <div class="pf-bu-card-footer">
424
- <p class="pf-bu-card-footer-item"><a href="https://printfriendly.freshdesk.com/support/solutions/articles/69000080358-create-a-custom-header-in-wordpress" target="_new"><?php _e( 'Documentation', 'printfriendly' ); ?></a></p>
425
- </div>
426
- </div>
427
-
428
- <div class="pf-bu-block pf-bu-card">
429
- <header class="pf-bu-card-header">
430
- <p class="pf-bu-card-header-title">
431
- <?php _e( 'Features', 'printfriendly' ); ?>
432
- </p>
433
- </header>
434
-
435
- <div class="pf-bu-card-content pf-features">
436
- <div class="pf-label-inline">
437
- <label for="pf-analytics-tracking" class="pf-bu-label"><?php _e( 'Track in Google Analytics', 'printfriendly' ); ?></label>
438
- <div>
439
- <select class="pf-bu-select" id="pf-analytics-tracking" name="<?php echo $this->option_name; ?>[enable_google_analytics]">
440
- <option value="yes" <?php $this->selected( 'enable_google_analytics', 'yes' ); ?>> <?php _e( 'Yes', 'printfriendly' ); ?></option>
441
- <option value="no" <?php $this->selected( 'enable_google_analytics', 'no' ); ?>> <?php _e( 'No', 'printfriendly' ); ?></option>
442
- </select>
443
- </div>
444
- </div>
445
-
446
- <div class="pf-label-inline">
447
- <label for="click-to-delete" class="pf-bu-label"><?php _e( 'Click to delete', 'printfriendly' ); ?></label>
448
- <div>
449
- <select class="pf-bu-select" name="<?php echo $this->option_name; ?>[click_to_delete]" id="click-to-delete">
450
- <option value="0" <?php selected( $this->options['click_to_delete'], '0' ); ?>><?php _e( 'Allow', 'printfriendly' ); ?></option>
451
- <option value="1" <?php selected( $this->options['click_to_delete'], '1' ); ?>><?php _e( 'Not Allow', 'printfriendly' ); ?></option>
452
- </select>
453
- <p class="description"><?php echo sprintf( __( 'Read documentation about this feature %1$shere%2$s', 'printfriendly' ), '<a href="https://printfriendly.freshdesk.com/support/solutions/articles/69000080475-turn-off-the-click-to-delete-option-in-wordpress" target="_new">', '</a>' ); ?></p>
454
- </div>
455
- </div>
456
-
457
- <div class="pf-label-inline">
458
- <label for="images-size" class="pf-bu-label"><?php _e( 'Image size', 'printfriendly' ); ?></label>
459
- <div>
460
- <select class="pf-bu-select" name="<?php echo $this->option_name; ?>[images-size]" id="images-size">
461
- <option value="full-size" <?php selected( $this->options['images-size'], 'full-size' ); ?>><?php _e( 'Full Size', 'printfriendly' ); ?></option>
462
- <option value="large" <?php selected( $this->options['images-size'], 'large' ); ?>><?php _e( 'Large', 'printfriendly' ); ?></option>
463
- <option value="medium" <?php selected( $this->options['images-size'], 'medium' ); ?>><?php _e( 'Medium', 'printfriendly' ); ?></option>
464
- <option value="small" <?php selected( $this->options['images-size'], 'small' ); ?>><?php _e( 'Small', 'printfriendly' ); ?></option>
465
- <option value="remove-images" <?php selected( $this->options['images-size'], 'remove-images' ); ?>><?php _e( 'Remove Images', 'printfriendly' ); ?></option>
466
- </select>
467
- </div>
468
- </div>
469
-
470
- <div class="pf-label-inline">
471
- <label for="image-style" class="pf-bu-label"><?php _e( 'Image style', 'printfriendly' ); ?></label>
472
- <div>
473
- <select class="pf-bu-select" name="<?php echo $this->option_name; ?>[image-style]" id="image-style">
474
- <option value="block" <?php selected( $this->options['image-style'], 'block' ); ?>><?php _e( 'Center/Block', 'printfriendly' ); ?></option>
475
- <option value="right" <?php selected( $this->options['image-style'], 'right' ); ?>><?php _e( 'Align Right', 'printfriendly' ); ?></option>
476
- <option value="left" <?php selected( $this->options['image-style'], 'left' ); ?>><?php _e( 'Align Left', 'printfriendly' ); ?></option>
477
- <option value="none" <?php selected( $this->options['image-style'], 'none' ); ?>><?php _e( 'Align None', 'printfriendly' ); ?></option>
478
- </select>
479
- <p class="description"><?php echo sprintf( __( 'Read documentation about this feature %1$shere%2$s', 'printfriendly' ), '<a href="https://printfriendly.freshdesk.com/support/solutions/articles/69000080507-remove-images-option" target="_new">', '</a>' ); ?></p>
480
- </div>
481
- </div>
482
-
483
- <div class="pf-label-inline">
484
- <label for="email" class="pf-bu-label"><?php _e( 'Email', 'printfriendly' ); ?></label>
485
- <div>
486
- <select class="pf-bu-select" name="<?php echo $this->option_name; ?>[email]" id="email">
487
- <option value="0" <?php selected( $this->options['email'], '0' ); ?>><?php _e( 'Allow', 'printfriendly' ); ?></option>
488
- <option value="1" <?php selected( $this->options['email'], '1' ); ?>><?php _e( 'Not Allow', 'printfriendly' ); ?></option>
489
- </select>
490
- </div>
491
- </div>
492
-
493
- <div class="pf-label-inline">
494
- <label for="pdf" class="pf-bu-label"><?php _e( 'PDF', 'printfriendly' ); ?></label>
495
- <div>
496
- <select class="pf-bu-select" name="<?php echo $this->option_name; ?>[pdf]" id="pdf">
497
- <option value="0" <?php selected( $this->options['pdf'], '0' ); ?>><?php _e( 'Allow', 'printfriendly' ); ?></option>
498
- <option value="1" <?php selected( $this->options['pdf'], '1' ); ?>><?php _e( 'Not Allow', 'printfriendly' ); ?></option>
499
- </select>
500
- <p class="description"><strong><?php _e( 'Developer Note', 'printfriendly' ); ?></strong>: <?php _e( 'On localhost the images can not be included in the PDF. Once the website is live/public images will be included in the PDF.', 'printfriendly' ); ?></p>
501
- </div>
502
- </div>
503
-
504
- <div class="pf-label-inline">
505
- <label for="print" class="pf-bu-label"><?php _e( 'Print', 'printfriendly' ); ?></label>
506
- <div>
507
- <select class="pf-bu-select" name="<?php echo $this->option_name; ?>[print]" id="print">
508
- <option value="0" <?php selected( $this->options['print'], '0' ); ?>><?php _e( 'Allow', 'printfriendly' ); ?></option>
509
- <option value="1" <?php selected( $this->options['print'], '1' ); ?>><?php _e( 'Not Allow', 'printfriendly' ); ?></option>
510
- </select>
511
- </div>
512
- </div>
513
-
514
- </div>
515
- </div>
516
-
517
- <div class="pf-bu-block pf-bu-card">
518
- <header class="pf-bu-card-header">
519
- <p class="pf-bu-card-header-title">
520
- <?php _e( 'Custom CSS', 'printfriendly' ); ?>
521
- </p>
522
- </header>
523
-
524
- <div class="pf-bu-card-content">
525
- <?php if ( ! $this->is_pro( 'custom-css' ) ) { ?>
526
- <label for="custom_css_url">
527
- <?php _e( 'Custom CSS URL', 'printfriendly' ); ?>
528
- <input id="custom_css_url" type="url" class="regular-text" name="<?php echo $this->option_name; ?>[custom_css_url]" value="<?php $this->val( 'custom_css_url' ); ?>" />
529
- </label>
530
- <?php } else { ?>
531
- <label for="custom_css">
532
- <textarea id="custom_css" class="regular-text pf-bu-textarea" rows="5" cols="80" name="<?php echo $this->option_name; ?>[custom_css]"><?php echo html_entity_decode( esc_textarea( $this->val( 'custom_css', false ) ) ); ?></textarea>
533
- <p class="desc"><?php echo $this->get_custom_css_upgrade_message(); ?></p>
534
- </label>
535
- <?php } ?>
536
- </div>
537
-
538
- <div class="pf-bu-card-footer">
539
- <p class="pf-bu-card-footer-item">
540
- <?php
541
- if ( ! $this->is_pro( 'custom-css' ) ) {
542
- _e( 'Customize the styles of the printed/pdf page using your own CSS. Create your custom CSS, and put the URL to your Custom CSS file in the box above', 'printfriendly' );
543
- } else {
544
- echo sprintf( __( 'Customize the styles of the printed/pdf page using your own CSS. Add your custom CSS (without the %s tags) in the box above', 'printfriendly' ), '<code>&lt;style&gt;</code>' );
545
- }
546
- ?>
547
- </p>
548
- </div>
549
-
550
- </div>
551
-
552
- <div class="pf-bu-container">
553
- <div class="pf-bu-is-flex pf-bu-is-justify-content-center">
554
- <input type="submit" class="button-primary pf-bu-is-medium pf-bu-button" value="<?php esc_attr_e( 'Save Options', 'printfriendly' ); ?>" />
555
- <input type="reset" class="button-secondary pf-bu-is-medium pf-bu-button" value="<?php esc_attr_e( 'Cancel', 'printfriendly' ); ?>" />
556
- </div>
557
- </div>
558
-
559
- </div>
560
- </section>
561
-
562
-
563
- <?php if ( WP_DEBUG ) { ?>
564
- <section id="tab-debug">
565
- <div class="pf-bu-container">
566
- <div class="pf-bu-block pf-bu-card">
567
- <header class="pf-bu-card-header">
568
- <p class="pf-bu-card-header-title">
569
- <?php _e( 'Debug options', 'printfriendly' ); ?>
570
- </p>
571
- </header>
572
-
573
- <div class="pf-bu-card-content">
574
- <pre><?php echo print_r( $this->options, 1 ); ?></pre>
575
- </div>
576
-
577
- <div class="pf-bu-card-footer">
578
- <p class="pf-bu-card-footer-item"><?php _e( 'Currently in Debug Mode. This tab is visible in debug mode only', 'printfriendly' ); ?></p>
579
- </div>
580
- </div>
581
- </div>
582
- </section>
583
- <?php } ?>
584
-
585
- </div>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <div id="pf-tabs">
2
+ <div class="pf-bu-tabs pf-bu-is-centered">
3
+ <ul>
4
+ <li class="<?php echo $this->is_tab(0) ? 'pf-bu-is-active' : ''; ?>" data-id="0"><a href="#tab-standard"><?php _e('Standard', 'printfriendly'); ?></a></li>
5
+ <li class="<?php echo $this->is_tab(1) ? 'pf-bu-is-active' : ''; ?>" data-id="1"><a href="#tab-advanced"><?php _e('Advanced', 'printfriendly'); ?></a></li>
6
+ <?php if (WP_DEBUG) { ?>
7
+ <li><a href="#tab-debug"><?php _e('Debug', 'printfriendly'); ?></a></li>
8
+ <?php } ?>
9
+ </ul>
10
+ </div>
11
+
12
+ <section id="tab-standard">
13
+ <div class="pf-bu-container">
14
+
15
+ <?php include_once PRINTFRIENDLY_BASEPATH . '/views/pro.php'; ?>
16
+
17
+ <div class="pf-bu-block pf-bu-card">
18
+ <header class="pf-bu-card-header">
19
+ <p class="pf-bu-card-header-title">
20
+ <?php _e('Select content using', 'printfriendly'); ?>
21
+ </p>
22
+ </header>
23
+
24
+ <div class="pf-bu-card-content">
25
+ <?php
26
+ $disabled = $message = '';
27
+ if (class_exists('WooCommerce')) {
28
+ $disabled = 'disabled';
29
+ $message = '(' . __('Not available for WooCommerce', 'printfriendly') . ')';
30
+ }
31
+ ?>
32
+
33
+ <div>
34
+ <div>
35
+ <label for="pf-algo-wp">
36
+ <input id="pf-algo-wp" type="radio" name="<?php echo $this->option_name; ?>[pf_algo]" value="wp" <?php echo $this->options['pf_algo'] === 'wp' ? 'checked' : ''; ?> <?php echo $disabled; ?>>
37
+ <?php _e('WP Template', 'printfriendly'); ?> <?php echo $message; ?>
38
+ </label>
39
+ </div>
40
+
41
+ <div>
42
+ <label for="pf-algo-pf">
43
+ <input id="pf-algo-pf" type="radio" name="<?php echo $this->option_name; ?>[pf_algo]" value="pf" <?php echo $this->options['pf_algo'] === 'pf' ? 'checked' : ''; ?>>
44
+ <?php _e('Content Algorithm', 'printfriendly'); ?>
45
+ </label>
46
+ </div>
47
+
48
+ <div>
49
+ <label for="pf-algo-css">
50
+ <input id="pf-algo-css" type="radio" name="<?php echo $this->option_name; ?>[pf_algo]" value="css" <?php echo $this->options['pf_algo'] === 'css' ? 'checked' : ''; ?>>
51
+ <?php _e('Custom CSS Selectors', 'printfriendly'); ?>
52
+ </label>
53
+ <div class="pf-algo-usage pf-algo-usage-css" style="display: none" data-tag-template="<?php echo esc_attr('<printfriendly-options data-selectors="#1" data-fallback-strategy="#2"></printfriendly-options>'); ?>">
54
+ <div class="pf-bu-columns">
55
+ <div class="pf-bu-column pf-bu-one-sixth pf-algo-usage-css-fields">
56
+ <div>
57
+ <label for="pf-algo-usage-css-author"><?php _e('Author Selector', 'printfriendly'); ?></label>
58
+ <input type="text" id="pf-algo-usage-css-author" name="<?php echo $this->option_name; ?>[css-author]" value="<?php $this->val('css-author'); ?>" data-selector-name="authorSelector">
59
+ </div>
60
+ <div>
61
+ <label for="pf-algo-usage-css-content"><?php _e('Content Selector', 'printfriendly'); ?></label>
62
+ <input type="text" id="pf-algo-usage-css-content" name="<?php echo $this->option_name; ?>[css-content]" value="<?php $this->val('css-content'); ?>" data-selector-name="contentSelectors">
63
+ </div>
64
+ <div>
65
+ <label for="pf-algo-usage-css-date"><?php _e('Date Selector', 'printfriendly'); ?></label>
66
+ <input type="text" id="pf-algo-usage-css-date" name="<?php echo $this->option_name; ?>[css-date]" value="<?php $this->val('css-date'); ?>" data-selector-name="dateSelector">
67
+ </div>
68
+ <div>
69
+ <label for="pf-algo-usage-css-title"><?php _e('Title Selector', 'printfriendly'); ?></label>
70
+ <input type="text" id="pf-algo-usage-css-title" name="<?php echo $this->option_name; ?>[css-title]" value="<?php $this->val('css-title'); ?>" data-selector-name="titleSelector">
71
+ </div>
72
+ <div>
73
+ <label for="pf-algo-usage-css-image"><?php _e('Image Selector', 'printfriendly'); ?></label>
74
+ <input type="text" id="pf-algo-usage-css-image" name="<?php echo $this->option_name; ?>[css-primaryImage]" value="<?php $this->val('css-primaryImage'); ?>" data-selector-name="primaryImageSelector">
75
+ </div>
76
+ </div>
77
+ <div class="pf-bu-column pf-bu-one-sixth pf-algo-usage-css-strategy">
78
+ <label><?php _e('Content Fallback Strategy', 'printfriendly'); ?></label>
79
+ <label>
80
+ <input type="radio" id="pf_algo_css_fallback_original" name="<?php echo $this->option_name; ?>[pf_algo_css_content]" value="original" <?php echo ( empty($this->options['pf_algo_css_content']) || $this->options['pf_algo_css_content'] === 'original' ) ? 'checked' : ''; ?>>
81
+ <?php _e('Use existing rules to find content', 'printfriendly'); ?>
82
+ </label>
83
+ <label>
84
+ <input type="radio" id="pf_algo_css_fallback_error" name="<?php echo $this->option_name; ?>[pf_algo_css_content]" value="error-message" <?php echo $this->options['pf_algo_css_content'] === 'error-message' ? 'checked' : ''; ?>>
85
+ <?php _e('Show an error message', 'printfriendly'); ?>
86
+ </label>
87
+ <p class="description">
88
+ <?php _e('This setting can be used to configure the behaviour of the plugin, when content CSS selector does not match any content.', 'printfriendly'); ?>
89
+ <br/>
90
+ <?php _e('We recommend setting this to "Use existing rules to find content" in production and to "Show an error message" in development.', 'printfriendly'); ?></p>
91
+ <div class="pf-bu-mt-5"></div>
92
+ <div class="pf-accordion">
93
+ <label><?php _e('Show Options Code', 'printfriendly'); ?></label>
94
+ <div>
95
+ <code class="pf-custom-css-code"><?php echo esc_html($customCssOptionCode); ?></code>
96
+ <a class="pf-clipboard pf-custom-css-code-snippet" href="javascript:;" data-clipboard-text="<?php echo esc_attr($customCssOptionCode); ?>"><span class="pf-bu-tag pf-bu-is-info pf-bu-is-light"><?php _e('Copy Code', 'printfriendly'); ?></span></a>
97
+ </div>
98
+ </div>
99
+ </div>
100
+ </div>
101
+ </div>
102
+ </div>
103
+ </div>
104
+ </div>
105
+
106
+ <div class="pf-bu-card-footer">
107
+ <p class="pf-bu-card-footer-item"><?php _e('Change this setting if your content is not showing in the preview.', 'printfriendly'); ?></p>
108
+ <p class="pf-bu-card-footer-item"><a href="https://printfriendly.freshdesk.com/support/solutions/articles/69000080285-page-content-not-selected" target="_new"><?php _e('Documentation', 'printfriendly'); ?></a></p>
109
+ </div>
110
+ </div>
111
+
112
+ <div class="pf-bu-block pf-bu-card">
113
+ <header class="pf-bu-card-header">
114
+ <p class="pf-bu-card-header-title">
115
+ <?php _e('Button Style', 'printfriendly'); ?>
116
+ </p>
117
+ </header>
118
+
119
+ <div class="pf-bu-card-content">
120
+
121
+ <div class="pf-bu-columns pf-bu-is-multiline" id="button-style">
122
+ <?php
123
+ // if any images are added here, add to $__buttons tooo
124
+ $buttons = array(
125
+ 'buttongroup1' => array(
126
+ 'printfriendly-pdf-email-button.png',
127
+ 'printfriendly-pdf-email-button-md.png',
128
+ 'printfriendly-pdf-email-button-notext.png',
129
+ ),
130
+ 'buttongroup2' => array(
131
+ 'printfriendly-pdf-button.png',
132
+ 'printfriendly-pdf-button-nobg.png',
133
+ 'printfriendly-pdf-button-nobg-md.png',
134
+ ),
135
+ 'buttongroup3' => array(
136
+ 'printfriendly-button.png',
137
+ 'printfriendly-button-nobg.png',
138
+ 'printfriendly-button-md.png',
139
+ 'printfriendly-button-lg.png',
140
+ ),
141
+ 'buttongroup4' => array(
142
+ 'print-button.png',
143
+ 'print-button-nobg.png',
144
+ 'print-button-gray.png',
145
+ ),
146
+ );
147
+
148
+ foreach ($buttons as $class => $array) {
149
+ foreach ($array as $button) {
150
+ ?>
151
+ <div class="pf-bu-column pf-bu-is-one-quarter">
152
+ <?php $this->radio('buttons/' . $button); ?>
153
+ </div>
154
+ <?php
155
+ }
156
+ }
157
+ ?>
158
+
159
+ </div>
160
+
161
+ <div class="pf-bu-columns">
162
+ <div class="pf-bu-column">
163
+ <label>
164
+ <input id="custom-btn" class="radio" name="<?php echo $this->option_name; ?>[button_type]" type="radio" value="custom-button" <?php echo $this->checked('button_type', 'custom-button', false); ?> >
165
+ <?php _e('Custom Button', 'printfriendly'); ?>
166
+ </label>
167
+
168
+ <div class="pf-bu-tile pf-bu-is-ancestor">
169
+ <div class="custom-btn pf-bu-tile pf-bu-is-4 pf-bu-is-flex-direction-column" id="custom-img">
170
+ <h2><?php _e('Image', 'printfriendly'); ?></h2>
171
+ <?php
172
+ // if any images are added here, add to $__buttons tooo
173
+ $icons = array(
174
+ 'icons/printfriendly-icon-sm.png',
175
+ 'icons/printfriendly-icon-md.png',
176
+ 'icons/printfriendly-icon-lg.png',
177
+ );
178
+ foreach ($icons as $icon) {
179
+ $this->radio_custom_image($icon);
180
+ }
181
+ ?>
182
+ <label for="custom-image-rb" class="radio-custom-btn">
183
+ <input id="custom-image-rb" type="radio" name="<?php echo $this->option_name; ?>[custom_button_icon]" value="custom-image" <?php $this->checked('custom_button_icon', 'custom-image'); ?>>
184
+ <?php _e('Use Your Image', 'printfriendly'); ?>
185
+
186
+ <div id="enter-image-url">
187
+ <input type="button" class="pf_upload_image_button button button-secondary" data-pf-element="#custom_image" value="<?php _e('Select Image', 'printfriendly'); ?>">
188
+ <input id="custom_image" type="hidden" name="<?php echo $this->option_name; ?>[custom_image]" value="<?php $this->val('custom_image'); ?>" />
189
+ <span id="custom_image_label">
190
+ <?php if (! empty($this->val('custom_image', false))) { ?>
191
+ <img src="<?php $this->val('custom_image'); ?>">
192
+ <?php } ?>
193
+ </span>
194
+ <div id="custom-img-sizes">
195
+ <?php _e('Width', 'printfriendly'); ?>
196
+ <input type="number" id="custom-img-width" min="0" class="small-text" name="<?php echo $this->option_name; ?>[custom_image_width]" value="<?php $this->val('custom_image_width'); ?>" />px
197
+ <?php _e('Height', 'printfriendly'); ?>
198
+ <input type="number" id="custom-img-height" min="0" class="small-text" name="<?php echo $this->option_name; ?>[custom_image_height]" value="<?php $this->val('custom_image_height'); ?>" />px
199
+ </div>
200
+ <div id="pf-custom-button-error"></div>
201
+ </div>
202
+ </label>
203
+
204
+ <label class="radio-custom-btn">
205
+ <input type="radio" name="<?php echo $this->option_name; ?>[custom_button_icon]" value="no-image" <?php $this->checked('custom_button_icon', 'no-image'); ?>>
206
+ <?php _e('No Image', 'printfriendly'); ?>
207
+ </label>
208
+ </div>
209
+
210
+ <div class="custom-btn pf-bu-tile pf-bu-is-4 pf-bu-is-flex-direction-column" id="custom-txt">
211
+ <h2><?php _e('Text', 'printfriendly'); ?></h2>
212
+ <div id="txt-enter">
213
+ <div class="pf-form-element">
214
+ <input id="custom-text-rb" type="radio" name="<?php echo $this->option_name; ?>[custom_button_text]" value="custom-text" <?php $this->checked('custom_button_text', 'custom-text'); ?>>
215
+ <input id="custom_text" type="text" size="10" class="clear regular-text" name="<?php echo $this->option_name; ?>[custom_text]" value="<?php $this->val('custom_text'); ?>">
216
+
217
+ <div id="pf-txt-attributes">
218
+ <div id="txt-size">
219
+ <?php _e('Text Size', 'printfriendly'); ?>
220
+ <input type="number" id="text_size" min="9" max="25" class="small-text" name="<?php echo $this->option_name; ?>[text_size]" value="<?php $this->val('text_size'); ?>" />
221
+ <input type="text" class="pf-color-picker" name="<?php echo $this->option_name; ?>[text_color]" id="text_color" value="<?php $this->val('text_color'); ?>" />
222
+ </div>
223
+ </div>
224
+
225
+ </div>
226
+
227
+ <label>
228
+ <input type="radio" id="custom-text-no" name="<?php echo $this->option_name; ?>[custom_button_text]" value="no-text" <?php $this->checked('custom_button_text', 'no-text'); ?>>
229
+ <?php _e('No Text', 'printfriendly'); ?>
230
+ </label>
231
+ </div>
232
+ </div>
233
+
234
+ <div class="custom-btn pf-bu-tile pf-bu-is-4 pf-bu-is-flex-direction-column" id="custom-button-preview">
235
+ <h2><?php _e('Preview', 'printfriendly'); ?></h2>
236
+ <?php $this->custom_button_preview(); ?>
237
+ </div>
238
+ </div>
239
+ </div>
240
+ </div>
241
+ </div>
242
+ </div>
243
+
244
+ <div class="pf-bu-block pf-bu-card">
245
+ <header class="pf-bu-card-header">
246
+ <p class="pf-bu-card-header-title">
247
+ <?php _e('Button Position', 'printfriendly'); ?>
248
+ </p>
249
+ </header>
250
+
251
+ <div class="pf-bu-card-content pf-features">
252
+ <div class="pf-label-inline">
253
+ <label for="pf_content_position" class="pf-bu-label"><?php _e('Alignment', 'printfriendly'); ?></label>
254
+ <div>
255
+ <select class="pf-bu-select" id="pf_content_position" name="<?php echo $this->option_name; ?>[content_position]">
256
+ <option value="left" <?php selected($this->options['content_position'], 'left'); ?>><?php _e('Left Align', 'printfriendly'); ?></option>
257
+ <option value="right" <?php selected($this->options['content_position'], 'right'); ?>><?php _e('Right Align', 'printfriendly'); ?></option>
258
+ <option value="center" <?php selected($this->options['content_position'], 'center'); ?>><?php _e('Center', 'printfriendly'); ?></option>
259
+ <option value="none" <?php selected($this->options['content_position'], 'none'); ?>><?php _e('None', 'printfriendly'); ?></option>
260
+ </select>
261
+ </div>
262
+ </div>
263
+
264
+ <div class="pf-label-inline">
265
+ <label for="pf_content_placement" class="pf-bu-label"><?php _e('Placement', 'printfriendly'); ?></label>
266
+ <div>
267
+ <select class="pf-bu-select" id="pf_content_placement" name="<?php echo $this->option_name; ?>[content_placement]">
268
+ <option value="before" <?php selected($this->options['content_placement'], 'before'); ?>><?php _e('Above Content', 'printfriendly'); ?></option>
269
+ <option value="after" <?php selected($this->options['content_placement'], 'after'); ?>><?php _e('Below Content', 'printfriendly'); ?></option>
270
+ </select>
271
+ </div>
272
+ </div>
273
+ </div>
274
+ </div>
275
+
276
+ <div class="pf-bu-block pf-bu-card">
277
+ <header class="pf-bu-card-header">
278
+ <p class="pf-bu-card-header-title">
279
+ <?php _e('Button Display', 'printfriendly'); ?>
280
+ </p>
281
+ </header>
282
+
283
+ <div class="pf-bu-card-content">
284
+ <label for="pages" class="pf-bu-label"><?php _e('Pages to show on', 'printfriendly'); ?></label>
285
+ <div id="pages">
286
+ <?php $this->create_checkbox('posts', __('Posts', 'printfriendly')); ?>
287
+ <?php $this->create_checkbox('pages', __('Pages', 'printfriendly')); ?>
288
+ <?php $this->create_checkbox('homepage', __('Homepage', 'printfriendly')); ?>
289
+ <?php $this->create_checkbox('categories', __('Category Pages', 'printfriendly')); ?>
290
+ <?php $this->create_checkbox('taxonomies', __('Taxonomy Pages', 'printfriendly')); ?>
291
+ </div>
292
+
293
+ <hr/>
294
+ <label for="categories" class="pf-bu-label"><?php _e('Specific categories to show on', 'printfriendly'); ?></label>
295
+ <?php
296
+ wp_dropdown_categories(
297
+ apply_filters(
298
+ 'printfriendly_category_args',
299
+ array(
300
+ 'show_count' => 0,
301
+ 'orderby' => 'name',
302
+ 'hide_empty' => false, // show a category even if it has no posts assigned
303
+ 'class' => 'pf-select2',
304
+ 'name' => 'printfriendly_option[show_on_cat]',
305
+ 'id' => 'show_on_cat',
306
+ 'selected' => isset($this->options['show_on_cat']) ? $this->options['show_on_cat'] : '',
307
+ 'multiple' => true,
308
+ )
309
+ )
310
+ );
311
+ ?>
312
+
313
+ <hr/>
314
+
315
+ <div class="pf-accordion">
316
+ <label class="pf-bu-label"><?php echo _e('Add direct to template', 'printfriendly'); ?></label>
317
+ <div>
318
+ <div>
319
+ <span class="small-text">Use the following if you want the buttons in archive/category page to link to individual posts</span>
320
+ <code>
321
+ &lt;?php if( function_exists( 'pf_default_button' ) ){ echo pf_default_button(); } ?&gt;
322
+
323
+ <a class="pf-clipboard" href="javascript:;" data-clipboard-text="<?php echo '&lt;?php if( function_exists( \'pf_default_button\' ) ) { echo pf_default_button(); } ?&gt;'; ?>"><span class="pf-bu-tag pf-bu-is-info pf-bu-is-dark"><?php _e('Copy Code', 'printfriendly'); ?></span></a>
324
+ </code>
325
+ </div>
326
+ <div>
327
+ <span class="small-text">Use the following if you want the button to always print the current page</span>
328
+ <code>
329
+ &lt;?php if( function_exists( 'pf_current_page_button' ) ){ echo pf_current_page_button(); } ?&gt;
330
+
331
+ <a class="pf-clipboard" href="javascript:;" data-clipboard-text="<?php echo '&lt;?php if( function_exists( \'pf_current_page_button\' ) ) { echo pf_current_page_button(); } ?&gt;'; ?>"><span class="pf-bu-tag pf-bu-is-info pf-bu-is-dark"><?php _e('Copy Code', 'printfriendly'); ?></span></a>
332
+ </code>
333
+ </div>
334
+ </div>
335
+ </div>
336
+
337
+ <div class="pf-accordion">
338
+ <label class="pf-bu-label"><?php echo _e('Use the shortcode', 'printfriendly'); ?></label>
339
+ <div>
340
+ <div>
341
+ <span class="small-text">Use the following if you want the buttons in archive/category page to link to individual posts</span>
342
+ <code>
343
+ [printfriendly]
344
+
345
+ <a class="pf-clipboard" href="javascript:;" data-clipboard-text="<?php echo '[printfriendly]'; ?>"><span class="pf-bu-tag pf-bu-is-info pf-bu-is-dark"><?php _e('Copy Code', 'printfriendly'); ?></span></a>
346
+ </code>
347
+ </div>
348
+ <div>
349
+ <span class="small-text">Use the following if you want the button to always print the current page</span>
350
+ <code>
351
+ [printfriendly current="yes"]
352
+
353
+ <a class="pf-clipboard" href="javascript:;" data-clipboard-text="<?php echo '[printfriendly current=\'yes\']'; ?>"><span class="pf-bu-tag pf-bu-is-info pf-bu-is-dark"><?php _e('Copy Code', 'printfriendly'); ?></span></a>
354
+ </code>
355
+ </div>
356
+ </div>
357
+ </div>
358
+ </div>
359
+
360
+ <div class="pf-bu-card-footer">
361
+ <p class="pf-bu-card-footer-item"><a href="https://printfriendly.freshdesk.com/support/solutions/articles/69000080457-manual-button-placement-in-wordpress" target="_new"><?php _e('Documentation', 'printfriendly'); ?></a></p>
362
+ </div>
363
+
364
+ </div>
365
+
366
+ <div class="pf-bu-block pf-bu-card">
367
+ <header class="pf-bu-card-header">
368
+ <p class="pf-bu-card-header-title">
369
+ <?php _e('Pro Exclusive Features', 'printfriendly'); ?>
370
+ </p>
371
+ </header>
372
+
373
+ <div class="pf-bu-card-content pf-features">
374
+ <div class="pf-label-inline">
375
+ <label for="password_protected" class="pf-bu-label"><?php _e('Encode images', 'printfriendly'); ?></label>
376
+ <div>
377
+ <select class="pf-bu-select" id="password_protected" name="<?php echo $this->option_name; ?>[password_protected]">
378
+ <option value="no" <?php selected($this->val('password_protected', false), 'no'); ?>><?php _e('No', 'printfriendly'); ?></option>
379
+ <option value="yes" <?php selected($this->val('password_protected', false), 'yes'); ?>><?php _e('Yes', 'printfriendly'); ?></option>
380
+ </select>
381
+ <p class="description"><?php _e('Select "Yes" if your site is not publicly accessible or if your provider blocks image requests from third parties or if images are not present in PDF', 'printfriendly'); ?></p>
382
+ </div>
383
+ </div>
384
+
385
+ <div class="pf-label-inline">
386
+ <label for="show_hidden_content" class="pf-bu-label"><?php _e('Show Hidden Content', 'printfriendly'); ?></label>
387
+ <div>
388
+ <select class="pf-bu-select" id="show_hidden_content" name="<?php echo $this->option_name; ?>[show_hidden_content]">
389
+ <option value="no" <?php selected($this->val('show_hidden_content', false), 'no'); ?>><?php _e('No', 'printfriendly'); ?></option>
390
+ <option value="yes" <?php selected($this->val('show_hidden_content', false), 'yes'); ?>><?php _e('Yes', 'printfriendly'); ?></option>
391
+ </select>
392
+ <p class="description"><?php _e('By default PrintFriendly Pro will only show the visible content on the page. Select "Yes", if you want PrintFriendly to show hidden content. (Ex. Content in hidden tabs)', 'printfriendly'); ?></p>
393
+ </div>
394
+ </div>
395
+ </div>
396
+
397
+ <div class="pf-bu-card-footer">
398
+ <p class="pf-bu-card-footer-item"><?php _e('These features require a Pro subscription.', 'printfriendly'); ?>&nbsp;<a href="https://www.printfriendly.com/pro" target="_blank"><?php _e('Learn More', 'printfriendly'); ?></a></p>
399
+ </div>
400
+ </div>
401
+
402
+ <div class="pf-bu-container">
403
+ <div class="pf-bu-is-flex pf-bu-is-justify-content-center">
404
+ <input type="submit" class="button-primary pf-bu-is-medium pf-bu-button" value="<?php esc_attr_e('Save Options', 'printfriendly'); ?>" />
405
+ <input type="reset" class="button-secondary pf-bu-is-medium pf-bu-button" value="<?php esc_attr_e('Cancel', 'printfriendly'); ?>" />
406
+ </div>
407
+ </div>
408
+ </div>
409
+ </section>
410
+
411
+ <section id="tab-advanced">
412
+ <div class="pf-bu-container">
413
+
414
+ <div class="pf-bu-block pf-bu-card">
415
+ <header class="pf-bu-card-header">
416
+ <p class="pf-bu-card-header-title">
417
+ <?php _e('Page header', 'printfriendly'); ?>
418
+ </p>
419
+ </header>
420
+
421
+ <div class="pf-bu-card-content">
422
+ <div class="pf-bu-columns">
423
+ <div class="pf-bu-column pf-bu-is-6">
424
+ <label for="icon_favicon">
425
+ <input id="icon_favicon" type="radio" name="<?php echo $this->option_name; ?>[logo]" value="favicon" <?php echo $this->options['logo'] === 'favicon' ? 'checked' : ''; ?>>
426
+ <?php _e('My Website Icon', 'printfriendly'); ?>
427
+ </label>
428
+ </div>
429
+
430
+ <div class="pf-bu-column pf-bu-is-6">
431
+ <label for="icon-upload-an-image">
432
+ <input id="icon-upload-an-image" type="radio" name="<?php echo $this->option_name; ?>[logo]" value="upload-an-image" <?php echo $this->options['logo'] === 'upload-an-image' ? 'checked' : ''; ?>>
433
+ <?php _e('Custom Image', 'printfriendly'); ?>
434
+
435
+ <div id="custom-logo"><div class="pf-bu-tile pf-bu-is-ancestor">
436
+ <div class="pf-bu-tile pf-bu-is-vertical">
437
+ <div class="pf-bu-tile pf-bu-is-4 pf-bu-is-flex-direction-column">
438
+ <div>
439
+ <input type="button" class="pf_upload_image_button button button-secondary" data-pf-element="#custom_logo" value="<?php _e('Select Image', 'printfriendly'); ?>">
440
+ <input id="custom_logo" type="hidden" name="<?php echo $this->option_name; ?>[image_url]" value="<?php $this->val('image_url'); ?>" />
441
+ <span id="custom_logo_label">
442
+ <?php if (! empty($this->val('image_url', false))) { ?>
443
+ <img src="<?php $this->val('image_url'); ?>">
444
+ <?php } ?>
445
+ </span>
446
+ </div>
447
+ </div>
448
+
449
+ <div class="pf-bu-tile pf-bu-is-4 pf-bu-is-flex-direction-column">
450
+ <div>
451
+ <div class="pf-bu-field pf-bu-has-addons">
452
+ <p class="pf-bu-control">
453
+ <a class="pf-bu-button pf-bu-is-static">
454
+ <?php _e('Tagline (optional)', 'printfriendly'); ?>
455
+ </a>
456
+ </p>
457
+ <p class="pf-bu-control">
458
+ <input id="image-tagline" type="text" class="pf-bu-input regular-text pf-regular-text" name="<?php echo $this->option_name; ?>[tagline]" value="<?php $this->val('tagline'); ?>" />
459
+ </p>
460
+ </div>
461
+ </div>
462
+ </div>
463
+ </div>
464
+ </div></div>
465
+
466
+ </label>
467
+ </div>
468
+ </div>
469
+ <div id="pf-image-error"></div>
470
+ <div id="pf-image-preview"></div>
471
+ </div>
472
+
473
+ <div class="pf-bu-card-footer">
474
+ <p class="pf-bu-card-footer-item"><a href="https://printfriendly.freshdesk.com/support/solutions/articles/69000080358-create-a-custom-header-in-wordpress" target="_new"><?php _e('Documentation', 'printfriendly'); ?></a></p>
475
+ </div>
476
+ </div>
477
+
478
+ <div class="pf-bu-block pf-bu-card">
479
+ <header class="pf-bu-card-header">
480
+ <p class="pf-bu-card-header-title">
481
+ <?php _e('Features', 'printfriendly'); ?>
482
+ </p>
483
+ </header>
484
+
485
+ <div class="pf-bu-card-content pf-features">
486
+ <div class="pf-label-inline">
487
+ <label for="pf-analytics-tracking" class="pf-bu-label"><?php _e('Track in Google Analytics', 'printfriendly'); ?></label>
488
+ <div>
489
+ <select class="pf-bu-select" id="pf-analytics-tracking" name="<?php echo $this->option_name; ?>[enable_google_analytics]">
490
+ <option value="yes" <?php $this->selected('enable_google_analytics', 'yes'); ?>> <?php _e('Yes', 'printfriendly'); ?></option>
491
+ <option value="no" <?php $this->selected('enable_google_analytics', 'no'); ?>> <?php _e('No', 'printfriendly'); ?></option>
492
+ </select>
493
+ </div>
494
+ </div>
495
+
496
+ <div class="pf-label-inline">
497
+ <label for="click-to-delete" class="pf-bu-label"><?php _e('Click to delete', 'printfriendly'); ?></label>
498
+ <div>
499
+ <select class="pf-bu-select" name="<?php echo $this->option_name; ?>[click_to_delete]" id="click-to-delete">
500
+ <option value="0" <?php selected($this->options['click_to_delete'], '0'); ?>><?php _e('Allow', 'printfriendly'); ?></option>
501
+ <option value="1" <?php selected($this->options['click_to_delete'], '1'); ?>><?php _e('Not Allow', 'printfriendly'); ?></option>
502
+ </select>
503
+ <p class="description"><?php echo sprintf(__('Read documentation about this feature %1$shere%2$s', 'printfriendly'), '<a href="https://printfriendly.freshdesk.com/support/solutions/articles/69000080475-turn-off-the-click-to-delete-option-in-wordpress" target="_new">', '</a>'); ?></p>
504
+ </div>
505
+ </div>
506
+
507
+ <div class="pf-label-inline">
508
+ <label for="images-size" class="pf-bu-label"><?php _e('Image size', 'printfriendly'); ?></label>
509
+ <div>
510
+ <select class="pf-bu-select" name="<?php echo $this->option_name; ?>[images-size]" id="images-size">
511
+ <option value="full-size" <?php selected($this->options['images-size'], 'full-size'); ?>><?php _e('Full Size', 'printfriendly'); ?></option>
512
+ <option value="large" <?php selected($this->options['images-size'], 'large'); ?>><?php _e('Large', 'printfriendly'); ?></option>
513
+ <option value="medium" <?php selected($this->options['images-size'], 'medium'); ?>><?php _e('Medium', 'printfriendly'); ?></option>
514
+ <option value="small" <?php selected($this->options['images-size'], 'small'); ?>><?php _e('Small', 'printfriendly'); ?></option>
515
+ <option value="remove-images" <?php selected($this->options['images-size'], 'remove-images'); ?>><?php _e('Remove Images', 'printfriendly'); ?></option>
516
+ </select>
517
+ </div>
518
+ </div>
519
+
520
+ <div class="pf-label-inline">
521
+ <label for="image-style" class="pf-bu-label"><?php _e('Image style', 'printfriendly'); ?></label>
522
+ <div>
523
+ <select class="pf-bu-select" name="<?php echo $this->option_name; ?>[image-style]" id="image-style">
524
+ <option value="block" <?php selected($this->options['image-style'], 'block'); ?>><?php _e('Center/Block', 'printfriendly'); ?></option>
525
+ <option value="right" <?php selected($this->options['image-style'], 'right'); ?>><?php _e('Align Right', 'printfriendly'); ?></option>
526
+ <option value="left" <?php selected($this->options['image-style'], 'left'); ?>><?php _e('Align Left', 'printfriendly'); ?></option>
527
+ <option value="none" <?php selected($this->options['image-style'], 'none'); ?>><?php _e('Align None', 'printfriendly'); ?></option>
528
+ </select>
529
+ <p class="description"><?php echo sprintf(__('Read documentation about this feature %1$shere%2$s', 'printfriendly'), '<a href="https://printfriendly.freshdesk.com/support/solutions/articles/69000080507-remove-images-option" target="_new">', '</a>'); ?></p>
530
+ </div>
531
+ </div>
532
+
533
+ <div class="pf-label-inline">
534
+ <label for="email" class="pf-bu-label"><?php _e('Email', 'printfriendly'); ?></label>
535
+ <div>
536
+ <select class="pf-bu-select" name="<?php echo $this->option_name; ?>[email]" id="email">
537
+ <option value="0" <?php selected($this->options['email'], '0'); ?>><?php _e('Allow', 'printfriendly'); ?></option>
538
+ <option value="1" <?php selected($this->options['email'], '1'); ?>><?php _e('Not Allow', 'printfriendly'); ?></option>
539
+ </select>
540
+ </div>
541
+ </div>
542
+
543
+ <div class="pf-label-inline">
544
+ <label for="pdf" class="pf-bu-label"><?php _e('PDF', 'printfriendly'); ?></label>
545
+ <div>
546
+ <select class="pf-bu-select" name="<?php echo $this->option_name; ?>[pdf]" id="pdf">
547
+ <option value="0" <?php selected($this->options['pdf'], '0'); ?>><?php _e('Allow', 'printfriendly'); ?></option>
548
+ <option value="1" <?php selected($this->options['pdf'], '1'); ?>><?php _e('Not Allow', 'printfriendly'); ?></option>
549
+ </select>
550
+ <p class="description"><strong><?php _e('Developer Note', 'printfriendly'); ?></strong>: <?php _e('On localhost the images can not be included in the PDF. Once the website is live/public images will be included in the PDF.', 'printfriendly'); ?></p>
551
+ </div>
552
+ </div>
553
+
554
+ <div class="pf-label-inline">
555
+ <label for="print" class="pf-bu-label"><?php _e('Print', 'printfriendly'); ?></label>
556
+ <div>
557
+ <select class="pf-bu-select" name="<?php echo $this->option_name; ?>[print]" id="print">
558
+ <option value="0" <?php selected($this->options['print'], '0'); ?>><?php _e('Allow', 'printfriendly'); ?></option>
559
+ <option value="1" <?php selected($this->options['print'], '1'); ?>><?php _e('Not Allow', 'printfriendly'); ?></option>
560
+ </select>
561
+ </div>
562
+ </div>
563
+
564
+ </div>
565
+ </div>
566
+
567
+ <div class="pf-bu-block pf-bu-card">
568
+ <header class="pf-bu-card-header">
569
+ <p class="pf-bu-card-header-title">
570
+ <?php _e('Custom CSS', 'printfriendly'); ?>
571
+ </p>
572
+ </header>
573
+
574
+ <div class="pf-bu-card-content">
575
+ <?php if (! $this->is_pro('custom-css')) { ?>
576
+ <label for="custom_css_url">
577
+ <?php _e('Custom CSS URL', 'printfriendly'); ?>
578
+ <input id="custom_css_url" type="url" class="regular-text" name="<?php echo $this->option_name; ?>[custom_css_url]" value="<?php $this->val('custom_css_url'); ?>" />
579
+ </label>
580
+ <?php } else { ?>
581
+ <label for="custom_css">
582
+ <textarea id="custom_css" class="regular-text pf-bu-textarea" rows="5" cols="80" name="<?php echo $this->option_name; ?>[custom_css]"><?php echo html_entity_decode(esc_textarea($this->val('custom_css', false))); ?></textarea>
583
+ <p class="desc"><?php echo $this->get_custom_css_upgrade_message(); ?></p>
584
+ </label>
585
+ <?php } ?>
586
+ </div>
587
+
588
+ <div class="pf-bu-card-footer">
589
+ <p class="pf-bu-card-footer-item">
590
+ <?php
591
+ if (! $this->is_pro('custom-css')) {
592
+ _e('Customize the styles of the printed/pdf page using your own CSS. Create your custom CSS, and put the URL to your Custom CSS file in the box above', 'printfriendly');
593
+ } else {
594
+ echo sprintf(__('Customize the styles of the printed/pdf page using your own CSS. Add your custom CSS (without the %s tags) in the box above', 'printfriendly'), '<code>&lt;style&gt;</code>');
595
+ }
596
+ ?>
597
+ </p>
598
+ </div>
599
+
600
+ </div>
601
+
602
+ <div class="pf-bu-container">
603
+ <div class="pf-bu-is-flex pf-bu-is-justify-content-center">
604
+ <input type="submit" class="button-primary pf-bu-is-medium pf-bu-button" value="<?php esc_attr_e('Save Options', 'printfriendly'); ?>" />
605
+ <input type="reset" class="button-secondary pf-bu-is-medium pf-bu-button" value="<?php esc_attr_e('Cancel', 'printfriendly'); ?>" />
606
+ </div>
607
+ </div>
608
+
609
+ </div>
610
+ </section>
611
+
612
+
613
+ <?php if (WP_DEBUG) { ?>
614
+ <section id="tab-debug">
615
+ <div class="pf-bu-container">
616
+ <div class="pf-bu-block pf-bu-card">
617
+ <header class="pf-bu-card-header">
618
+ <p class="pf-bu-card-header-title">
619
+ <?php _e('Debug options', 'printfriendly'); ?>
620
+ </p>
621
+ </header>
622
+
623
+ <div class="pf-bu-card-content">
624
+ <pre><?php echo print_r($this->options, 1); ?></pre>
625
+ </div>
626
+
627
+ <div class="pf-bu-card-footer">
628
+ <p class="pf-bu-card-footer-item"><?php _e('Currently in Debug Mode. This tab is visible in debug mode only', 'printfriendly'); ?></p>
629
+ </div>
630
+ </div>
631
+ </div>
632
+ </section>
633
+ <?php } ?>
634
+
635
+ </div>