使用OOP方法创建插件但坚持使超链接工作

时间:2014-05-14 14:00:56

标签: wordpress

我是wordpress开发的新手,所以请耐心等待我的问题听起来简单或荒谬,因为我一直在用PHP进行面向对象编程,所以我想在wordpress插件开发中使用OOP方法并遇到{{{ 3}}。我详细介绍了代码,但我仍感到困惑。

目前它带有admin.php的视图,我想创建另一个用于测试目的的页面,所以我创建了一个文件视图/ admin2.php,然后我想在{{1}中创建一个超链接将用户重定向到admin.php,我该怎么办?如果我只是做以下,它不起作用,并给我404错误

admin2.php

我知道我可以创建子菜单,但我不想这样做。我真的很感激这里的任何帮助。

更新

这就是我<a href="admin2.php">go to admin 2</a> 的样子

admin.php

这就是我<?php echo '<a href="'. plugins_url( 'admin2.php' , __FILE__ ) .'">Go to admin 2 page</a>'; ?> 的样子

admin2.php

2 个答案:

答案 0 :(得分:2)

Wordpress有一个方便的功能,称为plugins_url()。它检索绝对URL到插件目录没有斜杠),或者在使用$path参数时,检索该目录下的特定文件。您可以将$path参数指定为相对于plugins目录的硬编码路径,或者方便地将__FILE__作为第二个参数(如您所做的那样)以使$path相对于当前PHP脚本文件的父目录:

<?php plugins_url( $path, $plugin ); ?>

但是,如果您在嵌套在目录的子目录中的文件中使用plugins_url()函数,那么应该使用PHP&#39 ; s dirname()功能:

<?php echo '<a href="' . plugins_url( 'subfolder/admin2.php' , dirname(__FILE__) ) . '" > Go to admin 2 page </a> '; ?>

同样,plugins_url()函数不应在插件的全局上下文中调用,而是在<{>}或{{{> 1}}以确保在调用函数时已挂接init过滤器。这对于许多网站配置都很重要,如果在插件文件的全局上下文中调用admin_init,则无法通过其他插件进行过滤(尽管plugins_url能够过滤它,因为它们在任何其他插件之前运行。)

答案 1 :(得分:1)

除非您将插件页面添加为现有默认项目 1 的子页面,否则我们所有的插件页面都会附加到admin.php没有 admin2.php plugins_url()将为我们的管理页面提供实际网址: http://example.com/wp-admin/admin.php?page=PLUGIN-PAGE

1 add_management_pageadd_options_pageadd_theme_page

功能plugins_url()可在网址 http://example.com/wp-content/plugins/our-plugin/ 中访问我们的资产。你正在寻找的是admin_url( $path )

这是一个简单的演示。主插件文件:

<?php
/*
 * Plugin Name: (SO) OOP admin navigation
 * Plugin URI: http://stackoverflow.com/a/23703521/1287812
 */

/**
 * Based on Plugin Class Demo
 * https://gist.github.com/toscho/3804204
 */
add_action(
    'plugins_loaded', 
    array( B5F_Demo_OOP::get_instance(), 'plugin_setup' )
);

class B5F_Demo_OOP
{
    protected static $instance = NULL;
    public $plugin_url = '';
    public $plugin_path = '';

    public function __construct() {}

    public function plugin_setup()
    {
        $this->plugin_url    = plugins_url( '/', __FILE__ );
        $this->plugin_path   = plugin_dir_path( __FILE__ );
        add_action( 'admin_menu', array( $this, 'menu' ) );
    }

    public static function get_instance()
    {
        NULL === self::$instance and self::$instance = new self;
        return self::$instance;
    }

    public function menu()
    {
        add_menu_page( 
            'Main', 
            'Main Page', 
            'add_users', 
            'my-main-page', # <-- menu_slug used as URL param value
            function(){ 
                include_once( 'views/admin_menu.php' );
            },
            'http://s.w.org/favicon.ico'
        );  
        $hook = add_submenu_page(
            null,
            'Hidden',
            'Hidden Page',
            'add_users',
            'my-hidden-page', # <-- submenu_slug used as URL param value
            function(){ 
                include_once( 'views/admin_submenu.php' );
            }
        );
        # Print scripts
        // add_action( "admin_print_scripts-$hook", array( $this, 'enqueue' ) );
    }
}

<强> /views/admin_menu.php

<?php   
printf(
    '<h2>%s</h2><a href="%s">%s</a>',
    __( 'Main page' ),
    admin_url( 'admin.php?page=my-hidden-page'), # http://example.com/wp-admin/admin.php?page=my-hidden-page
    __( 'Hidden sub page' )
);

<强> /views/admin_submenu.php

<?php
printf(
    '<h2>%s</h2><a href="%s">%s</a>',
    __( 'Hidden sub page' ),
    admin_url( 'admin.php?page=my-main-page' ), # http://example.com/wp-admin/admin.php?page=my-main-page
    __( 'Main page' )
);