Friday, November 10, 2023

WP_LIST_TABLE - complete code for searching, listing, pagination

WP_LIST_TABLE - complete code for searching, listing, pagination:

1. First register a menu to maintain a view:

<?php
require_once 'class-people-list-table.php';

add_action( 'admin_menu', 'ashique_register_custom_menu_page' );
function ashique_register_custom_menu_page()
{
    $parent_slug = 'ashique-slug';
    $capability = 'manage_options';

    add_menu_page(
        'Title',
        'Menu Title',
        $capability,
        $parent_slug,
        'ashique_dashbard_callback',
        'dashicons-dashboard',
        6
    );

    add_submenu_page(
        $parent_slug,
        'Dashboard',
        'Dashboard',
        $capability,
        $parent_slug,
        'ashique_dashbard_callback',
    );

    add_submenu_page(
        $parent_slug,
        'People List',
        'People List',
        $capability,
        'ashique-people-list',
        'ashique_people_list_callback',
    );
}

2. Now maintain list callback function:

function ashique_people_list_callback()
{
    // Creating an instance of People_List_Table
    $people_list_table = new People_List_Table();
    $people_list_table->prepare_items();

    ?>
    <div class="wrap">
        <h2>People List Table</h2>

        <form method="get">
            <input type="hidden" name="page" value="<?php echo $_REQUEST['page']; ?>" />
            <?php $people_list_table->search_box('Search', 'search_id'); ?>
        </form>

        <form method="post">
            <input type="hidden" name="page" value="my_list_test" />
            <?php $people_list_table->display(); ?>
        </form>
    </div>
    <?php
}

3. List table class file code:

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

class People_List_Table extends WP_List_Table
{
    // Define table columns
    function get_columns()
    {
        $columns = array(
            'id'               => 'ID',
            'name'             => 'Name',
            'email'       => 'Email',
        );
        return $columns;
    }

    // Get table data
    private function get_table_data($args = [])
    {
        global $wpdb;
        $people_table = $wpdb->prefix . 'people';

        $search = $args['s'];
        $offset = $args['offset'];
        $number = $args['number'];

        if ($search != '')
        {
            $sql = "SELECT id, name, email
                FROM $people_table
                WHERE
                name LIKE '%$search%'
                OR
                email LIKE '%$search%'
                ORDER BY email
                LIMIT $offset, $number";
        }
        else
        {
            $sql = "SELECT id, name, email
                FROM $people_table
                ORDER BY email
                LIMIT $offset, $number";
        }

        return $wpdb->get_results($sql, ARRAY_A);
    }

    private function get_table_data_total_rows($args = [])
    {
        $search = $args['s'];
        global $wpdb;
        $donar_table = $wpdb->prefix . 'people';

        if ($search != '')
        {
            $sql = "SELECT id, name, email
                FROM $people_table
                WHERE
                name LIKE '%$search%'
                OR
                email LIKE '%$search%'
                ORDER BY name";
        }
        else {
            $sql = "SELECT id, name, email
            FROM $people_table
            ORDER BY name";
        }
       
        return count($wpdb->get_results($sql, ARRAY_A));
    }

    function column_default($item, $column_name)
    {
        switch ($column_name)
        {
        case 'name':
        case 'email':
        default:
            return $item[$column_name];
        }
    }

    // Bind table with columns, data and all
    function prepare_items()
    {
        //data
        $per_page = 30;
        $current_page = $this->get_pagenum();

        // TODO: Implement your search logic here
        $search = (isset($_REQUEST['s'])) ? sanitize_text_field($_REQUEST['s']) : '';

        $args = array(
            'offset' => ($current_page - 1) * $per_page,
            'number' => $per_page,
            's' => $search,
        );

        // TODO: Implement your data retrieval logic based on $args
        $data = $this->get_table_data($args); // Replace with your data array
        $total_items = $this->get_table_data_total_rows($args); // Replace with your data array

        $this->set_pagination_args(array(
            'total_items' => $total_items,
            'per_page' => $per_page,
        ));

        $columns = $this->get_columns();
        $hidden = array();
        $sortable = array();

        $this->_column_headers = array($columns, $hidden, $sortable);

        $this->items = $data;
    }
}

.:Happy coding:.


Tuesday, November 7, 2023

Hide calculate shipping for a specific product in woocommerce

Hide calculate shipping for a specific product in woocommerce:

Write the following code in your functions.php:

// Turn off calculate shipping if cart has service product
add_filter('woocommerce_product_needs_shipping', function() {
    foreach (WC()->cart->get_cart() as $cart_item)
    {
        $pid = $cart_item['data']->get_id();
        $product = get_post($pid);
        $slug = $product->post_name;
        if ($slug == 'YOUR-PRODUCT-SLUG') {
            return false;
        }
        else {
            return true;
        }
    }
});


