programing

정의되지 않은 함수 convert_to_screen() 호출

newstyles 2023. 6. 13. 22:03

정의되지 않은 함수 convert_to_screen() 호출

클래스 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();

하지만 이렇게 하면 다음과 같은 오류가 발생합니다.

치명적 오류: D:\xampp\htdocs\developplugin\wp-admin\includes\class-wp-list-table의 정의되지 않은 함수 convert_to_screen()을 호출합니다.143줄에 있는 php

저는 조사를 좀 했지만 어떻게 고치는지 이해하지 못했습니다.

이것을 고치는 방법을 아는 사람이 있습니까?

도와주셔서 감사합니다!

안부 전합니다.

제가 프랑스어를 잘 못해서 죄송합니다.

문제를 발견했습니다.클래스가 수정되었습니다(코드 하단 참조).

<?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일 후에, 그것은 나를 위한 일입니다!

저는 당신과 매우 유사한 수업의 시제품을 가지고 있었습니다.저는 플러그인에 대한 WordPress 모범 사례 구조를 따르기로 결정하여 제안된 보일러 플레이트 중 하나를 다운로드하고 보일러 플레이트 클래스 기반 구조에 코드를 적용하기 시작했습니다.그럴 때, 저도 당신과 같은 문제에 부딪혔습니다.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 시퀀스 목록을 발견했습니다.wp_loaded 액션 후크 {이 후크는 WP, 모든 플러그인, 테마가 완전히 로드되고 인스턴스화되면 실행됩니다.}을(를) 사용하여 Wp_Ban_User 클래스에 해당하는 것을 생성하려고 했지만 여전히 충돌했습니다.순서에서 조금 더 멀리 가면 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의 자식 클래스를 만드는 것을 연기했습니다.

여러분은 더 크고 더 나은 프로젝트로 넘어갔을 것이고, 여러분이 이 미스터리를 추적하기 위해 좌절감에 빠졌던 머리카락은 여러분이 커뮤니티에 여러분의 질문을 던진 지 2년이 지난 후로 다시 자라났지만, 저는 다른 사람이 문제에 부딪힐까봐 제 해결책을 게시했습니다.

나는 이 링크를 사용하여 나의 새로운 워드프레스로 당신의 코드를 확인했습니다. 나는 그것이 당신의 문제를 해결했다고 생각합니다. 나는 이 링크를 확인하고 싶습니다. 나는 워드프레스 플러그인의 나의 옵션 페이지로 페이지화를 원합니까?

혼란스러운 점이 있으면 제게 알려주세요.

언급URL : https://stackoverflow.com/questions/40867316/call-to-undefined-function-convert-to-screen