【问题标题】:How to add a button to a sidebar widget?如何将按钮添加到侧边栏小部件?
【发布时间】:2017-07-09 23:39:33
【问题描述】:

我是 WordPress 的新手,我想在 PointFinder 主题的管理仪表板中添加一个自定义按钮。我知道动作钩子的概念,并且已经使用do_action_ref_array() 成功实现了我自己的动作钩子,并从functions.phpadd_action() 调用它。

方法一(将按钮定义静态放入php文件)

我要在其中添加附加按钮的目标侧边栏小部件内置在“dashboard-page.php”文件中。这是代码的摘录:

$pfmenu_output .= ($setup11_reviewsystem_check == 1) ? '<li><a href="'.$setup4_membersettings_dashboard_link.$pfmenu_perout.'ua=reviews"><i class="pfadmicon-glyph-377"></i> '. $setup29_dashboard_contents_rev_page_menuname.'</a></li>' : '';
$pfmenu_output .= '<li><a href="http://my.testsite.com/market"><i class="pfadmicon-glyph-476"></i> '. esc_html__('Car Market','pointfindert2d').'</a></li>';
$pfmenu_output .= '<li><a href="'.esc_url(wp_logout_url( home_url() )).'"><i class="pfadmicon-glyph-476"></i> '. esc_html__('Logout','pointfindert2d').'</a></li>';

第二行是我的静态方法。该按钮已正确添加到侧边栏小部件。但是我需要将此代码放到我的Child-Themefunctions.php 中,以便在以后的更新过程中保留它。

方法 2(使用自定义动作挂钩更加动态)

