Pull to refresh

Выводим wysiwyg в клиентской части Wordpress

Reading time5 min
Views885
Понадобилось недавно сделать функционал добавления/редактирования постов прямо из клиентской части Wordpress. Основной проблемой оказалось включение визуального редактора. Гугл упрямо выдавал устаревшие и откровенно не работающие варианты.
Вообще редактор подключается функцией the_editor(), однако, чтобы она заработала, надо немного потанцевать с бубном.

1. Пишем функцию для вывода нужных скриптов и стилей в заголовке страницы

  1. <?php
  2. function ugc_content(){
  3.     $user_info = wp_get_current_user();
  4.     $time = time();
  5.     require ( 'wp-admin/includes/post.php' );
  6.     require ( 'wp-admin/includes/media.php' );
  7.     require ( 'wp-admin/custom-header.php' );
  8.     wp_admin_css();
  9.     wp_admin_css('colors-fresh');    // здесь могут быть проблемы с перекрытием CSS в разных темах. Желательно сделать свой
  10.     wp_admin_css('thickbox');
  11.     wp_print_scripts('jquery-ui-core');        // если в теме используется jquery - надо предусмотреть его отключение на этой странице
  12.     wp_print_scripts('jquery-ui-tabs');
  13.     $host = $_SERVER['SERVER_NAME'];
  14.         // тут выводятся настройки
  15.     echo <<<SCRIPT
  16. <script type='text/javascript'>
  17. /* <![CDATA[ */
  18.     userSettings = {
  19.         url: "/",
  20.         uid: "{$user_info->ID}",
  21.         time: "{$time}"
  22.     }
  23. /* ]]> */
  24. </script>
  25. <script type='text/javascript'>
  26. /* <![CDATA[ */
  27.     postboxL10n = {
  28.         requestFile: "http://{$host}/wp-admin/admin-ajax.php"
  29.     }
  30. /* ]]> */
  31. </script>
  32. SCRIPT;
  33.         // вот это мне не нравится никак :(
  34.     global $wp_version;
  35.     if ( $wp_version >= 2.8 )        // начиная с версии 2.8
  36.         echo "<script type='text/javascript' src='http://{$host}/wp-admin/js/utils.js?ver=20081129'></script>";
  37.     echo <<<SCRIPT
  38. <script type='text/javascript' src='http://{$host}/wp-admin/js/common.js?ver=20081129'></script>
  39. <script type='text/javascript' src='http://{$host}/wp-admin/js/editor.js?ver=20081129'></script>
  40. <script type='text/javascript' src='http://{$host}/wp-includes/js/thickbox/thickbox.js?ver=3.1-20090123'></script>
  41. <script type='text/javascript' src='http://{$host}/wp-admin/js/media-upload.js?ver=20081210'></script>
  42. SCRIPT;
  43.     wp_print_scripts('comment');
  44.     wp_print_scripts('editor');
  45.     add_thickbox();
  46.     wp_tiny_mce();
  47. }
  48. ?>
* This source code was highlighted with Source Code Highlighter.

(можно ее засунуть например в файл functions.php вашей темы)

2. Для нужной страницы вешаем фильтр
add_filter('wp_head','ugc_content');
(у меня используется отдельный шаблон для формы)

3. Собственно, выводим сам редактор

  1. <div id="poststuff" class="metabox-holder">
  2. <?=the_editor()?>
  3. </div>
* This source code was highlighted with Source Code Highlighter.


4. После этого на странице появится стандартный wysiwyg, однако имеет место проблема с медиа-панелью — иконки не отображаются, ссылки левые.
Лечится просто — файл wp-admin/include/media.php
функция media_buttons()
и прописываем там полные пути к картинкам и ссылкам, напр. так

  1.  
  2. function media_buttons() {
  3.     global $post_ID, $temp_ID;
  4.     $uploading_iframe_ID = (int) (0 == $post_ID ? $temp_ID : $post_ID);
  5.     $context = apply_filters('media_buttons_context', __('Upload/Insert %s'));
  6.     $media_upload_iframe_src = "/wp-admin/media-upload.php?post_id=$uploading_iframe_ID";
  7.     $media_title = __('Add Media');
  8.     $image_upload_iframe_src = apply_filters('image_upload_iframe_src', "$media_upload_iframe_src&type=image");
  9.     $image_title = __('Add an Image');
  10.     $video_upload_iframe_src = apply_filters('video_upload_iframe_src', "$media_upload_iframe_src&type=video");
  11.     $video_title = __('Add Video');
  12.     $audio_upload_iframe_src = apply_filters('audio_upload_iframe_src', "$media_upload_iframe_src&type=audio");
  13.     $audio_title = __('Add Audio');
  14.     $out = <<<EOF
  15.  
  16.     <a href="{$image_upload_iframe_src}&TB_iframe=true" id="add_image" class="thickbox" title='$image_title' onclick="return false;"><img src='/wp-admin/images/media-button-image.gif' alt='$image_title' /></a>
  17.     <a href="{$video_upload_iframe_src}&TB_iframe=true" id="add_video" class="thickbox" title='$video_title' onclick="return false;"><img src='/wp-admin/images/media-button-video.gif' alt='$video_title' /></a>
  18.     <a href="{$audio_upload_iframe_src}&TB_iframe=true" id="add_audio" class="thickbox" title='$audio_title' onclick="return false;"><img src='/wp-admin/images/media-button-music.gif' alt='$audio_title' /></a>
  19.     <a href="{$media_upload_iframe_src}&TB_iframe=true" id="add_media" class="thickbox" title='$media_title' onclick="return false;"><img src='/wp-admin/images/media-button-other.gif' alt='$media_title' /></a>
  20.  
  21. EOF;
  22.     printf($context, $out);
  23. }
  24.  
* This source code was highlighted with Source Code Highlighter.

Все.

Возможные проблемы:
поскольку используются стили из админ-панели, то возможны нежелательные эффекты на странице. Можно сделать для себя новые стили из системных
Также используется jQuery, так что, если в вашей теме он тоже используется, позаботьтесь, чтобы не было конфликта версий.

Работает в версиях WP 2.7 и 2.8

Tags:
Hubs:
Total votes 6: ↑5 and ↓1+4
Comments3

Articles