调用未定义的函数convert_to_screen()

时间:2016-11-29 13:37:31

标签: php wordpress

我正在开发一个插件,我必须扩展类WP_List_Table。我已经在我的插件文件中扩展了类(我不知道这是否是正确的方法?)并包含WP_List_Table,如下所示:

if(!class_exists('WP_List_Table')){
   require_once( ABSPATH . 'wp-admin/includes/class-wp-list-table.php' );
}

接下来是扩展类的代码,然后我创建了一个像我这样的表类的实例:

<?php

 if ( ! class_exists( 'WP_List_Table' ) ) {
                require_once( ABSPATH . 'wp-admin/includes/class-wp-list-table.php' );
}


 Class Wp_Ban_User extends WP_List_Table
 {

    public function __construct()
    {
             add_action('admin_menu',array($this,'WBU_adminMenu'));
             parent::__construct( array(
                  'singular'=> 'wp_list_text_link', //Singular label
                  'plural' => 'wp_list_test_links', //plural label, also this well be one of the table css class
                  'ajax'   => false //We won't support Ajax for this table
                  ) );      
            $this->prepare_items();
            $this->display();           

    }
     function get_columns() {
        $columns = array(
            'id'    => 'ID',
            'user_login'     => 'User Name',
            'user_email'   => 'User Email'            
        );
        return $columns;
    }


    function column_default( $item, $column_name ) {
        switch( $column_name ) {
            case 'id':
            case 'user_login':
            case 'user_email':

                return $item[ $column_name ];
            default:
                return print_r( $item, true ) ;
        }
    }
    function prepare_items() {

        $example_data = array(
                array(
                        'id'        => 1,
                        'user_login'     => 'vasim',
                        'user_email'    => 'vasim@abc.com'                        
                ),
                array(
                        'id'        => 2,
                        'user_login'     => 'Asma',
                        'user_email'    => 'Asma@abc.com'                        
                ),
                array(
                        'id'        => 3,
                        'user_login'     => 'Nehal',
                        'user_email'    => 'nehal@abc.com'                        
                ),
            );

        $columns = $this->get_columns();
        $hidden = array();
        $sortable = $this->get_sortable_columns();
        $this->_column_headers = array($columns, $hidden, $sortable);
        $this->items = $example_data;
    }

    public function WBU_adminMenu()
    {
            add_menu_page( 'Currently Logged In User', 'Banned User', 'manage_options', 'ban_admin_init', array($this,'ban_admin_init'));
    }
function ban_admin_init(){
        global $wpdb;

        $sql="SELECT * from {$wpdb->prefix}users";
        $sql_result=$wpdb->get_results($sql,'ARRAY_A');
        print_r($sql_result);
        //$this->items=$sql_result;     
    }

}

 global $Obj_Wp_Ban_User;

 $Obj_Wp_Ban_User=new Wp_Ban_User();

但是当我这样做时,我确实得到了这个错误:

  

致命错误:调用未定义的函数convert_to_screen()   d:\ XAMPP \ htdocs中\ developplugin \可湿性粉剂管理员\包括\类WP-列表table.php   在第143行

我做了一些研究,但不明白如何解决它。

有人知道如何解决这个问题吗?

感谢您的帮助!

最好的问候。

3 个答案:

答案 0 :(得分:2)

抱歉我的英语不好,我是法国人。

我发现了这个问题。您的课程已更正(请参阅代码底部):

<?php
/*
Plugin Name: My List Table Example
*/
 if ( ! class_exists( 'WP_List_Table' ) ) {
    require_once( ABSPATH . 'wp-admin/includes/class-wp-list-table.php' );
}


Class Wp_Ban_User extends WP_List_Table
{

    public function __construct()
    {
             parent::__construct( array(
                  'singular'=> 'wp_list_text_link', //Singular label
                  'plural' => 'wp_list_test_links', //plural label, also this well be one of the table css class
                  'ajax'   => false //We won't support Ajax for this table
                  ) );      
            $this->prepare_items();
            $this->display();           

    }

    function get_columns() {
        $columns = array(
            'id'    => 'ID',
            'user_login'     => 'User Name',
            'user_email'   => 'User Email'            
        );
        return $columns;
    }

    function column_default( $item, $column_name ) {
        switch( $column_name ) {
            case 'id':
            case 'user_login':
            case 'user_email':

                return $item[ $column_name ];
            default:
                return print_r( $item, true ) ;
        }
    }

    function prepare_items() {

        $example_data = array(
                array(
                        'id'        => 1,
                        'user_login'     => 'vasim',
                        'user_email'    => 'vasim@abc.com'                        
                ),
                array(
                        'id'        => 2,
                        'user_login'     => 'Asma',
                        'user_email'    => 'Asma@abc.com'                        
                ),
                array(
                        'id'        => 3,
                        'user_login'     => 'Nehal',
                        'user_email'    => 'nehal@abc.com'                        
                ),
            );

        $columns = $this->get_columns();
        $hidden = array();
        $sortable = $this->get_sortable_columns();
        $this->_column_headers = array($columns, $hidden, $sortable);
        $this->items = $example_data;
    }

}


