Intereting Posts
Как удалить все следы темы? Сортировка сообщений в соответствии с количеством просмотров не работает Пользовательская панель инструментов пользователя Регистрация без адреса электронной почты! Как я могу сделать свои «неудачные запросы» в диаграммах и анализе Application Insights? Нет данных, полученных после загрузки темы Определить размер избранного изображения в заголовке эхо задайте конкретную мета-страницу, запрошенную через пользовательский пост Как избежать дублирования сообщений на главной странице? Как отключить 301 перенаправление сообщений (не канонических)? Могу ли я заблокировать пост в позиции, поэтому он всегда появляется на главной странице? Теги WordPress и шаблона для плагина Simple Fields Автоматический srcset для жестких размеров изображений? Передача $ this-> get_field_name () в javascript Как относиться к 2 таксономии с категорией

Создать собственный исходного кода, правильный путь?

Что я хочу сделать

Совместное использование кода в сообщениях на WordPress – это большая проблема со всеми экранами HTML, которые нужно позаботиться. Таким образом, я планирую заключить код в сообщениях в специальном коротком коде, называемом [sourcecode] , как показано ниже, и позволить ему автоматически выходить из специальных символов.

 [sourcecode] <?php // Some code here. ?> [/sourcecode] 

Код

И это то, что соответствующая функция (в моей функции functions.php) выглядит так:

 /** * Functionality to set up custom shortcode correctly. * * This function is attached to the 'the_content' filter hook. */ add_filter( 'the_content', 'run_bbcodes', 7 ); function run_bbcodes( $content ) { global $shortcode_tags; $orig_shortcode_tags = $shortcode_tags; $shortcode_tags = array(); // New shortcodes below add_shortcode( 'sourcecode', 'bbcode_code' ); $content = do_shortcode( $content ); $shortcode_tags = $orig_shortcode_tags; return $content; } /** * Add Custom shortcode functions below * * This function is attached to the 'sourcecode' shortcode hook. */ function bbcode_code( $atts, $content = null ) { // Ensure contents of a <pre>...</pre> HTML block aren't converted into paragraphs or line-breaks $content = clean_pre( $content ); $content = str_replace( // Replace these special characters... array( '&', '\0', '<', '>', '\'', '"', '/', '[', ']' ), // ...with the HTML entities below, respectively array( '&amp;', '\0', '&lt;', '&gt;', '&apos;', '&quot;', '/', '[', ']' ), $content ); return '<pre><code>' . trim( $content ) . '</code></pre>'; } /** * Related sourcecode worth reading: * * https://bitbucket.org/cbavota/syntax-highlighter-plugin/src * * https://github.com/mdawaffe/Highlight.js-for-WordPress/blob/master/highlight-js.php * * https://github.com/fracek/highlight-wp/blob/master/highlight.php * * http://plugins.svn.wordpress.org/syntaxhighlighter/trunk/ * * http://blog.webspace.jp/235 * * http://core.trac.wordpress.org/browser/trunk/src/wp-includes/shortcodes.php */ 

Вопросов)

Теперь, когда объяснение не в порядке …

  1. Я что-то пропустил?

    Например, пока я не прочитал источник плагина SyntaxHighlighter Evolved , я не знал, что \0 также нужно заменить на \0 «работать вокруг kses» (что было недостаточно ясно для меня).

  2. И кроме того, что избегать специальных символов, есть ли что-нибудь еще, что я мог бы не заметить? Правильно ли я делаю это?

    (Было бы здорово, если бы кто-нибудь мог взглянуть на этот файл (исходный код PHP для SyntaxHighlighter Evolved plugin) и посмотреть, можете ли вы найти то, что мне нужно реализовать. Я уже старался изо всех сил.)


PS: Почему бы не использовать сам плагин? Во-первых, я не хочу выделять синтаксис, который он делает; и я хочу знать, может ли то, что он делает, легко реализовать.

Вы спрашиваете о X, но я отвечу Y. ИМХО, существует слишком много исключений, чтобы справиться с решением другого решения.

СинтаксисHighlighter Evolved имеет следующий Pro Tip (сильный, прописный, в оригинале):

СОВЕТ. Не используйте редактор Visual, если вы не хотите, чтобы ваш код искалечен. TinyMCE «очистит» ваш HTML.

Не только это, довольно распространено, что плагины и темы возились с the_content . Грубая (и совершенно ненаучная) мера: 10 случаев в пределах 50 плагинов; 15 случаев в 50 темах.

Еще один совет :

введите описание изображения здесь

Предложенное решение

