Preserve Editor Scroll Position
Маленький, но удобный плагин, который невидим, но делает свое дело. Да он занимает место в разделе плагинов, но позволяет не бояться нажимать на кнопку "сохранить" при написании длинного поста.
С версии WordPress 4.0. В WordPress по умолчанию включен показ полного контента, поэтому там отдельного скролла нет. Но я эту функцию выключаю и этот плагин мне по-прежнему нужен.
Задача плагина: сохранить позицию прокрутки скроллбара в визуальном редакторе после того, как страница обновится при нажатии на кнопку "Сохранить", "Опубликовать" или "Обновить". Понятнее посмотреть на картинку:
Не знаю как у вас, но меня это иногда, не то чтобы раздражает, но создает некоторые неудобства: когда пишу длинные посты лишний раз не нажимаю "Сохранить", как раз по этой причине - потеря позиции. Сегодня наткнулся на этот плагин. Я обычно не доверяю всяким плагинам и прежде чем установить какой-то плагин, его проверяю. Заглянув в код этого плагина, решил о нем написать - плагин простой и, скажем так, гениальный. Имею ввиду, что плагин, на мой взгляд, абсолютно стоит того, чтобы его установить, потому что: он никак не перегружает систему, совершенно незаметен, не имеет никаких настроек, его в любой момент можно удалить без последствий и он создает маленькую часть того удобства, которым славится WordPress. Думаю, эта функция в скором времени появится в базовой установке WordPress, возможно даже в ожидаемой версии 4.0 - работа над удобством редактора там проводится (прокручивание панели кнопок вниз, когда панель уходит за пределы экрана).
Установка плагина
Ставиться он из репозитории WordPress: заходим в админку: Плагины > Добавить новый; в поиск пишем "Preserve Editor Scroll Position"нажимаем Enter; Жмем "Установить" и активируем плагин. Это все, плагин уже работает.
Код плагина
Кроме функций плагина, некоторым читателям, разбирающимся в кодинге, возможно будет интересно взглянуть на простой код этого плагина:
<?php /* * Plugin Name: Preserve Editor Scroll Position * Version: 0.2 * Description: This plugin will recover the old scroll position in your Editor after saving. Either HTML or visuel editor. * Author: Dominik Schilling * Author URI: http://wphelper.de/ * Plugin URI: http://wpgrafie.de/wp-plugins/preserve-editor-scroll-position/ * * License: GPLv2 or later * * Copyright (C) 2011-2012 Dominik Schilling * * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ /* * Don't call this file directly. */ if ( ! class_exists( 'WP' ) ) { die(); } /** * The class will help you to recover the old scoll position in your Editor. * Either HTML or visuel editor. * */ final class Preserve_Editor_Scroll_Position { /** * Init. * * @since 0.1.0 */ public static function init() { add_filter( 'redirect_post_location', array( __CLASS__, 'add_query_arg' ) ); add_action( 'edit_form_advanced', array( __CLASS__, 'add_input_field' ) ); add_action( 'edit_page_form', array( __CLASS__, 'add_input_field' ) ); add_filter( 'tiny_mce_before_init', array( __CLASS__, 'extend_tiny_mce' ) ); add_action( 'after_wp_tiny_mce', array( __CLASS__, 'print_js' ) ); } /** * Adds a hidden input field for scrolltop value. * * @since 0.1.0 */ public static function add_input_field() { $position = ! empty( $_GET['scrollto'] ) ? $_GET['scrollto'] : 0; printf( '<input type="hidden" id="scrollto" name="scrollto" value="%d"/>', esc_attr( $position ) ); } /** * Extend TinyMCE config with a setup function. * See http://www.tinymce.com/wiki.php/API3:event.tinymce.Editor.onInit * * @since 0.1.0 * * @param array $init * @return array */ public static function extend_tiny_mce( $init ) { if ( wp_default_editor() == 'tinymce' ) $init['setup'] = 'rich_scroll'; return $init; } /** * Returns redirect url with query arg for scroll position. * * @since 0.1.0 * * @param string $location * @return string */ public static function add_query_arg( $location ) { if( ! empty( $_POST['scrollto'] ) ) $location = add_query_arg( 'scrollto', (int) $_POST['scrollto'], $location ); return $location; } /** * Prints Javascript data. * On form submit the scrollTop value will be saved into the hidden input field. * Includes callback function for TinyMCE scrolling. * * @since 0.1.0 */ public static function print_js( $mce_settings ) { ?> <script> ( function( $ ) { $( '#post' ).submit( function() { // TinyMCE or HTML Editor? scrollto = $('#content' ).is(':hidden') ? $('#content_ifr').contents().find( 'body' ).scrollTop() : $('#content' ).scrollTop(); // Save scrollto value $( '#scrollto' ).val( scrollto ); } ); // Only HTML editor: scroll to scrollto value $( '#content' ).scrollTop( $( '#scrollto' ).val() ); } )( jQuery ); <?php if ( wp_default_editor() == 'tinymce' && ! empty( $mce_settings ) ) : ?> /* * Callback function for TinyMCE setup event * See http://www.tinymce.com/wiki.php/API3:event.tinymce.Editor.onInit */ function rich_scroll( ed ) { ed.onInit.add( function() { jQuery( '#content_ifr' ).contents().find( 'body' ).scrollTop( jQuery( '#scrollto' ).val() ); } ); }; <?php endif; ?> </script> <?php } } // Please load. Thanks. add_action( 'admin_init', array( 'Preserve_Editor_Scroll_Position', 'init' ) );
Принцип работы: плагин работает только в админке; на странице редактирования записей добавляется скрытое поле input в которое при нажатии на кнопку "Сохранить" записывается значения позиции скролла TinyMCE, а значит это значение попадает в переменную $_POST['scrollto']
. Далее, при перезагрузке страницы, вас редиректит на тот же УРЛ (редактирование поста), только с добавкой GET параметра scrollto=позиция
. По этому добавленному параметру и выставляется прежняя позиция скролла.