// Render your admin menu outside the class
function WBU_adminMenu()
{
    add_menu_page( 'Currently Logged In User', 'Banned User', 'manage_options', 'render_admin_page', 'render_admin_page');
}

// Create your menu outside the class
add_action('admin_menu','WBU_adminMenu');

// Render your page outside the class
function render_admin_page(){
    global $wpdb;

    $Obj_Wp_Ban_User=new Wp_Ban_User();
    $Obj_Wp_Ban_User->prepare_items();

    $sql="SELECT * from {$wpdb->prefix}users";
    $sql_result=$wpdb->get_results($sql,'ARRAY_A');
    print_r($sql_result);    
}

这很简单:要解决错误Call to undefined function convert_to_screen(),您需要:

  • 在课堂外添加菜单
  • 在课堂外添加admin_menu操作
  • 在课堂外呈现管理页面

3天后,它对我有用!

答案 1 :(得分:0)

我已使用此链接使用我的新鲜wordpress检查了您的代码我觉得它解决了您的问题请查看此链接I want a pagination to my options page of wordpress plugin?

如果您有任何疑惑,请告诉我。

答案 2 :(得分:0)

我有一个工作类的原型,与您的非常相似。我决定对我的插件遵循WordPress best practices结构,因此我下载了one of the suggested boilerplates,并开始将我的代码适应基于样板类的结构。当我这样做时,我遇到了与您相同的问题。由于我有一个工作示例创建了从类内部的WP_List_Table扩展的管理页面,因此我知道问题不在于在类内部添加菜单页面。问题是构造函数

Wp_Ban_User类扩展WP_List_Table  {

public function __construct()
{
         add_action('admin_menu',array($this,'WBU_adminMenu'));
         parent::__construct( array(...

被称为在WordPress完成初始化之前。我做了一些挖掘,以了解初始化顺序是什么,并遇到了这个WordPress action_hook sequence list。我尝试使用wp_loaded操作钩子 {创建此等效于您的 Wp_Ban_User 类的类。{一旦WP,所有插件和主题完全加载并实例化,就会触发此钩子。} < / em>,但仍然崩溃。 wp 操作挂钩 {在设置了WordPress环境后触发} ,我认为它起作用了,因为我的插件没有崩溃。但是 wp 不是真正的动作挂钩,因此这意味着我的类没有被初始化。

所以,我的简单代码更改

function run_admin_page_init() {
    $myAdminPage = new Wp_Ban_User();
}
add_action( 'wp', 'run_admin_page_init' );

看起来不必光顾我的班级,但看起来却是个红鲱鱼。

仍然确信该问题是初始化期间的排序问题,所以我最终将其归结为以下修复程序(实际上有效)。在添加我的管理菜单条目的课程中,我有:

function __construct() {
    $this->pageTable = new WBU_adminMenu();
    add_action( 'admin_menu', [ $this, 'addAdminMenu' ] );
}
/**
 * Adds the Manage Mailing List label to the WordPress Admin Sidebar Menu
 */
public function addAdminMenu() {
    $hook = add_menu_page(
        'Page Title',
        'Menu Name',
        'manage_options',
        'menu_slug',
        [ $this, 'adminLayout' ] );

    add_action( "load-$hook", [ $this, 'screen_option' ] );
}

但我将其更改为:

function __construct() {
    add_action( 'admin_menu', [ $this, 'addAdminMenu' ] );
}

/**
 * Adds the Manage Mailing List label to the WordPress Admin Sidebar Menu
 */
public function addAdminMenu() {
    $this->pageTable = new WBU_adminMenu();
    $hook = add_menu_page(
        'Page Title',
    ...

将创建WP_LIST_TABLE的子类的时间推迟到the basic admin panel menu structure is in place之后。

我敢肯定,您已经着手进行更大更好的项目,而在挫折中试图追寻这种神秘感的头发早在您将问题提交给社区以来的两年中就已经恢复了,但是我发布了解决方案,以防其他人遇到问题。