I try to show the array which enumerates the data of my database with WP_List_Table but I have this error and I don’t understand why.

I use WordPress and Php.

Call to undefined method SP_Plugin::get_instance()

<?php 
    if(class_exists('Installations')){
        $inst_installation = new Installations();
    }

    if(isset($inst_installation)){
         register_activation_hook(__FILE__, array($inst_installation, 'installations_install'));
    }   

    class Installations {
        function installations_install(){
            global $wpdb;
            $table_site = $wpdb->prefix . "installations";
            
            if($wpdb->get_var("SHOW TABLES LIKE '$table_site'") != $table_site) {

                $sql = "CREATE TABLE `$table_site`(
                    `id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
                    `nom` VARCHAR(255) NOT NULL,
                    `title` VARCHAR(255) NOT NULL,
                    `subtitle` VARCHAR(255) NOT NULL,
                    `image_file` VARCHAR(255) NOT NULL,
                    `desccription_title` VARCHAR(255) NOT NULL,
                    `description_id` VARCHAR(255) NOT NULL,
                    `video_url` VARCHAR(255) NULL,
                    `video_image` VARCHAR(255)  NULL,
                    `galerie_id` BIGINT UNSIGNED NULL
                )";
            require_once(ABSPATH . 'wp-admin/includes/upgrade.php');
            dbDelta($sql);
            }}
    }   
 
     if ( ! class_exists( 'WP_List_Table' ) ) {
        require_once( ABSPATH . 'wp-admin/includes/class-wp-list-table.php' );   
    }

  class Installations_List extends WP_List_Table {

        public function __construct() {

            parent::__construct( [
                'singular' => __( 'Installation', 'sp' ),   //singular name of the listed records
                'plural'   => __( 'Installations', 'sp' ),  //plural name of the listed records
                'ajax'     => false                         //should this table support ajax?
            ] );
        }

        public function no_items(){                        //aucune installations dans la DB
            _e("Aucunes installations enregistrées");
        }
    }
   
  function get_installations( $per_page = 5, $page_number = 1 ) {  //classe enfant (test DB)

        global $wpdb;

        $sql = "SELECT * FROM {$wpdb->prefix}installations";

        if ( ! empty( $_REQUEST['orderby'] ) ) {
            $sql .= ' ORDER BY ' . esc_sql( $_REQUEST['orderby'] );
            $sql .= ! empty( $_REQUEST['order'] ) ? ' ' . esc_sql( $_REQUEST['order'] ) : ' ASC';
        }

        $sql .= " LIMIT $per_page";

        $sql .= ' OFFSET ' . ( $page_number - 1 ) * $per_page;

        $result = $wpdb->get_results( $sql, 'ARRAY_A' );

        return $result;
    }  
    
  function delete_installation($id){ //supprimer une installation de la DB

        global $wpdb;

        $wpdb->delete(
            "{$wpdb->prefix}installations",
            ['ID' => $id],
            ['%d']
        );
    }

    function record_count(){            // nombre d'installations dans la DB

        global $wpdb;

        $sql = "SELECT COUNT(*) FROM {$wpdb->prefix}installations";

        return $wpdb->get_var($sql);
    }

    function column_name($item){
        
        $delete_nonce = wp_create_nonce('sp_delete_customer');

        $title = '<strong>' . $item['nom'] . '</strong>';

        $action = [
            'delete' => sprintf('<a href="?page=%s&action=%s&installation=%s&_wpnonce=%s">Supprimer</a>')
        ];

        return $title . $this->row_actions($actions);
    }

    function column_default($item, $column_name){
    }

    function column_cb($item){
        return sprintf(
            '<input type="checkbox" name="bulk-delete[]" value="%s"/>', $item['Id']
        );
    }

    function get_columns(){      // Elememnts à afficher
        $columns = [
            'cb' => '<input type="checkbox"/>',
            'nom' => array('Nom', sp)
        ];
        return $columns;
    }

    function get_sortable_columns(){
        $sortable_colums = array(
            'nom' => array('nom', true)
        );
        return $sortable_colums;
    }

    function get_bulk_actions(){
        $actions = [
            'bulk-delete' => 'Delete'
        ];
        return $actions;
    }

    function prepare_items(){
        
        $this->_column_headers = $this->get_column_info();
        $this->process_bulk_action();

        $per_page     = $this->get_items_per_page( 'installations_per_page', 5 );
        $current_page = $this->get_pagenum();
        $total_items  = self::record_count();

        $this->set_pagination_args( [
            'total_items' => $total_items, //WE have to calculate the total number of items
            'per_page'    => $per_page //WE have to determine how many items to show on a page
        ] );

        $this->items = self::get_installations( $per_page, $current_page );
    }

    function process_bulk_action(){

        //Detect when a bulk action is being triggered...
        if ( 'delete' === $this->current_action() ) {

            $nonce = esc_attr( $_REQUEST['_wpnonce'] );

            if ( ! wp_verify_nonce( $nonce, 'sp_delete_installation' ) ) {
                die( 'Go get a life script kiddies' );
            }
            else {
                self::delete_installations( absint( $_GET['installation'] ) );

                wp_redirect( esc_url( add_query_arg() ) );
                exit;
            }
        }

        // If the delete bulk action is triggered
        if ( ( isset( $_POST['action'] ) && $_POST['action'] == 'bulk-delete' ) || ( isset( $_POST['action2'] ) && $_POST['action2'] == 'bulk-delete' )) {

            $delete_ids = esc_sql( $_POST['bulk-delete'] );

            // loop over the array of record IDs and delete them
            foreach ( $delete_ids as $id ) {
                self::delete_installation( $id );
            }
            wp_redirect( esc_url( add_query_arg() ) );
            exit;
        }
    }
    
    class SP_Plugin {
        
        // class instance
        static $instance;

        // customer WP_List_Table object
        public $installations_obj;

        // class constructor
        public function __construct() {
            add_filter( 'set-screen-option', [ __CLASS__, 'set_screen' ], 10, 3 );
            add_action( 'admin_menu', [ $this, 'plugin_menu' ] );
        }    
    }

    function set_screen( $status, $option, $value ) {
        return $value;
    }

    function plugin_menu() {

        $hook = add_menu_page(
            'Sitepoint WP_List_Table Example',
            'SP WP_List_Table',
            'manage_options',
            'wp_list_table_class',
            [ $this, 'plugin_settings_page' ]
        );

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

    function screen_option() {

        $option = 'per_page';
        $args   = [
            'label'   => 'Installations',
            'default' => 5,
            'option'  => 'installations_per_page'
        ];

        add_screen_option( $option, $args );

        $this->installations_obj = new Installationss_List();
    }

    function plugin_settings_page() { ?>

        <div class="wrap">
            <h2>Toutes les installations</h2>

            <div id="poststuff">
                <div id="post-body" class="metabox-holder columns-2">
                    <div id="post-body-content">
                        <div class="meta-box-sortables ui-sortable">
                            <form method="post">
                                <?php
                                $this->installations_obj->prepare_items();
                                $this->installations_obj->display(); ?>
                            </form>
                        </div>
                    </div>
                </div>
                <br class="clear">
            </div>
        </div> <?php
    }

    function get_instance() {
        if ( ! isset( self::$instance ) ) {
            self::$instance = new self();
        }
        return self::$instance;
    }
    add_action( 'plugins_loaded', function () {
        echo SP_Plugin::get_instance(); exit;
    });
?>

Read more here: Call to undefined method SP_Plugin::get_instance()


Solution:

If you know the solution of this issue, please leave us a reply in Comment section, to update the question.


Wordpress related questions and answers: