【问题标题】:Wordpress How to change plugin settings in Theme function.phpWordpress 如何更改 Theme function.php 中的插件设置
【发布时间】:2015-08-29 17:52:38
【问题描述】:

我是 Wordpress 的新手,正在研究我的第一个主题。该主题将与一个插件大量结合。我想知道如何在不触及插件本身的情况下更改主题 function.php 中的一些插件设置。

我已经尝试在互联网上查找它,但没有找到任何关于我的问题的具体答案。

我正在使用什么:

Wordpress 4.2, Justimmo api plugin

问题:

我正在尝试弄清楚如何在我的主题 function.php 中将插件模板文件重定向/替换为我的主题中的模板文件。

当前插件文件夹中有模板文件以及它们将如何在网站上呈现。我会编写自己的模板文件,确保它看起来像我的主题并将其替换为插件模板文件。

如果我直接在插件文件夹中编辑模板文件,只要有更新,它们就会被覆盖。 我觉得不对。

上网查了一下,觉得add_filter可以实现,但不完全确定如何实现。

插件

在 Github 上: https://github.com/justimmo/wordpress-plugin/blob/master/justimmo.php

在原始插件中有一行(indexPage() 为第 240 行,getIndexUrl() 为第 328 行):

class JiApiWpPlugin 
{

    function indexPage()
    {
        include(JI_API_WP_PLUGIN_DIR . '/templates/index.php');
    }
    function getIndexUrl()
    {
        return $this->getUrlPrefix().'ji_plugin=search';
    }
}

它规定了可以找到模板文件之一的位置,并提供了插件的永久链接。

我想要什么

我想添加一个过滤器来从我的主题中获取模板文件,并重写模板文件的路径。

如果有一种简单的方法可以添加一个钩子,它会覆盖它,太好了。 我还发现我可以用add_filter 做一些模板替换。

试过了:

add_filter( 'template_include', 'gulz_justimmo_page_template' );
function gulz_justimmo_page_template( $page_template )
{
    if ( is_page( 'ji_plugin' ) ) {
        $page_template = dirname( __FILE__ ) . '/justimmotemp/justimmo-index.php';
    }
    return $page_template;
}

但我不完全确定如何检查插件永久链接页面是否已激活。

我觉得用户用他们主题中的文件覆盖或重定向插件模板文件应该是一件简单的事情,但我想不通。

我将不胜感激所有的帮助和建议。

【问题讨论】:

    标签: templates wordpress custom-theme


    【解决方案1】:

    不幸的是,函数indexPage() 被另一个函数调用,然后被引用挂钩.....

    add_action('template_redirect', array(&$this, 'templateRedirect'));
    

    您需要做的是删除此函数并替换为您自己的自定义函数(从插件复制代码并修改以调用该页面的自定义函数)。问题是您不能使用 remove_action,因为没有使用 add_action 传递名称,因此 wp 创建了一个随每次加载而变化的名称。

    所以我们需要一个函数来查找添加的函数:

    function remove_anonymous_action( $name, $class, $method ){
            $actions = $GLOBALS['wp_filter'][ $name];
    
            if ( empty ( $actions ) ){
                return;
            }
    
            foreach ( $actions as $prity => $action ){
                foreach ( $action as $identifier => $function ){
                    if ( is_array( $function) && is_a( $function['function'][0], $class ) && $method === $function['function'][1]){
                        remove_action($tag, array ( $function['function'][0], $method ), $prity);
                    }
                }
            }
    }
    

    然后你可以做的是在上面使用优先级参数添加操作之后调用它(这会删除函数内所有页面的函数)

     // the action adding the action is added in parse_query filter...use this as the point to remove the added action
     add_action('parse_query', 'remove_plug_action', 50);
    
     function remove_plug_action(){
      // call our function with the name of the hook, classname and function name
             remove_anonymous_action('template_redirect','JiApiWpPlugin','templateRedirect');
    
     //add a custom function to replace the one we removed.
     add_action('template_redirect', 'customtemplateRedirect');
    }
    

    修改下面的函数以调用基于主题的文件。

    function customtemplateRedirect(){
        global $wp;
        global $wp_query;
        if (get_query_var('ji_plugin') !== '') {
            switch (get_query_var('ji_plugin'))
            {
                case 'property':
                    $this->propertyPage();
                    exit;
                    break;
                case 'expose':
                    $this->exposeDownload();
                    exit;
                    break;
                default:
                    $this->indexPage();
                    exit;
                    break;
            }
        }
    }
    

    你也可以使用检查钩子是否被移除

     $hook_name = 'template_redirect';
     global $wp_filter;
     var_dump( $wp_filter[$hook_name] );
    

    匿名过滤器将有一个长键,例如12i90rkl2rkljeri(每次都是随机的)。通过删除 remove_plug_action() 中的添加操作来分解该过程,看看你得到了什么。如果不是 var dump $_GLOBALS['wp_filter']['template_redirect'] 则应删除该操作以查看其外观。这可能需要一段时间的摆弄。您还需要检查您的 if 语句(输入 var_dump 值以检查它们是否会通过或失败等)

    【讨论】:

    • 顺便说一句,不要忘记单击为您解决问题的答案旁边的勾号(我注意到您发布的最后一个 q 未被接受?)
    • 嘿,大卫。谢谢您的回答。我有一个问题,因为我觉得有些步骤我并不完全熟悉,这会阻止一切正常工作。一开始你说: { 用你自己的自定义函数替换(从插件复制代码并修改以调用该页面的自定义函数)。我所做的是将插件中的 parseQuery 函数复制到我的 function.php 文件中。你可以看到当前文件:paste.ofcode.org/hHTC5jV8swa9g4Zkcs9rp3 还添加了你分享给我的所有代码。
    • 感觉需要告诉我的主题从 justimmo 插件中获取代码。一起来解惑。现在我觉得它们没有联系,因为没有任何变化。
    • 您看到 wordpress 为此目的使用了钩子和过滤器。这允许您修改包含在其他地方的进程。您可以只修改插件,但是当它更新时,您会丢失所做的更改。扩展类在这里不起作用,因为你的新类不会被调用,所以你需要解开你不想要的东西并添加你所做的如果有意义的话?我在上面添加了一些内容供您检查。
    • 嘿,大卫,很抱歉耽搁了这么久。没有忘记。只是还没有设法做到这一点,因为我正在忙于截止日期临近的其他项目。几天后会再次详细查看,如果可行,将添加为已解决。
    猜你喜欢
    • 2017-02-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-18
    • 2016-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多