为您推荐:
精华内容
最热下载
问答
  • 表单字段负责验证输入并直接在模板中使用。而Widget负责渲染网页上HTML表单的输入元素和提取提交的原始数据。widget是字段的一个内在属性,用于定义字段在浏览器的页面里以何种HTML元素展现。一、指定使用的widget每...

    前言

    不要将Widget与表单的fields字段混淆。表单字段负责验证输入并直接在模板中使用。而Widget负责渲染网页上HTML表单的输入元素和提取提交的原始数据。widget是字段的一个内在属性,用于定义字段在浏览器的页面里以何种HTML元素展现。

    一、指定使用的widget

    每个字段都有一个默认的widget类型。如果你想要使用一个不同的Widget,可以在定义字段时使用widget参数。 像这样:

    from django import forms

    class CommentForm(forms.Form):

    name = forms.CharField()

    url = forms.URLField()

    comment = forms.CharField(widget=forms.Textarea)

    这将使用一个Textarea Widget来展现表单的评论字段,而不是默认的TextInput Widget。

    二、设置widget的参数

    许多widget具有可选的额外参数,下面的示例中,设置了SelectDateWidget的years 属性,注意参数的传递方法:

    from django import forms

    BIRTH_YEAR_CHOICES = ('1980', '1981', '1982')

    FAVORITE_COLORS_CHOICES = (

    ('blue', 'Blue'),

    ('green', 'Green'),

    ('black', 'Black'),

    )

    class SimpleForm(forms.Form):

    birth_year = forms.DateField(widget=forms.SelectDateWidget(years=BIRTH_YEAR_CHOICES))

    favorite_colors = forms.MultipleChoiceField(

    required=False,

    widget=forms.CheckboxSelectMultiple,

    choices=FAVORITE_COLORS_CHOICES,

    )

    三、为widget添加CSS样式

    默认情况下,当Django渲染Widget为实际的HTML代码时,不会帮你添加任何的CSS样式,也就是说网页上所有的TextInput元素的外观是一样的。

    看下面的表单:

    from django import forms

    class CommentForm(forms.Form):

    name = forms.CharField()

    url = forms.URLField()

    comment = forms.CharField()

    这个表单包含三个默认的TextInput Widget,以默认的方式渲染,没有CSS类、没有额外的属性。每个Widget的输入框将渲染得一模一样,丑陋又单调:

    >>> f = CommentForm(auto_id=False)

    >>> f.as_table()

    Name:Url:Comment:

    在真正的网页中,你可ending不想让每个Widget看上去都一样。可能想要给comment一个更大的输入框,可能想让‘name' Widget具有一些特殊的CSS类。

    可以在创建Widget时使用Widget.attrs参数来实现这一目的:

    class CommentForm(forms.Form):

    name = forms.CharField(widget=forms.TextInput(attrs={'class': 'special'}))

    url = forms.URLField()

    comment = forms.CharField(widget=forms.TextInput(attrs={'size': '40'}))

    注意参数的传递方式!

    这次渲染后的结果就不一样了:

    >>> f = CommentForm(auto_id=False)

    >>> f.as_table()

    Name:Url:Comment:

    以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

    展开全文
    weixin_39801714 2020-12-24 14:19:43
  • 虽然Qt提供了不少现成的组件,但是在Python中使用PyQt5或PySide2进行图形界面程序开发的过程,还是免不了要根据自己的需求组合一些小部件以形成新的自定义组件。最近州的先生在写一个桌面图形界面的登录密码框的过程...

    虽然Qt提供了不少现成的组件,但是在Python中使用PyQt5或PySide2进行图形界面程序开发的过程,还是免不了要根据自己的需求组合一些小部件以形成新的自定义组件。

    最近州的先生在写一个桌面图形界面的登录密码框的过程中,发现了这样一个小巧的自定义组件库。

    其目前提供了密码输入框组件、渐变组件、均衡器组件、调色板组件。

    安装

    直接使用 pip 工具进行安装即可,命令如下:

    pip install qtwidgets

    密码输入框

    在PyQt5和PySide2中,我们一般使用QLineEdit()小部件,通过设置它的EchoMode属性来让输入的文本显示星号而非明文,代码如下所示:

    # encoding:utf-8

    from PySide2 import QtWidgets

    import sys

    class Widget(QtWidgets.QWidget):

    def __init__(self):

    super().__init__()

    self.setWindowTitle("州的先生-zmister.com")

    self.pwd_input = QtWidgets.QLineEdit(self)

    self.pwd_input.setEchoMode(QtWidgets.QLineEdit.Password)

    def main():

    app = QtWidgets.QApplication(sys.argv)

    gui = Widget()

    gui.show()

    sys.exit(app.exec_())

    if __name__ == '__main__':

    main()

    运行后的效果如下所示:

    在现代的登录界面中,默认输入密码为密文,然后通过一个按钮允许用户查看自己输入的密码,是一个很常见的功能。

    如果我们要基于QLineEdit()组件来扩展的话,就得花很多时间和代码来实现。借助qtwidgets模块,咱们就可以少造一点轮子了。

    from PySide2 import QtWidgets

    from qtwidgets import PasswordEdit

    import sys

    class Widget(QtWidgets.QMainWindow):

    def __init__(self):

    super().__init__()

    self.setWindowTitle("州的先生-zmister.com")

    # self.pwd_input = QtWidgets.QLineEdit(self)

    self.pwd_input = PasswordEdit()

    self.setCentralWidget(self.pwd_input)

    def main():

    app = QtWidgets.QApplication(sys.argv)

    gui = Widget()

    gui.show()

    sys.exit(app.exec_())

    if __name__ == '__main__':

    main()

    来看看使用qtwidgets提供的密码输入框的效果:

    除了密码输入框,qtwidgets还提供了几个扩展的组件。

    渐变组件

    渐变组件Gradient()提供了方便的界面来设计应用程序中的线性渐变。只需创建对象的实例即可创建新的渐变器。

    from PySide2 import QtWidgets

    from qtwidgets import PasswordEdit,Gradient

    import sys

    class Widget(QtWidgets.QMainWindow):

    def __init__(self):

    super().__init__()

    self.setWindowTitle("州的先生-zmister.com")

    self.gradient = Gradient()

    self.setCentralWidget(self.gradient)

    def main():

    app = QtWidgets.QApplication(sys.argv)

    gui = Widget()

    gui.show()

    sys.exit(app.exec_())

    if __name__ == '__main__':

    main()

    默认的渐变颜色是从黑到白的。停止点使用一个红色框进行标记。渐变器组件创建之后,我们可以在图形界面上进行编辑:

    在渐变器上双击可以添加标记点,其颜色与右边的颜色一致;

    拖动标记点,可以改变渐变色的范围和位置;

    右键单击新建的标记点,可以编辑标记点的颜色;

    双击新建的标记点,可以删除此标记点。

    下面,我们来演示一下:

    调色板

    qtwidgets提供了三种调色板,分别是:

    水平调色板PaletteHorizontal

    垂直调色板PaletteVertical

    网格调色板PaletteGrid

    这三个调色板除了排列方式有所不同外,其他的使用方法都一样,都接受颜色列表参数,或预置的几个颜色族,都支持selected选择信号,下面我们来演示一下:

    from PySide2 import QtWidgets

    from qtwidgets import PasswordEdit,Gradient,PaletteGrid,PaletteHorizontal,PaletteVertical

    import sys

    class Widget(QtWidgets.QMainWindow):

    def __init__(self):

    super().__init__()

    self.setWindowTitle("州的先生-zmister.com")

    self.palette_1 = PaletteGrid('category10')

    self.palette_2 = PaletteHorizontal('17undertones')

    self.palette_3 = PaletteVertical(['#000003', '#160B39', '#410967', '#6A176E', '#932567', '#BA3655', '#DC5039', '#F2751A', '#FBA40A', '#F6D542', '#FCFEA4'])

    self.palette_1.selected.connect(self.selected_color)

    self.label = QtWidgets.QLabel("点击了:")

    self.widget = QtWidgets.QWidget()

    self.widget_layout = QtWidgets.QVBoxLayout()

    self.widget.setLayout(self.widget_layout)

    self.widget_layout.addWidget(self.palette_1)

    self.widget_layout.addWidget(self.palette_2)

    self.widget_layout.addWidget(self.palette_3)

    self.widget_layout.addWidget(self.label)

    self.setCentralWidget(self.widget)

    def selected_color(self,value):

    self.label.setText("点击了:{}".format(value))

    def main():

    app = QtWidgets.QApplication(sys.argv)

    gui = Widget()

    gui.show()

    sys.exit(app.exec_())

    if __name__ == '__main__':

    main()

    其运行效果为:

    最后

    还有一个均衡器组件,用于动态可视化输出频率的变化,在这里就不演示了,有兴趣的小伙伴可以自己试一试。

    除此之外,所有这些组件也都是基于Qt现有组件进行的封装,学有余力的小伙伴还可以查看一下它们的源码实现,以加深对Qt各个原生组件运用的理解。

    以上就是Python QT组件库qtwidgets的使用的详细内容,更多关于Python qtwidgets库的资料请关注python博客其它相关文章!

    展开全文
    weixin_29213827 2020-12-23 17:30:24
  • Top Widgets万能桌面(以下简称“本应用”)按照下列条款与条件提供信息和产品,您在本协议中亦可被称为“用户”,以下所述条款和条件将构成您与本应用,就您使用提供的内容所达成的全部协议(以下称“本协议”) ...

    当前版本更新时间:2021年12月05日

    当前版本生效时间:2021年12月05日

    用户协议

    Top Widgets万能桌面(以下简称“本应用”)按照下列条款与条件提供信息和产品,您在本协议中亦可被称为“用户”,以下所述条款和条件将构成您与本应用,就您使用提供的内容所达成的全部协议(以下称“本协议”)

    您通过应用页面点击确认或以其他方式(包括但不限于签字或签章确认等方式)接受本协议,即表示您与本应用已达成协议并同意接受本协议的全部约定内容以及与本协议有关的各项规则及本应用网站所包含的其他与本协议或本协议项下各项规则的条款和条件有关的各项规定,包括本应用对用户协议随时做的任何修改。 您确认并同意上述变更和/修改具有溯及力,其效力将溯及至您首次使用本应用服务时。

    在接受本协议之前,请您仔细阅读本协议的全部内容(特别是以粗体下划线标注的内容)。如果您不同意本协议的任意内容,或者无法准确理解该条款的含义,请不要进行后续操作。

    服务内容

    本应用的具体服务内容由本应用根据实际情况提供,例如个人信息、个人分享信息以及评论,在线交流等。

    本应用保留变更、中断或终止部分网络服务的权利。本应用保留根据实际情况随时调整本应用平台提供的服务种类、形式。本应用不承担因业务调整给用户造成的损失。

    注册及账号管理义务

    为了能使用本服务,您同意以下事项:依本服务注册提示请您填写正确的、真实的手机号、注册邮箱、密码和名号,并确保今后更新的手机号、登录邮箱、名号、头像等信息资料的真实性、有效性和合法性。若您提供任何非真实的、违法的、不道德的或本应用认为不适合在本应用上展示的信息资料,本应用有理由怀疑你的资料属于程序或恶意操作,本应用有权暂停或终止您的账号,并拒绝您于现在和未来使用本服务之全部或任何部分。

    本应用无须对任何用户的任何登记资料承担任何责任,包括但不限于鉴别、核实任何登记资料的真实性、正确性、完整性、适用性及/或是否为最新资料的责任。

    您承诺:您在本应用的账号名称、头像和简介等注册信息及其他个人信息中不得出现违法和不良信息,未经他人许可不得用他人名义开设账号,不得恶意注册。您的账号仅限于您本人使用,未经公司书面同意,禁止以任何形式赠与、借用、出租、转让、售卖或以其他方式许可他人使用该账号。如果公司发现或者有合理理由认为账号使用者与初始注册者不符的,本应用有权在未通知您的情况下,暂停或终止向该注册账号提供服务,并注销该账号。

    内容合规要求

    用户在本应用发表的内容(包含但不限于本应用目前各产品功能里的内容)仅表明其个人的立场和观点,并不代表本应用的立场或观点。作为内容的发表者,需自行对所发表内容负责,因所发表内容引发的一切纠纷,由该内容的发表者承担全部法律及连带责任。本应用不承担任何法律及连带责任。

    用户不得使用本应用服务发送或传播敏感信息和违反国家法律制度的信息,包括但不限于下列信息:

    1. 反对宪法所确定的基本原则的;

    2. 危害国家安全,泄露国家秘密,颠覆国家政权,破坏国家统一的;

    3. 损害国家荣誉和利益的;

    4. 煽动民族仇恨、民族歧视,破坏民族团结的;

    5. 破坏国家宗教政策,宣扬邪教和封建迷信的;

    6. 散布谣言,扰乱社会秩序,破坏社会稳定的;

    7. 散布淫秽、色情、赌博、暴力、凶杀、恐怖或者教唆犯罪的;

    8.侮辱或者诽谤他人,侵害他人合法权益的;

    9. 所发表的信息毫无意义的,或刻意使用字符组合以逃避技术审核的;

    10.含有法律、行政法规禁止的其他内容的。

    公众账号生产运营者必须遵守《互联网用户公众账号信息服务管理规定》,不得有下列违法违规行为:

    1.不以真实身份信息注册,或者注册与自身真实身份信息不相符的公众账号名称、头像、简介等;

    2.恶意假冒、仿冒或者盗用组织机构及他人公众账号生产发布信息内容;

    3.未经许可或者超越许可范围提供互联网新闻信息采编发布等服务;

    4.操纵利用多个平台账号,批量发布雷同低质信息内容,生成虚假流量数据,制造虚假舆论热点;

    5.利用突发事件煽动极端情绪,或者实施网络暴力损害他人和组织机构名誉,干扰组织机构正常运营,影响社会和谐稳定;

    6.编造虚假信息,伪造原创属性,标注不实信息来源,歪曲事实真相,误导社会公众;

    7.以有偿发布、删除信息等手段,实施非法网络监督、营销诈骗、敲诈勒索,谋取非法利益;

    8.违规批量注册、囤积或者非法交易买卖公众账号;

    9.制作、复制、发布违法信息,或者未采取措施防范和抵制制作、复制、发布不良信息

    10.法律、行政法规禁止的其他行为。

    用户承诺发表言论要:爱国、守法、自律、真实、文明,用户不得在本应用上传输任何非法的、骚扰性的、中伤他人的、辱骂性的、恐吓性的、伤害性的、庸俗的,淫秽的、危害国家安全的、泄露国家机密的、破坏国家宗教政策和民族团结的以及其它违反法律法规及政策的内容。如用户在本应用发布任何侵犯他人知识产权或其他合法权益的内容,或发表任何违规信息(定义见附件),本应用有权立即自本应用删除此类内容及信息;如果用户发布了大量的侵权内容或违规信息,或存在其他违反本用户协议的行为本应用有权作出独立判断立即取消用户服务账号。用户需对自己在网上的行为承担法律责任,本应用不承担任何法律及连带责任,并保留移交司法机关处理的权利。

    隐私保护

    保护用户隐私是本应用的重点原则,本应用通过技术手段、提供隐私保护服务功能、强化内部管理等办法充分保护用户的个人资料安全。

    本隐私声明适用于本应用的所有相关服务,随着本应用服务范围的扩大,隐私声明的内容可由本应用随时更新,且毋须另行通知。更新后的隐私声明一旦在网页上公布即有效代替原来的隐私声明。

    本应用严格保护您个人信息的安全。我们使用各种安全技术和程序来保护您的个人信息不被未经授权的访问、使用或泄漏。本应用会在法律要求或符合本应用的相关用户协议、软件许可使用协议约定的情况下透露您的个人信息,或者有充分理由相信必须这样做才能:

    (a) 满足法律或行政法规的明文规定,或者符合本应用站适用的法律程序;

    (b) 符合本应用相关用户协议、软件许可使用协议的约定;

    (c) 保护本应用的权利或财产,以及在紧急情况下保护本应用员工、产品或服务的用户或大众的个人安全。

    本应用不会未经您的允许将这些信息与第三方共享,本声明已经列出的上述情况除外。

    社区准则

    用户使用本应用服务时需遵守中华人民共和国相关法律法规,包括但不限于《中华人民共和国计算机信息系统安全保护条例》、《计算机软件保护条例》、《最高人民法院关于审理涉及计算机网络著作权纠纷案件适用法律若干问题的解释(法释[2004]1号)》、《全国人大常委会关于维护互联网安全的决定》、《互联网电子公告服务管理规定》、《互联网新闻信息服务管理规定》、《互联网著作权行政保护办法》、《信息网络传播权保护条例》和《互联网用户公众账号信息服务管理规定》等有关计算机互联网规定和知识产权的法律和法规、实施办法。

    用户使用本应用服务的行为若有任何违反国家法律法规或侵犯任何第三方的合法权益的情形时,本应用有权直接删除该等违反规定之内容。

    除非与本应用单独签订合同,否则不得将社区用于商业目的;本应用仅供个人使用。不可以通过自动方式创建账户,也不可以对账户使用自动系统执行操作。

    用户影响系统总体稳定性或完整性的操作可能会被暂停或终止,直到问题得到解决。

    本应用提倡:

    1. 分享、互助和开放;

    2. 宽容和理性地对待不同的看法、喜好和意见;

    3. 尊重他人的隐私和个人空间。

    本应用不欢迎:

    1. 针对种族、国家、民族、宗教、性别、年龄、地缘、性取向、生理特征的歧视和仇恨言论;

    2. 不雅词句、人身攻击、故意骚扰和恶意使用;

    3. 色情、激进时政、意识形态方面的话题;

    4. 频繁发布形式恶劣的广告内容。

    本应用不允许:

    1. 违反中国或本应用成员所在地法律法规的行为和内容;

    2. 威胁他人或本应用成员自身的人身安全、法律安全的行为;

    3. 对网站的运营安全有潜在威胁的内容。

    知识产权

    一、作为内容发布者您理解并同意:

    1、本应用尊重知识产权并注重保护用户享有的各项权利,您在本应用发布的所有原创作品,知识产权归您本人所有,您可自行授权第三方以任何方式使用而无须取得本应用的同意。

    2、您在发布作品时同意免费授权本应用对作品进行公开传播、推广等方式的使用。您在此做出并应授予本应用一项非排他性,全球性,永久性,免版税,免费,可转让,可再许可的使用,复制,分发,准备,展示,表演和以其他方式充分利用您的作品。您保证您拥有向我们授予此类许可的所有权利,而不会侵犯或侵犯任何第三方权利。

    3、为提高您内容曝光量及发布效率,您授权本应用有权将该内容用于本应用各种形态的产品和服务上,包括但不限于本应用微博、本应用微信公众号、小程序、子产品等各种形态的互联网产品上。

    4、对于您发布的作品,出现本应用已经删除或处理的内容,但是百度、谷歌等搜索引擎依然可以搜索到的现象,是因为百度、谷歌等搜索引擎自带缓存,此类问题本应用无权也无法处理,因此相关申请不予受理。您可以自行联系搜索引擎服务商进行处理。

    5、您通过本应用发表的作品将默认受“署名+非商业性使用”的转载规则保护,如您对自己发布的内容禁止其他用户转载的,须做出明示。但本应用并不确保在技术上实现禁止其他用户转载。

    二、作为内容阅读者您理解并同意:

    1、将用户在本应用上发表的内容转载在本应用之外的地方仅能用于用于个人浏览、学习、欣赏等个人用途,并不得对作品进行修改演绎。如果原创作者入驻本应用,须注明本应用签约作者。

    2、如用户在本应用上发表的内容注明“禁止转载”,除非获得原作者的单独授权,任何转载行为均构成侵权。

    3、用户以任何形式上传、发布于本应用上的信息内容,知识产权均归属用户。在任何情形下,未经本应用公司及上传者书面许可,您通过点赞、关注、付费等任何形式下载的其他用户上传的信息内容,均不视为获得了任何商业类授权或许可,仅可用于个人浏览、学习、欣赏等用途,不得用于任何商业目的。若您对下载后的信息内容进行了任何违法编辑或使用行为,导致的全部损害、费用或损失,将由您单独承担。

    4、应用依照法律规定履行广告及推广相关义务,您应当自行判断该广告或推广信息的真实性和可靠性并为自己的判断行为负责。除法律法规明确规定外,您因该广告或推广信息进行的购买、交易或因前述内容遭受的损害或损失由您自行承担,公司不予承担责任。

    5、您有权对违规内容或违规用户进行举报(详见内容合规要求)。

    三、承诺对其上传或者发表于本应用的所有信息(即属于《中华人民共和国著作权法》规定的作品,包括但不限于文字、图片、音乐、电影、表演、录音录像制品和电脑程序等)均享有完整的知识产权,或者已经得到相关权利人的合法授权;如用户违反本条规定造成本应用被第三方索赔的,用户同意全额补偿本应用(包括但不限于各种赔偿费用和律师费);

    当第三方认为用户上传或者发表于本应用的信息侵犯其权利,并根据《信息网络传播权保护条例》或者相关法律规定向本应用发送权利通知书(见附件一)时,用户同意本应用可以自行判断决定删除涉嫌侵权的用户上传或者发表于本应用的信息,除非收到符合相关法律规定且可以证明本应用不承担任何法律责任的书面说明,本应用将不会自动恢复上述删除的信息,由此给涉嫌侵权的用户带来的任何损失,本应用不承担任何法律责任;

    四、如用户在使用本应用服务时违反上述任何规定,本应用有权要求用户改正或直接采取一切必要的措施(包括但不限于删除用户张贴的内容、暂停或终止用户使用网络服务的权利)以减轻用户不当行为而造成的影响。由此给该用户带来的任何损失,本应用不承担任何法律责任。

    五、经由本应用提供为用户服务的内容,包括音乐,图片工具等,受到著作权法、商标法、专利法或其他法律的保护,用户可依照本协议的约定以个人欣赏之目的使用,但未经本应用另行书面同意,不得利用本应用网或服务进行销售或其他商业用途;用户对本网站所使用的软件有非专属性使用权,但不得自行或许可任何第三方复制、修改、出售或衍生产品。

    免责声明

    一旦您注册成为用户即表示您与本应用达成协议,完全接受本用户协议项下的全部条款。对免责声明的解释、修改及更新权均属于本应用所有。

    1. 由于您将用户密码告知他人或与他人共享注册账户,由此导致的任何个人信息的泄漏,或其他非因本应用原因导致的个人信息的泄漏,本应用不承担任何法律责任;

    2. 任何第三方根据本应用用户协议中所列明的情况使用您的个人信息,由此所产生的纠纷,本应用不承认任何法律责任;

    3. 任何由于黑客攻击、电脑病毒侵入或政府管制而造成的暂时性网站关闭,本应用不承担任何法律责任;

    4. 我们鼓励用户充分利用本应用平台自由地张贴和共享自己的信息。您可以自由张贴图片等内容,但您应拥有这些内容的使用权。同时,用户不应在自己的个人主页或社区中张贴其他受版权保护的内容。

    5. 用户在本应用发布侵犯他人知识产权或其他合法权益的内容,本应用有权予以删除,并保留移交司法机关处理的权利。

    6. 用户对于其创作并在本应用上发布的合法内容依法享有著作权及其相关权利。

    7. 互联网是一个开放平台,用户将图片等资料上传到互联网上,有可能会被其他组织或个人复制、转载、擅改或做其它非法用途,用户必须充分意识此类风险的存在。用户明确同意其使用本应用服务所存在的风险将完全由其自己承担;因其使用本应用服务而产生的一切后果也由其自己承担,本应用对用户不承担任何责任。

    服务变更、中断或终止

    遇到特殊情况或政府相关机构要求时,本应用有权根据有权机构的要求直接停用或注销用户账号;

    如因系统维护或升级的需要而需暂停网络服务、服务功能的调整,本应用将尽可能事先在本应用平台进行通告。

    如发生下列任何一种情形,本应用有权单方面中断或终止向用户提供服务而无需通知用户:

    1.用户提供的个人资料不真实;

    2.用户违反本用户协议中规定的使用规则;

    3.用户进行影响本应用系统总体稳定性或完整性的操作;

    4.未经本应用书面同意,将本应用平台用于商业目的。

    用户协议的完善和修改

    本应用有权根据互联网的发展和中华人民共和国有关法律、法规的变化,不时地完善和修改本应用用户协议。本应用保留随时修改用户协议的权利,用户在使用本应用平台服务时,有必要对最新的本应用用户协议进行仔细阅读和重新确认,当发生有关争议时,请以最新的用户协议为准。

    特别约定

    用户使用本服务的行为若有任何违反国家法律法规或侵犯任何第三方的合法权益的情形时,本应用有权直接删除该等违反规定之信息,并有权暂停或终止向该用户提供服务。

    若用户利用本服务从事任何违法或侵权行为,由用户自行承担全部责任,本应用不承担任何法律及连带责任。因此给本应用或任何第三方造成任何损失,用户应负责全额赔偿。

    您知悉并同意,本应用有权将您上传或者发表于本应用的所有信息,转载于本应用运营的本应用APP应用、微博微信公众号等多种媒体。您认可上述转载视同您本人发布和/或上传行为,受本协议约束,您和本应用无须另行签署协议。

    * 本条款的最终解释权归本应用所有

    附件一:侵权/违规作品反应方案

    1、如果用户认为本应用上提供的信息或内容侵犯了您的权利,您可以发送通知书至【xyj_173@163.com】;对于本应用App内涉嫌侵权的内容,您也可以点击各页面的“举报”功能,再选择“涉嫌侵权”,提交要求删除该侵权信息或内容。通知书须由权利人或经其合法授权的人亲笔签名,若为单位则还须加盖单位公章。通知书应当包含下列内容:

    您的姓名(名称)、联系方式、地址、身份证复印件(自然人)、单位登记证明复印件(单位);

    要求删除内容或信息的准确名称和网络地址,以便本应用能够发现并确认侵权内容;

    认为构成侵权的初步证明材料,包括但不限于对被侵犯对象的权属证明等。您应对通知书的真实性负责。若通知书的内容不真实,您将承担由此造成的全部法律责任。

    本应用收到您发出的以上通知后会及时对侵犯事实进行核查,核查确认您的侵犯通知书事实无误的情况下,本应用将:

    立即删除涉嫌侵权的内容或信息,或者断开涉嫌侵权作品的链接,并同时将通知书转送作品或内容的提供者;

    除履行反通知程序外,对使用同一账号多次上传同一侵权作品的会员,本应用有权不事先通知随时终止该帐号的使用。

    2、如果用户认为本应用上提供的信息或内容有涉及其他违反法律法规的,您可以发送邮件至【xyj_173@163.com】进行举报;对于本应用App内涉嫌违规的内容,您也可以点击各页面的“举报”功能,再选择具体的违规情形,提交要求删除该侵权信息或内容。如果邮件举报的话,则须需简单提供涉嫌违规的内容及其链接。

    附件二:对用户上传内容的审查制度

    审查原则:若本应用发现用户上传或发布的作品存在或可能存在侵犯任何第三方知识产权或违规信息的情形,本应用有权在不经事先通知的情况下随时删除该侵权或违规内容。

    本应用会采取必要的技术措施,尽量防止相同侵权或违规作品的再次上传。

    若本应用发现用户反复上传侵权或违规内容,则本应用有权随时停止为该等用户提供服务,并采取包括关闭注册账户、禁止登录在内的各种措施。

    审核步骤:

    对每个用户上传至本应用的内容,本应用都会采取以下步骤对该上传内容进行审核:用户发布——系统判断——系统拦截——人工初审——人工复审——前台发布;

    审核完毕后,本应用会根据审核的结果对用户上传内容进行以下类型的操作:删除、屏蔽、公开及推荐;

    具体操作:首先,由系统对用户上传的内容进行识别,只要被系统识别为可能侵权或违规,即刻进入锁定区,对公众不可见;之后由本应用工作人员审核是否侵权或违规,对于确定合规的,取消锁定;如有构成侵权或违规,人工审核清除此信息,并查看此用户所上传的所有信息,如果侵权或违规信息为少量的,则清除侵权或违规信息;如果此会员发布了大量的侵权或违规信息,则本应用会将侵权或违规内容全部清除,并屏蔽该会员。

    本应用每周升级扫描系统,收集新的关键字到词典;系统重新学习,重新计算侵权或违规信息的关键字分布概率。

    对于用户上传的以下内容(统称为“违规信息”),本应用必须予以删除处理:

    违法信息:是指违背《中华人民共和国宪法》和《全国人大常委会关于维护互联网安全的决定》、《互联网信息服务管理办法》所明文严禁的信息以及其它法律法规明文禁止传播的各类信息。

    不良信息:是指违背社会主义精神文明建设要求、违背中华民族优良文化传统与习惯以及其它违背社会公德的各类信息。

    淫秽信息:是指在整体上宣扬淫秽行为,具有下列内容之一:

    淫亵性地具体描写性行为、性交及其心理感受;

    宣扬色情淫荡形象;

    淫亵性地描述或者传授性技巧;

    具体描写乱伦、强奸及其它性犯罪的手段、过程或者细节,可能诱发犯罪的;

    具体描写少年儿童的性行为;

    淫亵性地具体描写同性恋的性行为或者其它性变态行为,以及具体描写与性变态有关的暴力、虐待、侮辱行为;

    其它令普通人不能容忍的对性行为淫亵性描写。

    《互联网信息服务管理办法》所严禁的九类信息是:

    反对宪法所确定的基本原则的;

    危害国家安全,泄露国家秘密,颠覆国家政权,破坏国家统一的;

    损害国家荣誉和利益的;

    煽动民族仇恨、民族歧视,破坏民族团结的;

    破坏国家宗教政策,宣扬邪教和封建迷信的;

    散布谣言,扰乱社会秩序,破坏社会稳定的;

    散布淫秽、色情、赌博、暴力、凶杀、恐怖或者教唆犯罪的;

    侮辱或者诽谤他人,侵害他人合法权益的;

    含有法律、行政法规禁止的其它内容的。

    展开全文
    penghongya11 2021-12-05 14:45:37
  • /*** Core Widgets API** This API is used for creating dynamic sidebar without hardcoding functionality into* themes** Includes both internal WordPress routines and theme-use routines.** This functiona...

    /**

    * Core Widgets API

    *

    * This API is used for creating dynamic sidebar without hardcoding functionality into

    * themes

    *

    * Includes both internal WordPress routines and theme-use routines.

    *

    * This functionality was found in a plugin before the WordPress 2.2 release, which

    * included it in the core from that point on.

    *

    * @link https://codex.wordpress.org/Plugins/WordPress_Widgets WordPress Widgets

    * @link https://codex.wordpress.org/Plugins/WordPress_Widgets_Api Widgets API

    *

    * @package WordPress

    * @subpackage Widgets

    * @since 2.2.0

    */

    //

    // Global Variables

    //

    /** @ignore */

    global $wp_registered_sidebars, $wp_registered_widgets, $wp_registered_widget_controls, $wp_registered_widget_updates;

    /**

    * Stores the sidebars, since many themes can have more than one.

    *

    * @global array $wp_registered_sidebars

    * @since 2.2.0

    */

    $wp_registered_sidebars = array();

    /**

    * Stores the registered widgets.

    *

    * @global array $wp_registered_widgets

    * @since 2.2.0

    */

    $wp_registered_widgets = array();

    /**

    * Stores the registered widget control (options).

    *

    * @global array $wp_registered_widget_controls

    * @since 2.2.0

    */

    $wp_registered_widget_controls = array();

    /**

    * @global array $wp_registered_widget_updates

    */

    $wp_registered_widget_updates = array();

    /**

    * Private

    *

    * @global array $_wp_sidebars_widgets

    */

    $_wp_sidebars_widgets = array();

    /**

    * Private

    *

    * @global array $_wp_deprecated_widgets_callbacks

    */

    $GLOBALS['_wp_deprecated_widgets_callbacks'] = array(

    'wp_widget_pages',

    'wp_widget_pages_control',

    'wp_widget_calendar',

    'wp_widget_calendar_control',

    'wp_widget_archives',

    'wp_widget_archives_control',

    'wp_widget_links',

    'wp_widget_meta',

    'wp_widget_meta_control',

    'wp_widget_search',

    'wp_widget_recent_entries',

    'wp_widget_recent_entries_control',

    'wp_widget_tag_cloud',

    'wp_widget_tag_cloud_control',

    'wp_widget_categories',

    'wp_widget_categories_control',

    'wp_widget_text',

    'wp_widget_text_control',

    'wp_widget_rss',

    'wp_widget_rss_control',

    'wp_widget_recent_comments',

    'wp_widget_recent_comments_control'

    );

    //

    // Template tags & API functions

    //

    /**

    * Register a widget

    *

    * Registers a WP_Widget widget

    *

    * @since 2.8.0

    * @since 4.6.0 Updated the `$widget` parameter to also accept a WP_Widget instance object

    * instead of simply a `WP_Widget` subclass name.

    *

    * @see WP_Widget

    *

    * @global WP_Widget_Factory $wp_widget_factory

    *

    * @param string|WP_Widget $widget Either the name of a `WP_Widget` subclass or an instance of a `WP_Widget` subclass.

    */

    function register_widget( $widget ) {

    global $wp_widget_factory;

    $wp_widget_factory->register( $widget );

    }

    /**

    * Unregisters a widget.

    *

    * Unregisters a WP_Widget widget. Useful for un-registering default widgets.

    * Run within a function hooked to the {@see 'widgets_init'} action.

    *

    * @since 2.8.0

    * @since 4.6.0 Updated the `$widget` parameter to also accept a WP_Widget instance object

    * instead of simply a `WP_Widget` subclass name.

    *

    * @see WP_Widget

    *

    * @global WP_Widget_Factory $wp_widget_factory

    *

    * @param string|WP_Widget $widget Either the name of a `WP_Widget` subclass or an instance of a `WP_Widget` subclass.

    */

    function unregister_widget( $widget ) {

    global $wp_widget_factory;

    $wp_widget_factory->unregister( $widget );

    }

    /**

    * Creates multiple sidebars.

    *

    * If you wanted to quickly create multiple sidebars for a theme or internally.

    * This function will allow you to do so. If you don't pass the 'name' and/or

    * 'id' in `$args`, then they will be built for you.

    *

    * @since 2.2.0

    *

    * @see register_sidebar() The second parameter is documented by register_sidebar() and is the same here.

    *

    * @global array $wp_registered_sidebars

    *

    * @param int $number Optional. Number of sidebars to create. Default 1.

    * @param array|string $args {

    * Optional. Array or string of arguments for building a sidebar.

    *

    * @type string $id The base string of the unique identifier for each sidebar. If provided, and multiple

    * sidebars are being defined, the id will have "-2" appended, and so on.

    * Default 'sidebar-' followed by the number the sidebar creation is currently at.

    * @type string $name The name or title for the sidebars displayed in the admin dashboard. If registering

    * more than one sidebar, include '%d' in the string as a placeholder for the uniquely

    * assigned number for each sidebar.

    * Default 'Sidebar' for the first sidebar, otherwise 'Sidebar %d'.

    * }

    */

    function register_sidebars( $number = 1, $args = array() ) {

    global $wp_registered_sidebars;

    $number = (int) $number;

    if ( is_string($args) )

    parse_str($args, $args);

    for ( $i = 1; $i <= $number; $i++ ) {

    $_args = $args;

    if ( $number > 1 )

    $_args['name'] = isset($args['name']) ? sprintf($args['name'], $i) : sprintf(__('Sidebar %d'), $i);

    else

    $_args['name'] = isset($args['name']) ? $args['name'] : __('Sidebar');

    // Custom specified ID's are suffixed if they exist already.

    // Automatically generated sidebar names need to be suffixed regardless starting at -0

    if ( isset($args['id']) ) {

    $_args['id'] = $args['id'];

    $n = 2; // Start at -2 for conflicting custom ID's

    while ( is_registered_sidebar( $_args['id'] ) ) {

    $_args['id'] = $args['id'] . '-' . $n++;

    }

    } else {

    $n = count( $wp_registered_sidebars );

    do {

    $_args['id'] = 'sidebar-' . ++$n;

    } while ( is_registered_sidebar( $_args['id'] ) );

    }

    register_sidebar($_args);

    }

    }

    /**

    * Builds the definition for a single sidebar and returns the ID.

    *

    * Accepts either a string or an array and then parses that against a set

    * of default arguments for the new sidebar. WordPress will automatically

    * generate a sidebar ID and name based on the current number of registered

    * sidebars if those arguments are not included.

    *

    * When allowing for automatic generation of the name and ID parameters, keep

    * in mind that the incrementor for your sidebar can change over time depending

    * on what other plugins and themes are installed.

    *

    * If theme support for 'widgets' has not yet been added when this function is

    * called, it will be automatically enabled through the use of add_theme_support()

    *

    * @since 2.2.0

    *

    * @global array $wp_registered_sidebars Stores the new sidebar in this array by sidebar ID.

    *

    * @param array|string $args {

    * Optional. Array or string of arguments for the sidebar being registered.

    *

    * @type string $name The name or title of the sidebar displayed in the Widgets

    * interface. Default 'Sidebar $instance'.

    * @type string $id The unique identifier by which the sidebar will be called.

    * Default 'sidebar-$instance'.

    * @type string $description Description of the sidebar, displayed in the Widgets interface.

    * Default empty string.

    * @type string $class Extra CSS class to assign to the sidebar in the Widgets interface.

    * Default empty.

    * @type string $before_widget HTML content to prepend to each widget's HTML output when

    * assigned to this sidebar. Default is an opening list item element.

    * @type string $after_widget HTML content to append to each widget's HTML output when

    * assigned to this sidebar. Default is a closing list item element.

    * @type string $before_title HTML content to prepend to the sidebar title when displayed.

    * Default is an opening h2 element.

    * @type string $after_title HTML content to append to the sidebar title when displayed.

    * Default is a closing h2 element.

    * }

    * @return string Sidebar ID added to $wp_registered_sidebars global.

    */

    function register_sidebar($args = array()) {

    global $wp_registered_sidebars;

    $i = count($wp_registered_sidebars) + 1;

    $id_is_empty = empty( $args['id'] );

    $defaults = array(

    'name' => sprintf(__('Sidebar %d'), $i ),

    'id' => "sidebar-$i",

    'description' => '',

    'class' => '',

    'before_widget' => '

    ',

    'after_widget' => "

    \n",

    'before_title' => '

    ',

    'after_title' => "\n",

    );

    $sidebar = wp_parse_args( $args, $defaults );

    if ( $id_is_empty ) {

    /* translators: 1: the id argument, 2: sidebar name, 3: recommended id value */

    _doing_it_wrong( __FUNCTION__, sprintf( __( 'No %1$s was set in the arguments array for the "%2$s" sidebar. Defaulting to "%3$s". Manually set the %1$s to "%3$s" to silence this notice and keep existing sidebar content.' ), 'id', $sidebar['name'], $sidebar['id'] ), '4.2.0' );

    }

    $wp_registered_sidebars[$sidebar['id']] = $sidebar;

    add_theme_support('widgets');

    /**

    * Fires once a sidebar has been registered.

    *

    * @since 3.0.0

    *

    * @param array $sidebar Parsed arguments for the registered sidebar.

    */

    do_action( 'register_sidebar', $sidebar );

    return $sidebar['id'];

    }

    /**

    * Removes a sidebar from the list.

    *

    * @since 2.2.0

    *

    * @global array $wp_registered_sidebars Stores the new sidebar in this array by sidebar ID.

    *

    * @param string|int $sidebar_id The ID of the sidebar when it was registered.

    */

    function unregister_sidebar( $sidebar_id ) {

    global $wp_registered_sidebars;

    unset( $wp_registered_sidebars[ $sidebar_id ] );

    }

    /**

    * Checks if a sidebar is registered.

    *

    * @since 4.4.0

    *

    * @global array $wp_registered_sidebars Registered sidebars.

    *

    * @param string|int $sidebar_id The ID of the sidebar when it was registered.

    * @return bool True if the sidebar is registered, false otherwise.

    */

    function is_registered_sidebar( $sidebar_id ) {

    global $wp_registered_sidebars;

    return isset( $wp_registered_sidebars[ $sidebar_id ] );

    }

    /**

    * Register an instance of a widget.

    *

    * The default widget option is 'classname' that can be overridden.

    *

    * The function can also be used to un-register widgets when `$output_callback`

    * parameter is an empty string.

    *

    * @since 2.2.0

    *

    * @global array $wp_registered_widgets Uses stored registered widgets.

    * @global array $wp_registered_widget_controls Stores the registered widget controls (options).

    * @global array $wp_registered_widget_updates

    * @global array $_wp_deprecated_widgets_callbacks

    *

    * @param int|string $id Widget ID.

    * @param string $name Widget display title.

    * @param callable $output_callback Run when widget is called.

    * @param array $options {

    * Optional. An array of supplementary widget options for the instance.

    *

    * @type string $classname Class name for the widget's HTML container. Default is a shortened

    * version of the output callback name.

    * @type string $description Widget description for display in the widget administration

    * panel and/or theme.

    * }

    */

    function wp_register_sidebar_widget( $id, $name, $output_callback, $options = array() ) {

    global $wp_registered_widgets, $wp_registered_widget_controls, $wp_registered_widget_updates, $_wp_deprecated_widgets_callbacks;

    $id = strtolower($id);

    if ( empty($output_callback) ) {

    unset($wp_registered_widgets[$id]);

    return;

    }

    $id_base = _get_widget_id_base($id);

    if ( in_array($output_callback, $_wp_deprecated_widgets_callbacks, true) && !is_callable($output_callback) ) {

    unset( $wp_registered_widget_controls[ $id ] );

    unset( $wp_registered_widget_updates[ $id_base ] );

    return;

    }

    $defaults = array('classname' => $output_callback);

    $options = wp_parse_args($options, $defaults);

    $widget = array(

    'name' => $name,

    'id' => $id,

    'callback' => $output_callback,

    'params' => array_slice(func_get_args(), 4)

    );

    $widget = array_merge($widget, $options);

    if ( is_callable($output_callback) && ( !isset($wp_registered_widgets[$id]) || did_action( 'widgets_init' ) ) ) {

    /**

    * Fires once for each registered widget.

    *

    * @since 3.0.0

    *

    * @param array $widget An array of default widget arguments.

    */

    do_action( 'wp_register_sidebar_widget', $widget );

    $wp_registered_widgets[$id] = $widget;

    }

    }

    /**

    * Retrieve description for widget.

    *

    * When registering widgets, the options can also include 'description' that

    * describes the widget for display on the widget administration panel or

    * in the theme.

    *

    * @since 2.5.0

    *

    * @global array $wp_registered_widgets

    *

    * @param int|string $id Widget ID.

    * @return string|void Widget description, if available.

    */

    function wp_widget_description( $id ) {

    if ( !is_scalar($id) )

    return;

    global $wp_registered_widgets;

    if ( isset($wp_registered_widgets[$id]['description']) )

    return esc_html( $wp_registered_widgets[$id]['description'] );

    }

    /**

    * Retrieve description for a sidebar.

    *

    * When registering sidebars a 'description' parameter can be included that

    * describes the sidebar for display on the widget administration panel.

    *

    * @since 2.9.0

    *

    * @global array $wp_registered_sidebars

    *

    * @param string $id sidebar ID.

    * @return string|void Sidebar description, if available.

    */

    function wp_sidebar_description( $id ) {

    if ( !is_scalar($id) )

    return;

    global $wp_registered_sidebars;

    if ( isset($wp_registered_sidebars[$id]['description']) )

    return esc_html( $wp_registered_sidebars[$id]['description'] );

    }

    /**

    * Remove widget from sidebar.

    *

    * @since 2.2.0

    *

    * @param int|string $id Widget ID.

    */

    function wp_unregister_sidebar_widget($id) {

    /**

    * Fires just before a widget is removed from a sidebar.

    *

    * @since 3.0.0

    *

    * @param int $id The widget ID.

    */

    do_action( 'wp_unregister_sidebar_widget', $id );

    wp_register_sidebar_widget($id, '', '');

    wp_unregister_widget_control($id);

    }

    /**

    * Registers widget control callback for customizing options.

    *

    * @since 2.2.0

    *

    * @todo `$params` parameter?

    *

    * @global array $wp_registered_widget_controls

    * @global array $wp_registered_widget_updates

    * @global array $wp_registered_widgets

    * @global array $_wp_deprecated_widgets_callbacks

    *

    * @param int|string $id Sidebar ID.

    * @param string $name Sidebar display name.

    * @param callable $control_callback Run when sidebar is displayed.

    * @param array $options {

    * Optional. Array or string of control options. Default empty array.

    *

    * @type int $height Never used. Default 200.

    * @type int $width Width of the fully expanded control form (but try hard to use the default width).

    * Default 250.

    * @type int|string $id_base Required for multi-widgets, i.e widgets that allow multiple instances such as the

    * text widget. The widget id will end up looking like `{$id_base}-{$unique_number}`.

    * }

    */

    function wp_register_widget_control( $id, $name, $control_callback, $options = array() ) {

    global $wp_registered_widget_controls, $wp_registered_widget_updates, $wp_registered_widgets, $_wp_deprecated_widgets_callbacks;

    $id = strtolower($id);

    $id_base = _get_widget_id_base($id);

    if ( empty($control_callback) ) {

    unset($wp_registered_widget_controls[$id]);

    unset($wp_registered_widget_updates[$id_base]);

    return;

    }

    if ( in_array($control_callback, $_wp_deprecated_widgets_callbacks, true) && !is_callable($control_callback) ) {

    unset( $wp_registered_widgets[ $id ] );

    return;

    }

    if ( isset($wp_registered_widget_controls[$id]) && !did_action( 'widgets_init' ) )

    return;

    $defaults = array('width' => 250, 'height' => 200 ); // height is never used

    $options = wp_parse_args($options, $defaults);

    $options['width'] = (int) $options['width'];

    $options['height'] = (int) $options['height'];

    $widget = array(

    'name' => $name,

    'id' => $id,

    'callback' => $control_callback,

    'params' => array_slice(func_get_args(), 4)

    );

    $widget = array_merge($widget, $options);

    $wp_registered_widget_controls[$id] = $widget;

    if ( isset($wp_registered_widget_updates[$id_base]) )

    return;

    if ( isset($widget['params'][0]['number']) )

    $widget['params'][0]['number'] = -1;

    unset($widget['width'], $widget['height'], $widget['name'], $widget['id']);

    $wp_registered_widget_updates[$id_base] = $widget;

    }

    /**

    * Registers the update callback for a widget.

    *

    * @since 2.8.0

    *

    * @global array $wp_registered_widget_updates

    *

    * @param string $id_base The base ID of a widget created by extending WP_Widget.

    * @param callable $update_callback Update callback method for the widget.

    * @param array $options Optional. Widget control options. See wp_register_widget_control().

    * Default empty array.

    */

    function _register_widget_update_callback( $id_base, $update_callback, $options = array() ) {

    global $wp_registered_widget_updates;

    if ( isset($wp_registered_widget_updates[$id_base]) ) {

    if ( empty($update_callback) )

    unset($wp_registered_widget_updates[$id_base]);

    return;

    }

    $widget = array(

    'callback' => $update_callback,

    'params' => array_slice(func_get_args(), 3)

    );

    $widget = array_merge($widget, $options);

    $wp_registered_widget_updates[$id_base] = $widget;

    }

    /**

    * Registers the form callback for a widget.

    *

    * @since 2.8.0

    *

    * @global array $wp_registered_widget_controls

    *

    * @param int|string $id Widget ID.

    * @param string $name Name attribute for the widget.

    * @param callable $form_callback Form callback.

    * @param array $options Optional. Widget control options. See wp_register_widget_control().

    * Default empty array.

    */

    function _register_widget_form_callback($id, $name, $form_callback, $options = array()) {

    global $wp_registered_widget_controls;

    $id = strtolower($id);

    if ( empty($form_callback) ) {

    unset($wp_registered_widget_controls[$id]);

    return;

    }

    if ( isset($wp_registered_widget_controls[$id]) && !did_action( 'widgets_init' ) )

    return;

    $defaults = array('width' => 250, 'height' => 200 );

    $options = wp_parse_args($options, $defaults);

    $options['width'] = (int) $options['width'];

    $options['height'] = (int) $options['height'];

    $widget = array(

    'name' => $name,

    'id' => $id,

    'callback' => $form_callback,

    'params' => array_slice(func_get_args(), 4)

    );

    $widget = array_merge($widget, $options);

    $wp_registered_widget_controls[$id] = $widget;

    }

    /**

    * Remove control callback for widget.

    *

    * @since 2.2.0

    *

    * @param int|string $id Widget ID.

    */

    function wp_unregister_widget_control($id) {

    wp_register_widget_control( $id, '', '' );

    }

    /**

    * Display dynamic sidebar.

    *

    * By default this displays the default sidebar or 'sidebar-1'. If your theme specifies the 'id' or

    * 'name' parameter for its registered sidebars you can pass an id or name as the $index parameter.

    * Otherwise, you can pass in a numerical index to display the sidebar at that index.

    *

    * @since 2.2.0

    *

    * @global array $wp_registered_sidebars

    * @global array $wp_registered_widgets

    *

    * @param int|string $index Optional, default is 1. Index, name or ID of dynamic sidebar.

    * @return bool True, if widget sidebar was found and called. False if not found or not called.

    */

    function dynamic_sidebar( $index = 1 ) {

    global $wp_registered_sidebars, $wp_registered_widgets;

    if ( is_int( $index ) ) {

    $index = "sidebar-$index";

    } else {

    $index = sanitize_title( $index );

    foreach ( (array) $wp_registered_sidebars as $key => $value ) {

    if ( sanitize_title( $value['name'] ) == $index ) {

    $index = $key;

    break;

    }

    }

    }

    $sidebars_widgets = wp_get_sidebars_widgets();

    if ( empty( $wp_registered_sidebars[ $index ] ) || empty( $sidebars_widgets[ $index ] ) || ! is_array( $sidebars_widgets[ $index ] ) ) {

    /** This action is documented in wp-includes/widget.php */

    do_action( 'dynamic_sidebar_before', $index, false );

    /** This action is documented in wp-includes/widget.php */

    do_action( 'dynamic_sidebar_after', $index, false );

    /** This filter is documented in wp-includes/widget.php */

    return apply_filters( 'dynamic_sidebar_has_widgets', false, $index );

    }

    /**

    * Fires before widgets are rendered in a dynamic sidebar.

    *

    * Note: The action also fires for empty sidebars, and on both the front end

    * and back end, including the Inactive Widgets sidebar on the Widgets screen.

    *

    * @since 3.9.0

    *

    * @param int|string $index Index, name, or ID of the dynamic sidebar.

    * @param bool $has_widgets Whether the sidebar is populated with widgets.

    * Default true.

    */

    do_action( 'dynamic_sidebar_before', $index, true );

    $sidebar = $wp_registered_sidebars[$index];

    $did_one = false;

    foreach ( (array) $sidebars_widgets[$index] as $id ) {

    if ( !isset($wp_registered_widgets[$id]) ) continue;

    $params = array_merge(

    array( array_merge( $sidebar, array('widget_id' => $id, 'widget_name' => $wp_registered_widgets[$id]['name']) ) ),

    (array) $wp_registered_widgets[$id]['params']

    );

    // Substitute HTML id and class attributes into before_widget

    $classname_ = '';

    foreach ( (array) $wp_registered_widgets[$id]['classname'] as $cn ) {

    if ( is_string($cn) )

    $classname_ .= '_' . $cn;

    elseif ( is_object($cn) )

    $classname_ .= '_' . get_class($cn);

    }

    $classname_ = ltrim($classname_, '_');

    $params[0]['before_widget'] = sprintf($params[0]['before_widget'], $id, $classname_);

    /**

    * Filters the parameters passed to a widget's display callback.

    *

    * Note: The filter is evaluated on both the front end and back end,

    * including for the Inactive Widgets sidebar on the Widgets screen.

    *

    * @since 2.5.0

    *

    * @see register_sidebar()

    *

    * @param array $params {

    * @type array $args {

    * An array of widget display arguments.

    *

    * @type string $name Name of the sidebar the widget is assigned to.

    * @type string $id ID of the sidebar the widget is assigned to.

    * @type string $description The sidebar description.

    * @type string $class CSS class applied to the sidebar container.

    * @type string $before_widget HTML markup to prepend to each widget in the sidebar.

    * @type string $after_widget HTML markup to append to each widget in the sidebar.

    * @type string $before_title HTML markup to prepend to the widget title when displayed.

    * @type string $after_title HTML markup to append to the widget title when displayed.

    * @type string $widget_id ID of the widget.

    * @type string $widget_name Name of the widget.

    * }

    * @type array $widget_args {

    * An array of multi-widget arguments.

    *

    * @type int $number Number increment used for multiples of the same widget.

    * }

    * }

    */

    $params = apply_filters( 'dynamic_sidebar_params', $params );

    $callback = $wp_registered_widgets[$id]['callback'];

    /**

    * Fires before a widget's display callback is called.

    *

    * Note: The action fires on both the front end and back end, including

    * for widgets in the Inactive Widgets sidebar on the Widgets screen.

    *

    * The action is not fired for empty sidebars.

    *

    * @since 3.0.0

    *

    * @param array $widget_id {

    * An associative array of widget arguments.

    *

    * @type string $name Name of the widget.

    * @type string $id Widget ID.

    * @type array|callable $callback When the hook is fired on the front end, $callback is an array

    * containing the widget object. Fired on the back end, $callback

    * is 'wp_widget_control', see $_callback.

    * @type array $params An associative array of multi-widget arguments.

    * @type string $classname CSS class applied to the widget container.

    * @type string $description The widget description.

    * @type array $_callback When the hook is fired on the back end, $_callback is populated

    * with an array containing the widget object, see $callback.

    * }

    */

    do_action( 'dynamic_sidebar', $wp_registered_widgets[ $id ] );

    if ( is_callable($callback) ) {

    call_user_func_array($callback, $params);

    $did_one = true;

    }

    }

    /**

    * Fires after widgets are rendered in a dynamic sidebar.

    *

    * Note: The action also fires for empty sidebars, and on both the front end

    * and back end, including the Inactive Widgets sidebar on the Widgets screen.

    *

    * @since 3.9.0

    *

    * @param int|string $index Index, name, or ID of the dynamic sidebar.

    * @param bool $has_widgets Whether the sidebar is populated with widgets.

    * Default true.

    */

    do_action( 'dynamic_sidebar_after', $index, true );

    /**

    * Filters whether a sidebar has widgets.

    *

    * Note: The filter is also evaluated for empty sidebars, and on both the front end

    * and back end, including the Inactive Widgets sidebar on the Widgets screen.

    *

    * @since 3.9.0

    *

    * @param bool $did_one Whether at least one widget was rendered in the sidebar.

    * Default false.

    * @param int|string $index Index, name, or ID of the dynamic sidebar.

    */

    return apply_filters( 'dynamic_sidebar_has_widgets', $did_one, $index );

    }

    /**

    * Whether widget is displayed on the front end.

    *

    * Either $callback or $id_base can be used

    * $id_base is the first argument when extending WP_Widget class

    * Without the optional $widget_id parameter, returns the ID of the first sidebar

    * in which the first instance of the widget with the given callback or $id_base is found.

    * With the $widget_id parameter, returns the ID of the sidebar where

    * the widget with that callback/$id_base AND that ID is found.

    *

    * NOTE: $widget_id and $id_base are the same for single widgets. To be effective

    * this function has to run after widgets have initialized, at action {@see 'init'} or later.

    *

    * @since 2.2.0

    *

    * @global array $wp_registered_widgets

    *

    * @param string|false $callback Optional, Widget callback to check. Default false.

    * @param int|false $widget_id Optional. Widget ID. Optional, but needed for checking. Default false.

    * @param string|false $id_base Optional. The base ID of a widget created by extending WP_Widget. Default false.

    * @param bool $skip_inactive Optional. Whether to check in 'wp_inactive_widgets'. Default true.

    * @return string|false False if widget is not active or id of sidebar in which the widget is active.

    */

    function is_active_widget( $callback = false, $widget_id = false, $id_base = false, $skip_inactive = true ) {

    global $wp_registered_widgets;

    $sidebars_widgets = wp_get_sidebars_widgets();

    if ( is_array($sidebars_widgets) ) {

    foreach ( $sidebars_widgets as $sidebar => $widgets ) {

    if ( $skip_inactive && ( 'wp_inactive_widgets' === $sidebar || 'orphaned_widgets' === substr( $sidebar, 0, 16 ) ) ) {

    continue;

    }

    if ( is_array($widgets) ) {

    foreach ( $widgets as $widget ) {

    if ( ( $callback && isset($wp_registered_widgets[$widget]['callback']) && $wp_registered_widgets[$widget]['callback'] == $callback ) || ( $id_base && _get_widget_id_base($widget) == $id_base ) ) {

    if ( !$widget_id || $widget_id == $wp_registered_widgets[$widget]['id'] )

    return $sidebar;

    }

    }

    }

    }

    }

    return false;

    }

    /**

    * Whether the dynamic sidebar is enabled and used by theme.

    *

    * @since 2.2.0

    *

    * @global array $wp_registered_widgets

    * @global array $wp_registered_sidebars

    *

    * @return bool True, if using widgets. False, if not using widgets.

    */

    function is_dynamic_sidebar() {

    global $wp_registered_widgets, $wp_registered_sidebars;

    $sidebars_widgets = get_option('sidebars_widgets');

    foreach ( (array) $wp_registered_sidebars as $index => $sidebar ) {

    if ( ! empty( $sidebars_widgets[ $index ] ) ) {

    foreach ( (array) $sidebars_widgets[$index] as $widget )

    if ( array_key_exists($widget, $wp_registered_widgets) )

    return true;

    }

    }

    return false;

    }

    /**

    * Whether a sidebar is in use.

    *

    * @since 2.8.0

    *

    * @param string|int $index Sidebar name, id or number to check.

    * @return bool true if the sidebar is in use, false otherwise.

    */

    function is_active_sidebar( $index ) {

    $index = ( is_int($index) ) ? "sidebar-$index" : sanitize_title($index);

    $sidebars_widgets = wp_get_sidebars_widgets();

    $is_active_sidebar = ! empty( $sidebars_widgets[$index] );

    /**

    * Filters whether a dynamic sidebar is considered "active".

    *

    * @since 3.9.0

    *

    * @param bool $is_active_sidebar Whether or not the sidebar should be considered "active".

    * In other words, whether the sidebar contains any widgets.

    * @param int|string $index Index, name, or ID of the dynamic sidebar.

    */

    return apply_filters( 'is_active_sidebar', $is_active_sidebar, $index );

    }

    //

    // Internal Functions

    //

    /**

    * Retrieve full list of sidebars and their widget instance IDs.

    *

    * Will upgrade sidebar widget list, if needed. Will also save updated list, if

    * needed.

    *

    * @since 2.2.0

    * @access private

    *

    * @global array $_wp_sidebars_widgets

    * @global array $sidebars_widgets

    *

    * @param bool $deprecated Not used (argument deprecated).

    * @return array Upgraded list of widgets to version 3 array format when called from the admin.

    */

    function wp_get_sidebars_widgets( $deprecated = true ) {

    if ( $deprecated !== true )

    _deprecated_argument( __FUNCTION__, '2.8.1' );

    global $_wp_sidebars_widgets, $sidebars_widgets;

    // If loading from front page, consult $_wp_sidebars_widgets rather than options

    // to see if wp_convert_widget_settings() has made manipulations in memory.

    if ( !is_admin() ) {

    if ( empty($_wp_sidebars_widgets) )

    $_wp_sidebars_widgets = get_option('sidebars_widgets', array());

    $sidebars_widgets = $_wp_sidebars_widgets;

    } else {

    $sidebars_widgets = get_option('sidebars_widgets', array());

    }

    if ( is_array( $sidebars_widgets ) && isset($sidebars_widgets['array_version']) )

    unset($sidebars_widgets['array_version']);

    /**

    * Filters the list of sidebars and their widgets.

    *

    * @since 2.7.0

    *

    * @param array $sidebars_widgets An associative array of sidebars and their widgets.

    */

    return apply_filters( 'sidebars_widgets', $sidebars_widgets );

    }

    /**

    * Set the sidebar widget option to update sidebars.

    *

    * @since 2.2.0

    * @access private

    *

    * @global array $_wp_sidebars_widgets

    * @param array $sidebars_widgets Sidebar widgets and their settings.

    */

    function wp_set_sidebars_widgets( $sidebars_widgets ) {

    global $_wp_sidebars_widgets;

    // Clear cached value used in wp_get_sidebars_widgets().

    $_wp_sidebars_widgets = null;

    if ( ! isset( $sidebars_widgets['array_version'] ) ) {

    $sidebars_widgets['array_version'] = 3;

    }

    update_option( 'sidebars_widgets', $sidebars_widgets );

    }

    /**

    * Retrieve default registered sidebars list.

    *

    * @since 2.2.0

    * @access private

    *

    * @global array $wp_registered_sidebars

    *

    * @return array

    */

    function wp_get_widget_defaults() {

    global $wp_registered_sidebars;

    $defaults = array();

    foreach ( (array) $wp_registered_sidebars as $index => $sidebar )

    $defaults[$index] = array();

    return $defaults;

    }

    /**

    * Convert the widget settings from single to multi-widget format.

    *

    * @since 2.8.0

    *

    * @global array $_wp_sidebars_widgets

    *

    * @param string $base_name

    * @param string $option_name

    * @param array $settings

    * @return array

    */

    function wp_convert_widget_settings($base_name, $option_name, $settings) {

    // This test may need expanding.

    $single = $changed = false;

    if ( empty($settings) ) {

    $single = true;

    } else {

    foreach ( array_keys($settings) as $number ) {

    if ( 'number' == $number )

    continue;

    if ( !is_numeric($number) ) {

    $single = true;

    break;

    }

    }

    }

    if ( $single ) {

    $settings = array( 2 => $settings );

    // If loading from the front page, update sidebar in memory but don't save to options

    if ( is_admin() ) {

    $sidebars_widgets = get_option('sidebars_widgets');

    } else {

    if ( empty($GLOBALS['_wp_sidebars_widgets']) )

    $GLOBALS['_wp_sidebars_widgets'] = get_option('sidebars_widgets', array());

    $sidebars_widgets = &$GLOBALS['_wp_sidebars_widgets'];

    }

    foreach ( (array) $sidebars_widgets as $index => $sidebar ) {

    if ( is_array($sidebar) ) {

    foreach ( $sidebar as $i => $name ) {

    if ( $base_name == $name ) {

    $sidebars_widgets[$index][$i] = "$name-2";

    $changed = true;

    break 2;

    }

    }

    }

    }

    if ( is_admin() && $changed )

    update_option('sidebars_widgets', $sidebars_widgets);

    }

    $settings['_multiwidget'] = 1;

    if ( is_admin() )

    update_option( $option_name, $settings );

    return $settings;

    }

    /**

    * Output an arbitrary widget as a template tag.

    *

    * @since 2.8.0

    *

    * @global WP_Widget_Factory $wp_widget_factory

    *

    * @param string $widget The widget's PHP class name (see class-wp-widget.php).

    * @param array $instance Optional. The widget's instance settings. Default empty array.

    * @param array $args {

    * Optional. Array of arguments to configure the display of the widget.

    *

    * @type string $before_widget HTML content that will be prepended to the widget's HTML output.

    * Default `

    `, where `%s` is the widget's class name.

    * @type string $after_widget HTML content that will be appended to the widget's HTML output.

    * Default `

    `.

    * @type string $before_title HTML content that will be prepended to the widget's title when displayed.

    * Default `

    `.

    * @type string $after_title HTML content that will be appended to the widget's title when displayed.

    * Default ``.

    * }

    */

    function the_widget( $widget, $instance = array(), $args = array() ) {

    global $wp_widget_factory;

    if ( ! isset( $wp_widget_factory->widgets[ $widget ] ) ) {

    /* translators: %s: register_widget() */

    _doing_it_wrong( __FUNCTION__, sprintf( __( 'Widgets need to be registered using %s, before they can be displayed.' ), 'register_widget()' ), '4.9.0' );

    return;

    }

    $widget_obj = $wp_widget_factory->widgets[$widget];

    if ( ! ( $widget_obj instanceof WP_Widget ) ) {

    return;

    }

    $default_args = array(

    'before_widget' => '

    ',

    'after_widget' => "

    ",

    'before_title' => '

    ',

    'after_title' => '',

    );

    $args = wp_parse_args( $args, $default_args );

    $args['before_widget'] = sprintf( $args['before_widget'], $widget_obj->widget_options['classname'] );

    $instance = wp_parse_args($instance);

    /**

    * Fires before rendering the requested widget.

    *

    * @since 3.0.0

    *

    * @param string $widget The widget's class name.

    * @param array $instance The current widget instance's settings.

    * @param array $args An array of the widget's sidebar arguments.

    */

    do_action( 'the_widget', $widget, $instance, $args );

    $widget_obj->_set(-1);

    $widget_obj->widget($args, $instance);

    }

    /**

    * Retrieves the widget ID base value.

    *

    * @since 2.8.0

    *

    * @param string $id Widget ID.

    * @return string Widget ID base.

    */

    function _get_widget_id_base( $id ) {

    return preg_replace( '/-[0-9]+$/', '', $id );

    }

    /**

    * Handle sidebars config after theme change

    *

    * @access private

    * @since 3.3.0

    *

    * @global array $sidebars_widgets

    */

    function _wp_sidebars_changed() {

    global $sidebars_widgets;

    if ( ! is_array( $sidebars_widgets ) )

    $sidebars_widgets = wp_get_sidebars_widgets();

    retrieve_widgets(true);

    }

    /**

    * Look for "lost" widgets, this has to run at least on each theme change.

    *

    * @since 2.8.0

    *

    * @global array $wp_registered_sidebars

    * @global array $sidebars_widgets

    * @global array $wp_registered_widgets

    *

    * @param string|bool $theme_changed Whether the theme was changed as a boolean. A value

    * of 'customize' defers updates for the Customizer.

    * @return array Updated sidebars widgets.

    */

    function retrieve_widgets( $theme_changed = false ) {

    global $wp_registered_sidebars, $sidebars_widgets, $wp_registered_widgets;

    $registered_sidebars_keys = array_keys( $wp_registered_sidebars );

    $registered_widgets_ids = array_keys( $wp_registered_widgets );

    if ( ! is_array( get_theme_mod( 'sidebars_widgets' ) ) ) {

    if ( empty( $sidebars_widgets ) ) {

    return array();

    }

    unset( $sidebars_widgets['array_version'] );

    $sidebars_widgets_keys = array_keys( $sidebars_widgets );

    sort( $sidebars_widgets_keys );

    sort( $registered_sidebars_keys );

    if ( $sidebars_widgets_keys === $registered_sidebars_keys ) {

    $sidebars_widgets = _wp_remove_unregistered_widgets( $sidebars_widgets, $registered_widgets_ids );

    return $sidebars_widgets;

    }

    }

    // Discard invalid, theme-specific widgets from sidebars.

    $sidebars_widgets = _wp_remove_unregistered_widgets( $sidebars_widgets, $registered_widgets_ids );

    $sidebars_widgets = wp_map_sidebars_widgets( $sidebars_widgets );

    // Find hidden/lost multi-widget instances.

    $shown_widgets = call_user_func_array( 'array_merge', $sidebars_widgets );

    $lost_widgets = array_diff( $registered_widgets_ids, $shown_widgets );

    foreach ( $lost_widgets as $key => $widget_id ) {

    $number = preg_replace( '/.+?-([0-9]+)$/', '$1', $widget_id );

    // Only keep active and default widgets.

    if ( is_numeric( $number ) && (int) $number < 2 ) {

    unset( $lost_widgets[ $key ] );

    }

    }

    $sidebars_widgets['wp_inactive_widgets'] = array_merge( $lost_widgets, (array) $sidebars_widgets['wp_inactive_widgets'] );

    if ( 'customize' !== $theme_changed ) {

    wp_set_sidebars_widgets( $sidebars_widgets );

    }

    return $sidebars_widgets;

    }

    /**

    * Compares a list of sidebars with their widgets against a whitelist.

    *

    * @since 4.9.0

    * @since 4.9.2 Always tries to restore widget assignments from previous data, not just if sidebars needed mapping.

    *

    * @param array $existing_sidebars_widgets List of sidebars and their widget instance IDs.

    * @return array Mapped sidebars widgets.

    */

    function wp_map_sidebars_widgets( $existing_sidebars_widgets ) {

    global $wp_registered_sidebars;

    $new_sidebars_widgets = array(

    'wp_inactive_widgets' => array(),

    );

    // Short-circuit if there are no sidebars to map.

    if ( ! is_array( $existing_sidebars_widgets ) || empty( $existing_sidebars_widgets ) ) {

    return $new_sidebars_widgets;

    }

    foreach ( $existing_sidebars_widgets as $sidebar => $widgets ) {

    if ( 'wp_inactive_widgets' === $sidebar || 'orphaned_widgets' === substr( $sidebar, 0, 16 ) ) {

    $new_sidebars_widgets['wp_inactive_widgets'] = array_merge( $new_sidebars_widgets['wp_inactive_widgets'], (array) $widgets );

    unset( $existing_sidebars_widgets[ $sidebar ] );

    }

    }

    // If old and new theme have just one sidebar, map it and we're done.

    if ( 1 === count( $existing_sidebars_widgets ) && 1 === count( $wp_registered_sidebars ) ) {

    $new_sidebars_widgets[ key( $wp_registered_sidebars ) ] = array_pop( $existing_sidebars_widgets );

    return $new_sidebars_widgets;

    }

    // Map locations with the same slug.

    $existing_sidebars = array_keys( $existing_sidebars_widgets );

    foreach ( $wp_registered_sidebars as $sidebar => $name ) {

    if ( in_array( $sidebar, $existing_sidebars, true ) ) {

    $new_sidebars_widgets[ $sidebar ] = $existing_sidebars_widgets[ $sidebar ];

    unset( $existing_sidebars_widgets[ $sidebar ] );

    } else if ( ! array_key_exists( $sidebar, $new_sidebars_widgets ) ) {

    $new_sidebars_widgets[ $sidebar ] = array();

    }

    }

    // If there are more sidebars, try to map them.

    if ( ! empty( $existing_sidebars_widgets ) ) {

    /*

    * If old and new theme both have sidebars that contain phrases

    * from within the same group, make an educated guess and map it.

    */

    $common_slug_groups = array(

    array( 'sidebar', 'primary', 'main', 'right' ),

    array( 'second', 'left' ),

    array( 'sidebar-2', 'footer', 'bottom' ),

    array( 'header', 'top' ),

    );

    // Go through each group...

    foreach ( $common_slug_groups as $slug_group ) {

    // ...and see if any of these slugs...

    foreach ( $slug_group as $slug ) {

    // ...and any of the new sidebars...

    foreach ( $wp_registered_sidebars as $new_sidebar => $args ) {

    // ...actually match!

    if ( false === stripos( $new_sidebar, $slug ) && false === stripos( $slug, $new_sidebar ) ) {

    continue;

    }

    // Then see if any of the existing sidebars...

    foreach ( $existing_sidebars_widgets as $sidebar => $widgets ) {

    // ...and any slug in the same group...

    foreach ( $slug_group as $slug ) {

    // ... have a match as well.

    if ( false === stripos( $sidebar, $slug ) && false === stripos( $slug, $sidebar ) ) {

    continue;

    }

    // Make sure this sidebar wasn't mapped and removed previously.

    if ( ! empty( $existing_sidebars_widgets[ $sidebar ] ) ) {

    // We have a match that can be mapped!

    $new_sidebars_widgets[ $new_sidebar ] = array_merge( $new_sidebars_widgets[ $new_sidebar ], $existing_sidebars_widgets[ $sidebar ] );

    // Remove the mapped sidebar so it can't be mapped again.

    unset( $existing_sidebars_widgets[ $sidebar ] );

    // Go back and check the next new sidebar.

    continue 3;

    }

    } // endforeach ( $slug_group as $slug )

    } // endforeach ( $existing_sidebars_widgets as $sidebar => $widgets )

    } // endforeach foreach ( $wp_registered_sidebars as $new_sidebar => $args )

    } // endforeach ( $slug_group as $slug )

    } // endforeach ( $common_slug_groups as $slug_group )

    }

    // Move any left over widgets to inactive sidebar.

    foreach ( $existing_sidebars_widgets as $widgets ) {

    if ( is_array( $widgets ) && ! empty( $widgets ) ) {

    $new_sidebars_widgets['wp_inactive_widgets'] = array_merge( $new_sidebars_widgets['wp_inactive_widgets'], $widgets );

    }

    }

    // Sidebars_widgets settings from when this theme was previously active.

    $old_sidebars_widgets = get_theme_mod( 'sidebars_widgets' );

    $old_sidebars_widgets = isset( $old_sidebars_widgets['data'] ) ? $old_sidebars_widgets['data'] : false;

    if ( is_array( $old_sidebars_widgets ) ) {

    // Remove empty sidebars, no need to map those.

    $old_sidebars_widgets = array_filter( $old_sidebars_widgets );

    // Only check sidebars that are empty or have not been mapped to yet.

    foreach ( $new_sidebars_widgets as $new_sidebar => $new_widgets ) {

    if ( array_key_exists( $new_sidebar, $old_sidebars_widgets ) && ! empty( $new_widgets ) ) {

    unset( $old_sidebars_widgets[ $new_sidebar ] );

    }

    }

    // Remove orphaned widgets, we're only interested in previously active sidebars.

    foreach ( $old_sidebars_widgets as $sidebar => $widgets ) {

    if ( 'orphaned_widgets' === substr( $sidebar, 0, 16 ) ) {

    unset( $old_sidebars_widgets[ $sidebar ] );

    }

    }

    $old_sidebars_widgets = _wp_remove_unregistered_widgets( $old_sidebars_widgets );

    if ( ! empty( $old_sidebars_widgets ) ) {

    // Go through each remaining sidebar...

    foreach ( $old_sidebars_widgets as $old_sidebar => $old_widgets ) {

    // ...and check every new sidebar...

    foreach ( $new_sidebars_widgets as $new_sidebar => $new_widgets ) {

    // ...for every widget we're trying to revive.

    foreach ( $old_widgets as $key => $widget_id ) {

    $active_key = array_search( $widget_id, $new_widgets, true );

    // If the widget is used elsewhere...

    if ( false !== $active_key ) {

    // ...and that elsewhere is inactive widgets...

    if ( 'wp_inactive_widgets' === $new_sidebar ) {

    // ...remove it from there and keep the active version...

    unset( $new_sidebars_widgets['wp_inactive_widgets'][ $active_key ] );

    } else {

    // ...otherwise remove it from the old sidebar and keep it in the new one.

    unset( $old_sidebars_widgets[ $old_sidebar ][ $key ] );

    }

    } // endif ( $active_key )

    } // endforeach ( $old_widgets as $key => $widget_id )

    } // endforeach ( $new_sidebars_widgets as $new_sidebar => $new_widgets )

    } // endforeach ( $old_sidebars_widgets as $old_sidebar => $old_widgets )

    } // endif ( ! empty( $old_sidebars_widgets ) )

    // Restore widget settings from when theme was previously active.

    $new_sidebars_widgets = array_merge( $new_sidebars_widgets, $old_sidebars_widgets );

    }

    return $new_sidebars_widgets;

    }

    /**

    * Compares a list of sidebars with their widgets against a whitelist.

    *

    * @since 4.9.0

    *

    * @param array $sidebars_widgets List of sidebars and their widget instance IDs.

    * @param array $whitelist Optional. List of widget IDs to compare against. Default: Registered widgets.

    * @return array Sidebars with whitelisted widgets.

    */

    function _wp_remove_unregistered_widgets( $sidebars_widgets, $whitelist = array() ) {

    if ( empty( $whitelist ) ) {

    $whitelist = array_keys( $GLOBALS['wp_registered_widgets'] );

    }

    foreach ( $sidebars_widgets as $sidebar => $widgets ) {

    if ( is_array( $widgets ) ) {

    $sidebars_widgets[ $sidebar ] = array_intersect( $widgets, $whitelist );

    }

    }

    return $sidebars_widgets;

    }

    /**

    * Display the RSS entries in a list.

    *

    * @since 2.5.0

    *

    * @param string|array|object $rss RSS url.

    * @param array $args Widget arguments.

    */

    function wp_widget_rss_output( $rss, $args = array() ) {

    if ( is_string( $rss ) ) {

    $rss = fetch_feed($rss);

    } elseif ( is_array($rss) && isset($rss['url']) ) {

    $args = $rss;

    $rss = fetch_feed($rss['url']);

    } elseif ( !is_object($rss) ) {

    return;

    }

    if ( is_wp_error($rss) ) {

    if ( is_admin() || current_user_can('manage_options') )

    echo '

    ' . __( 'RSS Error:' ) . ' ' . $rss->get_error_message() . '

    ';

    return;

    }

    $default_args = array( 'show_author' => 0, 'show_date' => 0, 'show_summary' => 0, 'items' => 0 );

    $args = wp_parse_args( $args, $default_args );

    $items = (int) $args['items'];

    if ( $items < 1 || 20 < $items )

    $items = 10;

    $show_summary = (int) $args['show_summary'];

    $show_author = (int) $args['show_author'];

    $show_date = (int) $args['show_date'];

    if ( !$rss->get_item_quantity() ) {

    echo '

    • ' . __( 'An error has occurred, which probably means the feed is down. Try again later.' ) . '
    ';

    $rss->__destruct();

    unset($rss);

    return;

    }

    echo '

    • ';

    foreach ( $rss->get_items( 0, $items ) as $item ) {

    $link = $item->get_link();

    while ( stristr( $link, 'http' ) != $link ) {

    $link = substr( $link, 1 );

    }

    $link = esc_url( strip_tags( $link ) );

    $title = esc_html( trim( strip_tags( $item->get_title() ) ) );

    if ( empty( $title ) ) {

    $title = __( 'Untitled' );

    }

    $desc = @html_entity_decode( $item->get_description(), ENT_QUOTES, get_option( 'blog_charset' ) );

    $desc = esc_attr( wp_trim_words( $desc, 55, ' […]' ) );

    $summary = '';

    if ( $show_summary ) {

    $summary = $desc;

    // Change existing [...] to […].

    if ( '[...]' == substr( $summary, -5 ) ) {

    $summary = substr( $summary, 0, -5 ) . '[…]';

    }

    $summary = '

    ' . esc_html( $summary ) . '
    ';

    }

    $date = '';

    if ( $show_date ) {

    $date = $item->get_date( 'U' );

    if ( $date ) {

    $date = ' ' . date_i18n( get_option( 'date_format' ), $date ) . '';

    }

    }

    $author = '';

    if ( $show_author ) {

    $author = $item->get_author();

    if ( is_object($author) ) {

    $author = $author->get_name();

    $author = ' ' . esc_html( strip_tags( $author ) ) . '';

    }

    }

    if ( $link == '' ) {

    echo "

    $title{$date}{$summary}{$author}";

    } elseif ( $show_summary ) {

    echo "

    $title{$date}{$summary}{$author}";

    } else {

    echo "

    $title{$date}{$author}";

    }

    }

    echo '

    ';

    $rss->__destruct();

    unset($rss);

    }

    /**

    * Display RSS widget options form.

    *

    * The options for what fields are displayed for the RSS form are all booleans

    * and are as follows: 'url', 'title', 'items', 'show_summary', 'show_author',

    * 'show_date'.

    *

    * @since 2.5.0

    *

    * @param array|string $args Values for input fields.

    * @param array $inputs Override default display options.

    */

    function wp_widget_rss_form( $args, $inputs = null ) {

    $default_inputs = array( 'url' => true, 'title' => true, 'items' => true, 'show_summary' => true, 'show_author' => true, 'show_date' => true );

    $inputs = wp_parse_args( $inputs, $default_inputs );

    $args['title'] = isset( $args['title'] ) ? $args['title'] : '';

    $args['url'] = isset( $args['url'] ) ? $args['url'] : '';

    $args['items'] = isset( $args['items'] ) ? (int) $args['items'] : 0;

    if ( $args['items'] < 1 || 20 < $args['items'] ) {

    $args['items'] = 10;

    }

    $args['show_summary'] = isset( $args['show_summary'] ) ? (int) $args['show_summary'] : (int) $inputs['show_summary'];

    $args['show_author'] = isset( $args['show_author'] ) ? (int) $args['show_author'] : (int) $inputs['show_author'];

    $args['show_date'] = isset( $args['show_date'] ) ? (int) $args['show_date'] : (int) $inputs['show_date'];

    if ( ! empty( $args['error'] ) ) {

    echo '

    ' . __( 'RSS Error:' ) . ' ' . $args['error'] . '

    ';

    }

    $esc_number = esc_attr( $args['number'] );

    if ( $inputs['url'] ) :

    ?>

    for ( $i = 1; $i <= 20; ++$i ) {

    echo "$i";

    }

    ?>

    />

    />

    />

    endif;

    foreach ( array_keys($default_inputs) as $input ) :

    if ( 'hidden' === $inputs[$input] ) :

    $id = str_replace( '_', '-', $input );

    ?>

    endif;

    endforeach;

    }

    /**

    * Process RSS feed widget data and optionally retrieve feed items.

    *

    * The feed widget can not have more than 20 items or it will reset back to the

    * default, which is 10.

    *

    * The resulting array has the feed title, feed url, feed link (from channel),

    * feed items, error (if any), and whether to show summary, author, and date.

    * All respectively in the order of the array elements.

    *

    * @since 2.5.0

    *

    * @param array $widget_rss RSS widget feed data. Expects unescaped data.

    * @param bool $check_feed Optional, default is true. Whether to check feed for errors.

    * @return array

    */

    function wp_widget_rss_process( $widget_rss, $check_feed = true ) {

    $items = (int) $widget_rss['items'];

    if ( $items < 1 || 20 < $items )

    $items = 10;

    $url = esc_url_raw( strip_tags( $widget_rss['url'] ) );

    $title = isset( $widget_rss['title'] ) ? trim( strip_tags( $widget_rss['title'] ) ) : '';

    $show_summary = isset( $widget_rss['show_summary'] ) ? (int) $widget_rss['show_summary'] : 0;

    $show_author = isset( $widget_rss['show_author'] ) ? (int) $widget_rss['show_author'] :0;

    $show_date = isset( $widget_rss['show_date'] ) ? (int) $widget_rss['show_date'] : 0;

    if ( $check_feed ) {

    $rss = fetch_feed($url);

    $error = false;

    $link = '';

    if ( is_wp_error($rss) ) {

    $error = $rss->get_error_message();

    } else {

    $link = esc_url(strip_tags($rss->get_permalink()));

    while ( stristr($link, 'http') != $link )

    $link = substr($link, 1);

    $rss->__destruct();

    unset($rss);

    }

    }

    return compact( 'title', 'url', 'link', 'items', 'error', 'show_summary', 'show_author', 'show_date' );

    }

    /**

    * Registers all of the default WordPress widgets on startup.

    *

    * Calls {@see 'widgets_init'} action after all of the WordPress widgets have been registered.

    *

    * @since 2.2.0

    */

    function wp_widgets_init() {

    if ( ! is_blog_installed() ) {

    return;

    }

    register_widget( 'WP_Widget_Pages' );

    register_widget( 'WP_Widget_Calendar' );

    register_widget( 'WP_Widget_Archives' );

    if ( get_option( 'link_manager_enabled' ) ) {

    register_widget( 'WP_Widget_Links' );

    }

    register_widget( 'WP_Widget_Media_Audio' );

    register_widget( 'WP_Widget_Media_Image' );

    register_widget( 'WP_Widget_Media_Gallery' );

    register_widget( 'WP_Widget_Media_Video' );

    register_widget( 'WP_Widget_Meta' );

    register_widget( 'WP_Widget_Search' );

    register_widget( 'WP_Widget_Text' );

    register_widget( 'WP_Widget_Categories' );

    register_widget( 'WP_Widget_Recent_Posts' );

    register_widget( 'WP_Widget_Recent_Comments' );

    register_widget( 'WP_Widget_RSS' );

    register_widget( 'WP_Widget_Tag_Cloud' );

    register_widget( 'WP_Nav_Menu_Widget' );

    register_widget( 'WP_Widget_Custom_HTML' );

    /**

    * Fires after all default WordPress widgets have been registered.

    *

    * @since 2.2.0

    */

    do_action( 'widgets_init' );

    }

    一键复制

    编辑

    Web IDE

    原始数据

    按行查看

    历史

    展开全文
    weixin_30953869 2021-04-30 07:56:32
  • zhizhengguan 2021-04-03 09:51:07
  • qq_33375598 2021-01-02 22:38:16
  • weixin_38606457 2021-06-08 14:07:58
  • Aguangliang 2021-01-26 21:37:59
  • computerclass 2021-07-01 10:57:21
  • weixin_39964391 2021-01-13 12:50:20
  • MrCharles 2021-03-22 18:20:57
  • qq12547345 2021-04-02 16:14:06
  • weixin_35702787 2021-05-16 03:10:58
  • baidu_36499789 2021-02-16 12:49:23
  • weixin_45482816 2021-06-10 10:29:04
  • hitzsf 2021-01-24 19:12:18
  • weixin_39905725 2020-12-20 12:20:32
  • weixin_39855634 2021-05-16 11:25:39
  • han1202012 2021-03-29 11:05:56
  • kuangshenbobo 2021-07-20 11:16:57
  • weixin_39800331 2020-12-30 04:07:41
  • weixin_30935475 2021-07-16 18:56:44
  • weixin_36474966 2021-06-06 18:36:55
  • weixin_36336256 2021-04-13 12:23:16
  • weixin_34338129 2021-01-29 20:30:44
  • qq_45092173 2021-11-09 16:01:42
  • qq_34905587 2021-09-03 19:03:48
  • han1202012 2021-03-27 11:34:32
  • mighty13 2021-01-26 10:16:50
  • weixin_42620340 2021-01-13 06:43:45

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 90,189
精华内容 36,075
关键字:

widgets怎么用