.:Happy coding:.

Saturday, September 9, 2023

Laragon - mysql issue during upgrading mysql V5 to V8

1. Stop Laragon.

2. Remove all files and folders from mysql-8 in laragon -> data -> mysql-8.

3. Open terminal and go to this directory: laragon -> bin -> mysql -> mysql-8 -> bin

4. Run this command: mysqld --initialize --console

5. Run this command: start mysqld

6. Enter in to mysql: mysql -u root -p

7. Password has given in step 42

8. Run this command: ALTER USER 'root'@'localhost' IDENTIFIED BY '';

9. Close mysqld window and start laragon.

Enjoy mysql 8 in laragon!

Tuesday, May 9, 2023

Mysql import from a SQL file by command line way

Mysql import from a SQL file by command line way:

Open command line and login to your mysql database by typing below command:

mysql -u root -p password then press enter.

mysql > source path_of_your_sql_file.sql Eg: if your file in D drive then path will be D:\mysql.sql

Then press enter all your tables will be imported soon.

Tuesday, April 4, 2023

gitignore is not ignoring already committed files or folders

When gitignore is not working for already committed files or folders.

In that time you need to run the below comment first:

git rm --cached file_name

Or

git rm --cached folder_name

Or 

git rm --cached -r folder_name

It will clear committed stuff from git.

Then you can commit and push your branch.

Tuesday, March 21, 2023

Set local timezone in wordpress programatically

Set local timezone in wordpress programatically:

add_action('wp_loaded', 'animed_time_zone_function');
function animed_time_zone_function() {
    $timezone_identifier = 'Asia/Dhaka';
    date_default_timezone_set($timezone_identifier);
}

Happy coding!

Tuesday, February 14, 2023

Get completed orders count for a specific user with a specific product in Woocommerce

Get completed orders count for a specific user with a specific product in Woocommerce:

Code:

function get_total_product_completed_order_for_a_specific_user() {
    $product_slug = 'product-slug';
    $product_obj = get_page_by_path($product_slug, OBJECT, 'product');

    $pid = 0;
    if (!empty($product_obj)) {
        $pid = $product_obj->ID;
    }

    // Get all customer orders
    $customer_orders = get_posts(
        array(
            'numberposts' => -1,
            'meta_key'    => '_customer_user',
            'orderby'     => 'date',
            'order'       => 'DESC',
            'meta_value'  => get_current_user_id(),
            'post_type'   => wc_get_order_types(),
            'post_status' => array_keys(wc_get_order_statuses()),
            'post_status' => array('wc-completed'),
        )
    );

    $Order_Array = [];
    $apid_counter = 0;
    foreach ($customer_orders as $customer_order) {
        $orderq        = wc_get_order($customer_order);

        $items = $orderq->get_items();

        foreach ( $items as $item ) {
            $product_id = $item->get_product_id();
            if ($pid == $product_id) {
                $apid_counter++;
            }
            break;
        }

        $Order_Array[] = [
            "ID"    => $orderq->get_id(),
            "Value" => $orderq->get_total(),
            "Date"  => $orderq->get_date_created()->date_i18n('Y-m-d'),
        ];
    }

    // return count($Order_Array);
    return $apid_counter;
}

Happy coding...



Monday, February 6, 2023

Laravel - raw query with pagination

Laravel - raw query with pagination:

class InventoryController extends Controller

{

    public function index(Request $request)

    {

        $sql = "SELECT *,products.name as product_name, product_categories.name as category_name, products.id as productid,

              ( SELECT SUM(buy_products.qty) as purcahse_qty

                FROM buy_products

                WHERE buy_products.product_id=products.id GROUP BY buy_products.product_id ) as bqty,

              ( SELECT SUM(sell_products.qty) as order_qty

                FROM sell_products

                WHERE sell_products.product_id=products.id GROUP BY sell_products.product_id ) as sqty 

                FROM products LEFT JOIN product_categories ON products.product_category_id=product_categories.id

                ";

        $results = DB::select($sql);

        $productInventoryData = $this->arrayPaginator($results, $request);

        return view('auth.inventory.inventory_list')->with('productInventoryData', $productInventoryData);

    }


    public function arrayPaginator($array, $request)

    {

        $page = is_null($request->get('page')) ? 1 : $request->get('page');

        $perPage = 2;

        $offset = ($page * $perPage) - $perPage;


        return new LengthAwarePaginator(array_slice($array, $offset, $perPage, true), count($array), $perPage, $page,

            ['path' => $request->url(), 'query' => $request->query()]);

    }

}

And in views you can use links as like DB query build we use.
Thanks and happy coding.

Switch PHP version in Ubuntu OS or Zorin OS

First check where is installed your PHP by the below command: $ which php See PHP version by below command: $ php -v As I've installed P...