0

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

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

我正在使用什么:

Wordpress 4.2 , Justimmo api 插件

问题:

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

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

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

在浏览了互联网之后,我觉得我可以用 实现它add_filter,但不完全确定如何实现。

插件

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

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

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;
}

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

我觉得对于用户来说,用他们主题中的文件覆盖或重定向插件模板文件应该是一件简单的事情,但我无法弄清楚。

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

4

1 回答 1

0

不幸的是,该函数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);
                }
            }
        }
}

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

 // 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 值以检查它们是否会通过或失败等)

于 2015-08-30T00:18:25.540 回答