Wordpress如何在Theme function.php

时间:2015-08-29 17:52:38

标签: wordpress templates wordpress-plugin wordpress-theme-customize custom-theme

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

我试过在互联网上查找但未找到任何针对我的问题的具体答案。

我使用的是什么:

Wordpress 4.2Justimmo 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;
}

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

我认为用户使用主题中的插件模板文件覆盖或重定向插件模板文件应该是一件简单的事情,但我无法弄清楚。

我将非常感谢所有的帮助和建议。

1 个答案:

答案 0 :(得分: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] );

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