WP_Widget_Text{}

用于实现Text小部件的核心类。

描述

另请参阅

方法

姓名描述
WP_Widget_Text::__construct设置新的文本小部件实例。
WP_Widget_Text::过滤器库短代码属性筛选库短代码属性。
WP_Widget_Text::_register_one在注册该小部件类的所有小部件实例时,添加用于对资产进行排队的挂钩。
WP_Widget_Text::队列管理员脚本加载小部件控件所需的脚本和样式。
WP_Widget_Text::enqueue_preview_scripts将预览脚本排队。
WP_Widget_Text::表单输出文本小部件设置窗体。
WP_Widget_Text::注入_video_max_width_style注入最大宽度并删除视频的高度,因为视频太受限制,无法放在前端的侧边栏中。
WP_Widget_Text::is_legacy_instance确定给定实例是否为旧实例,是否应使用TinyMCE绕过。
WP_Widget_Text::render_control_template_scripts呈现表单模板脚本。
WP_Widget_Text::更新处理当前文本小部件实例的更新设置。
WP_Widget_Text::小部件输出当前文本小部件实例的内容。

来源

类WP_Widget_Text扩展了WP_Widlet{/***小部件是否已注册。**@自4.8.1起*@var布尔*/protected$registered=false;/***设置新的文本小部件实例。**@自2.8.0起*/公共函数__construct(){$widget_ops=数组(“classname”=>“widget_text”,“description”=>__(“任意文本”),“customize_selective_refresh”=>true,“show_instance_in_rest”=>true,);$control_ops=数组(“宽度”=>400,“高度”=>350,);父项::__construct('text',__('text'),$widget_ops,$control_ops);}/***在注册此小部件类的所有小部件实例时,添加用于排队资产的挂钩。**@param int$number可选。此小部件实例的唯一订单号*与同一类的其他实例进行比较。默认值为1。*/公共函数_register_one($number=-1){父项::_register_one($number);if($this->已注册){回报;}$this->registered=true;if($this->is_preview()){add_action('wp_enqueue_scripts',数组($this,'enqueue_preview_scripts]);}/**注意,定制器中的小部件组件也可以*WP_Customize_widgets:print_scripts()中的“admin_print_scripts-widgets.php”操作。*/add_action(“admin_print_scripts-widgets.php”,数组($this,“enqueue_admin_scripts”);/**注意,定制器中的小部件组件也可以*WP_Customize_widgets::print_footer_scripts()中的“admin_footer-widgets.php”操作。*/add_action('admin_footer-widgets.php',数组('WP_Widget_Text','render_control_template_scripts');}/***确定给定实例是否为旧实例,是否应使用TinyMCE绕过。**@自4.8.1起**@param数组$instance{*实例数据。**@type string$text内容。*@type bool | string$filter是否应应用自动过滤器或内容过滤器。*@type bool$legacy小部件是否处于传统模式。* }*@return bool文本小部件实例是否包含旧数据。*/公共函数is_legacy_instance($instance){//非视觉模式时的传统模式。if(isset($instance['visual'])){返回$实例[“视觉”];}//或者,在4.8.0中添加/更新了小部件,然后过滤器属性为“内容”,它不再是遗留的。if(isset($instance['filter'])&&'内容'===$instance['filter']){返回false;}//如果文本为空,则没有任何东西阻止迁移到TinyMCE。if(空($instance['text']){返回false;}$wpauto=!空($instance['filter']);$has_line_breaks=(str_contains(trim($instance['text']),“\n”);//如果未启用自动绘图,并且存在换行符,请确保使用传统模式。如果(!$wpauto&&$hasline_breaks){返回true;}//如果存在HTML注释,则采用传统模式。if(str_contains($instance['text'],'<!--')){返回true;}//在DOMDocument不可用的罕见情况下,我们无法可靠地嗅探内容,因此我们假设存在遗留问题。if(!class_exists('DOMDocument')){//@codeCoverage忽略开始返回true;//@codeCoverage忽略结束}$doc=新DOMDocument();//禁止加载HTML生成的警告。$errors=libxml_use_internal_errors(true);//phpcs:忽略WordPress。菲律宾比索。无SilencedErrors。感到沮丧@$doc->loadHTML(冲刺('<!DOCTYPE html><html><头><元字符集=“%s”></head><正文>%s</body></html>',esc_attr(get_bloginfo(“字符集”)),$instance[“文本”]));libxml_use_internal_errors($errors);$body=$doc->getElementsByTagName('body')->项(0);//请参阅$allowedposttags。$safe_elements_attributes=数组(“strong”=>数组(),'em'=>数组(),“b”=>数组(),“i”=>数组(),'u'=>数组(),“s”=>数组(),“ul”=>数组(),'ol'=>数组(),'li'=>数组(),'hr'=>数组(),“abbr”=>数组(),“首字母缩写词”=>array(),“code”=>数组(),“dfn”=>数组(),“a”=>数组('href'=>true,),“img”=>数组(“src”=>true,'alt'=>true,),);$safe_empty_elements=数组('img','hr','iframe');foreach($body->getElementsByTagName('*')作为$element){/**@var DOMElement$元素*/$tag_name=strtolower($element->nodeName);//如果元素不安全,则实例是遗留的。if(!isset($safe_elements_attributes[$tag_name])){返回true;}//如果元素不安全为空,并且其内容为空,则为遗留模式。if(!in_array($tag_name,$safe_empty_elements,true)&&'’===修剪($element->textContent)){返回true;}//如果属性未被识别为安全属性,则该实例为遗留实例。foreach($element->attributes作为$attribute){/**@var DOMAttr$属性*/$attribute_name=strtollower($attricte->nodeName);if(!isset($safe_elements_attributes[$tag_name][$attribute_name])){返回true;}}}//否则,文本不包含TinyMCE可以删除的元素/属性,因此小部件不需要传统模式。返回false;}/***筛选库短代码属性。**阻止网站的所有附件显示在*$post上下文不可用的非奇异模板。**@自4.9.0起**@param array$attrs属性。*@return数组属性。*/公共函数filter_gallery_shortcode_attrs($attrs){if(!is_singular()&&空($attrs['id'])&&empty($attris['include']){$attrs['id']=-1;}返回$attrs;}/***输出当前文本小部件实例的内容。**@自2.8.0起**@global WP_Post$Post全局发布对象。**@param array$args显示参数,包括“before_title”、“after_title”、,*'before_widget'和'after_widget]。*当前文本小部件实例的@param array$instance设置。*/公共功能小部件($args,$instance){全球$邮政;$title=!空($instance['title'])$实例[“标题”]:“”;/**该过滤器记录在wp-includes/widgets/class-wp-widget-pages.php中*/$title=应用过滤器('widget_title',$title,$instance,$this->id_base);$text=!空($instance['text'])$实例['text']:'';$is_visual_text_widget=(!空($instance['visual'])&&!空($instance['filter']);//仅在4.8.0中,可视化文本小部件获取filter=content,而没有可视化属性;即时升级实例道具。if(!$is_visual_text_widget){$is_visual_text_widget=(isset($instance['filter'])&&'内容'===$instance['filter']);}if($isvisual_text_widget){$instance['filter']=真;$instance['visual']=true;}/**暂停为可视文本小部件的“widget_text”筛选器提供的旧插件do_shortcode(),以防止*短代码被处理两次。现在do_shortcode()被添加到核心本身的“widget_text_content”过滤器中*它应用于wpauto()之后,以防止损坏由短代码添加的HTML输出。当do_shortcode()为*添加到“widget_text_content”后,在传统模式下也将手动调用do_shortcode()。*/$widget_text_do_shortcode_priority=has_filter('小部件_文本','do_shortcode');$should_suspend_legacy_shortcode_support=($is_visual_text_widget&&false!==$widget_text_do_shortcode优先级);if($should_suspend_legacy_shortcode_support){删除过滤器(“widget_text”,“do_shortcode”,$widget_ext_do_shortcode_priority);}//覆盖全局$post,以便在一致的上下文中应用筛选器(和短代码)。$original_post=$post;if(is_singular()){//确保post始终是单个查询中的查询对象(而不是来自未能清理全局$post的另一个子查询)。$post=获取查询对象();}其他{//在小部件呈现期间,将$post全局设置为空,以防止短代码在存档查询的意外上下文中运行。$post=空;}//防止从媒体库中转储所有附件。add_filter(“shortcode_atts_gallery”,数组($this,“_filter_gallery_shortcode\uattrs”);/***过滤文本小部件的内容。**@自2.3.0起*@since 4.4.0添加了`$widget`参数。*@自4.8.1以来,除了“WP_widget_Text”对象之外,“$widget`参数”现在还可以是“WP_widget_Custom_HTML”对象。**@param string$text小部件内容。*@param array$instance当前小部件的设置数组。*@param WP_Widget_Text | WP_Wigget_Custom_HTML$小部件当前文本或HTML小部件实例。*/$text=应用过滤器('widget_text',$text,$instance,$this);if($isvisual_text_widget){/***过滤文本小部件的内容以应用可视(TinyMCE)编辑器中预期的更改。**默认情况下,将应用the_content过滤器的子集,包括wpauto和wptextureze。**@自4.8.0起**@param string$text小部件内容。*@param array$instance当前小部件的设置数组。*@param WP_Widget_Text$小部件当前文本小部件实例。*/$text=应用过滤器('widget_text_content',$text,$instance,$this);}其他{//现在,在传统模式下,选中复选框时添加段落和换行符。if(!empty($instance['filter'])){$text=wpautop($text);}/**当内核添加过滤器存在时,手动对内容进行短代码。默认情况下添加*将doshortcode()添加到“widgettextcontent”过滤器中,以在wpauto()之后应用。*由于遗留文本小部件在应用“widget_Text”过滤器后运行wpauto()*这里的传统模式手动对内容应用do_shortcode(),除非默认*“widget_text_content”的核心筛选器已删除,或者do_shortcode()已删除*通过将do_shortcode()添加到“widget_text”过滤器的插件应用。*/if(has_filter('widget_text_content','do_shortcode')&&$小部件_文本_短代码_优先级){if(!空($instance['filter']){$text=shortcode_unautop($text);}$text=do_shortcode($text);}}//还原全局日志。$post=$original_post;删除过滤器('shortcode_atts_gallery',数组($this,'_filter_galley_shortcode\uattrs');//撤销对旧插件提供的短代码处理的暂停。如果($should_suspend_legacy_shortcode_support){add_filter(“小部件文本”,“do_shortcode”,$widget_text_do_shortcode_priority);}echo$args[“小部件之前”];if(!空($title)){echo$args[“标题之前”]$标题$args['after_title'];}$text=preg_replace_callback('#<(video|iframe|object|embed)\s[^>]*>#i',数组($this,'inject_video_max_width_style'),$text);//将“noopener”关系添加到具有目标的所有HTMLA元素中,而不重复值。$text=wp_targeted_link_rel($text);?><div class=“textwidget”><?php echo$text;?></div(分频)><?php(电话)echo$args['after_widget'];}/***为视频注入最大宽度并删除高度,因为视频太受限制,无法放在前端的侧边栏中。**@自4.9.0起**@请参阅WP_Widget_Media视频::inject_Video_max_width_style()**@param array$匹配来自preg_replace_callback的模式匹配。*@return string HTML输出。*/公共函数inject_video_max_width_style($matches){$html=$matches[0];$html=preg_replace('/\sheight=“\d+”/','',$html);$html=preg_replace('/\swidth=“\d+”/','',$html);$html=preg_replace('/(?<=宽度:)\s*\d+px(?=;?)/','100%',$html);返回$html;}/***处理当前文本小部件实例的更新设置。**@自2.8.0起**@param array$new_instance用户通过输入此实例的新设置*WP_Widget::form()。*@param array$old_instance此实例的旧设置。*@return array Settings保存,bool false取消保存。*/公共函数更新($new_instance,$old_instance){$new_instance=wp_parse_args($new_instance=wp_parse_args)($new_ instance,阵列(“标题”=>“”,“文本”=>“”,'filter'=>false,//用于back-compat。“visual”=>null,//必须显式定义。));$instance=$old_instance;$instance['title']=清理文本字段($new_instance['标题']);if(current_user_can('unfiltered_html')){$instance['text']=$new_instance['文本'];}其他{$instance['text']=wp_kses_post($new_instance['文本']);}$instance['filter']=!空($new_instance['filter']);//升级4.8.0格式。if(isset($oldinstance['filter'])&&'内容'===$oldinstance['filter']){$instance['visual']=true;}if(“内容”===$newinstance['filter']){$instance['visual']=true;}if(isset($new_instance['visual'])){$instance['visual']=!空($new_instance['visual']);}//过滤器在可视模式下始终为true。if(!空($instance['visual']){$instance['filter']=true;}return$instance;}/***将预览脚本排队。**当使用播放列表短代码时,这些脚本通常会实时排队。*然而,在自定义程序中,文本小部件和*通过选择性刷新动态添加,因此无条件排队很重要。**@自4.9.3起*/公共函数enqueue_preview_scripts(){require_once目录名(__DIR__)。'/media.php';wp_playlist_scripts('音频');wp_playlist_scripts(“视频”);}/***加载小部件控件所需的脚本和样式。**@自4.8.0起*/公共函数enqueue_admin_scripts(){wp_enqueue_editor();wp_enque_media();wp_enque_script(“文本窗口小部件”);wp_add_inline_script('text-widgets',sprintf('wp.textWidgets.idBases.push(%s);',wp_json_encode($this->id_base));wp_add_inline_script('text-widgets','wp.textWidgets.init();','后');}/***输出文本小部件设置窗体。**@自2.8.0起*@since 4.8.0表单只包含与JS模板同步的隐藏输入。*@自4.8.1以来,已将原始表单还原为在传统模式下显示。**@请参阅WP_Widget_Text::render_control_template_scripts()*@请参阅_WP_Editors::editor()**@param array$instance当前设置。*/公共函数窗体($instance){$instance=wp_parse_args((数组)$实例,阵列(“标题”=>“”,“文本”=>“”,));?><?php if(!$this->is_legacyinstance($instance)):?><?php(电话)if(user_can_richedit()){add_filter('the_editor_content','format_for_editor',10,2);$default_editor='tinymce';}其他{$default_editor=“html”;}/**该过滤器记录在wp-includes/class-wp-editor.php中*/$text=应用过滤器('the_editor_content',$instance['text'],$default_editor);//重置过滤器添加。if(user_can_richedit()){remove_filter('编辑内容','格式_for_editor');}//防止在format_for_editor()不适用或_editor_content过滤器做了错误的事情时过早关闭文本区域。$escaped_text=preg_replace(“#</textarea#i”,“&lt;/textarea”,$text);?><input id=“<?php echo$this->get_field_id('title');?>”name=“<?php echo$this->get_field_name('titel');”>“class=”title sync-input“type=”hidden“value=”<?php-echo esc_attr($instance['title']);?>>“>”><textarea id=“<?php echo$this->get_field_id('text');?>”name=“<?php echo$this->get_field_name('text`);?>>”class=“text sync-input”隐藏>>?php echo$escaped_text;?></文本区域><input id=“<?php echo$this->get_field_id('filter');?>”name=“<input id=“<?php echo$this->get_field_id('visual');?>”name=“<?php其他:?><input id=“<?php echo$this->get_field_id('visual');?>”name=“<p><label for=“<?php echo$this->get_field_id('title');?>”><?php_e('标题:');?></标签><input class=“widefat”id=“<?php echo$this->get_field_id('title');?>”name=“<?php echo$this->get_field_name('titel');”>“type=”text“value=”<?php-echo esc_attr($instance['title']);?>>“/></p><?php(电话)if(!isset($instance['visual'])){$widget_info_message=__('此小部件可能包含在&#8220;自定义HTML&#8221;小部件中工作得更好的代码。不如尝试该小部件?');}其他{$widget_info_message=__('此小部件可能包含在&#8220;Custom HTML&#8221;小部件中可能工作得更好的代码。如果您还没有,不如试试该小部件?');}wp_admin_notice(管理员通知)($widget_info_消息,阵列(“type”=>“info”,“additional_classes”=>数组(“notice-alt”,“inline”),));?><p><label for=“<?php echo$this->get_field_id('text');?>”><?php_e('内容:');?></标签><textarea class=“widefat”rows=“16”cols=“20”id=“<?php echo$this->get_field_id('text');?>”name=“<?hp echo$this->get_field_name('text`);?>>”>?php echo esc_textarea($instance['text']);?></文本区域></p><p><input id=“<?php echo$this->get_field_id('filter');?>”name=“?php已检查(!empty($instance['filter']));?>/>&nbsp<label for=“<?php echo$this->get_field_id('filter');?>”><?php_e('自动添加段落');?></标签></p><?php(电话)endif;}/***呈现表单模板脚本。**@自4.8.0起*@自4.9.0以来,该方法现在是静态的。*/公共静态函数render_control_template_scripts(){$dissisted_pointers=爆炸(',',(string)get_user_meta(get_current_user_id(),'dissisted_wp_pointers',true));?><script type=“text/html”id=“tmpl-widget-text-control-fields”><#var elementIdPrefix='el'+字符串(Math.random()).replace(/\D/g,'')+'_'#><p><label for=“{{elementIdPrefix}}title”><?php esc_html_e('标题:');?></标签><input id=“{{elementIdPrefix}}title”type=“text”class=“widefat title”></p><?php if(!in_array('text_widget_custom_html,$dissisted_pointers,true)):?><div hidden class=“wp-pointer custom-html-widget-pointer wp-pointer-top”><div class=“wp-pointer-content”><h3><?php_e(“新自定义HTML小工具”);?></h3><?php if(is_customize_preview()):?><p><?php _e('您知道现在有一个&#8220;自定义HTML&#8221;小部件吗?您可以通过按&#8220,添加小部件,然后搜索&#8220、HTML&#82 21;找到它!');?></p>(第页)<?php其他:?><p><?php_e('您知道现在有一个&#8220;自定义HTML&#8221;小部件吗?您可以通过扫描此屏幕上可用小部件的列表找到它。查看它以向您的站点添加一些自定义代码!');?></p>(第页)<?php endif;?><div class=“wp-pointer-buttons”><a class=“close”href=“#”><?php _e(“解散”);?></a></div></div><div class=“wp-pointer-arrow”><div class=“wp-pointer-arrow-inner”></div></div><?php endif;?><?php if(!in_array('text_widget_paste_html,$dissisted_pointers,true)):?><div hidden class=“wp-pointer paste-html-pointer wp-pointer-top”><div class=“wp-pointer-content”><h3><?php_e(“刚才粘贴HTML了吗?”);?></h3><p><?php _e(“嘿,您好,看起来您刚刚将HTML粘贴到了“文本”小部件的&#8220;Visual&#8221;选项卡中。您可能想将代码粘贴到&#8220)“文本”选项卡中。或者,尝试使用新的&#822;自定义HTML小部件!”);?></p>(第页)<div class=“wp-pointer-buttons”><a class=“close”href=“#”><?php_e(“删除”);?></a></div></div><div class=“wp-pointer-arrow”><div class=“wp-pointer-arrow-inner”></div></div><?php endif;?><p><label for=“{{elementIdPrefix}}text”class=“screen-reader-text”><?php/*translator:隐藏的辅助功能文本。*/esc_html_e('内容:');?></标签><textarea id=“{{elementIdPrefix}}text”class=“widefat text wp-editor-area”style=“height:200px”rows=“16”cols=“20”></textarea></p></script><?php(电话)}}

变更日志

版本描述
2.8.0介绍。

用户贡献的笔记

你必须登录在能够发表注释或反馈之前。