Templates Wordpress如何在Theme function.php中更改插件设置
我是Wordpress的新手,正在研究我的第一个主题。该主题将与一个插件紧密结合。我想知道如何在不接触插件本身的情况下更改theme function.php中的一些插件设置 我试着在网上查找,但没有找到任何具体的答案 我使用的是: , 问题是: 我正试图弄清楚如何在我的主题Templates Wordpress如何在Theme function.php中更改插件设置,templates,wordpress,custom-theme,Templates,Wordpress,Custom Theme,我是Wordpress的新手,正在研究我的第一个主题。该主题将与一个插件紧密结合。我想知道如何在不接触插件本身的情况下更改theme function.php中的一些插件设置 我试着在网上查找,但没有找到任何具体的答案 我使用的是: , 问题是: 我正试图弄清楚如何在我的主题function.php中重定向/替换插件模板文件,使之成为我主题中的模板文件 当前插件文件夹中有模板文件以及它们在网站上的呈现方式。我会编写自己的模板文件,确保它看起来像我的主题,并用插件模板文件替换它 如果我直接在plu
function.php
中重定向/替换插件模板文件,使之成为我主题中的模板文件
当前插件文件夹中有模板文件以及它们在网站上的呈现方式。我会编写自己的模板文件,确保它看起来像我的主题,并用插件模板文件替换它
如果我直接在plugin文件夹中编辑模板文件,每当有更新时,它们都会被覆盖。
我觉得这不对
在浏览了互联网之后,我觉得我可以通过添加过滤器
实现它,但不完全确定如何实现
插件
在Github上:
在原始版本中,插件有一行(第240行表示indexPage()
,第328行表示getIndexUrl()
):
它指示在哪里可以找到一个模板文件,并为插件提供永久链接
我想要什么
我想添加一个过滤器,从我的主题中获取模板文件,并重写模板文件的路径
如果有一个简单的方法来添加一个钩子,它会覆盖它,太好了。
我还发现我可以用add\u filter
替换一些模板
已尝试:
但我不完全确定如何检查插件permalinks页面是否被激活
我觉得这应该是一件简单的事情,用户覆盖或重定向插件模板文件和那些在他们的主题,但我不明白
我将非常感谢所有的帮助和建议。不幸的是,函数
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);
}
}
}
}
然后,您可以使用priority参数在上面添加操作后调用它(这将删除函数btw中所有页面的函数)
修改下面的函数以调用基于主题的文件
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()中的add操作,即可分解该过程,并查看您得到了什么。如果不是var dump$\u GLOBALS['wp\u filter']['template\u redirect'],则应删除该操作,以查看其外观。这可能需要一段时间的摆弄。您还需要检查您的if语句(输入var_dump值以检查它们是否通过或失败等)顺便说一句,不要忘记单击解决问题的答案旁边的勾号(我注意到您发布的上一个q不被接受?)。谢谢你的回答。我有一个问题,因为我觉得有些步骤我并不完全熟悉,这妨碍了一切工作。开始时,您说:{替换为您自己的自定义函数(从插件复制代码并修改以调用该页面的自定义函数)。}我所做的是将parseQuery函数从插件复制到我的function.php文件中。你可以看到当前的文件:还添加了你与我共享的所有代码。我觉得需要告诉我的主题一些东西才能从Justimo插件中获取这些代码。把它联系起来。现在我觉得它们没有连接,因为没有变化。你看wordpress为此使用了钩子和过滤器。这允许您修改其他地方包含的流程。你可以修改插件,但是当它更新时,你会丢失你所做的更改。在这里扩展类将不起作用,因为您的新类将不会被调用,所以您需要解开您不想要的,并添加您所做的(如果有意义的话)?我在上面加了一点让你检查。嗨,大卫,很抱歉耽搁了这么久。别忘了。只是还没能做到这一点,因为我正忙于其他项目,截止日期即将到来。将在几天内再次详细检查,如果有效,将添加为已解决。
// 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] );