SHARE
TWEET

wp list table

kybernaut Apr 3rd, 2017 119 Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. <?php
  2.  
  3. // https://www.sitepoint.com/using-wp_list_table-to-create-wordpress-admin-tables/
  4.  
  5. if ( ! class_exists( 'WP_List_Table' ) ) {
  6.     require_once( ABSPATH . 'wp-admin/includes/class-wp-list-table.php' );
  7. }
  8.  
  9. class Objednavky extends WP_List_Table {
  10.  
  11.     /** Class constructor */
  12.     public function __construct() {
  13.  
  14.         parent::__construct( [
  15.             'singular' => __( 'Objedn├ívka', IR_TDOMAIN ), //singular name of the listed records
  16.             'plural'   => __( 'Objedn├ívky', IR_TDOMAIN ), //plural name of the listed records
  17.             'ajax'     => false //does this table support ajax?
  18.         ] );
  19.  
  20.     }
  21.  
  22.  
  23.     /**
  24.      * Retrieve dochazka data from the database
  25.      *
  26.      * @param int $per_page
  27.      * @param int $page_number
  28.      *
  29.      * @return mixed
  30.      */
  31.     public static function get_dochazka( $per_page = 20, $page_number = 1 ) {
  32.  
  33.         global $wpdb;
  34.         $sql = "SELECT ID, datum, uzivatel, adresa, objednavka, odeslano FROM {$wpdb->prefix}".IR_DB_OBJ;
  35.         $sql .= " WHERE 1";
  36.         if ( ! empty( $_REQUEST['orderby'] ) ) {
  37.             $sql .= ' ORDER BY ' . esc_sql( $_REQUEST['orderby'] );
  38.             $sql .= ! empty( $_REQUEST['order'] ) ? ' ' . esc_sql( $_REQUEST['order'] ) : ' ASC';
  39.         } else {
  40.             $sql .= ' ORDER BY id DESC';
  41.         }      
  42.         $sql .= " LIMIT $per_page";
  43.         $sql .= ' OFFSET ' . ( $page_number - 1 ) * $per_page;
  44.  
  45.         $objednavky = $wpdb->get_results( $sql, 'ARRAY_A' );
  46.  
  47.         return $objednavky;
  48.     }
  49.  
  50.  
  51.     /**
  52.      * Delete a customer record.
  53.      *
  54.      * @param int $id customer ID
  55.      */
  56.     public static function smazat_objednavku( $id ) {
  57.         global $wpdb;
  58.  
  59.         // ziskat cenu
  60.         $sql = "SELECT cena, uzivatel_id FROM {$wpdb->prefix}".IR_DB_OBJ." WHERE ID = ".$id;
  61.         $objednavka = $wpdb->get_row( $sql );
  62.  
  63.         $aktualni_pocet_bodu = get_user_meta( $objednavka->uzivatel_id, 'pocetbodu', true );
  64.         $pocet_bodu = $aktualni_pocet_bodu + $objednavka->cena;
  65.         update_pocet_bodu( $objednavka->uzivatel_id, $pocet_bodu, 'Objedn├ívka ─Ź. ' . $id . ' byla stornov├ína.' );
  66.  
  67.         // smazat
  68.         $wpdb->delete(
  69.             "{$wpdb->prefix}".IR_DB_OBJ,
  70.             [ 'ID' => $id ],
  71.             [ '%d' ]
  72.         );
  73.  
  74.     }
  75.  
  76.     /**
  77.      * Update stav
  78.      *
  79.      * @param int $id customer ID
  80.      */
  81.     public static function update_stav( $id, $stav ) {
  82.         global $wpdb;
  83.  
  84.         $wpdb->update(
  85.             "{$wpdb->prefix}".IR_DB_OBJ,
  86.             array(
  87.                 'odeslano' => $stav,
  88.             ),
  89.             array( 'ID' => $id ),
  90.             array(
  91.                 '%d',              
  92.             ),
  93.             array( '%d' )
  94.         );
  95.     }
  96.  
  97.  
  98.  
  99.     /**
  100.      * Returns the count of records in the database.
  101.      *
  102.      * @return null|string
  103.      */
  104.     public static function record_count() {
  105.         global $wpdb;      
  106.  
  107.         $sql = "SELECT COUNT(*) FROM {$wpdb->prefix}".IR_DB_OBJ;
  108.         $sql .= " WHERE 1";
  109.  
  110.         return $wpdb->get_var( $sql );
  111.     }
  112.  
  113.  
  114.     /** Text displayed when no customer data is available */
  115.     public function no_items() {
  116.         _e( 'Nikdo nen├ş p┼Öihl├í┼íen.', IR_TDOMAIN );
  117.     }
  118.  
  119.  
  120.     /**
  121.      * Render a column when no column specific method exist.
  122.      *
  123.      * @param array $item
  124.      * @param string $column_name
  125.      *
  126.      * @return mixed
  127.      */
  128.     public function column_default( $item, $column_name ) {
  129.         switch ( $column_name ) {
  130.             case 'datum':
  131.             case 'uzivatel':
  132.             case 'adresa':
  133.             case 'objednavka':            
  134.                 return $item[ $column_name ];
  135.                 break;
  136.             case 'odeslano':
  137.                 if ( $item['odeslano'] == 0 ) {
  138.                     return 'ne';
  139.                 } else {
  140.                     return 'ano';
  141.                 }
  142.                 break;
  143.             default:
  144.                 return print_r( $item, true ); //Show the whole array for troubleshooting purposes
  145.         }
  146.     }
  147.  
  148.     /**
  149.      * Render the bulk edit checkbox
  150.      *
  151.      * @param array $item
  152.      *
  153.      * @return string
  154.      */
  155.     function column_cb( $item ) {
  156.         return sprintf(
  157.             '<input type="checkbox" name="bulk-delete[]" value="%s" />', $item['ID']
  158.         );
  159.     }
  160.  
  161.  
  162.     /**
  163.      * Method for name column
  164.      *
  165.      * @param array $item an array of DB data
  166.      *
  167.      * @return string
  168.      */
  169.     function column_name( $item ) {
  170.  
  171.         $delete_nonce = wp_create_nonce( 'sp_smazat_objednavku' );
  172.         $stav_nonce = wp_create_nonce( 'sp_update_stav' );
  173.  
  174.         $title = '<strong>' . $item['name'] . '</strong>';
  175.  
  176.         $actions = [
  177.             'delete' => sprintf( '<a href="?page=%s&action=%s&customer=%s&_wpnonce=%s">Delete</a>', esc_attr( $_REQUEST['page'] ), 'delete', absint( $item['ID'] ), $delete_nonce ),
  178.             'odeslano' => sprintf( '<a href="?page=%s&action=%s&customer=%s&_wpnonce=%s">P┼Öihl├ísit</a>', esc_attr( $_REQUEST['page'] ), 'odeslano', absint( $item['ID'] ), $stav_nonce ),
  179.             'neodeslano' => sprintf( '<a href="?page=%s&action=%s&customer=%s&_wpnonce=%s">Odhl├ísit</a>', esc_attr( $_REQUEST['page'] ), 'neodeslano', absint( $item['ID'] ), $stav_nonce )
  180.         ];
  181.  
  182.         return $title . $this->row_actions( $actions );
  183.     }
  184.  
  185.  
  186.     /**
  187.      *  Associative array of columns
  188.      *
  189.      * @return array
  190.      */
  191.     function get_columns() {
  192.         $columns = [
  193.             'cb'      => '<input type="checkbox" />',
  194.             'datum'    => __( 'Datum', IR_TDOMAIN ),           
  195.             'uzivatel'    => __( 'Kdo', IR_TDOMAIN ),
  196.             'adresa'    => __( 'Adresa', IR_TDOMAIN ),
  197.             'objednavka'    => __( 'Objednan├ę d├írky', IR_TDOMAIN ),
  198.             'odeslano'    => __( 'Odeslan├ę', IR_TDOMAIN ),
  199.         ];
  200.  
  201.         return $columns;
  202.     }
  203.  
  204.  
  205.     /**
  206.      * Columns to make sortable.
  207.      *
  208.      * @return array
  209.      */
  210.     public function get_sortable_columns() {
  211.         $sortable_columns = array(
  212.             'uzivatel' => array( 'jmeno', true ),
  213.             'adresa' => array( 'akce', false ),
  214.             'odeslano' => array( 'stav', true ),
  215.             'datum' => array( 'datum', true ),
  216.             'objednavka' => array( 'email', false )
  217.         );
  218.  
  219.         return $sortable_columns;
  220.     }
  221.  
  222.     /**
  223.      * Returns an associative array containing the bulk action
  224.      *
  225.      * @return array
  226.      */
  227.     public function get_bulk_actions() {
  228.         $actions = [
  229.             'bulk-odeslano' => 'Ozna─Źit jako odeslan├ę',
  230.             'bulk-neodeslano' => 'Ozna─Źit jako neodeslan├ę',
  231.             'bulk-delete' => 'Smazat objedn├ívku',         
  232.         ];
  233.  
  234.         return $actions;
  235.     }
  236.  
  237.  
  238.     /**
  239.      * Handles data query and filter, sorting, and pagination.
  240.      */
  241.     public function prepare_items() {
  242.  
  243.         $this->_column_headers = $this->get_column_info();
  244.  
  245.         /** Process bulk action */
  246.         $this->process_bulk_action();
  247.  
  248.         $per_page     = $this->get_items_per_page( 'objednavky_per_page', 20 );
  249.         $current_page = $this->get_pagenum();
  250.         $total_items  = self::record_count();
  251.  
  252.         $this->set_pagination_args( [
  253.             'total_items' => $total_items, //WE have to calculate the total number of items
  254.             'per_page'    => $per_page //WE have to determine how many items to show on a page
  255.         ] );
  256.  
  257.         $this->items = self::get_dochazka( $per_page, $current_page );
  258.     }
  259.  
  260.     public function process_bulk_action() {
  261.  
  262.         //Detect when a bulk action is being triggered...
  263.         if ( 'delete' === $this->current_action() ) {
  264.  
  265.             // In our file that handles the request, verify the nonce.
  266.             $nonce = esc_attr( $_REQUEST['_wpnonce'] );
  267.  
  268.             if ( ! wp_verify_nonce( $nonce, 'sp_smazat_objednavku' ) ) {
  269.                 die( 'Go get a life script kiddies' );
  270.             }
  271.             else {
  272.                 self::smazat_objednavku( absint( $_GET['customer'] ) );
  273.  
  274.                         // esc_url_raw() is used to prevent converting ampersand in url to "#038;"
  275.                         // add_query_arg() return the current url$
  276.                         wp_redirect( esc_url_raw(add_query_arg()) );                       
  277.                 exit;
  278.             }
  279.  
  280.         }
  281.  
  282.         if ( 'odeslano' === $this->current_action() ) {
  283.  
  284.             // In our file that handles the request, verify the nonce.
  285.             $nonce = esc_attr( $_REQUEST['_wpnonce'] );
  286.  
  287.             if ( ! wp_verify_nonce( $nonce, 'sp_update_stav' ) ) {
  288.                 die( 'Go get a life script kiddies' );
  289.             }
  290.             else {
  291.                 self::update_stav( absint( $_GET['customer'] ), 1 );
  292.  
  293.                         // esc_url_raw() is used to prevent converting ampersand in url to "#038;"
  294.                         // add_query_arg() return the current url
  295.                         wp_redirect( esc_url_raw(add_query_arg()) );
  296.                 exit;
  297.             }
  298.  
  299.         }
  300.  
  301.         if ( 'neodeslano' === $this->current_action() ) {
  302.  
  303.             // In our file that handles the request, verify the nonce.
  304.             $nonce = esc_attr( $_REQUEST['_wpnonce'] );
  305.  
  306.             if ( ! wp_verify_nonce( $nonce, 'sp_update_stav' ) ) {
  307.                 die( 'Go get a life script kiddies' );
  308.             }
  309.             else {
  310.                 self::update_stav( absint( $_GET['customer'] ), 0 );
  311.  
  312.                         // esc_url_raw() is used to prevent converting ampersand in url to "#038;"
  313.                         // add_query_arg() return the current url
  314.                         wp_redirect( esc_url_raw(add_query_arg()) );
  315.                 exit;
  316.             }
  317.  
  318.         }
  319.  
  320.         // If the delete bulk action is triggered
  321.         if ( ( isset( $_POST['action'] ) && $_POST['action'] == 'bulk-delete' )
  322.              || ( isset( $_POST['action2'] ) && $_POST['action2'] == 'bulk-delete' )
  323.         ) {
  324.  
  325.             $delete_ids = esc_sql( $_POST['bulk-delete'] );
  326.  
  327.             // loop over the array of record IDs and delete them
  328.             foreach ( $delete_ids as $id ) {
  329.                 self::smazat_objednavku( $id );
  330.  
  331.             }
  332.  
  333.             // esc_url_raw() is used to prevent converting ampersand in url to "#038;"
  334.                 // add_query_arg() return the current url
  335.                 wp_redirect( esc_url_raw(add_query_arg()) );
  336.             exit;
  337.         }
  338.  
  339.  
  340.         // If the delete bulk action is triggered
  341.         if ( ( isset( $_POST['action'] ) && $_POST['action'] == 'bulk-neodeslano' )
  342.              || ( isset( $_POST['action2'] ) && $_POST['action2'] == 'bulk-neodeslano' )
  343.         ) {
  344.  
  345.             $neodeslano_ids = esc_sql( $_POST['bulk-delete'] );
  346.  
  347.             // loop over the array of record IDs and delete them
  348.             foreach ( $neodeslano_ids as $id ) {
  349.                 self::update_stav( $id, 0 );
  350.  
  351.             }
  352.  
  353.             // esc_url_raw() is used to prevent converting ampersand in url to "#038;"
  354.                 // add_query_arg() return the current url
  355.                 wp_redirect( esc_url_raw(add_query_arg()) );
  356.             exit;
  357.         }
  358.  
  359.         // If the delete bulk action is triggered
  360.         if ( ( isset( $_POST['action'] ) && $_POST['action'] == 'bulk-odeslano' )
  361.              || ( isset( $_POST['action2'] ) && $_POST['action2'] == 'bulk-odeslano' )
  362.         ) {
  363.  
  364.             $odeslano_ids = esc_sql( $_POST['bulk-delete'] );
  365.  
  366.             // loop over the array of record IDs and delete them
  367.             foreach ( $odeslano_ids as $id ) {
  368.                 self::update_stav( $id, 1 );
  369.  
  370.             }
  371.  
  372.             // esc_url_raw() is used to prevent converting ampersand in url to "#038;"
  373.                 // add_query_arg() return the current url
  374.                 wp_redirect( esc_url_raw(add_query_arg()) );
  375.             exit;
  376.         }
  377.  
  378.     }
  379.  
  380. }
  381.  
  382.  
  383. class SP_Plugin_Objednavky {
  384.  
  385.     // class instance
  386.     static $instance;
  387.  
  388.     // customer WP_List_Table object
  389.     public $dochazka_obj;
  390.  
  391.     // class constructor
  392.     public function __construct() {
  393.         add_filter( 'set-screen-option', [ __CLASS__, 'set_screen' ], 10, 3 );
  394.         add_action( 'admin_menu', [ $this, 'plugin_menu' ] );
  395.     }
  396.  
  397.  
  398.     public static function set_screen( $status, $option, $value ) {
  399.         return $value;
  400.     }
  401.  
  402.     public function plugin_menu() {
  403.  
  404.         $hook = add_menu_page(
  405.             'Objedn├ívky',
  406.             'Objedn├ívky',
  407.             'manage_options',
  408.             'objednavky',
  409.             [ $this, 'plugin_settings_page' ],
  410.             'dashicons-visibility',
  411.             102
  412.         );
  413.  
  414.         add_action( "load-$hook", [ $this, 'screen_option' ] );
  415.  
  416.     }
  417.  
  418.  
  419.     /**
  420.      * Plugin settings page
  421.      */
  422.     public function plugin_settings_page() {
  423.         ?>
  424.         <div class="wrap">
  425.             <h2>Objedn├ívky</h2>
  426.  
  427.             <div id="poststuff">
  428.                 <div id="post-body" class="metabox-holder columns-1">
  429.                     <div id="post-body-content">
  430.                         <div class="meta-box-sortables ui-sortable">
  431.                             <form method="post">
  432.                                 <?php
  433.                                 $this->dochazka_obj->prepare_items();
  434.                                 $this->dochazka_obj->display(); ?>
  435.                             </form>
  436.                         </div>
  437.                     </div>
  438.                 </div>
  439.                 <br class="clear">
  440.             </div>
  441.         </div>
  442.     <?php
  443.     }
  444.  
  445.     /**
  446.      * Screen options
  447.      */
  448.     public function screen_option() {
  449.  
  450.         $option = 'per_page';
  451.         $args   = [
  452.             'label'   => 'Zobrazovat objedn├ívky po',
  453.             'default' => 20,
  454.             'option'  => 'objednavky_per_page'
  455.         ];
  456.  
  457.         add_screen_option( $option, $args );
  458.  
  459.         $this->dochazka_obj = new Objednavky();
  460.     }
  461.  
  462.  
  463.     /** Singleton instance */
  464.     public static function get_instance() {
  465.         if ( ! isset( self::$instance ) ) {
  466.             self::$instance = new self();
  467.         }
  468.  
  469.         return self::$instance;
  470.     }
  471.  
  472. }
  473. SP_Plugin_Objednavky::get_instance();
RAW Paste Data
We use cookies for various purposes including analytics. By continuing to use Pastebin, you agree to our use of cookies as described in the Cookies Policy. OK, I Understand
 
Top