���� JFIF  H H ��(ICC_PROFILE   0 mntrRGB XYZ acsp  ��  �- desc � trXYZ d gXYZ x bXYZ � rTRC � (gTRC � (bTRC � (wtpt � cprt � ب���V�7eud�akt��!Q ,*R����G�PQ�NČzŬb 56��6��6p �z��"c8�3'���'Mq�6����G�i�t�q��l@�9��0.ۚA�����c���N|li:�9�蠃p���/��^�Zn���L���x84�v�����;[#$ ��n����h�'�����c���3���2o�8Ɛ5K��Av*_�?n�X�?��p��y�ֆ����̈́#�z�����2�3�F0O���e> {�Gu�.�V �(C���'h/�o%>�x1X� r:(>}�{�yc��X�8b��]�U�:�dO�Ms���VA�����p�'Z�3'3E�-�y��bj:�>��j�Ov�Uw�#�2cl~�@gF�C����jț���bz� ^:����-t��df��j{XTh���8aU���M��^+d�Al��"(KK� m1$$ X�K�K�q�rž�o�q��g� V FF#pG~����:�]�֦��!!Ң�:pC+ �A�����zӬ�].��t�`=�'�h�_/�}����� �@L�\�,�x㌼��z԰+�J�-��v�+�Y��������[�'8�'�� �%�� X q=������[4�Sj~�4�ݢ�#�d�ʂē�R�L5k��X؊���>��l���:t\��ba��B��A\Q3�8�(�<���A�;�d�)�n�ӓLr�Œ��*�|J�: Ƒ���2rF ������G�A�8��&\ �A�-�J) ��/j�`t.���E�� � ��A�:�T �m�"%Cb"!��7��wΦ�� �Æ��%�;���[�]�U�zmF������kx�+��7�^�Ү�R��"7�����N+-��b7�c�,.55�H�T���E`)��P�T ci 20y=MڭyٽS��Odc�i�UJnq&~zn$�Rp��)fG'�2�'����.�mEϙ���Z����oV���𶛒u�S�]�|�A�@.���)<��+�'>�� ө����:&�$� '��L�#���d{q�H�>*5;��jDo����� ˷�����Y��m���Ԉ*[9*�5���t�Uf��%3��= �GU������W\�'�����AR��_�W��4�_��P �պ�� ��-���|�4R��F��JZ�v0�d[ˠzJ|��PU�8��;鯌� '�V��cL�,���κ�>���*e��b)f,�0�"j1���� �1������v՘;�b�J��++�C�Oz7�%�>�N�U��,=z�\�c�EV�K�>Ic�7} .��jHn;^觱GHI����� �H�V����ǂO:�ߊ{mSV?K|@�� ���A��iA����T`2��j �� 1�~�K8’$� �~]=9ឦG �*����9�E�Mּm5X�f�9�Q�ĸ}i D%��+t+;F��: v�:�-�&����h�_�rD�|�!� �Ә�;Z�l��븂'�������:�C�&�Ҁae��Kkm6���� �uT".}J&\� hci�B2B�+�T�7�t?EPþЌ��m�A�F\�l���c2�ЊABm�E,cն\Q���J�]d�5� �����������`O�� Y@�8�?lx#���K�iI&��Ri1f��R2f1N�%_�g�*T���Ө��??N:����}+ל�ɀ�h٭�q��L��,ʈ�B�r����c��u��Bmz�� ̢TV^� 뙏8' ����u��fUX�3㓏��>NG�:���/�;�H�p饕�B�1�K�� ���/%iɫ V�Q%�:�_ -��1o����L�?�R��oa\i^����F|����W*Na)��P�� �X�#y㯨�z+C���ح\��в�j��i�rm����*d��W�ҡQb�BȨ��i'%�NEb�?���'[����h�=`Oi��U϶�u� ���n��R�}GW�4f�VJm������i�R���~��J|l%m'��%�"�LW�� V��2���7���Ns�X�b�?_�=����{s�}ij4�Ý=SN����jx�FV�"ԎI(�E���)]�ӝ�Ж���m�[4 m��`5�-7W�����f�󪥎�b�Z�K�a#Vb%��K��Y����5���T�$y`�4�6�̼�p �C�7�HM������'l{Oi � +���Pw~j,S5T4(F�Ԩ;�A��`*HJ��TP�g�t��(6/�cg��5�U�1@Qb8�Y!����r�<���r�6h��)��[{h�h�8 ���3���� ��0<�y+V�>BzOQ�KF+6�v�%=��~XD��PpW���c�_-:߈����#c�坣���C�W1�:�^�Q�� 06Ӭ�q@ Dj�$ �UW���$�?9���F�\cS���M5�=��2>�hב\,(�)�JB�k���; �J���#j徻W�(p=�o��Q�D� #U�Mh��U�*F��c ?N���=�n���F5��Ӑ12��w�0�5Z���뀩4ڣ���霅�uC1������y�����%n���J�8Ԑ���*c��r������R��� ��9W=�H�����9�,�A�׻,��.���ZF�b�� QEGVNs, �q�'�����;O����Mm�btN���Vq�Ow*֙kPѬ؈����X�J���I��ӯ��E������Wo�k�+��R�{��%�����j;��� ���Y��x����� ��7&&���,���LԜ���Y�bw"�lI���(*���`۹F� ����A�S����- #$�������4����13)Q���pڤ3Rx�O�J�$c�P]v�i�uq� {��k��y�N.��- ��B���,@󪳪ڸ�Ao���r%��X0�U��N��b��9 ���������򍕑��7)*��23�3���|�Rn�b���@�q��|E���U���y��́$!7����&���["X�O�y� �~ƓtADhP���]��m�G�파�9�p=�ԜZ]ӭ�ሎ�O�eyq�� !�b�I �GU����:�5~�F��o�L �S�T[е�$]$g��*�w]��!��;��m@�ޠ�&IU�ڬ{�҄բ-.Sm�Ғ�`���� �������vU"o�L��;�'��5s�"�W�)��@��ä���L�1i��}�^Y5�$+�P���v0o ������HU @ȓ��s�Q�M�)��?�M\��4�Q�� ��$2���;g� �WJ�/NwF�JG�D�:� y�� ��ό���Mf��W!���QUZ%a�zҳ����DK�_��X�h��M�^r�ԝ^!d��'<#ﴛ�O���{����/F�?�+�$ �Y�' wg'$��l������jG�AH�7l�4�������x�Ѷ�c��}���I�*e�s��g�~��;ͤ��t@����B�����2�iB'�9C �a�8���f�TR:�� �����%���N�O���@� m����3�s�v�� ��w� .@�濾��� ��,FYrT0m��UW�_v>>d�[���A�6��ڊx�:�Y�����T�L�����Hv��Ӻ!�n�S�D}�>[m�E�T0��_�,'C]���p����j�����V���ᅷ��PDZ[-��V0`����>�}��ܟpmֻ�2O6�O*����ݹ�X�HS�N(J�� /�+1՟�#(��P�*g�����EO�#�w&j�6�?;��ڡ�)+�U���]l��\�/{莄��*�I���/�����9�<'$�'#'��y�t/&�-\\WP�L`/p9�q��a'�e��¨��E]�� f��A�A�E�Y�nGtm,�ϮwXT�>AaN#���F��j��ŵj�Q�Fd������q^<�H?��y���J�܃2�*���3� T4�Ч����H���**W;�(ꭽ�¾�P�f=����e���yA���4�FJ��6{e�]J��q��OC��f#3��S�J�f i�MM\ i�T�$�rG�8$��9>2��:��M)���Q�#N��K��e��&"�E�8�����.��z�<��mHk�?�#��t��˒��A���]; G0H�:��f!�i�! ��� j�{���1�m�}���o��7�u;�$����99Ӱ���\n�c��z:zA�Lq�޶w�y��K���T<�����4�X,�'!Y;���Ͱ6�q� G�M~_�~܂}��t>���(��z�l�}:r �L�9 fe}.-���R*<`c6��o�ܛ=�pr��ҽGB)nQ%���������)s*&i΍��%—Zb{���m[��N�Nkb���wB����w Q*��d��F ��HP � � iܛ�; aV68j}\e�I��GI'͔B����;yA �:^���bn��-�m�#�@������S6�ˎr���� ;��~�cm�ƻgU��:�X6�G��%�<�r�' dzX^}�-� �H�X�D�������-C�W`#���کpNH5�E�y��=�1���G�#�꽁���C�5Yx��z�Y_"&�A�*�C� �+q7Km�1Pm��@in�88��  N�� ^c.d �p� � �>[�g�c��������{]c�4�)����f�psgY��˅����>��*"1���}2<1���7����5)]���������V5)kd�kM��~`�΂�����:{���4���nG��PTT�����b�� �� �� ����뎱�϶w FFᓂG8���>z��F����_�H��9_r��D��l:������ҶH5��Z!Bj.y��k}�e�rb:SOT��]!ǎ?n:H�ε�Z�s��y�z�tn���[�7N��Z#UQO$�.�J�#]Cr#�Y��X���9���c�<��'$�������z��� 9� ������.�$��$P���nDS�n ��2��u5���X ���g\��� �?�����|A���ᬰⶵ��� �>>�bE)�Cb����-ruMc��׺��*,\)`^���m� ge�\k�.�۫8��گ��oK�1��gWM�p�U޻zI=EE�rz:�#���6�-�-/�Wm��\z8�מ�0x �t��A���_c�?Ծ���c�^Mژ�������I�MyO>�l0�ċ�}t7[�\�ʲ9̜��m_a[�姯�rְ�j��P�\k�x��1�'�CdmvF70e���+����m-�]a��?ݝK��uSMUm 8f� ��Yb!�)�2Z.U���D� ���\~:��ܽ8z��R�̪K�c�b�s����&ߦ��������1�$�,� w�\gc�����3F$��iU#<�`��:�I�4{w���.���2���a��Q�$�EX�<��p}�x>N���o?Gm ��N�N rE��$#J�n҉�!��A��H'<�w���i���i͗k�;��S;(PY ����y,��|� v� �G!H���$��4�ƴ��@��V��!қ 7����� �$�� ���{��O�y�� �W�SY��:��I�doI�5b�_���s��G��q��$�qIOg�-���B�H]_�V���������G����!��w0�p$����n�U����#ROMB��$Zn:�BD�U���KE�4�����ec�q������}���3�������^���n��BZ�j�b��W��`l��� �Z�d�"��"�b�]nm!ij.��{&*������F���O?��c�u�]�������u�VQbj:�J�B��.Xg�J�Fsq�d祚N� �x�ʣR��;!�$�� � �:��F�cU��$R1- �K�'ɋ� I���x8�Ϗoߠ�F~�� ���z "��_^v�2��-����f��K ������kW8 c�.�Ms-����6�=eV�=����ev�\����������L�=� g�n22p<�׵?r�Fۏ�>z��eP��z��Rog�8u�(�tJ�P߁�Z���.p�Ð���͢A��ռ65�X��syvm��� 6R�W7W��;��|0�� >O��үG��@������ٳ<�>�om��Լ()���kZJlK,����F 4��)sn��������O�Q�{u㌏�=� A��o���,ծ����?eKB�zG �6e6������ ������ f|�C�U�� �_�4�C[j͕M�8,%em��M���8�\� ��c�v� COwTGi� _9��4���BDf%���'ns��8�M�P��c���������&�-�y"8R��_j���� �3a��+z+��N� �9���Q�lDQ�40�E �V���ۋ�rH�2�I�_���Y�O�',:뿉�WN�Hvﵐ0�B}n�����a*E zUb�N#��0�e"�f.Q���� ��H��5"��-�H�Vn=�+ #� �Eiy- �v8=�g��`���o�[ 鼛�2�.�D�^�����Q����eB� ؅q��Ͽ�R�C~ B+J�ۍ��8 ���4���*�Ӗ������Ν1��R �B��I\ �1[0 �I�9y��)���Y " 7�]6�q��g\� ��vP�  ��s�= Ѭ֕)פ��E��<�� �c`��ϷU9�W��,: �?�y����1h�s�U(�T g��e�/룮����J�A�]|��������4a�ZV�AI�eIhBI!�l�$��3![q�Hnw\7R�{��o�M�/�ִ��>�5&�� gw�j�F�E��� dc@K:V&�W�/k�+�=�Y�k[� @fU��5�zzmF��ȖH,[��� n�-dc� �w�d[��z"��g�4��ϘR�r�0`B��8_;�� #�$^Z�������o5K�ZYKj �GY%�����s�"!a�[9I2TF�����-�������w#a�]���˒����I�tٮ�ei_��F�pVЧ૱W�3e�Ci�7� ���"���}��H��A�pG>�h��֝������5i�� T٧- '�`d�X1���AF$�$<���y��9~��,��n���e�boW�>ޙ_��Z]ڷ�T���C�� ���U�y� ��J���G��O��}���� ���>���A"����5��a> Z�U��R� -��Z�\9� jrW��ݖQ�Rݳ�*�ļ��]�$ڵ�Xq�=�/��w�� ��z\��I��I�#�{�ӭ��l�^;�F_R쵎�[ָ[gK�KͰ�o�Q� )W녕��і��s�*kuz�ŨQde`�WU_��KLE��~"��g r<�2G�y��އ����L�(�-V�Y��� -Z(�I�U�����0� �|�\���;�8��C��� ��m����hl��:̄D��k�YHO�k��|:��*D��Y� ts�س� |��zrO;�񍃌s�T3���1���=�j�w���y��Ш��^nZ��H���m��_G̮��0W���������󿓹�S�;�����_$�mٛI��D�V��=f�-H�}����U����]H��A��*�vԶ����3\�Wh*I#$�@6�����x��^��O�Z���C&J�U� 16� X�D*��if&��B��DGFY�YP�[KL�X u�X �.Z�� h��q Ghb��8��M#�Mq�t�\c�>�� ��aT �� 00=�㎨ʕ�G�Q�Ԫ�R�����,Ĝ�I9����zӦ��JO��3Rn��`�C�5����܊@Q�O1�N.ؔ"I\�YÖ�Đ�H�d���L���������\}IP~jm�$ y�����;� ����:ZG��ZV�Jv ��=&*UF#`�`R`*S+p��\=)� ���ҭ�9�k������̮Rš�x��0'����**ԑL�kɺk��+zJb�#�:|M��Z� ��?�j$ݼ &�X�)$���6�F���Y6ѕ/������;�� ��J�*n����l��C�*ų_� �ԕ{�_�6�:\47ڷ�s��4R���m�Ċ�=����z ����*��ʪ��XT��[��������]�5�Bl#a�-˙bv�8�@�H���|R���we9A%5&�M����%�Z02T���N)&&GfM 儀o��Œ���M�;=���./�/k~ E"a9/3���y���,>��l��j��>������Z��X��y�&ε��Y�P��&h �g�e�c<�``����]!}i'c �KQ�ulF�Iʓ_\T58��(�+cJ��q~ ����[d�����gm�m/`��Xڙ�ht�k�q� ��ו$���"�c[P�VY�[uɜ&#�몵��"���Ⱦ�qC���"�Ü��Ȕ!���<����M�j8��u-�d��x��*�g��ϫ�t�T�Ld�K�laWڭ��\���~�|����7�u`��h(����w��֋�c�L=�����˼�=�F��vcG��s�}��зU����BS�М;�FI;���Q�$8�+V|[C�S��쮙���1�%�YP�� Q%� L�����VVK+&�,�c�Ib��]���Vy�i� �~h��?y��F4��"5��A�s-���F� ݆x5���5P&E�:W@f;}��G�y���^�]U ��� ITki�� ��1���� �d﫠���*c���N���h��'� c�ؗY�n�s�L����:b��?��H� :k���M~�@����8#�I�qɔ�~��:f�]��P*i]H��'f��jhx�Tҗ�1��O��:���^t�$�1]�����UXz&������t�OD�T�����>�(^�s��&3��#N_�/�x��-�䬦?��� ~��v��U-����W$4����'�ӎ�v�������RG�|jy��SW?�u���4�(�1 G[��ِ2��2jʎ�hr�m�oյ�ش��gRͮ%ϟ�Ѭ��9� �o���R  n-�����&F�-�����@����hgY�����_qN��;"2 �!K�J � šA��^, ��"�aG�8`�=1�4�=5�Mq�k�>��U@UT �:�R�gj����rK�F.�O$�I9'���=i�}.�_�� 403 Forbidden
  • Your IP: 216.73.216.38
  • Server IP: 54.36.91.62
  • Server: Linux webm008.cluster127.gra.hosting.ovh.net 6.18.42-ovh-vps-grsec-zfs+ #1 SMP PREEMPT_DYNAMIC Wed Aug 5 15:59:48 CEST 2026 x86_64
  • Server Software: Apache
  • PHP Version: 7.0.33
  • Buat File | Buat Folder
Edit File: dashboard.php

'save-post' ) ); ?>

'post', 'post_status' => 'draft', 'author' => get_current_user_id(), 'posts_per_page' => 4, 'orderby' => 'modified', 'order' => 'DESC', ); /** * Filters the post query arguments for the 'Recent Drafts' dashboard widget. * * @since 4.4.0 * * @param array $query_args The query arguments for the 'Recent Drafts' dashboard widget. */ $query_args = apply_filters( 'dashboard_recent_drafts_query_args', $query_args ); $drafts = get_posts( $query_args ); if ( ! $drafts ) { return; } } echo '
'; if ( count( $drafts ) > 3 ) { printf( '

%s

' . "\n", esc_url( admin_url( 'edit.php?post_status=draft' ) ), __( 'View all drafts' ) ); } echo '

' . __( 'Your Recent Drafts' ) . "

\n
    "; /* translators: Maximum number of words used in a preview of a draft on the dashboard. */ $draft_length = intval( _x( '10', 'draft_length' ) ); $drafts = array_slice( $drafts, 0, 3 ); foreach ( $drafts as $draft ) { $url = get_edit_post_link( $draft->ID ); $title = _draft_or_post_title( $draft->ID ); echo "
  • \n"; printf( '
    %s
    ', esc_url( $url ), /* translators: %s: Post title. */ esc_attr( sprintf( __( 'Edit “%s”' ), $title ) ), esc_html( $title ), get_the_time( 'c', $draft ), get_the_time( __( 'F j, Y' ), $draft ) ); $the_content = wp_trim_words( $draft->post_content, $draft_length ); if ( $the_content ) { echo '

    ' . $the_content . '

    '; } echo "
  • \n"; } echo "
\n
"; } /** * Outputs a row for the Recent Comments widget. * * @access private * @since 2.7.0 * * @global WP_Comment $comment Global comment object. * * @param WP_Comment $comment The current comment. * @param bool $show_date Optional. Whether to display the date. */ function _wp_dashboard_recent_comments_row( &$comment, $show_date = true ) { $GLOBALS['comment'] = clone $comment; if ( $comment->comment_post_ID > 0 ) { $comment_post_title = _draft_or_post_title( $comment->comment_post_ID ); $comment_post_url = get_the_permalink( $comment->comment_post_ID ); $comment_post_link = "$comment_post_title"; } else { $comment_post_link = ''; } $actions_string = ''; if ( current_user_can( 'edit_comment', $comment->comment_ID ) ) { // Pre-order it: Approve | Reply | Edit | Spam | Trash. $actions = array( 'approve' => '', 'unapprove' => '', 'reply' => '', 'edit' => '', 'spam' => '', 'trash' => '', 'delete' => '', 'view' => '', ); $del_nonce = esc_html( '_wpnonce=' . wp_create_nonce( "delete-comment_$comment->comment_ID" ) ); $approve_nonce = esc_html( '_wpnonce=' . wp_create_nonce( "approve-comment_$comment->comment_ID" ) ); $approve_url = esc_url( "comment.php?action=approvecomment&p=$comment->comment_post_ID&c=$comment->comment_ID&$approve_nonce" ); $unapprove_url = esc_url( "comment.php?action=unapprovecomment&p=$comment->comment_post_ID&c=$comment->comment_ID&$approve_nonce" ); $spam_url = esc_url( "comment.php?action=spamcomment&p=$comment->comment_post_ID&c=$comment->comment_ID&$del_nonce" ); $trash_url = esc_url( "comment.php?action=trashcomment&p=$comment->comment_post_ID&c=$comment->comment_ID&$del_nonce" ); $delete_url = esc_url( "comment.php?action=deletecomment&p=$comment->comment_post_ID&c=$comment->comment_ID&$del_nonce" ); $actions['approve'] = sprintf( '%s', $approve_url, "dim:the-comment-list:comment-{$comment->comment_ID}:unapproved:e7e7d3:e7e7d3:new=approved", esc_attr__( 'Approve this comment' ), __( 'Approve' ) ); $actions['unapprove'] = sprintf( '%s', $unapprove_url, "dim:the-comment-list:comment-{$comment->comment_ID}:unapproved:e7e7d3:e7e7d3:new=unapproved", esc_attr__( 'Unapprove this comment' ), __( 'Unapprove' ) ); $actions['edit'] = sprintf( '%s', "comment.php?action=editcomment&c={$comment->comment_ID}", esc_attr__( 'Edit this comment' ), __( 'Edit' ) ); $actions['reply'] = sprintf( '', $comment->comment_ID, $comment->comment_post_ID, esc_attr__( 'Reply to this comment' ), __( 'Reply' ) ); $actions['spam'] = sprintf( '%s', $spam_url, "delete:the-comment-list:comment-{$comment->comment_ID}::spam=1", esc_attr__( 'Mark this comment as spam' ), /* translators: "Mark as spam" link. */ _x( 'Spam', 'verb' ) ); if ( ! EMPTY_TRASH_DAYS ) { $actions['delete'] = sprintf( '%s', $delete_url, "delete:the-comment-list:comment-{$comment->comment_ID}::trash=1", esc_attr__( 'Delete this comment permanently' ), __( 'Delete Permanently' ) ); } else { $actions['trash'] = sprintf( '%s', $trash_url, "delete:the-comment-list:comment-{$comment->comment_ID}::trash=1", esc_attr__( 'Move this comment to the Trash' ), _x( 'Trash', 'verb' ) ); } $actions['view'] = sprintf( '%s', esc_url( get_comment_link( $comment ) ), esc_attr__( 'View this comment' ), __( 'View' ) ); /** * Filters the action links displayed for each comment in the 'Recent Comments' * dashboard widget. * * @since 2.6.0 * * @param string[] $actions An array of comment actions. Default actions include: * 'Approve', 'Unapprove', 'Edit', 'Reply', 'Spam', * 'Delete', and 'Trash'. * @param WP_Comment $comment The comment object. */ $actions = apply_filters( 'comment_row_actions', array_filter( $actions ), $comment ); $i = 0; foreach ( $actions as $action => $link ) { ++$i; ( ( ( 'approve' == $action || 'unapprove' == $action ) && 2 === $i ) || 1 === $i ) ? $sep = '' : $sep = ' | '; // Reply and quickedit need a hide-if-no-js span. if ( 'reply' == $action || 'quickedit' == $action ) { $action .= ' hide-if-no-js'; } if ( 'view' === $action && '1' !== $comment->comment_approved ) { $action .= ' hidden'; } $actions_string .= "$sep$link"; } } ?>
  • > comment_type || 'comment' == $comment->comment_type ) : ?>

    ' . get_comment_author_link( $comment ) . '', $comment_post_link, '' . __( '[Pending]' ) . '' ); } else { printf( /* translators: 1: Comment author, 2: Notification if the comment is pending. */ __( 'From %1$s %2$s' ), '' . get_comment_author_link( $comment ) . '', '' . __( '[Pending]' ) . '' ); } ?>

    comment_type ) { case 'pingback': $type = __( 'Pingback' ); break; case 'trackback': $type = __( 'Trackback' ); break; default: $type = ucwords( $comment->comment_type ); } $type = esc_html( $type ); ?>

    $type", $comment_post_link, '' . __( '[Pending]' ) . '' ); } else { printf( /* translators: 1: Type of comment, 2: Notification if the comment is pending. */ _x( '%1$s %2$s', 'dashboard' ), "$type", '' . __( '[Pending]' ) . '' ); } ?>

  • '; $future_posts = wp_dashboard_recent_posts( array( 'max' => 5, 'status' => 'future', 'order' => 'ASC', 'title' => __( 'Publishing Soon' ), 'id' => 'future-posts', ) ); $recent_posts = wp_dashboard_recent_posts( array( 'max' => 5, 'status' => 'publish', 'order' => 'DESC', 'title' => __( 'Recently Published' ), 'id' => 'published-posts', ) ); $recent_comments = wp_dashboard_recent_comments(); if ( ! $future_posts && ! $recent_posts && ! $recent_comments ) { echo '
    '; echo ''; echo '

    ' . __( 'No activity yet!' ) . '

    '; echo '
    '; } echo ''; } /** * Generates Publishing Soon and Recently Published sections. * * @since 3.8.0 * * @param array $args { * An array of query and display arguments. * * @type int $max Number of posts to display. * @type string $status Post status. * @type string $order Designates ascending ('ASC') or descending ('DESC') order. * @type string $title Section title. * @type string $id The container id. * } * @return bool False if no posts were found. True otherwise. */ function wp_dashboard_recent_posts( $args ) { $query_args = array( 'post_type' => 'post', 'post_status' => $args['status'], 'orderby' => 'date', 'order' => $args['order'], 'posts_per_page' => intval( $args['max'] ), 'no_found_rows' => true, 'cache_results' => false, 'perm' => ( 'future' === $args['status'] ) ? 'editable' : 'readable', ); /** * Filters the query arguments used for the Recent Posts widget. * * @since 4.2.0 * * @param array $query_args The arguments passed to WP_Query to produce the list of posts. */ $query_args = apply_filters( 'dashboard_recent_posts_query_args', $query_args ); $posts = new WP_Query( $query_args ); if ( $posts->have_posts() ) { echo '
    '; echo '

    ' . $args['title'] . '

    '; echo '
      '; $today = current_time( 'Y-m-d' ); $tomorrow = current_datetime()->modify( '+1 day' )->format( 'Y-m-d' ); $year = current_time( 'Y' ); while ( $posts->have_posts() ) { $posts->the_post(); $time = get_the_time( 'U' ); if ( gmdate( 'Y-m-d', $time ) == $today ) { $relative = __( 'Today' ); } elseif ( gmdate( 'Y-m-d', $time ) == $tomorrow ) { $relative = __( 'Tomorrow' ); } elseif ( gmdate( 'Y', $time ) !== $year ) { /* translators: Date and time format for recent posts on the dashboard, from a different calendar year, see https://www.php.net/date */ $relative = date_i18n( __( 'M jS Y' ), $time ); } else { /* translators: Date and time format for recent posts on the dashboard, see https://www.php.net/date */ $relative = date_i18n( __( 'M jS' ), $time ); } // Use the post edit link for those who can edit, the permalink otherwise. $recent_post_link = current_user_can( 'edit_post', get_the_ID() ) ? get_edit_post_link() : get_permalink(); $draft_or_post_title = _draft_or_post_title(); printf( '
    • %1$s %4$s
    • ', /* translators: 1: Relative date, 2: Time. */ sprintf( _x( '%1$s, %2$s', 'dashboard' ), $relative, get_the_time() ), $recent_post_link, /* translators: %s: Post title. */ esc_attr( sprintf( __( 'Edit “%s”' ), $draft_or_post_title ) ), $draft_or_post_title ); } echo '
    '; echo '
    '; } else { return false; } wp_reset_postdata(); return true; } /** * Show Comments section. * * @since 3.8.0 * * @param int $total_items Optional. Number of comments to query. Default 5. * @return bool False if no comments were found. True otherwise. */ function wp_dashboard_recent_comments( $total_items = 5 ) { // Select all comment types and filter out spam later for better query performance. $comments = array(); $comments_query = array( 'number' => $total_items * 5, 'offset' => 0, ); if ( ! current_user_can( 'edit_posts' ) ) { $comments_query['status'] = 'approve'; } while ( count( $comments ) < $total_items && $possible = get_comments( $comments_query ) ) { if ( ! is_array( $possible ) ) { break; } foreach ( $possible as $comment ) { if ( ! current_user_can( 'read_post', $comment->comment_post_ID ) ) { continue; } $comments[] = $comment; if ( count( $comments ) == $total_items ) { break 2; } } $comments_query['offset'] += $comments_query['number']; $comments_query['number'] = $total_items * 10; } if ( $comments ) { echo '
    '; echo '

    ' . __( 'Recent Comments' ) . '

    '; echo '
      '; foreach ( $comments as $comment ) { $comment_post = get_post( $comment->comment_post_ID ); if ( current_user_can( 'edit_post', $comment->comment_post_ID ) || ( empty( $comment_post->post_password ) && current_user_can( 'read_post', $comment->comment_post_ID ) ) ) { _wp_dashboard_recent_comments_row( $comment ); } } echo '
    '; if ( current_user_can( 'edit_posts' ) ) { echo '

    ' . __( 'View more comments' ) . '

    '; _get_list_table( 'WP_Comments_List_Table' )->views(); } wp_comment_reply( -1, false, 'dashboard', false ); wp_comment_trashnotice(); echo '
    '; } else { return false; } return true; } /** * Display generic dashboard RSS widget feed. * * @since 2.5.0 * * @param string $widget_id */ function wp_dashboard_rss_output( $widget_id ) { $widgets = get_option( 'dashboard_widget_options' ); echo '
    '; wp_widget_rss_output( $widgets[ $widget_id ] ); echo '
    '; } /** * Checks to see if all of the feed url in $check_urls are cached. * * If $check_urls is empty, look for the rss feed url found in the dashboard * widget options of $widget_id. If cached, call $callback, a function that * echoes out output for this widget. If not cache, echo a "Loading..." stub * which is later replaced by Ajax call (see top of /wp-admin/index.php) * * @since 2.5.0 * @since 5.3.0 Formalized the existing and already documented `...$args` parameter * by adding it to the function signature. * * @param string $widget_id The widget ID. * @param callable $callback The callback function used to display each feed. * @param array $check_urls RSS feeds. * @param mixed ...$args Optional additional parameters to pass to the callback function. * @return bool True on success, false on failure. */ function wp_dashboard_cached_rss_widget( $widget_id, $callback, $check_urls = array(), ...$args ) { $loading = '

    ' . __( 'Loading…' ) . '

    ' . __( 'This widget requires JavaScript.' ) . '

    '; $doing_ajax = wp_doing_ajax(); if ( empty( $check_urls ) ) { $widgets = get_option( 'dashboard_widget_options' ); if ( empty( $widgets[ $widget_id ]['url'] ) && ! $doing_ajax ) { echo $loading; return false; } $check_urls = array( $widgets[ $widget_id ]['url'] ); } $locale = get_user_locale(); $cache_key = 'dash_v2_' . md5( $widget_id . '_' . $locale ); $output = get_transient( $cache_key ); if ( false !== $output ) { echo $output; return true; } if ( ! $doing_ajax ) { echo $loading; return false; } if ( $callback && is_callable( $callback ) ) { array_unshift( $args, $widget_id, $check_urls ); ob_start(); call_user_func_array( $callback, $args ); // Default lifetime in cache of 12 hours (same as the feeds). set_transient( $cache_key, ob_get_flush(), 12 * HOUR_IN_SECONDS ); } return true; } // // Dashboard Widgets Controls. // /** * Calls widget control callback. * * @since 2.5.0 * * @global array $wp_dashboard_control_callbacks * * @param int $widget_control_id Registered Widget ID. */ function wp_dashboard_trigger_widget_control( $widget_control_id = false ) { global $wp_dashboard_control_callbacks; if ( is_scalar( $widget_control_id ) && $widget_control_id && isset( $wp_dashboard_control_callbacks[ $widget_control_id ] ) && is_callable( $wp_dashboard_control_callbacks[ $widget_control_id ] ) ) { call_user_func( $wp_dashboard_control_callbacks[ $widget_control_id ], '', array( 'id' => $widget_control_id, 'callback' => $wp_dashboard_control_callbacks[ $widget_control_id ], ) ); } } /** * The RSS dashboard widget control. * * Sets up $args to be used as input to wp_widget_rss_form(). Handles POST data * from RSS-type widgets. * * @since 2.5.0 * * @param string $widget_id * @param array $form_inputs */ function wp_dashboard_rss_control( $widget_id, $form_inputs = array() ) { $widget_options = get_option( 'dashboard_widget_options' ); if ( ! $widget_options ) { $widget_options = array(); } if ( ! isset( $widget_options[ $widget_id ] ) ) { $widget_options[ $widget_id ] = array(); } $number = 1; // Hack to use wp_widget_rss_form(). $widget_options[ $widget_id ]['number'] = $number; if ( 'POST' == $_SERVER['REQUEST_METHOD'] && isset( $_POST['widget-rss'][ $number ] ) ) { $_POST['widget-rss'][ $number ] = wp_unslash( $_POST['widget-rss'][ $number ] ); $widget_options[ $widget_id ] = wp_widget_rss_process( $_POST['widget-rss'][ $number ] ); $widget_options[ $widget_id ]['number'] = $number; // Title is optional. If black, fill it if possible. if ( ! $widget_options[ $widget_id ]['title'] && isset( $_POST['widget-rss'][ $number ]['title'] ) ) { $rss = fetch_feed( $widget_options[ $widget_id ]['url'] ); if ( is_wp_error( $rss ) ) { $widget_options[ $widget_id ]['title'] = htmlentities( __( 'Unknown Feed' ) ); } else { $widget_options[ $widget_id ]['title'] = htmlentities( strip_tags( $rss->get_title() ) ); $rss->__destruct(); unset( $rss ); } } update_option( 'dashboard_widget_options', $widget_options ); $locale = get_user_locale(); $cache_key = 'dash_v2_' . md5( $widget_id . '_' . $locale ); delete_transient( $cache_key ); } wp_widget_rss_form( $widget_options[ $widget_id ], $form_inputs ); } /** * Renders the Events and News dashboard widget. * * @since 4.8.0 */ function wp_dashboard_events_news() { wp_print_community_events_markup(); ?>

    array( /** * Filters the primary link URL for the 'WordPress Events and News' dashboard widget. * * @since 2.5.0 * * @param string $link The widget's primary link URL. */ 'link' => apply_filters( 'dashboard_primary_link', __( 'https://wordpress.org/news/' ) ), /** * Filters the primary feed URL for the 'WordPress Events and News' dashboard widget. * * @since 2.3.0 * * @param string $url The widget's primary feed URL. */ 'url' => apply_filters( 'dashboard_primary_feed', __( 'https://wordpress.org/news/feed/' ) ), /** * Filters the primary link title for the 'WordPress Events and News' dashboard widget. * * @since 2.3.0 * * @param string $title Title attribute for the widget's primary link. */ 'title' => apply_filters( 'dashboard_primary_title', __( 'WordPress Blog' ) ), 'items' => 1, 'show_summary' => 0, 'show_author' => 0, 'show_date' => 0, ), 'planet' => array( /** * Filters the secondary link URL for the 'WordPress Events and News' dashboard widget. * * @since 2.3.0 * * @param string $link The widget's secondary link URL. */ 'link' => apply_filters( 'dashboard_secondary_link', __( 'https://planet.wordpress.org/' ) ), /** * Filters the secondary feed URL for the 'WordPress Events and News' dashboard widget. * * @since 2.3.0 * * @param string $url The widget's secondary feed URL. */ 'url' => apply_filters( 'dashboard_secondary_feed', __( 'https://planet.wordpress.org/feed/' ) ), /** * Filters the secondary link title for the 'WordPress Events and News' dashboard widget. * * @since 2.3.0 * * @param string $title Title attribute for the widget's secondary link. */ 'title' => apply_filters( 'dashboard_secondary_title', __( 'Other WordPress News' ) ), /** * Filters the number of secondary link items for the 'WordPress Events and News' dashboard widget. * * @since 4.4.0 * * @param string $items How many items to show in the secondary feed. */ 'items' => apply_filters( 'dashboard_secondary_items', 3 ), 'show_summary' => 0, 'show_author' => 0, 'show_date' => 0, ), ); wp_dashboard_cached_rss_widget( 'dashboard_primary', 'wp_dashboard_primary_output', $feeds ); } /** * Displays the WordPress events and news feeds. * * @since 3.8.0 * @since 4.8.0 Removed popular plugins feed. * * @param string $widget_id Widget ID. * @param array $feeds Array of RSS feeds. */ function wp_dashboard_primary_output( $widget_id, $feeds ) { foreach ( $feeds as $type => $args ) { $args['type'] = $type; echo '
    '; wp_widget_rss_output( $args['url'], $args ); echo '
    '; } } /** * Displays file upload quota on dashboard. * * Runs on the {@see 'activity_box_end'} hook in wp_dashboard_right_now(). * * @since 3.0.0 * * @return bool|null True if not multisite, user can't upload files, or the space check option is disabled. */ function wp_dashboard_quota() { if ( ! is_multisite() || ! current_user_can( 'upload_files' ) || get_site_option( 'upload_space_check_disabled' ) ) { return true; } $quota = get_space_allowed(); $used = get_space_used(); if ( $used > $quota ) { $percentused = '100'; } else { $percentused = ( $used / $quota ) * 100; } $used_class = ( $percentused >= 70 ) ? ' warning' : ''; $used = round( $used, 2 ); $percentused = number_format( $percentused ); ?>

    • %2$s (%3$s)', esc_url( admin_url( 'upload.php' ) ), $text, __( 'Manage Uploads' ) ); ?>
    • %2$s (%3$s)', esc_url( admin_url( 'upload.php' ) ), $text, __( 'Manage Uploads' ) ); ?>
    %s', esc_url( $response['update_url'] ), esc_html( $response['name'] ) ) ); } else { $msg = sprintf( /* translators: %s: Browser name and link. */ __( "It looks like you're using an old version of %s. For the best WordPress experience, please update your browser." ), sprintf( '%s', esc_url( $response['update_url'] ), esc_html( $response['name'] ) ) ); } $browser_nag_class = ''; if ( ! empty( $response['img_src'] ) ) { $img_src = ( is_ssl() && ! empty( $response['img_src_ssl'] ) ) ? $response['img_src_ssl'] : $response['img_src']; $notice .= '
    '; $browser_nag_class = ' has-browser-icon'; } $notice .= "

    {$msg}

    "; $browsehappy = 'https://browsehappy.com/'; $locale = get_user_locale(); if ( 'en_US' !== $locale ) { $browsehappy = add_query_arg( 'locale', $locale, $browsehappy ); } $notice .= '

    ' . sprintf( /* translators: 1: Browser update URL, 2: Browser name, 3: Browse Happy URL. */ __( 'Update %2$s or learn how to browse happy' ), esc_attr( $response['update_url'] ), esc_html( $response['name'] ), esc_url( $browsehappy ) ) . '

    '; $notice .= '

    ' . __( 'Dismiss' ) . '

    '; $notice .= '
    '; } /** * Filters the notice output for the 'Browse Happy' nag meta box. * * @since 3.2.0 * * @param string $notice The notice content. * @param array $response An array containing web browser information. See `wp_check_browser_version()`. */ echo apply_filters( 'browse-happy-notice', $notice, $response ); // phpcs:ignore WordPress.NamingConventions.ValidHookName.UseUnderscores } /** * Adds an additional class to the browser nag if the current version is insecure. * * @since 3.2.0 * * @param string[] $classes Array of meta box classes. * @return string[] Modified array of meta box classes. */ function dashboard_browser_nag_class( $classes ) { $response = wp_check_browser_version(); if ( $response && $response['insecure'] ) { $classes[] = 'browser-insecure'; } return $classes; } /** * Checks if the user needs a browser update. * * @since 3.2.0 * * @return array|bool Array of browser data on success, false on failure. */ function wp_check_browser_version() { if ( empty( $_SERVER['HTTP_USER_AGENT'] ) ) { return false; } $key = md5( $_SERVER['HTTP_USER_AGENT'] ); $response = get_site_transient( 'browser_' . $key ); if ( false === $response ) { // Include an unmodified $wp_version. require ABSPATH . WPINC . '/version.php'; $url = 'http://api.wordpress.org/core/browse-happy/1.1/'; $options = array( 'body' => array( 'useragent' => $_SERVER['HTTP_USER_AGENT'] ), 'user-agent' => 'WordPress/' . $wp_version . '; ' . home_url( '/' ), ); if ( wp_http_supports( array( 'ssl' ) ) ) { $url = set_url_scheme( $url, 'https' ); } $response = wp_remote_post( $url, $options ); if ( is_wp_error( $response ) || 200 != wp_remote_retrieve_response_code( $response ) ) { return false; } /** * Response should be an array with: * 'platform' - string - A user-friendly platform name, if it can be determined * 'name' - string - A user-friendly browser name * 'version' - string - The version of the browser the user is using * 'current_version' - string - The most recent version of the browser * 'upgrade' - boolean - Whether the browser needs an upgrade * 'insecure' - boolean - Whether the browser is deemed insecure * 'update_url' - string - The url to visit to upgrade * 'img_src' - string - An image representing the browser * 'img_src_ssl' - string - An image (over SSL) representing the browser */ $response = json_decode( wp_remote_retrieve_body( $response ), true ); if ( ! is_array( $response ) ) { return false; } set_site_transient( 'browser_' . $key, $response, WEEK_IN_SECONDS ); } return $response; } /** * Displays the PHP update nag. * * @since 5.1.0 */ function wp_dashboard_php_nag() { $response = wp_check_php_version(); if ( ! $response ) { return; } if ( isset( $response['is_secure'] ) && ! $response['is_secure'] ) { $msg = __( 'WordPress has detected that your site is running on an insecure version of PHP.' ); } else { $msg = __( 'WordPress has detected that your site is running on an outdated version of PHP.' ); } ?>

    %2$s %3$s', esc_url( wp_get_update_php_url() ), __( 'Learn more about updating PHP' ), /* translators: Accessibility text. */ __( '(opens in a new tab)' ) ); ?>

    0, 'recommended' => 0, 'critical' => 0, ); } $issues_total = $issue_counts['recommended'] + $issue_counts['critical']; ?>

    visit the Site Health screen to gather information about your site now.' ), esc_url( admin_url( 'site-health.php' ) ) ); ?>

    0 ) : ?>

    0 && false !== $get_issues ) : ?>

    %1$d item on the Site Health screen.', 'Take a look at the %1$d items on the Site Health screen.', $issues_total ), $issues_total, esc_url( admin_url( 'site-health.php' ) ) ); ?>

    true ) ) ) > 1 ) ) : ?>

    change your theme completely' ), $themes_link ); ?>

    • ' . __( 'Edit your front page' ) . '', get_edit_post_link( get_option( 'page_on_front' ) ) ); ?>
    • ' . __( 'Add additional pages' ) . '', admin_url( 'post-new.php?post_type=page' ) ); ?>
    • ' . __( 'Edit your front page' ) . '', get_edit_post_link( get_option( 'page_on_front' ) ) ); ?>
    • ' . __( 'Add additional pages' ) . '', admin_url( 'post-new.php?post_type=page' ) ); ?>
    • ' . __( 'Add a blog post' ) . '', admin_url( 'post-new.php' ) ); ?>
    • ' . __( 'Write your first blog post' ) . '', admin_url( 'post-new.php' ) ); ?>
    • ' . __( 'Add an About page' ) . '', admin_url( 'post-new.php?post_type=page' ) ); ?>
    • ' . __( 'Set up your homepage' ) . '', current_user_can( 'customize' ) ? add_query_arg( 'autofocus[section]', 'static_front_page', admin_url( 'customize.php' ) ) : admin_url( 'options-reading.php' ) ); ?>
    • ' . __( 'View your site' ) . '', home_url( '/' ) ); ?>

    • ' . __( 'Manage widgets' ) . '', admin_url( 'widgets.php' ) ); ?>
    • ' . __( 'Manage menus' ) . '', admin_url( 'nav-menus.php' ) ); ?>
    • ' . __( 'Turn comments on or off' ) . '', admin_url( 'options-discussion.php' ) ); ?>
    • ' . __( 'Learn more about getting started' ) . '', __( 'https://wordpress.org/support/article/first-steps-with-wordpress-b/' ) ); ?>