【问题标题】:Wordpress - How to include() a file that lies in another dirWordpress - 如何包含()位于另一个目录中的文件
【发布时间】:2023-03-18 18:27:01
【问题描述】:

我正在编写一个插件,它将利用其他插件的功能(考虑一个插件的插件)。

我的文件位于 /plugins/new-plugin/new-plugin.php

我需要做一个 include(/plugins/OLD_plugin/old-plugin.php) 所以我可以使用 old-plugin.php 文件中的几个函数。

这样做的正确方法是什么?我也许可以让 old-plugin.php 中的函数在全球范围内可用,但我不想更改 old-plugin.php 文件。

我已经尝试了几种方法来做到这一点,但都没有奏效。新插件只会在选项页面中显示一些信息,公众无法查看,并且不会与任何公共页面或我网站上的帖子进行交互。

我已经尝试过 $_SERVER、WP_PLUGIN_DIR、WP_CONTENT_DIR、绝对服务器路径、相对路径甚至一些黑魔法,但似乎没有任何效果。

使用其中一些解决方案,插件的选项页面显示良好,但博客页面不呈现。使用其他解决方案会发生相反的情况,而使用其他一些解决方案甚至不会呈现任何内容,无论是管理页面还是博客页面,都会出现关于找不到文件的错误。

new-plugin.php 就这么简单

<?php
/*
WP Common Headers
*/

global $wpdb;
if ( ! defined( 'WP_CONTENT_DIR' ) )
       define( 'WP_CONTENT_DIR', ABSPATH . 'wp-content' );
if ( ! defined( 'WP_PLUGIN_DIR' ) )
       define( 'WP_PLUGIN_DIR', WP_CONTENT_DIR . '/plugins' );

include '/server-absolute-path/public_html/gameblogs/wp-content/plugins/old-plugin/old-plugin.php';

add_action('admin_menu', 'new_plugin_menu');

function new_plugin_menu() {
$page_title = 'New Plugin';
$menu_title = 'New Plugin';
$function = 'new_plugin_admin_page';
$menu_slug = 'new_plugin';

add_menu_page($page_title, $menu_title, 0, __FILE__, $function);
}

function new_plugin_admin_page() {

    $result = old_plugin_link_data(" WHERE link_destination NOT LIKE '/%' AND link_destination NOT LIKE '%gameblogs%'");

    $total = count($result);
    old_plugin_list_links($result, $total, FALSE, FALSE);
    */
    }
?>

感谢您的任何想法!

【问题讨论】:

    标签: wordpress include-path


    【解决方案1】:

    检查旧插件文件,看看里面是否有do_actionsapply_filters。如果有,那么您可以使用 add_actionapply_filters 将新插件挂接到旧插件脚本并执行您想做的其他事情。

    http://codex.wordpress.org/Function_Reference/do_actionhttp://codex.wordpress.org/Function_Reference/apply_filters

    例如(非常基本的例子):

    如果在旧插件中找到:
    do_action('some_type_of_reference);`

    在您的新插件中,您可以通过以下方式连接它:
    `add_action('some_type_of_reference', 'name_of_my_function');

    函数名_of_my_function() { //这里执行的代码 }`

    如果您在旧插件中找到:
    apply_filters('some_type_of_reference', $variable);

    然后在您的新插件中,您可以通过以下方式连接到过滤器:
    apply_filter('some_type_of_reference', 'my_function');

    函数 my_function( $variable ) {

    //作用于过滤器中的变量。

    返回$变量;

    }

    【讨论】:

    • 感谢您的回答,但不,旧插件中没有 apply_filter 或 do_action。有一些add_filter,但我认为它们不是一回事,对吧?还有其他想法吗?
    【解决方案2】:

    你看过plugins_url 函数吗?我没有深入阅读您的代码,但它可能会有所帮助。

    plugins_url 模板标签检索插件目录或该目录中特定文件的 url。您可以在 $path 中对插件 slug 进行硬编码,或者将 FILE 作为第二个参数传递以获取正确的文件夹名称。

    希望这会有所帮助!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-05-03
      • 1970-01-01
      • 2014-03-17
      • 1970-01-01
      • 1970-01-01
      • 2011-11-26
      • 1970-01-01
      相关资源
      最近更新 更多