1) Чтобы обработать код, я думаю, что это либо настраиваемое поле / поле на экране «Редактировать сообщение», либо мост между почтой и «частным» пользовательским типом сообщения, который будет хранить код. Я предпочитаю последнее. шаги:

  • вставьте внедряемый код в <textarea> обработанный с помощью edit_form_after_title
  • используйте esc_html для отображения в бэкэнд
  • и '<pre class="pretty">'.htmlentities($code).</pre> в интерфейсе

2) Чтобы обработать подсветку синтаксиса, читателю следует выбрать его предпочтительный метод. Google Prettify буквально 2 строки кода и добавление класса в <pre> . Заблокируйте скрипт только при наличии короткого кода.

Пример плагина

Пользовательский тип сообщения введите описание изображения здесь

Тип почтового сообщения
введите описание изображения здесь

Следующее – скелет и только описывает логику. И здесь ссылки на некоторые лакомства:
Working skeleton at Gist Full plugin at GitHub

 <?php /** * Plugin Name: Skeleton for the plugin Snippets Shortcode * Plugin URI: https://gist.github.com/brasofilo/6804951 */ /** * Based on Plugin Class Demo * https://gist.github.com/toscho/3804204 */ add_action( 'plugins_loaded', array ( B5F_Snippets_Shortcode::get_instance(), 'plugin_setup' ) ); /** * Main class * * Fires all classes * Handles save_post action for other classes */ class B5F_Snippets_Shortcode { protected static $instance = NULL; public $post_type = 'snippet'; public function plugin_setup() { new B5F_SS_Cpt(); new B5F_SS_Posts_Pages_Metabox(); new B5F_SS_Shortcode(); add_action( 'save_post', array( $this, '_save_post' ), 10, 2 ); } } /** * Register Snippet post type and render Textarea Field after the Title * * CPT is hierarchical * Custom Metabox for CPT is left empty, can be used as Language Selector * Uses save_post for CPT */ class B5F_SS_Cpt { public function __construct() { add_action( 'init', array( $this, '_cpt' ) ); add_action( 'edit_form_after_title', array( $this, 'input_text_area' ) ); } } /** * Metabox to select the Snippet and to display the correspondent Shortcode * * Displayed in Posts and Pages post types * Add jQuery to listen to the Snippets Dropdown changes and update the sample Text Field * Uses save_post for other Post Types */ class B5F_SS_Posts_Pages_Metabox { public function __construct() { add_action( 'add_meta_boxes', array( $this, '_meta_boxes' ) ); } } /** * Snippets Shortcode * * First gets the Snippet Post ID, then its associated Meta Data, * finally filters the string with http://php.net/manual/en/function.htmlentities.php * * Uses Google Code Prettify * https://code.google.com/p/google-code-prettify/ */ class B5F_SS_Shortcode { public function __construct() { add_shortcode( 'snippet', array( $this, '_shortcode' ) ); } } 

