368 <?php |
429 <?php |
369 /** |
430 /** |
370 * Fires in the Network Admin 'Right Now' dashboard widget |
431 * Fires in the Network Admin 'Right Now' dashboard widget |
371 * just before the user and site search form fields. |
432 * just before the user and site search form fields. |
372 * |
433 * |
373 * @since MU |
434 * @since MU (3.0.0) |
374 * |
435 * |
375 * @param null $unused |
436 * @param null $unused |
376 */ |
437 */ |
377 do_action( 'wpmuadminresult', '' ); |
438 do_action( 'wpmuadminresult', '' ); |
378 ?> |
439 ?> |
379 |
440 |
380 <form action="<?php echo network_admin_url('users.php'); ?>" method="get"> |
441 <form action="<?php echo network_admin_url('users.php'); ?>" method="get"> |
381 <p> |
442 <p> |
382 <label class="screen-reader-text" for="search-users"><?php _e( 'Search Users' ); ?></label> |
443 <label class="screen-reader-text" for="search-users"><?php _e( 'Search Users' ); ?></label> |
383 <input type="search" name="s" value="" size="30" autocomplete="off" id="search-users"/> |
444 <input type="search" name="s" value="" size="30" autocomplete="off" id="search-users"/> |
384 <?php submit_button( __( 'Search Users' ), 'button', 'submit', false, array( 'id' => 'submit_users' ) ); ?> |
445 <?php submit_button( __( 'Search Users' ), '', false, false, array( 'id' => 'submit_users' ) ); ?> |
385 </p> |
446 </p> |
386 </form> |
447 </form> |
387 |
448 |
388 <form action="<?php echo network_admin_url('sites.php'); ?>" method="get"> |
449 <form action="<?php echo network_admin_url('sites.php'); ?>" method="get"> |
389 <p> |
450 <p> |
390 <label class="screen-reader-text" for="search-sites"><?php _e( 'Search Sites' ); ?></label> |
451 <label class="screen-reader-text" for="search-sites"><?php _e( 'Search Sites' ); ?></label> |
391 <input type="search" name="s" value="" size="30" autocomplete="off" id="search-sites"/> |
452 <input type="search" name="s" value="" size="30" autocomplete="off" id="search-sites"/> |
392 <?php submit_button( __( 'Search Sites' ), 'button', 'submit', false, array( 'id' => 'submit_sites' ) ); ?> |
453 <?php submit_button( __( 'Search Sites' ), '', false, false, array( 'id' => 'submit_sites' ) ); ?> |
393 </p> |
454 </p> |
394 </form> |
455 </form> |
395 <?php |
456 <?php |
396 /** |
457 /** |
397 * Fires at the end of the 'Right Now' widget in the Network Admin dashboard. |
458 * Fires at the end of the 'Right Now' widget in the Network Admin dashboard. |
398 * |
459 * |
399 * @since MU |
460 * @since MU (3.0.0) |
400 */ |
461 */ |
401 do_action( 'mu_rightnow_end' ); |
462 do_action( 'mu_rightnow_end' ); |
402 |
463 |
403 /** |
464 /** |
404 * Fires at the end of the 'Right Now' widget in the Network Admin dashboard. |
465 * Fires at the end of the 'Right Now' widget in the Network Admin dashboard. |
405 * |
466 * |
406 * @since MU |
467 * @since MU (3.0.0) |
407 */ |
468 */ |
408 do_action( 'mu_activity_box_end' ); |
469 do_action( 'mu_activity_box_end' ); |
409 } |
470 } |
410 |
471 |
411 /** |
472 /** |
412 * The Quick Draft widget display and creation of drafts. |
473 * The Quick Draft widget display and creation of drafts. |
413 * |
474 * |
414 * @since 3.8.0 |
475 * @since 3.8.0 |
415 * |
476 * |
|
477 * @global int $post_ID |
|
478 * |
416 * @param string $error_msg Optional. Error message. Default false. |
479 * @param string $error_msg Optional. Error message. Default false. |
417 */ |
480 */ |
418 function wp_dashboard_quick_press( $error_msg = false ) { |
481 function wp_dashboard_quick_press( $error_msg = false ) { |
419 global $post_ID; |
482 global $post_ID; |
|
483 |
|
484 if ( ! current_user_can( 'edit_posts' ) ) { |
|
485 return; |
|
486 } |
420 |
487 |
421 /* Check if a new auto-draft (= no new post_ID) is needed or if the old can be used */ |
488 /* Check if a new auto-draft (= no new post_ID) is needed or if the old can be used */ |
422 $last_post_id = (int) get_user_option( 'dashboard_quick_press_last_post_id' ); // Get the last post_ID |
489 $last_post_id = (int) get_user_option( 'dashboard_quick_press_last_post_id' ); // Get the last post_ID |
423 if ( $last_post_id ) { |
490 if ( $last_post_id ) { |
424 $post = get_post( $last_post_id ); |
491 $post = get_post( $last_post_id ); |
488 'author' => get_current_user_id(), |
557 'author' => get_current_user_id(), |
489 'posts_per_page' => 4, |
558 'posts_per_page' => 4, |
490 'orderby' => 'modified', |
559 'orderby' => 'modified', |
491 'order' => 'DESC' |
560 'order' => 'DESC' |
492 ); |
561 ); |
|
562 |
|
563 /** |
|
564 * Filters the post query arguments for the 'Recent Drafts' dashboard widget. |
|
565 * |
|
566 * @since 4.4.0 |
|
567 * |
|
568 * @param array $query_args The query arguments for the 'Recent Drafts' dashboard widget. |
|
569 */ |
|
570 $query_args = apply_filters( 'dashboard_recent_drafts_query_args', $query_args ); |
|
571 |
493 $drafts = get_posts( $query_args ); |
572 $drafts = get_posts( $query_args ); |
494 if ( ! $drafts ) { |
573 if ( ! $drafts ) { |
495 return; |
574 return; |
496 } |
575 } |
497 } |
576 } |
498 |
577 |
499 echo '<div class="drafts">'; |
578 echo '<div class="drafts">'; |
500 if ( count( $drafts ) > 3 ) { |
579 if ( count( $drafts ) > 3 ) { |
501 echo '<p class="view-all"><a href="' . esc_url( admin_url( 'edit.php?post_status=draft' ) ) . '">' . _x( 'View all', 'drafts' ) . "</a></p>\n"; |
580 echo '<p class="view-all"><a href="' . esc_url( admin_url( 'edit.php?post_status=draft' ) ) . '">' . __( 'View all drafts' ) . "</a></p>\n"; |
502 } |
581 } |
503 echo '<h4 class="hide-if-no-js">' . __( 'Drafts' ) . "</h4>\n<ul>"; |
582 echo '<h2 class="hide-if-no-js">' . __( 'Your Recent Drafts' ) . "</h2>\n<ul>"; |
504 |
583 |
505 $drafts = array_slice( $drafts, 0, 3 ); |
584 $drafts = array_slice( $drafts, 0, 3 ); |
506 foreach ( $drafts as $draft ) { |
585 foreach ( $drafts as $draft ) { |
507 $url = get_edit_post_link( $draft->ID ); |
586 $url = get_edit_post_link( $draft->ID ); |
508 $title = _draft_or_post_title( $draft->ID ); |
587 $title = _draft_or_post_title( $draft->ID ); |
509 echo "<li>\n"; |
588 echo "<li>\n"; |
510 echo '<div class="draft-title"><a href="' . esc_url( $url ) . '" title="' . esc_attr( sprintf( __( 'Edit “%s”' ), $title ) ) . '">' . esc_html( $title ) . '</a>'; |
589 /* translators: %s: post title */ |
511 echo '<time datetime="' . get_the_time( 'c', $draft ) . '">' . get_the_time( get_option( 'date_format' ), $draft ) . '</time></div>'; |
590 echo '<div class="draft-title"><a href="' . esc_url( $url ) . '" aria-label="' . esc_attr( sprintf( __( 'Edit “%s”' ), $title ) ) . '">' . esc_html( $title ) . '</a>'; |
|
591 echo '<time datetime="' . get_the_time( 'c', $draft ) . '">' . get_the_time( __( 'F j, Y' ), $draft ) . '</time></div>'; |
512 if ( $the_content = wp_trim_words( $draft->post_content, 10 ) ) { |
592 if ( $the_content = wp_trim_words( $draft->post_content, 10 ) ) { |
513 echo '<p>' . $the_content . '</p>'; |
593 echo '<p>' . $the_content . '</p>'; |
514 } |
594 } |
515 echo "</li>\n"; |
595 echo "</li>\n"; |
516 } |
596 } |
517 echo "</ul>\n</div>"; |
597 echo "</ul>\n</div>"; |
518 } |
598 } |
519 |
599 |
|
600 /** |
|
601 * Outputs a row for the Recent Comments widget. |
|
602 * |
|
603 * @access private |
|
604 * @since 2.7.0 |
|
605 * |
|
606 * @global WP_Comment $comment |
|
607 * |
|
608 * @param WP_Comment $comment The current comment. |
|
609 * @param bool $show_date Optional. Whether to display the date. |
|
610 */ |
520 function _wp_dashboard_recent_comments_row( &$comment, $show_date = true ) { |
611 function _wp_dashboard_recent_comments_row( &$comment, $show_date = true ) { |
521 $GLOBALS['comment'] =& $comment; |
612 $GLOBALS['comment'] = clone $comment; |
522 |
613 |
523 $comment_post_title = _draft_or_post_title( $comment->comment_post_ID ); |
614 if ( $comment->comment_post_ID > 0 ) { |
524 |
615 |
525 if ( current_user_can( 'edit_post', $comment->comment_post_ID ) ) { |
616 $comment_post_title = _draft_or_post_title( $comment->comment_post_ID ); |
526 $comment_post_url = get_edit_post_link( $comment->comment_post_ID ); |
617 $comment_post_url = get_the_permalink( $comment->comment_post_ID ); |
527 $comment_post_link = "<a href='$comment_post_url'>$comment_post_title</a>"; |
618 $comment_post_link = "<a href='$comment_post_url'>$comment_post_title</a>"; |
528 } else { |
619 } else { |
529 $comment_post_link = $comment_post_title; |
620 $comment_post_link = ''; |
530 } |
621 } |
531 |
|
532 $comment_link = '<a class="comment-link" href="' . esc_url(get_comment_link()) . '">#</a>'; |
|
533 |
622 |
534 $actions_string = ''; |
623 $actions_string = ''; |
535 if ( current_user_can( 'edit_comment', $comment->comment_ID ) ) { |
624 if ( current_user_can( 'edit_comment', $comment->comment_ID ) ) { |
536 // Pre-order it: Approve | Reply | Edit | Spam | Trash. |
625 // Pre-order it: Approve | Reply | Edit | Spam | Trash. |
537 $actions = array( |
626 $actions = array( |
538 'approve' => '', 'unapprove' => '', |
627 'approve' => '', 'unapprove' => '', |
539 'reply' => '', |
628 'reply' => '', |
540 'edit' => '', |
629 'edit' => '', |
541 'spam' => '', |
630 'spam' => '', |
542 'trash' => '', 'delete' => '' |
631 'trash' => '', 'delete' => '', |
|
632 'view' => '', |
543 ); |
633 ); |
544 |
634 |
545 $del_nonce = esc_html( '_wpnonce=' . wp_create_nonce( "delete-comment_$comment->comment_ID" ) ); |
635 $del_nonce = esc_html( '_wpnonce=' . wp_create_nonce( "delete-comment_$comment->comment_ID" ) ); |
546 $approve_nonce = esc_html( '_wpnonce=' . wp_create_nonce( "approve-comment_$comment->comment_ID" ) ); |
636 $approve_nonce = esc_html( '_wpnonce=' . wp_create_nonce( "approve-comment_$comment->comment_ID" ) ); |
547 |
637 |
549 $unapprove_url = esc_url( "comment.php?action=unapprovecomment&p=$comment->comment_post_ID&c=$comment->comment_ID&$approve_nonce" ); |
639 $unapprove_url = esc_url( "comment.php?action=unapprovecomment&p=$comment->comment_post_ID&c=$comment->comment_ID&$approve_nonce" ); |
550 $spam_url = esc_url( "comment.php?action=spamcomment&p=$comment->comment_post_ID&c=$comment->comment_ID&$del_nonce" ); |
640 $spam_url = esc_url( "comment.php?action=spamcomment&p=$comment->comment_post_ID&c=$comment->comment_ID&$del_nonce" ); |
551 $trash_url = esc_url( "comment.php?action=trashcomment&p=$comment->comment_post_ID&c=$comment->comment_ID&$del_nonce" ); |
641 $trash_url = esc_url( "comment.php?action=trashcomment&p=$comment->comment_post_ID&c=$comment->comment_ID&$del_nonce" ); |
552 $delete_url = esc_url( "comment.php?action=deletecomment&p=$comment->comment_post_ID&c=$comment->comment_ID&$del_nonce" ); |
642 $delete_url = esc_url( "comment.php?action=deletecomment&p=$comment->comment_post_ID&c=$comment->comment_ID&$del_nonce" ); |
553 |
643 |
554 $actions['approve'] = "<a href='$approve_url' data-wp-lists='dim:the-comment-list:comment-$comment->comment_ID:unapproved:e7e7d3:e7e7d3:new=approved' class='vim-a' title='" . esc_attr__( 'Approve this comment' ) . "'>" . __( 'Approve' ) . '</a>'; |
644 $actions['approve'] = "<a href='$approve_url' data-wp-lists='dim:the-comment-list:comment-$comment->comment_ID:unapproved:e7e7d3:e7e7d3:new=approved' class='vim-a' aria-label='" . esc_attr__( 'Approve this comment' ) . "'>" . __( 'Approve' ) . '</a>'; |
555 $actions['unapprove'] = "<a href='$unapprove_url' data-wp-lists='dim:the-comment-list:comment-$comment->comment_ID:unapproved:e7e7d3:e7e7d3:new=unapproved' class='vim-u' title='" . esc_attr__( 'Unapprove this comment' ) . "'>" . __( 'Unapprove' ) . '</a>'; |
645 $actions['unapprove'] = "<a href='$unapprove_url' data-wp-lists='dim:the-comment-list:comment-$comment->comment_ID:unapproved:e7e7d3:e7e7d3:new=unapproved' class='vim-u' aria-label='" . esc_attr__( 'Unapprove this comment' ) . "'>" . __( 'Unapprove' ) . '</a>'; |
556 $actions['edit'] = "<a href='comment.php?action=editcomment&c={$comment->comment_ID}' title='" . esc_attr__('Edit comment') . "'>". __('Edit') . '</a>'; |
646 $actions['edit'] = "<a href='comment.php?action=editcomment&c={$comment->comment_ID}' aria-label='" . esc_attr__( 'Edit this comment' ) . "'>". __( 'Edit' ) . '</a>'; |
557 $actions['reply'] = '<a onclick="window.commentReply && commentReply.open(\''.$comment->comment_ID.'\',\''.$comment->comment_post_ID.'\');return false;" class="vim-r hide-if-no-js" title="'.esc_attr__('Reply to this comment').'" href="#">' . __('Reply') . '</a>'; |
647 $actions['reply'] = '<a onclick="window.commentReply && commentReply.open(\'' . $comment->comment_ID . '\',\''.$comment->comment_post_ID.'\');return false;" class="vim-r hide-if-no-js" aria-label="' . esc_attr__( 'Reply to this comment' ) . '" href="#">' . __( 'Reply' ) . '</a>'; |
558 $actions['spam'] = "<a href='$spam_url' data-wp-lists='delete:the-comment-list:comment-$comment->comment_ID::spam=1' class='vim-s vim-destructive' title='" . esc_attr__( 'Mark this comment as spam' ) . "'>" . /* translators: mark as spam link */ _x( 'Spam', 'verb' ) . '</a>'; |
648 $actions['spam'] = "<a href='$spam_url' data-wp-lists='delete:the-comment-list:comment-$comment->comment_ID::spam=1' class='vim-s vim-destructive' aria-label='" . esc_attr__( 'Mark this comment as spam' ) . "'>" . /* translators: mark as spam link */ _x( 'Spam', 'verb' ) . '</a>'; |
559 if ( !EMPTY_TRASH_DAYS ) |
649 |
560 $actions['delete'] = "<a href='$delete_url' data-wp-lists='delete:the-comment-list:comment-$comment->comment_ID::trash=1' class='delete vim-d vim-destructive'>" . __('Delete Permanently') . '</a>'; |
650 if ( ! EMPTY_TRASH_DAYS ) { |
561 else |
651 $actions['delete'] = "<a href='$delete_url' data-wp-lists='delete:the-comment-list:comment-$comment->comment_ID::trash=1' class='delete vim-d vim-destructive' aria-label='" . esc_attr__( 'Delete this comment permanently' ) . "'>" . __( 'Delete Permanently' ) . '</a>'; |
562 $actions['trash'] = "<a href='$trash_url' data-wp-lists='delete:the-comment-list:comment-$comment->comment_ID::trash=1' class='delete vim-d vim-destructive' title='" . esc_attr__( 'Move this comment to the trash' ) . "'>" . _x('Trash', 'verb') . '</a>'; |
652 } else { |
|
653 $actions['trash'] = "<a href='$trash_url' data-wp-lists='delete:the-comment-list:comment-$comment->comment_ID::trash=1' class='delete vim-d vim-destructive' aria-label='" . esc_attr__( 'Move this comment to the Trash' ) . "'>" . _x( 'Trash', 'verb' ) . '</a>'; |
|
654 } |
|
655 |
|
656 $actions['view'] = '<a class="comment-link" href="' . esc_url( get_comment_link( $comment ) ) . '" aria-label="' . esc_attr__( 'View this comment' ) . '">' . __( 'View' ) . '</a>'; |
563 |
657 |
564 /** |
658 /** |
565 * Filter the action links displayed for each comment in the 'Recent Comments' |
659 * Filters the action links displayed for each comment in the 'Recent Comments' |
566 * dashboard widget. |
660 * dashboard widget. |
567 * |
661 * |
568 * @since 2.6.0 |
662 * @since 2.6.0 |
569 * |
663 * |
570 * @param array $actions An array of comment actions. Default actions include: |
664 * @param array $actions An array of comment actions. Default actions include: |
571 * 'Approve', 'Unapprove', 'Edit', 'Reply', 'Spam', |
665 * 'Approve', 'Unapprove', 'Edit', 'Reply', 'Spam', |
572 * 'Delete', and 'Trash'. |
666 * 'Delete', and 'Trash'. |
573 * @param object $comment The comment object. |
667 * @param WP_Comment $comment The comment object. |
574 */ |
668 */ |
575 $actions = apply_filters( 'comment_row_actions', array_filter($actions), $comment ); |
669 $actions = apply_filters( 'comment_row_actions', array_filter($actions), $comment ); |
576 |
670 |
577 $i = 0; |
671 $i = 0; |
578 foreach ( $actions as $action => $link ) { |
672 foreach ( $actions as $action => $link ) { |
579 ++$i; |
673 ++$i; |
580 ( ( ('approve' == $action || 'unapprove' == $action) && 2 === $i ) || 1 === $i ) ? $sep = '' : $sep = ' | '; |
674 ( ( ('approve' == $action || 'unapprove' == $action) && 2 === $i ) || 1 === $i ) ? $sep = '' : $sep = ' | '; |
581 |
675 |
582 // Reply and quickedit need a hide-if-no-js span |
676 // Reply and quickedit need a hide-if-no-js span |
583 if ( 'reply' == $action || 'quickedit' == $action ) |
677 if ( 'reply' == $action || 'quickedit' == $action ) { |
584 $action .= ' hide-if-no-js'; |
678 $action .= ' hide-if-no-js'; |
585 |
679 } |
|
680 |
|
681 if ( 'view' === $action && '1' !== $comment->comment_approved ) { |
|
682 $action .= ' hidden'; |
|
683 } |
586 $actions_string .= "<span class='$action'>$sep$link</span>"; |
684 $actions_string .= "<span class='$action'>$sep$link</span>"; |
587 } |
685 } |
588 } |
686 } |
589 |
|
590 ?> |
687 ?> |
591 |
688 |
592 <div id="comment-<?php echo $comment->comment_ID; ?>" <?php comment_class( array( 'comment-item', wp_get_comment_status($comment->comment_ID) ) ); ?>> |
689 <li id="comment-<?php echo $comment->comment_ID; ?>" <?php comment_class( array( 'comment-item', wp_get_comment_status( $comment ) ), $comment ); ?>> |
593 |
690 |
594 <?php echo get_avatar( $comment, 50, 'mystery' ); ?> |
691 <?php echo get_avatar( $comment, 50, 'mystery' ); ?> |
595 |
692 |
596 <?php if ( !$comment->comment_type || 'comment' == $comment->comment_type ) : ?> |
693 <?php if ( !$comment->comment_type || 'comment' == $comment->comment_type ) : ?> |
597 |
694 |
598 <div class="dashboard-comment-wrap"> |
695 <div class="dashboard-comment-wrap has-row-actions"> |
599 <h4 class="comment-meta"> |
696 <p class="comment-meta"> |
600 <?php printf( /* translators: 1: comment author, 2: post link, 3: notification if the comment is pending */__( 'From %1$s on %2$s%3$s' ), |
697 <?php |
601 '<cite class="comment-author">' . get_comment_author_link() . '</cite>', $comment_post_link.' '.$comment_link, ' <span class="approve">' . __( '[Pending]' ) . '</span>' ); ?> |
698 // Comments might not have a post they relate to, e.g. programmatically created ones. |
602 </h4> |
699 if ( $comment_post_link ) { |
|
700 printf( |
|
701 /* translators: 1: comment author, 2: post link, 3: notification if the comment is pending */ |
|
702 __( 'From %1$s on %2$s %3$s' ), |
|
703 '<cite class="comment-author">' . get_comment_author_link( $comment ) . '</cite>', |
|
704 $comment_post_link, |
|
705 '<span class="approve">' . __( '[Pending]' ) . '</span>' |
|
706 ); |
|
707 } else { |
|
708 printf( |
|
709 /* translators: 1: comment author, 2: notification if the comment is pending */ |
|
710 __( 'From %1$s %2$s' ), |
|
711 '<cite class="comment-author">' . get_comment_author_link( $comment ) . '</cite>', |
|
712 '<span class="approve">' . __( '[Pending]' ) . '</span>' |
|
713 ); |
|
714 } |
|
715 ?> |
|
716 </p> |
603 |
717 |
604 <?php |
718 <?php |
605 else : |
719 else : |
606 switch ( $comment->comment_type ) { |
720 switch ( $comment->comment_type ) { |
607 case 'pingback' : |
721 case 'pingback' : |
917 $rss->__destruct(); |
1072 $rss->__destruct(); |
918 unset($rss); |
1073 unset($rss); |
919 } |
1074 } |
920 } |
1075 } |
921 update_option( 'dashboard_widget_options', $widget_options ); |
1076 update_option( 'dashboard_widget_options', $widget_options ); |
922 $cache_key = 'dash_' . md5( $widget_id ); |
1077 $locale = get_user_locale(); |
|
1078 $cache_key = 'dash_v2_' . md5( $widget_id . '_' . $locale ); |
923 delete_transient( $cache_key ); |
1079 delete_transient( $cache_key ); |
924 } |
1080 } |
925 |
1081 |
926 wp_widget_rss_form( $widget_options[$widget_id], $form_inputs ); |
1082 wp_widget_rss_form( $widget_options[$widget_id], $form_inputs ); |
927 } |
1083 } |
928 |
1084 |
|
1085 |
|
1086 /** |
|
1087 * Renders the Events and News dashboard widget. |
|
1088 * |
|
1089 * @since 4.8.0 |
|
1090 */ |
|
1091 function wp_dashboard_events_news() { |
|
1092 wp_print_community_events_markup(); |
|
1093 |
|
1094 ?> |
|
1095 |
|
1096 <div class="wordpress-news hide-if-no-js"> |
|
1097 <?php wp_dashboard_primary(); ?> |
|
1098 </div> |
|
1099 |
|
1100 <p class="community-events-footer"> |
|
1101 <?php |
|
1102 printf( |
|
1103 '<a href="%1$s" target="_blank">%2$s <span class="screen-reader-text">%3$s</span><span aria-hidden="true" class="dashicons dashicons-external"></span></a>', |
|
1104 'https://make.wordpress.org/community/meetups-landing-page', |
|
1105 __( 'Meetups' ), |
|
1106 /* translators: accessibility text */ |
|
1107 __( '(opens in a new window)' ) |
|
1108 ); |
|
1109 ?> |
|
1110 |
|
1111 | |
|
1112 |
|
1113 <?php |
|
1114 printf( |
|
1115 '<a href="%1$s" target="_blank">%2$s <span class="screen-reader-text">%3$s</span><span aria-hidden="true" class="dashicons dashicons-external"></span></a>', |
|
1116 'https://central.wordcamp.org/schedule/', |
|
1117 __( 'WordCamps' ), |
|
1118 /* translators: accessibility text */ |
|
1119 __( '(opens in a new window)' ) |
|
1120 ); |
|
1121 ?> |
|
1122 |
|
1123 | |
|
1124 |
|
1125 <?php |
|
1126 printf( |
|
1127 '<a href="%1$s" target="_blank">%2$s <span class="screen-reader-text">%3$s</span><span aria-hidden="true" class="dashicons dashicons-external"></span></a>', |
|
1128 /* translators: If a Rosetta site exists (e.g. https://es.wordpress.org/news/), then use that. Otherwise, leave untranslated. */ |
|
1129 esc_url( _x( 'https://wordpress.org/news/', 'Events and News dashboard widget' ) ), |
|
1130 __( 'News' ), |
|
1131 /* translators: accessibility text */ |
|
1132 __( '(opens in a new window)' ) |
|
1133 ); |
|
1134 ?> |
|
1135 </p> |
|
1136 |
|
1137 <?php |
|
1138 } |
|
1139 |
|
1140 /** |
|
1141 * Prints the markup for the Community Events section of the Events and News Dashboard widget. |
|
1142 * |
|
1143 * @since 4.8.0 |
|
1144 */ |
|
1145 function wp_print_community_events_markup() { |
|
1146 ?> |
|
1147 |
|
1148 <div class="community-events-errors notice notice-error inline hide-if-js"> |
|
1149 <p class="hide-if-js"> |
|
1150 <?php _e( 'This widget requires JavaScript.' ); ?> |
|
1151 </p> |
|
1152 |
|
1153 <p class="community-events-error-occurred" aria-hidden="true"> |
|
1154 <?php _e( 'An error occurred. Please try again.' ); ?> |
|
1155 </p> |
|
1156 |
|
1157 <p class="community-events-could-not-locate" aria-hidden="true"></p> |
|
1158 </div> |
|
1159 |
|
1160 <div class="community-events-loading hide-if-no-js"> |
|
1161 <?php _e( 'Loading…' ); ?> |
|
1162 </div> |
|
1163 |
|
1164 <?php |
|
1165 /* |
|
1166 * Hide the main element when the page first loads, because the content |
|
1167 * won't be ready until wp.communityEvents.renderEventsTemplate() has run. |
|
1168 */ |
|
1169 ?> |
|
1170 <div id="community-events" class="community-events" aria-hidden="true"> |
|
1171 <div class="activity-block"> |
|
1172 <p> |
|
1173 <span id="community-events-location-message"></span> |
|
1174 |
|
1175 <button class="button-link community-events-toggle-location" aria-label="<?php esc_attr_e( 'Edit city' ); ?>" aria-expanded="false"> |
|
1176 <span class="dashicons dashicons-edit"></span> |
|
1177 </button> |
|
1178 </p> |
|
1179 |
|
1180 <form class="community-events-form" aria-hidden="true" action="<?php echo esc_url( admin_url( 'admin-ajax.php' ) ); ?>" method="post"> |
|
1181 <label for="community-events-location"> |
|
1182 <?php _e( 'City:' ); ?> |
|
1183 </label> |
|
1184 <?php |
|
1185 /* translators: Replace with a city related to your locale. |
|
1186 * Test that it matches the expected location and has upcoming |
|
1187 * events before including it. If no cities related to your |
|
1188 * locale have events, then use a city related to your locale |
|
1189 * that would be recognizable to most users. Use only the city |
|
1190 * name itself, without any region or country. Use the endonym |
|
1191 * (native locale name) instead of the English name if possible. |
|
1192 */ |
|
1193 ?> |
|
1194 <input id="community-events-location" class="regular-text" type="text" name="community-events-location" placeholder="<?php esc_attr_e( 'Cincinnati' ); ?>" /> |
|
1195 |
|
1196 <?php submit_button( __( 'Submit' ), 'secondary', 'community-events-submit', false ); ?> |
|
1197 |
|
1198 <button class="community-events-cancel button-link" type="button" aria-expanded="false"> |
|
1199 <?php _e( 'Cancel' ); ?> |
|
1200 </button> |
|
1201 |
|
1202 <span class="spinner"></span> |
|
1203 </form> |
|
1204 </div> |
|
1205 |
|
1206 <ul class="community-events-results activity-block last"></ul> |
|
1207 </div> |
|
1208 |
|
1209 <?php |
|
1210 } |
|
1211 |
|
1212 /** |
|
1213 * Renders the events templates for the Event and News widget. |
|
1214 * |
|
1215 * @since 4.8.0 |
|
1216 */ |
|
1217 function wp_print_community_events_templates() { |
|
1218 ?> |
|
1219 |
|
1220 <script id="tmpl-community-events-attend-event-near" type="text/template"> |
|
1221 <?php printf( |
|
1222 /* translators: %s: the name of a city */ |
|
1223 __( 'Attend an upcoming event near %s.' ), |
|
1224 '<strong>{{ data.location.description }}</strong>' |
|
1225 ); ?> |
|
1226 </script> |
|
1227 |
|
1228 <script id="tmpl-community-events-could-not-locate" type="text/template"> |
|
1229 <?php printf( |
|
1230 /* translators: %s is the name of the city we couldn't locate. |
|
1231 * Replace the examples with cities in your locale, but test |
|
1232 * that they match the expected location before including them. |
|
1233 * Use endonyms (native locale names) whenever possible. |
|
1234 */ |
|
1235 __( 'We couldn’t locate %s. Please try another nearby city. For example: Kansas City; Springfield; Portland.' ), |
|
1236 '<em>{{data.unknownCity}}</em>' |
|
1237 ); ?> |
|
1238 </script> |
|
1239 |
|
1240 <script id="tmpl-community-events-event-list" type="text/template"> |
|
1241 <# _.each( data.events, function( event ) { #> |
|
1242 <li class="event event-{{ event.type }} wp-clearfix"> |
|
1243 <div class="event-info"> |
|
1244 <div class="dashicons event-icon" aria-hidden="true"></div> |
|
1245 <div class="event-info-inner"> |
|
1246 <a class="event-title" href="{{ event.url }}">{{ event.title }}</a> |
|
1247 <span class="event-city">{{ event.location.location }}</span> |
|
1248 </div> |
|
1249 </div> |
|
1250 |
|
1251 <div class="event-date-time"> |
|
1252 <span class="event-date">{{ event.formatted_date }}</span> |
|
1253 <# if ( 'meetup' === event.type ) { #> |
|
1254 <span class="event-time">{{ event.formatted_time }}</span> |
|
1255 <# } #> |
|
1256 </div> |
|
1257 </li> |
|
1258 <# } ) #> |
|
1259 </script> |
|
1260 |
|
1261 <script id="tmpl-community-events-no-upcoming-events" type="text/template"> |
|
1262 <li class="event-none"> |
|
1263 <# if ( data.location.description ) { #> |
|
1264 <?php printf( |
|
1265 /* translators: 1: the city the user searched for, 2: meetup organization documentation URL */ |
|
1266 __( 'There aren’t any events scheduled near %1$s at the moment. Would you like to <a href="%2$s">organize one</a>?' ), |
|
1267 '{{ data.location.description }}', |
|
1268 __( 'https://make.wordpress.org/community/handbook/meetup-organizer/welcome/' ) |
|
1269 ); ?> |
|
1270 |
|
1271 <# } else { #> |
|
1272 <?php printf( |
|
1273 /* translators: %s: meetup organization documentation URL */ |
|
1274 __( 'There aren’t any events scheduled near you at the moment. Would you like to <a href="%s">organize one</a>?' ), |
|
1275 __( 'https://make.wordpress.org/community/handbook/meetup-organizer/welcome/' ) |
|
1276 ); ?> |
|
1277 <# } #> |
|
1278 </li> |
|
1279 </script> |
|
1280 <?php |
|
1281 } |
|
1282 |
929 /** |
1283 /** |
930 * WordPress News dashboard widget. |
1284 * WordPress News dashboard widget. |
931 * |
1285 * |
932 * @since 2.7.0 |
1286 * @since 2.7.0 |
|
1287 * @since 4.8.0 Removed popular plugins feed. |
933 */ |
1288 */ |
934 function wp_dashboard_primary() { |
1289 function wp_dashboard_primary() { |
935 $feeds = array( |
1290 $feeds = array( |
936 'news' => array( |
1291 'news' => array( |
937 |
1292 |
938 /** |
1293 /** |
939 * Filter the primary link URL for the 'WordPress News' dashboard widget. |
1294 * Filters the primary link URL for the 'WordPress News' dashboard widget. |
940 * |
1295 * |
941 * @since 2.5.0 |
1296 * @since 2.5.0 |
942 * |
1297 * |
943 * @param string $link The widget's primary link URL. |
1298 * @param string $link The widget's primary link URL. |
944 */ |
1299 */ |
945 'link' => apply_filters( 'dashboard_primary_link', __( 'http://wordpress.org/news/' ) ), |
1300 'link' => apply_filters( 'dashboard_primary_link', __( 'https://wordpress.org/news/' ) ), |
946 |
1301 |
947 /** |
1302 /** |
948 * Filter the primary feed URL for the 'WordPress News' dashboard widget. |
1303 * Filters the primary feed URL for the 'WordPress News' dashboard widget. |
949 * |
1304 * |
950 * @since 2.3.0 |
1305 * @since 2.3.0 |
951 * |
1306 * |
952 * @param string $url The widget's primary feed URL. |
1307 * @param string $url The widget's primary feed URL. |
953 */ |
1308 */ |
954 'url' => apply_filters( 'dashboard_primary_feed', __( 'http://wordpress.org/news/feed/' ) ), |
1309 'url' => apply_filters( 'dashboard_primary_feed', __( 'http://wordpress.org/news/feed/' ) ), |
955 |
1310 |
956 /** |
1311 /** |
957 * Filter the primary link title for the 'WordPress News' dashboard widget. |
1312 * Filters the primary link title for the 'WordPress News' dashboard widget. |
958 * |
1313 * |
959 * @since 2.3.0 |
1314 * @since 2.3.0 |
960 * |
1315 * |
961 * @param string $title Title attribute for the widget's primary link. |
1316 * @param string $title Title attribute for the widget's primary link. |
962 */ |
1317 */ |
963 'title' => apply_filters( 'dashboard_primary_title', __( 'WordPress Blog' ) ), |
1318 'title' => apply_filters( 'dashboard_primary_title', __( 'WordPress Blog' ) ), |
964 'items' => 1, |
1319 'items' => 1, |
965 'show_summary' => 1, |
1320 'show_summary' => 0, |
966 'show_author' => 0, |
1321 'show_author' => 0, |
967 'show_date' => 1, |
1322 'show_date' => 0, |
968 ), |
1323 ), |
969 'planet' => array( |
1324 'planet' => array( |
970 |
1325 |
971 /** |
1326 /** |
972 * Filter the secondary link URL for the 'WordPress News' dashboard widget. |
1327 * Filters the secondary link URL for the 'WordPress News' dashboard widget. |
973 * |
1328 * |
974 * @since 2.3.0 |
1329 * @since 2.3.0 |
975 * |
1330 * |
976 * @param string $link The widget's secondary link URL. |
1331 * @param string $link The widget's secondary link URL. |
977 */ |
1332 */ |
978 'link' => apply_filters( 'dashboard_secondary_link', __( 'https://planet.wordpress.org/' ) ), |
1333 'link' => apply_filters( 'dashboard_secondary_link', __( 'https://planet.wordpress.org/' ) ), |
979 |
1334 |
980 /** |
1335 /** |
981 * Filter the secondary feed URL for the 'WordPress News' dashboard widget. |
1336 * Filters the secondary feed URL for the 'WordPress News' dashboard widget. |
982 * |
1337 * |
983 * @since 2.3.0 |
1338 * @since 2.3.0 |
984 * |
1339 * |
985 * @param string $url The widget's secondary feed URL. |
1340 * @param string $url The widget's secondary feed URL. |
986 */ |
1341 */ |
987 'url' => apply_filters( 'dashboard_secondary_feed', __( 'https://planet.wordpress.org/feed/' ) ), |
1342 'url' => apply_filters( 'dashboard_secondary_feed', __( 'https://planet.wordpress.org/feed/' ) ), |
988 |
1343 |
989 /** |
1344 /** |
990 * Filter the secondary link title for the 'WordPress News' dashboard widget. |
1345 * Filters the secondary link title for the 'WordPress News' dashboard widget. |
991 * |
1346 * |
992 * @since 2.3.0 |
1347 * @since 2.3.0 |
993 * |
1348 * |
994 * @param string $title Title attribute for the widget's secondary link. |
1349 * @param string $title Title attribute for the widget's secondary link. |
995 */ |
1350 */ |
996 'title' => apply_filters( 'dashboard_secondary_title', __( 'Other WordPress News' ) ), |
1351 'title' => apply_filters( 'dashboard_secondary_title', __( 'Other WordPress News' ) ), |
997 'items' => 3, |
1352 |
|
1353 /** |
|
1354 * Filters the number of secondary link items for the 'WordPress News' dashboard widget. |
|
1355 * |
|
1356 * @since 4.4.0 |
|
1357 * |
|
1358 * @param string $items How many items to show in the secondary feed. |
|
1359 */ |
|
1360 'items' => apply_filters( 'dashboard_secondary_items', 3 ), |
998 'show_summary' => 0, |
1361 'show_summary' => 0, |
999 'show_author' => 0, |
1362 'show_author' => 0, |
1000 'show_date' => 0, |
1363 'show_date' => 0, |
1001 ) |
1364 ) |
1002 ); |
1365 ); |
1003 |
1366 |
1004 if ( ( ! is_multisite() && is_blog_admin() && current_user_can( 'install_plugins' ) ) || ( is_network_admin() && current_user_can( 'manage_network_plugins' ) && current_user_can( 'install_plugins' ) ) ) { |
|
1005 $feeds['plugins'] = array( |
|
1006 'link' => '', |
|
1007 'url' => array( |
|
1008 'popular' => 'http://wordpress.org/plugins/rss/browse/popular/', |
|
1009 ), |
|
1010 'title' => '', |
|
1011 'items' => 1, |
|
1012 'show_summary' => 0, |
|
1013 'show_author' => 0, |
|
1014 'show_date' => 0, |
|
1015 ); |
|
1016 } |
|
1017 |
|
1018 wp_dashboard_cached_rss_widget( 'dashboard_primary', 'wp_dashboard_primary_output', $feeds ); |
1367 wp_dashboard_cached_rss_widget( 'dashboard_primary', 'wp_dashboard_primary_output', $feeds ); |
1019 } |
1368 } |
1020 |
1369 |
1021 /** |
1370 /** |
1022 * Display the WordPress news feeds. |
1371 * Display the WordPress news feeds. |
1023 * |
1372 * |
1024 * @since 3.8.0 |
1373 * @since 3.8.0 |
|
1374 * @since 4.8.0 Removed popular plugins feed. |
1025 * |
1375 * |
1026 * @param string $widget_id Widget ID. |
1376 * @param string $widget_id Widget ID. |
1027 * @param array $feeds Array of RSS feeds. |
1377 * @param array $feeds Array of RSS feeds. |
1028 */ |
1378 */ |
1029 function wp_dashboard_primary_output( $widget_id, $feeds ) { |
1379 function wp_dashboard_primary_output( $widget_id, $feeds ) { |
1030 foreach( $feeds as $type => $args ) { |
1380 foreach ( $feeds as $type => $args ) { |
1031 $args['type'] = $type; |
1381 $args['type'] = $type; |
1032 echo '<div class="rss-widget">'; |
1382 echo '<div class="rss-widget">'; |
1033 if ( $type === 'plugins' ) { |
|
1034 wp_dashboard_plugins_output( $args['url'], $args ); |
|
1035 } else { |
|
1036 wp_widget_rss_output( $args['url'], $args ); |
1383 wp_widget_rss_output( $args['url'], $args ); |
1037 } |
|
1038 echo "</div>"; |
1384 echo "</div>"; |
1039 } |
1385 } |
1040 } |
1386 } |
1041 |
1387 |
1042 /** |
1388 /** |
1043 * Display plugins text for the WordPress news widget. |
|
1044 * |
|
1045 * @since 2.5.0 |
|
1046 */ |
|
1047 function wp_dashboard_plugins_output( $rss, $args = array() ) { |
|
1048 // Plugin feeds plus link to install them |
|
1049 $popular = fetch_feed( $args['url']['popular'] ); |
|
1050 |
|
1051 if ( false === $plugin_slugs = get_transient( 'plugin_slugs' ) ) { |
|
1052 $plugin_slugs = array_keys( get_plugins() ); |
|
1053 set_transient( 'plugin_slugs', $plugin_slugs, DAY_IN_SECONDS ); |
|
1054 } |
|
1055 |
|
1056 echo '<ul>'; |
|
1057 |
|
1058 foreach ( array( $popular ) as $feed ) { |
|
1059 if ( is_wp_error( $feed ) || ! $feed->get_item_quantity() ) |
|
1060 continue; |
|
1061 |
|
1062 $items = $feed->get_items(0, 5); |
|
1063 |
|
1064 // Pick a random, non-installed plugin |
|
1065 while ( true ) { |
|
1066 // Abort this foreach loop iteration if there's no plugins left of this type |
|
1067 if ( 0 == count($items) ) |
|
1068 continue 2; |
|
1069 |
|
1070 $item_key = array_rand($items); |
|
1071 $item = $items[$item_key]; |
|
1072 |
|
1073 list($link, $frag) = explode( '#', $item->get_link() ); |
|
1074 |
|
1075 $link = esc_url($link); |
|
1076 if ( preg_match( '|/([^/]+?)/?$|', $link, $matches ) ) |
|
1077 $slug = $matches[1]; |
|
1078 else { |
|
1079 unset( $items[$item_key] ); |
|
1080 continue; |
|
1081 } |
|
1082 |
|
1083 // Is this random plugin's slug already installed? If so, try again. |
|
1084 reset( $plugin_slugs ); |
|
1085 foreach ( $plugin_slugs as $plugin_slug ) { |
|
1086 if ( $slug == substr( $plugin_slug, 0, strlen( $slug ) ) ) { |
|
1087 unset( $items[$item_key] ); |
|
1088 continue 2; |
|
1089 } |
|
1090 } |
|
1091 |
|
1092 // If we get to this point, then the random plugin isn't installed and we can stop the while(). |
|
1093 break; |
|
1094 } |
|
1095 |
|
1096 // Eliminate some common badly formed plugin descriptions |
|
1097 while ( ( null !== $item_key = array_rand($items) ) && false !== strpos( $items[$item_key]->get_description(), 'Plugin Name:' ) ) |
|
1098 unset($items[$item_key]); |
|
1099 |
|
1100 if ( !isset($items[$item_key]) ) |
|
1101 continue; |
|
1102 |
|
1103 $title = esc_html( $item->get_title() ); |
|
1104 |
|
1105 $ilink = wp_nonce_url('plugin-install.php?tab=plugin-information&plugin=' . $slug, 'install-plugin_' . $slug) . '&TB_iframe=true&width=600&height=800'; |
|
1106 echo "<li class='dashboard-news-plugin'><span>" . __( 'Popular Plugin' ) . ":</span> <a href='$link' class='dashboard-news-plugin-link'>$title</a> <span>(<a href='$ilink' class='thickbox' title='$title'>" . __( 'Install' ) . "</a>)</span></li>"; |
|
1107 |
|
1108 $feed->__destruct(); |
|
1109 unset( $feed ); |
|
1110 } |
|
1111 |
|
1112 echo '</ul>'; |
|
1113 } |
|
1114 |
|
1115 /** |
|
1116 * Display file upload quota on dashboard. |
1389 * Display file upload quota on dashboard. |
1117 * |
1390 * |
1118 * Runs on the activity_box_end hook in wp_dashboard_right_now(). |
1391 * Runs on the {@see 'activity_box_end'} hook in wp_dashboard_right_now(). |
1119 * |
1392 * |
1120 * @since 3.0.0 |
1393 * @since 3.0.0 |
1121 * |
1394 * |
1122 * @return bool|null True if not multisite, user can't upload files, or the space check option is disabled. |
1395 * @return bool|null True if not multisite, user can't upload files, or the space check option is disabled. |
1123 */ |
1396 */ |
1124 function wp_dashboard_quota() { |
1397 function wp_dashboard_quota() { |
1125 if ( !is_multisite() || !current_user_can( 'upload_files' ) || get_site_option( 'upload_space_check_disabled' ) ) |
1398 if ( !is_multisite() || !current_user_can( 'upload_files' ) || get_site_option( 'upload_space_check_disabled' ) ) |
1126 return true; |
1399 return true; |
1127 |
1400 |
1128 $quota = get_space_allowed(); |
1401 $quota = get_space_allowed(); |
1135 $used_class = ( $percentused >= 70 ) ? ' warning' : ''; |
1408 $used_class = ( $percentused >= 70 ) ? ' warning' : ''; |
1136 $used = round( $used, 2 ); |
1409 $used = round( $used, 2 ); |
1137 $percentused = number_format( $percentused ); |
1410 $percentused = number_format( $percentused ); |
1138 |
1411 |
1139 ?> |
1412 ?> |
1140 <h4 class="mu-storage"><?php _e( 'Storage Space' ); ?></h4> |
1413 <h3 class="mu-storage"><?php _e( 'Storage Space' ); ?></h3> |
1141 <div class="mu-storage"> |
1414 <div class="mu-storage"> |
1142 <ul> |
1415 <ul> |
1143 <li class="storage-count"> |
1416 <li class="storage-count"> |
1144 <?php $text = sprintf( |
1417 <?php $text = sprintf( |
1145 /* translators: number of megabytes */ |
1418 /* translators: %s: number of megabytes */ |
1146 __( '%s MB Space Allowed' ), |
1419 __( '%s MB Space Allowed' ), |
1147 number_format_i18n( $quota ) |
1420 number_format_i18n( $quota ) |
1148 ); |
1421 ); |
1149 printf( |
1422 printf( |
1150 '<a href="%1$s" title="%2$s">%3$s</a>', |
1423 '<a href="%1$s">%2$s <span class="screen-reader-text">(%3$s)</span></a>', |
1151 esc_url( admin_url( 'upload.php' ) ), |
1424 esc_url( admin_url( 'upload.php' ) ), |
1152 __( 'Manage Uploads' ), |
1425 $text, |
1153 $text |
1426 __( 'Manage Uploads' ) |
1154 ); ?> |
1427 ); ?> |
1155 </li><li class="storage-count <?php echo $used_class; ?>"> |
1428 </li><li class="storage-count <?php echo $used_class; ?>"> |
1156 <?php $text = sprintf( |
1429 <?php $text = sprintf( |
1157 /* translators: 1: number of megabytes, 2: percentage */ |
1430 /* translators: 1: number of megabytes, 2: percentage */ |
1158 __( '%1$s MB (%2$s%%) Space Used' ), |
1431 __( '%1$s MB (%2$s%%) Space Used' ), |
1159 number_format_i18n( $used, 2 ), |
1432 number_format_i18n( $used, 2 ), |
1160 $percentused |
1433 $percentused |
1161 ); |
1434 ); |
1162 printf( |
1435 printf( |
1163 '<a href="%1$s" title="%2$s" class="musublink">%3$s</a>', |
1436 '<a href="%1$s" class="musublink">%2$s <span class="screen-reader-text">(%3$s)</span></a>', |
1164 esc_url( admin_url( 'upload.php' ) ), |
1437 esc_url( admin_url( 'upload.php' ) ), |
1165 __( 'Manage Uploads' ), |
1438 $text, |
1166 $text |
1439 __( 'Manage Uploads' ) |
1167 ); ?> |
1440 ); ?> |
1168 </li> |
1441 </li> |
1169 </ul> |
1442 </ul> |
1170 </div> |
1443 </div> |
1171 <?php |
1444 <?php |
1172 } |
1445 } |
1173 add_action( 'activity_box_end', 'wp_dashboard_quota' ); |
|
1174 |
1446 |
1175 // Display Browser Nag Meta Box |
1447 // Display Browser Nag Meta Box |
1176 function wp_dashboard_browser_nag() { |
1448 function wp_dashboard_browser_nag() { |
1177 $notice = ''; |
1449 $notice = ''; |
1178 $response = wp_check_browser_version(); |
1450 $response = wp_check_browser_version(); |
1179 |
1451 |
1180 if ( $response ) { |
1452 if ( $response ) { |
1181 if ( $response['insecure'] ) { |
1453 if ( $response['insecure'] ) { |
1182 $msg = sprintf( __( "It looks like you're using an insecure version of <a href='%s'>%s</a>. Using an outdated browser makes your computer unsafe. For the best WordPress experience, please update your browser." ), esc_attr( $response['update_url'] ), esc_html( $response['name'] ) ); |
1454 /* translators: %s: browser name and link */ |
|
1455 $msg = sprintf( __( "It looks like you're using an insecure version of %s. Using an outdated browser makes your computer unsafe. For the best WordPress experience, please update your browser." ), |
|
1456 sprintf( '<a href="%s">%s</a>', esc_url( $response['update_url'] ), esc_html( $response['name'] ) ) |
|
1457 ); |
1183 } else { |
1458 } else { |
1184 $msg = sprintf( __( "It looks like you're using an old version of <a href='%s'>%s</a>. For the best WordPress experience, please update your browser." ), esc_attr( $response['update_url'] ), esc_html( $response['name'] ) ); |
1459 /* translators: %s: browser name and link */ |
|
1460 $msg = sprintf( __( "It looks like you're using an old version of %s. For the best WordPress experience, please update your browser." ), |
|
1461 sprintf( '<a href="%s">%s</a>', esc_url( $response['update_url'] ), esc_html( $response['name'] ) ) |
|
1462 ); |
1185 } |
1463 } |
1186 |
1464 |
1187 $browser_nag_class = ''; |
1465 $browser_nag_class = ''; |
1188 if ( !empty( $response['img_src'] ) ) { |
1466 if ( !empty( $response['img_src'] ) ) { |
1189 $img_src = ( is_ssl() && ! empty( $response['img_src_ssl'] ) )? $response['img_src_ssl'] : $response['img_src']; |
1467 $img_src = ( is_ssl() && ! empty( $response['img_src_ssl'] ) )? $response['img_src_ssl'] : $response['img_src']; |
1337 </div> |
1629 </div> |
1338 </div> |
1630 </div> |
1339 </div> |
1631 </div> |
1340 <?php |
1632 <?php |
1341 } |
1633 } |
|
1634 |
|
1635 /** |
|
1636 * Displays a Try Gutenberg Panel, to introduce people to Gutenberg |
|
1637 * |
|
1638 * @since 4.9.8 |
|
1639 */ |
|
1640 function wp_try_gutenberg_panel() { |
|
1641 $plugins = get_plugins(); |
|
1642 $action = $url = $classes = ''; |
|
1643 $classic_action = $classic_url = $classic_classes = ''; |
|
1644 |
|
1645 if ( current_user_can( 'install_plugins' ) ) { |
|
1646 if ( empty( $plugins['gutenberg/gutenberg.php'] ) ) { |
|
1647 if ( get_filesystem_method( array(), WP_PLUGIN_DIR ) === 'direct' ) { |
|
1648 $action = __( 'Install Gutenberg' ); |
|
1649 $url = wp_nonce_url( self_admin_url( 'update.php?action=install-plugin&plugin=gutenberg' ), 'install-plugin_gutenberg' ); |
|
1650 $classes = ' install-now'; |
|
1651 } |
|
1652 } else if ( is_plugin_inactive( 'gutenberg/gutenberg.php' ) ) { |
|
1653 $action = __( 'Activate Gutenberg' ); |
|
1654 $url = wp_nonce_url( self_admin_url( 'plugins.php?action=activate&plugin=gutenberg/gutenberg.php&from=try-gutenberg' ), 'activate-plugin_gutenberg/gutenberg.php' ); |
|
1655 $classes = ' activate-now'; |
|
1656 } |
|
1657 |
|
1658 if ( empty( $plugins['classic-editor/classic-editor.php'] ) ) { |
|
1659 if ( get_filesystem_method( array(), WP_PLUGIN_DIR ) === 'direct' ) { |
|
1660 $classic_action = __( 'Install the Classic Editor' ); |
|
1661 $classic_url = wp_nonce_url( self_admin_url( 'update.php?action=install-plugin&plugin=classic-editor' ), 'install-plugin_classic-editor' ); |
|
1662 $classic_classes = ' install-now'; |
|
1663 } |
|
1664 } else if ( is_plugin_inactive( 'classic-editor/classic-editor.php' ) ) { |
|
1665 $classic_action = __( 'Activate the Classic Editor' ); |
|
1666 $classic_url = wp_nonce_url( self_admin_url( 'plugins.php?action=activate&plugin=classic-editor/classic-editor.php&from=try-gutenberg' ), 'activate-plugin_classic-editor/classic-editor.php' ); |
|
1667 $classic_classes = ' activate-now'; |
|
1668 } else { |
|
1669 $classic_action = __( 'The Classic Editor is activated' ); |
|
1670 $classic_url = wp_nonce_url( self_admin_url( 'plugins.php?action=activate&plugin=classic-editor/classic-editor.php&from=try-gutenberg' ), 'activate-plugin_classic-editor/classic-editor.php' );; |
|
1671 $classic_classes = ' button-disabled install-now updated-message'; |
|
1672 } |
|
1673 } |
|
1674 |
|
1675 if ( current_user_can( 'edit_posts' ) && is_plugin_active( 'gutenberg/gutenberg.php' ) ) { |
|
1676 $action = __( 'Try Gutenberg' ); |
|
1677 $url = admin_url( 'admin.php?page=gutenberg' ); |
|
1678 } |
|
1679 |
|
1680 ?> |
|
1681 <div class="try-gutenberg-panel-content"> |
|
1682 <h2><?php _e( 'A new, modern publishing experience is coming soon.' ); ?></h2> |
|
1683 |
|
1684 <p class="about-description"><?php _e( "Take your words, media, and layout in new directions with Gutenberg, the WordPress editor we're currently building." ); ?></p> |
|
1685 |
|
1686 <hr /> |
|
1687 |
|
1688 <div class="try-gutenberg-panel-column-container"> |
|
1689 <div class="try-gutenberg-panel-column try-gutenberg-panel-image-column"> |
|
1690 <picture> |
|
1691 <source srcset="about:blank" media="(max-width: 1024px)"> |
|
1692 <img src="https://s.w.org/images/core/gutenberg-screenshot.png?<?php echo date( 'Ymd' ); ?>" alt="<?php esc_attr_e( 'Screenshot from the Gutenberg interface' ); ?>" /> |
|
1693 </picture> |
|
1694 </div> |
|
1695 <div class="try-gutenberg-panel-column plugin-card-gutenberg"> |
|
1696 |
|
1697 <div> |
|
1698 <h3><?php _e( 'Test the new editor today.' ); ?></h3> |
|
1699 |
|
1700 <p> |
|
1701 <?php _e( "You can take Gutenberg for a spin (and share your feedback, if you’d like) before we officially release it, by installing it as a plugin." ); ?> |
|
1702 <?php |
|
1703 printf( |
|
1704 /* translators: 1: Gutenberg call for testing handbook link, 2: Gutenberg GitHub repository issues link, 3: Gutenberg GitHub repository CONTRIBUTING.md link */ |
|
1705 __( 'You can help by <a href="%1$s">testing</a>, <a href="%2$s">filing bugs</a>, or contributing on the <a href="%3$s">GitHub repository</a>.' ), |
|
1706 'https://make.wordpress.org/test/handbook/call-for-testing/gutenberg-testing/', |
|
1707 'https://github.com/WordPress/gutenberg/issues', |
|
1708 'https://github.com/WordPress/gutenberg/blob/master/CONTRIBUTING.md' |
|
1709 ); |
|
1710 ?> |
|
1711 </p> |
|
1712 </div> |
|
1713 |
|
1714 <div class="try-gutenberg-action"> |
|
1715 <?php if ( $action ) { ?> |
|
1716 <p><a class="button button-primary button-hero<?php echo $classes; ?>" href="<?php echo esc_url( $url ); ?>" data-name="<?php esc_attr_e( 'Gutenberg' ); ?>" data-slug="gutenberg"><?php echo $action; ?></a></p> |
|
1717 <?php } ?> |
|
1718 |
|
1719 <p> |
|
1720 <?php |
|
1721 $learnmore = sprintf( |
|
1722 /* translators: Link to https://wordpress.org/gutenberg/ */ |
|
1723 __( '<a href="%s">Learn more about Gutenberg</a>' ), |
|
1724 __( 'https://wordpress.org/gutenberg/' ) |
|
1725 ); |
|
1726 |
|
1727 /** |
|
1728 * Filters the "Learn more" link in the Try Gutenberg panel. |
|
1729 * |
|
1730 * It allows hosts or site owners to change the link, to provide extra |
|
1731 * information about Gutenberg, specific to their service. |
|
1732 * |
|
1733 * WARNING: This filter will only exist in the 4.9.x series, it will not be |
|
1734 * added to WordPress 5.0 and later. |
|
1735 * |
|
1736 * @since 4.9.8 |
|
1737 */ |
|
1738 echo apply_filters( 'try_gutenberg_learn_more_link', $learnmore ); |
|
1739 ?> |
|
1740 </p> |
|
1741 </div> |
|
1742 </div> |
|
1743 |
|
1744 <div class="try-gutenberg-panel-column plugin-card-classic-editor"> |
|
1745 |
|
1746 <div> |
|
1747 <h3><?php _e( 'Not quite ready?' ); ?></h3> |
|
1748 |
|
1749 <p> |
|
1750 <?php _e( 'The new editor will be enabled by default in the next major release of WordPress. If you’re not sure how compatible your current themes and plugins are, we’ve got you covered.' ); ?> |
|
1751 <?php |
|
1752 printf( |
|
1753 /* translators: Link to the Classic Editor plugin page */ |
|
1754 __( 'Install the <a href="%s">Classic Editor plugin</a> to keep using the current editor until you’re ready to make the switch.' ), |
|
1755 __( 'https://wordpress.org/plugins/classic-editor' ) |
|
1756 ); |
|
1757 ?> |
|
1758 </p> |
|
1759 </div> |
|
1760 |
|
1761 <?php if ( $classic_action ) { ?> |
|
1762 <div class="try-gutenberg-action"> |
|
1763 <p><a class="button button-secondary button-hero<?php echo $classic_classes; ?>" href="<?php echo esc_url( $classic_url ); ?>" data-name="<?php esc_attr_e( 'Classic Editor' ); ?>" data-slug="classic-editor"><?php echo $classic_action; ?></a></p> |
|
1764 </div> |
|
1765 <?php } ?> |
|
1766 </div> |
|
1767 </div> |
|
1768 </div> |
|
1769 <?php |
|
1770 } |