如何在侧边栏小部件中添加按钮?

sal*_*inx 5 html php wordpress action-hook

我是WordPress的新手,我想在PointFinder主题的管理仪表板中添加一个自定义按钮.我知道行动挂钩的概念,并已成功实施了我自己的行动挂钩与do_action_ref_array()并称之为从functions.phpadd_action().

方法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>';
Run Code Online (Sandbox Code Playgroud)

第二行是我的静态方法.该按钮正确添加到侧边栏小部件.但我需要把这段代码到functions.php我的Child-Theme,以保持它在未来的更新过程.

方法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>';
Run Code Online (Sandbox Code Playgroud)

之后我添加了一个add_action()对我的孩子主题的调用,function.php并在那里添加了按钮,这也很好:

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' );
Run Code Online (Sandbox Code Playgroud)

问题定义

但是上述两种方法只有在我第一次更新PointFinder主题之后dashboard-page.php才会有效,因为在更新过程中很可能会被覆盖.

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

方案?

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

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

Kod*_*son 4

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

我只是扩展塞巴斯蒂安的评论。您可以将整个dashboard-page.php 文件(带有您自行添加的操作挂钩)复制到您的子主题文件夹中。然后,您必须在父主题中搜索包含该dashboard-page.php文件的位置。希望它包含在父主题的标准模板文件之一中。然后,您只需将该模板文件复制到您的子主题即可覆盖它。然后,您必须更改包含该dashboard-page.php文件的行以在子文件夹中包含相同的文件。

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

include (get_template_directory() . '/dashboard-page.php')
Run Code Online (Sandbox Code Playgroud)

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

include (get_stylesheet_directory() . '/dashboard-page.php')
Run Code Online (Sandbox Code Playgroud)

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

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

选项 2:使用 Javascript/jQuery

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

include (get_template_directory() . '/dashboard-page.php')
Run Code Online (Sandbox Code Playgroud)
include (get_stylesheet_directory() . '/dashboard-page.php')
Run Code Online (Sandbox Code Playgroud)

仅供参考,将上述代码添加到您的网站的一个简单方法是将以下内容添加到您的子主题的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' );
Run Code Online (Sandbox Code Playgroud)