На всякий случай ответ Родольфо не ясен, вот что (я думаю), он предлагает – отличная идея, кстати:

  1. Создайте собственный настраиваемый тип сообщений, называемый Snippets, в сообщениях которого мы будем хранить наши фрагменты кода.

    Мы будем использовать аргумент support в register_post_type в наших интересах. Нам не нужен Редактор содержимого на экране редактирования для настраиваемого типа сообщений, поскольку мы будем хранить наш контент в настраиваемом мета-окне [1] (в основном пользовательское поле), поэтому мы его скроем; и другие ненужные поля, так как это будет отдельный пользовательский тип сообщения.

    Вот пример, чтобы дать вам представление о том, как это сделать:

     /* * Register Custom Post Types * DON'T FORGET TO FLUSH PERMALINKS * * http://justintadlock.com/archives/2013/09/13/register-post-type-cheat-sheet * https://gist.github.com/justintadlock/6552000 * http://core.trac.wordpress.org/browser/trunk/src/wp-includes/post.php */ add_action( 'init', 'itsme_register_post_types' ); function itsme_register_post_types() { // Post Type: Snippets register_post_type( // Keeping it unique so that it never conflicts with a plugin or theme 'itsme_snippet', array( 'description' => 'Code snippets for sharing in posts.', 'public' => false, // NOTE! 'publicly_queryable' => false, // NOTE! 'exclude_from_search' => true, // NOTE! 'show_in_nav_menus' => false, 'show_ui' => true, 'show_in_menu' => true, 'show_in_admin_bar' => false, 'menu_position' => 5, // Your choice. 'menu_icon' => null, 'can_export' => false, 'delete_with_user' => false, 'hierarchical' => false, 'taxonomies' => array(), 'has_archive' => false, // NOTE! 'query_var' => false, // NOTE! 'capability_type' => 'post', 'rewrite' => array( 'slug' => 'snippets', 'with_front' => false, 'pages' => false, 'feeds' => false, // NOTE! ), // IMPORTANT! At least make sure that the 'editor' (Content Editor) is hidden - ie remove it from the array. 'supports' => array( 'title', 'revisions', ), 'labels' => array( 'name' => __( 'Snippets' ), 'singular_name' => __( 'Snippet' ), 'menu_name' => __( 'Snippets' ), 'name_admin_bar' => __( 'Snippets' ), 'add_new' => __( 'Add New' ), 'add_new_item' => __( 'Add New Snippet' ), 'edit_item' => __( 'Edit Snippet' ), 'new_item' => __( 'New Snippet' ), 'view_item' => __( 'View Snippet' ), 'search_items' => __( 'Search Snippets' ), 'not_found' => __( 'No Snippets found' ), 'not_found_in_trash' => __( 'No Snippets found in trash' ), 'all_items' => __( 'All Snippets' ), 'parent_item' => __( 'Parent Snippet' ), 'parent_item_colon' => __( 'Parent Snippet:' ), 'archive_title' => __( 'Snippets' ), ) ) ); } 

    Ссылки по теме: (Потому что я не дал никаких пояснений в коде.)

  2. Создайте метатекст типа textarea (по существу, настраиваемое поле), которое отображается только на экране редактирования для пользовательских фрагментов типа публикации.

    Если вы не знаете, как закодировать один , вы можете легко создать его с помощью плагина, например Advanced Custom Fields . Вот скриншот, чтобы дать вам представление:

    Create a custom meta box using Advanced Custom Fields plugin

  3. Создайте собственный код, который принимает идентификатор сообщения от фрагмента и отображает содержимое (например, фрагмент кода) между <pre> тегами; Разумеется, все символы специальных символов HTML правильно экранированы.

    Вот пример, который даст вам хорошую идею:

     /* * Custom Shortcode: Snippet * USAGE: [snippet id="188"], where id = Snippet (CPT) post's ID * * http://wpquestions.com/question/showChrono?id=8901 */ add_shortcode( 'snippet', 'bbcode_snippet' ); function bbcode_snippet( $atts ) { extract( shortcode_atts( array( 'id' => null, ), $atts ) ); $post = get_post( $id ); $content = $post->post_content; $content = trim( htmlspecialchars( clean_pre( $content ) ) ); return '<pre><code>' . $content . '</code></pre>'; } 

    Ссылки по теме:

  4. Чтобы немного облегчить работу, создайте настраиваемый мета-ящик, который отображает используемый короткий код (например, [snippet id="120"] ) на экране редактирования пользовательского типа сообщений (фрагменты). Поэтому, как только вы публикуете фрагмент, вы можете скопировать короткий код для встраивания кода в свои сообщения.

     add_action( 'add_meta_boxes', 'itsme_custom_meta_boxes' ); function itsme_custom_meta_boxes() { add_meta_box( // HTML 'id' attribute of the edit screen section (AKA meta box) 'itsme-snippet-shortcode-box', // Title of the meta box, visible to user esc_html__( 'Snippet Shortcode' ), // Callback function 'itsme_snippet_shortcode_box', // Custom post type on whose edit screen to show meta box 'aahank_vault', // The part of edit screen where the meta box should be shown 'side', // Priority within the context where the meta box should show 'high' ); } // Function to display the meta box function itsme_snippet_shortcode_box() { global $post; $snippet_id = $post->ID; echo '<textarea rows="1" readonly="readonly" placeholder="Publish post first!" onclick="this.focus();this.select();">[snippet id="' . $snippet_id . '"]</textarea>'; } 

Это почти все, что нам нужно. Выделение синтаксиса и прочее являются дополнительными, поэтому я не вдаваюсь в подробности.

Примечания:

  1. Плагины и темы, как сказал Родольфо, могут легко испортить the_content . Поскольку мы хотим оставить наши фрагменты кода нетронутыми (если мы этого не хотим), мы используем настраиваемое поле для хранения наших данных, то есть фрагментов кода.

    Кроме того, WordPress по умолчанию имеет множество фильтров на the_content , что делает его довольно сложным, чтобы делать то, что мы хотим. Использование настраиваемого поля делает его намного проще и проще.

Идеи:

  1. Вы можете использовать пользовательскую таксономию, называемую language или что-то, чтобы упорядочить сообщения типа персонализированного сообщения и даже использовать его для синтаксического выделения кода.