如何将按钮添加到侧边栏小部件?

How to add a button to a sidebar widget?

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

functions.php 调用它

方法 1(将按钮定义静态放入 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 变量以添加额外的按钮?

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

使用PHP Code Widget插件

PHP Code Widget

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

我只是在扩展 . You could copy the whole dashboard-page.php file (with your self-added action hook) to your child theme folder. Then, you will have to search for the place in the parent theme where the dashboard-page.php file is included. Hopefully it is included by one of the parent theme's 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() retrieves the path to the child theme folder and get_template_directory() 检索父主题文件夹的路径。

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

选项 2:使用 Javascript/jQuery

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

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 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' );