我还尝试添加自己的动作挂钩,而不是静态添加按钮(将第二行替换为动作挂钩定义:

$pfmenu_output .= ($setup11_reviewsystem_check == 1) ? '<li><a href="'.$setup4_membersettings_dashboard_link.$pfmenu_perout.'ua=reviews"><i class="pfadmicon-glyph-377"></i> '. $setup29_dashboard_contents_rev_page_menuname.'</a></li>' : '';
do_action_ref_array( 'pf_add_widget_button', array(&$pfmenu_output) );
$pfmenu_output .= '<li><a href="'.esc_url(wp_logout_url( home_url() )).'"><i class="pfadmicon-glyph-476"></i> '. esc_html__('Logout','pointfindert2d').'</a></li>';

之后我在我的子主题的function.php 中添加了一个add_action() 调用,并在那里添加了按钮,它也可以正常工作:

function swi_add_button_to_widget(&$pfmenu_output) {
    $pfmenu_output .= '<li><a href="http://my.testsite.com/market"><i class="pfadmicon-glyph-476"></i> '. esc_html__('Car Market,'pointfindert2d').'</a></li>';
}
add_action( 'pf_add_widget_button', 'swi_add_button_to_widget' );

问题定义

但上述两种方法仅在我第一次更新 PointFinder 主题之前有效,因为dashboard-page.php 很可能会在更新期间被覆盖。

通过搜索所有寻找do_action()do_action_ref_array() 的文件,我没有找到主题开发团队实施的任何预制动作挂钩。没什么...

解决方案?

因此,是否有任何其他方法可以从我的子主题中访问此 $pfmenu_output 变量以添加额外的按钮?

当主题开发人员没有为此特定目的内置一些预制动作挂钩时,我是否完全陷入困境?

【问题讨论】:

  • 为什么不直接从子主题编辑dashboard-page.php 文件?
  • 我不会在前端和后端查看文件,如果您安装了 Simply Show Hooks,您可以在您的站点和管理员中查看所有挂钩和过滤器。然后,如果找不到特定区域,则可以在附近找到一个,并使用优先级将其粘贴在另一个区域的上方或下方。
  • 为什么要在主题或子主题中添加按钮。制作插件
  • 感谢您的众多反馈。我会尽力理解你的所有想法。这需要一些时间,但我会回复大家。
  • @SebastianKaczmarek:如果我将dashboard-page.php 及其文件夹结构复制到我的子主题,如果发布者去更改/更新该文件中的任何内容,它将不会被更新,对吗?跨度>

标签: php html wordpress action-hook


【解决方案1】:

选项 1:将 dashboard-page.php 复制到您的子主题中

我只是在扩展 Sebastian's comment。您可以将整个 dashboard-page.php 文件(使用您自己添加的操作挂钩)复制到您的子主题文件夹中。然后,您必须在父主题中搜索包含dashboard-page.php 文件的位置。希望它包含在父主题的standard template files 之一中。然后,您只需将该模板文件复制到您的子主题即可覆盖它。然后,您必须更改包含 dashboard-page.php 文件的行,以在子文件夹中包含相同的文件。

例如,如果page.php 模板文件有这样的内容:

include (get_template_directory() . '/dashboard-page.php')

您可以将page.php 文件复制到您的子主题并将该行更改为:

include (get_stylesheet_directory() . '/dashboard-page.php')

请注意,get_stylesheet_directory() 检索子主题文件夹的路径,get_template_directory() 检索父主题文件夹的路径。

重要提示:dashboard-page.php 文件可能不包含在可被覆盖的标准模板文件之一中,而是包含在其他非标准模板文件中父主题。在这种情况下,您必须将每个包含的文件复制到 dashboard-page.php 文件中。并确保每个include 都使用每个文件的子主题版本。

选项 2:使用 Javascript/jQuery

​​>

另一种方法是使用 javascript 代码插入按钮。您可以将 javascript 代码添加到您的子主题模板之一,以在页面加载后动态更改菜单。我看了一下主题的演示,看起来侧边栏的列表元素有一个名为“pf-sidebar-menu”的类。您可以添加以下针对该类的代码并在第一个列表项之后插入您的按钮:

jQuery(".pf-sidebar-menu &gt; li:nth-child(1)").after('&lt;li&gt;&lt;a href="http://my.testsite.com/market"&gt;&lt;i class="pfadmicon-glyph-476"&gt;&lt;/i&gt;Car Market&lt;/a&gt;&lt;/li&gt;');
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<ul class="pf-sidebar-menu">
    <li><a href="#"><i class="pfadmicon-glyph-377"></i>Something</a></li>
    <li><a href="#"><i class="pfadmicon-glyph-476"></i>Logout</a></li>
</ul>

仅供参考,将上述代码添加到您的站点的一种简单方法是将以下代码添加到您的 子主题 functions.php 文件中。这将使用上述代码在您网站的页脚处创建一个脚本标记。您可能需要添加额外的检查来定位特定页面。

<?php
function js_add_sidebar_button() {
    ?>
    <script type="text/javascript">
        jQuery(".pf-sidebar-menu > li:nth-child(1)").after('<li><a href="http://my.testsite.com/market"><i class="pfadmicon-glyph-476"></i>Car Market</a></li>');
    </script>
    <?php
}
add_action( 'wp_footer', 'js_add_sidebar_button' );

【讨论】:

  • 选项2不那么麻烦。
  • 到目前为止非常感谢!我会尽力实施您的建议并尽快报告。提前提出一个问题:您的选项 1 不会考虑发布者可能会更新 dashboard-page.php 的情况 - 对吗?
  • @salocinx 是的,这是正确的。 dashboard-page.php 中添加的新功能可能在您的站点上不可用,因为您使用的是该文件的旧副本。在这种情况下,Allen 在这里可能是正确的,选项 2 不那么繁琐,并且在未来更新时“破坏性”更小。
  • @salocinx 我说破坏性时可能用错了词。我的意思是它与未来的更新更兼容。我不相信第一种方法实际上会破坏任何东西。
  • @KodosJohnson:你是个天才,你真的读懂了我的想法 :-) 我只是在考虑如何集成 jQuery 调用。从汇编程序到 Java,我了解很多,但 Web 开发对我来说仍然是个谜。非常感谢!
【解决方案2】:

使用PHP Code Widget插件

PHP Code Widget

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-29
    • 1970-01-01
    • 2017-06-09
    • 2013-02-01
    • 2013-01-16
    相关资源
    最近更新 更多