Столкнулись с проблемой, что в редакторе TinyMCE с правами "Редактора" вырезались тэги микроразметки, типа:
<meta itemprop="applicationCategory" content="Business"> <span itemprop="review" itemscope itemtype="http://schema.org/Review"> <span itemprop="author" itemscope itemtype="http://schema.org/Person">
решение нашлось в виде плагина на гитхабе Allow Schema.Org Markup in WordPress (WP) Content Editor
на всякий случай продублирую код тут:
<?php // http://www.engfers.com/2008/10/16/how-to-allow-stripped-element-attributes-in-wordpress-tinymce-editor/ // https://vip.wordpress.com/documentation/register-additional-html-attributes-for-tinymce-and-wp-kses/ // global $allowedposttags, $allowedtags /* Plugin Name: Schema.Org Markup it WP Editor Plugin URI: https://github.com/Hube2/wp-schema-org-in-editor Description: Allow Schema Markup in the WP Content Editor Version: 0.0.1 Author: John A. Huebner II Author URI: https://github.com/Hube2/ License: GPL */ // If this file is called directly, abort. if (!defined('WPINC')) {die;} new blunt_schema_data(); class blunt_schema_data { private $extended_elements = array( // element => array(attribute, attribute); 'a' => array( 'itemprop' => true, 'content' => true, ), 'acronym' => array( 'itemprop' => true, 'content' => true, ), 'article' => array( 'itemprop' => true, 'content' => true, ), 'audio' => array( 'itemprop' => true, 'content' => true, ), 'blockquote' => array( 'itemprop' => true, 'content' => true, ), 'caption' => array( 'itemprop' => true, 'content' => true, 'datetime' => true, ), 'cite' => array( 'itemprop' => true, 'content' => true, ), 'dd' => array( 'itemprop' => true, 'content' => true, 'datetime' => true, ), 'div' => array( 'itemscope:itemscope' => true, 'itemtype' => true, 'itemprop' => true, 'datetime' => true, 'content' => true, ), 'dt' => array( 'itemprop' => true, 'content' => true, 'datetime' => true, ), 'figure' => array( 'itemprop' => true, 'content' => true, ), 'h1' => array( 'itemprop' => true, 'content' => true, ), 'h2' => array( 'itemprop' => true, 'content' => true, ), 'h3' => array( 'itemprop' => true, 'content' => true, ), 'h4' => array( 'itemprop' => true, 'content' => true, ), 'h5' => array( 'itemprop' => true, 'content' => true, ), 'h6' => array( 'itemprop' => true, 'content' => true, ), 'img' => array( 'itemprop' => true, 'content' => true, ), 'li' => array( 'itemprop' => true, 'content' => true, 'datetime' => true, ), 'link' => array( 'itemprop' => true, 'href' => true, 'datetime' => true, 'content' => true, ), 'meta' => array( 'itemprop' => true, 'datetime' => true, 'content' => true, ), 'p' => array( 'itemprop' => true, 'datetime' => true, 'content' => true, ), 'span' => array( 'itemprop' => true, 'datetime' => true, 'content' => true, ), 'time' => array( 'itemprop' => true, 'datetime' => true, 'content' => true, ), 'track' => array( 'itemprop' => true, 'content' => true, ), 'video' => array( 'itemprop' => true, 'content' => true, ), ); public function __construct() { add_action('init', array($this, 'init'), 99); add_filter('tiny_mce_before_init', array($this, 'tiny_mce_before_init'), 99, 2); } // end public function __construct public function init() { global $allowedposttags, $allowedtags; $allowedposttags = $this->merge_elements($allowedposttags, $this->extended_elements); $allowedtags = $this->merge_elements($allowedtags, $this->extended_elements); //echo '<pre>'; print_r($allowedposttags); die; /* foreach ($this->extended_elements as $element => $attributes) { if (isset($allowedposttags[$element]) && is_array($allowedposttags[$element])) { array_merge($allowedposttags[$element], $attributes); } else { $allowedposttags[$element] = $attributes; } } */ } // end public function init public function tiny_mce_before_init($mce, $editor_id) { global $allowedposttags, $allowedtags; $extended_elements = array(); if (isset($mce['extended_valid_elements'])) { $extended_elements = $this->extract_elements($mce['extended_valid_elements']); } $extended_elements = $this->merge_elements($extended_elements, $this->extended_elements); $extended_elements = $this->merge_extended_elements($extended_elements, $allowedposttags); $extended_elements = $this->format_elements($extended_elements); $mce['extended_valid_elements'] = $extended_elements; $mce['valid_children'] = '+body[meta],+div[meta]'; return $mce; } // end public function tiny_mce_before_init private function format_elements($elements) { //echo '<pre>'; print_r($elements); echo '</pre>'; $list = array(); foreach ($elements as $element => $attributes) { $sub_list = array(); if (count($attributes)) { foreach ($attributes as $attribute => $value) { $sub_list[] = $attribute; } } $list[] = $element.'['.implode('|', $sub_list).']'; } // end foreach $elements //echo '<pre>'; print_r($list); echo '</pre>'; $string = implode(',', $list); return $string; } // end private function format_elements private function merge_extended_elements($array1, $array2) { // merge existing allowed elements into extented elements foreach ($array2 as $element => $attributes) { if (!isset($array1[$element])) { continue; } foreach ($attributes as $attribute => $value) { if (!isset($array1[$element][$attribute])) { if ($attribute == 'xml:lang') { $attribute = 'xml'; } $array1[$element][$attribute] = $value; } } } return $array1; } // end private function merge_extended_elements private function merge_elements($array1, $array2) { foreach ($array2 as $element => $attributes) { //echo $element; echo ' : '; print_r($attributes); echo ' : '; print_r($array1[$element]);echo '<br>'; if (!isset($array1[$element])) { $array1[$element] = $attributes; } else { if (count($attributes)) { foreach ($attributes as $attribute => $value) { $array1[$element][$attribute] = $value; } } } } return $array1; } // end private function merge_elements private function extract_elements($string) { $elements = array(); if (trim($string) == '') { return $elements; } $tags = explode(',', $string); foreach ($tags as $tag) { if (strpos($tag, '[') === false) { $elements[trim($tag)] = array(); } else { $attributes = explode('[', trim($tag, ']')); $element = trim(array_shift($attributes)); $elements[$element] = array(); foreach ($attributes as $attribute) { $elements[$element][trim($attribute)] = true; } } } return $elements; } // end private function extract_elements private function write_to_file($value) { // this function for testing & debuggin only return; $file = dirname(__FILE__).'/data.txt'; $handle = fopen($file, 'a'); ob_start(); //echo "\r\n"; //echo "\r\n\r\nvar_dump:: "; var_dump($value); echo " ::end var_dump\r\n\r\n"; if (is_array($value) || is_object($value)) { print_r($value); } elseif (is_bool($value)) { var_dump($value); } else { echo $value; } echo "\r\n\r\n"; fwrite($handle, ob_get_clean()); fclose($handle); } // end private function write_to_file } // end class blunt_schema_data ?>
У себя же я немного подправил плагин:
- вырезал в конце непонятную функцию сохранения данных в файл, которая по коду нигде не использовалась
- прошелся по списку и добавил для span и meta дополнительные атрибуты
как итог - все заработало и под правами редактора 🙂