felixarntz/oop-admin-pages

View on GitHub
oop-admin-pages-examples.php

Summary

Maintainability
A
3 hrs
Test Coverage
<?php
/**
 * Examples for the OOP Admin Pages library, as a WordPress plugin.
 *
 * @package Leaves_And_Love\OOP_Admin_Pages\Examples
 * @since 1.0.0
 *
 * @wordpress-plugin
 * Plugin Name: OOP Admin Pages Examples
 * Plugin URI:  https://github.com/felixarntz/oop-admin-pages
 * Description: Examples for the OOP Admin Pages library, as a WordPress plugin.
 * Version:     1.0.0
 * Author:      Felix Arntz
 * Author URI:  https://leaves-and-love.net
 * License:     GNU General Public License v2
 * License URI: http://www.gnu.org/licenses/gpl-2.0.html
 * Text Domain: oop-admin-pages
 * Tags:        admin pages, oop, library, wordpress
 */

defined( 'ABSPATH' ) || exit;

use Leaves_And_Love\OOP_Admin_Pages\Admin_Page_Collection\Base_Admin_Page_Collection as Page_Collection;
use Leaves_And_Love\OOP_Admin_Pages\Admin_Page_Factory\WordPress_Admin_Page_Factory as Page_Factory;
use Leaves_And_Love\OOP_Admin_Pages\Admin_Page\WordPress_Admin_Page as Page;
use Leaves_And_Love\OOP_Admin_Pages\Admin_Page\WordPress_Admin_Menu_Page as Menu_Page;
use Leaves_And_Love\OOP_Admin_Pages\Admin_Page\WordPress_Admin_Submenu_Page as Submenu_Page;
use Leaves_And_Love\OOP_Admin_Pages\Admin_Page\WordPress_Admin_Panels\WordPress_Admin_Panels as Panels;
use BrightNucleus\Config\Config;

if ( ! interface_exists( 'Leaves_And_Love\OOP_Admin_Pages\Admin_Page' ) ) {
    if ( file_exists( plugin_dir_path( __FILE__ ) . 'vendor/autoload.php' ) ) {
        require_once plugin_dir_path( __FILE__ ) . 'vendor/autoload.php';
    } else {
        wp_die( 'OOP Admin Pages library could not be loaded!' );
    }
}

add_action( 'init', function() {
    if ( ! is_admin() ) {
        return;
    }

    // This instantiates the WordPress admin page factory (since we're in WordPress, of course).
    $factory = new Page_Factory();

    // Instantiate a new admin page collection with a configuration.
    $collection = new Page_Collection( new Config( array(

        // This tells the collection to use our above factory.
        Page_Collection::FACTORY => $factory,

        // The following array is the actual admin pages configuration.
        Page_Collection::PAGES   => array(

            // This is a very basic admin page that renders as a toplevel menu.
            array(
                Menu_Page::SLUG            => 'my-menu-page',
                Menu_Page::TITLE           => __( 'Menu Page', 'oop-admin-pages' ),
                Menu_Page::MENU_TITLE      => __( 'Menu', 'oop-admin-pages' ),
                Menu_Page::CAPABILITY      => 'manage_options',
                Menu_Page::ADMIN_PANEL     => Panels::SITE,
                Menu_Page::RENDER_CALLBACK => function( $config ) {
                    ?>
                    <div class="wrap">
                        <h1><?php echo esc_html( $config['title'] ); ?></h1>
                        <p class="description"><?php esc_html_e( 'This is a menu page.', 'oop-admin-pages' ); ?></p>
                    </div>
                    <?php
                },
            ),

            // This is a very basic admin page that renders as a submenu.
            array(
                Submenu_Page::SLUG            => 'my-submenu-page',
                Submenu_Page::TITLE           => __( 'Submenu Page', 'oop-admin-pages' ),
                Submenu_Page::MENU_TITLE      => __( 'Submenu', 'oop-admin-pages' ),
                Submenu_Page::CAPABILITY      => 'manage_options',
                Submenu_Page::ADMIN_PANEL     => Panels::SITE,
                Submenu_Page::PARENT_SLUG     => 'my-menu-page',
                Submenu_Page::RENDER_CALLBACK => function( $config ) {
                    ?>
                    <div class="wrap">
                        <h1><?php echo esc_html( $config['title'] ); ?></h1>
                        <p class="description"><?php esc_html_e( 'This is a submenu page.', 'oop-admin-pages' ); ?></p>
                    </div>
                    <?php
                },
            ),

            // This is a very basic admin page that does not have any menu entry.
            array(
                Page::SLUG              => 'my-page',
                Page::TITLE             => __( 'Page without Menu', 'oop-admin-pages' ),
                Page::CAPABILITY        => 'manage_options',
                Page::ADMIN_PANEL       => Panels::SITE,
                Page_Factory::SKIP_MENU => true,
                Page::RENDER_CALLBACK   => function( $config ) {
                    ?>
                    <div class="wrap">
                        <h1><?php echo esc_html( $config['title'] ); ?></h1>
                        <p class="description"><?php esc_html_e( 'This is a page that does not have any menu entry.', 'oop-admin-pages' ); ?></p>
                    </div>
                    <?php
                },
            ),

            // This is a little more realistic admin submenu page in the "Tools" menu that allows you to send an email through WordPress.
            array(
                Submenu_Page::SLUG                => 'send-email',
                Submenu_Page::TITLE               => __( 'Send Email', 'oop-admin-pages' ),
                Submenu_Page::CAPABILITY          => 'manage_options',
                Submenu_Page::ADMIN_PANEL         => Panels::SITE,
                Submenu_Page::PARENT_SLUG         => 'tools.php',
                Submenu_Page::RENDER_CALLBACK     => function( $config ) {
                    ?>
                    <div class="wrap">
                        <h1><?php echo esc_html( $config['title'] ); ?></h1>

                        <p class="description">
                            <?php esc_html_e( 'This form allows you to send an email through WordPress.', 'oop-admin-pages' ); ?>
                        </p>

                        <?php
                        if ( ! empty( $_GET['result'] ) ) {
                            switch ( $_GET['result'] ) {
                                case 'success':
                                    $class   = 'notice notice-success';
                                    $message = __( 'The email was sent successfully!', 'oop-admin-pages' );
                                    break;
                                case 'invalid_nonce':
                                    $class   = 'notice notice-error';
                                    $message = __( 'The email was not sent because of an invalid nonce!', 'oop-admin-pages' );
                                    break;
                                case 'invalid_email':
                                    $class   = 'notice notice-error';
                                    $message = __( 'The email was not sent because you did not specify a valid email address!', 'oop-admin-pages' );
                                    break;
                                default:
                                    $class   = 'notice notice-error';
                                    $message = __( 'The email was not sent due to an unknown error!', 'oop-admin-pages' );
                            }

                            ?>
                            <div class="<?php echo esc_attr( $class ); ?>">
                                <p><?php echo esc_html( $message ); ?></p>
                            </div>
                            <?php
                        }
                        ?>

                        <form method="POST">
                            <table class="form-table">
                                <tbody>
                                    <tr>
                                        <th scope="row">
                                            <label for="email-address"><?php esc_html_e( 'Email Address', 'oop-admin-pages' ); ?></label>
                                        </th>
                                        <td>
                                            <input type="email" id="email-address" name="email_address" class="regular-text" />
                                        </td>
                                    </tr>
                                    <tr>
                                        <th scope="row">
                                            <label for="email-subject"><?php esc_html_e( 'Subject', 'oop-admin-pages' ); ?></label>
                                        </th>
                                        <td>
                                            <input type="text" id="email-subject" name="email_subject" class="regular-text" />
                                        </td>
                                    </tr>
                                    <tr>
                                        <th scope="row">
                                            <label for="email-message"><?php esc_html_e( 'Message', 'oop-admin-pages' ); ?></label>
                                        </th>
                                        <td>
                                            <textarea id="email-message" name="email_message" class="regular-text" rows="12"></textarea>
                                        </td>
                                    </tr>
                                </tbody>
                            </table>

                            <?php
                            wp_nonce_field( 'send-email', 'email_nonce' );
                            submit_button( __( 'Send', 'oop-admin-pages' ) );
                            ?>
                        </form>
                    </div>
                    <?php
                },
                Submenu_Page::INITIALIZE_CALLBACK => function() {
                    if ( empty( $_POST ) ) {
                        return;
                    }

                    $post_data = wp_unslash( $_POST );

                    if ( empty( $post_data['email_nonce'] ) || ! wp_verify_nonce( $post_data['email_nonce'], 'send-email' ) ) {
                        $result = 'invalid_nonce';
                    } else {
                        $address = is_email( $post_data['email_address'] );
                        $subject = $post_data['email_subject'];
                        $message = $post_data['email_message'];

                        if ( ! $address ) {
                            $result = 'invalid_email';
                        } else {
                            $sent = wp_mail( $address, $subject, $message );

                            if ( ! $sent ) {
                                $result = 'unknown_error';
                            } else {
                                $result = 'success';
                            }
                        }
                    }

                    wp_safe_redirect( add_query_arg( 'result', $result, wp_get_referer() ) );
                    exit;
                },
            ),

            // This is an admin menu page for the network admin panel.
            array(
                Menu_Page::SLUG            => 'my-network-menu-page',
                Menu_Page::TITLE           => __( 'Network Menu Page', 'oop-admin-pages' ),
                Menu_Page::MENU_TITLE      => __( 'Network Menu', 'oop-admin-pages' ),
                Menu_Page::CAPABILITY      => 'manage_network_options',
                Menu_Page::ADMIN_PANEL     => Panels::NETWORK,
                Menu_Page::RENDER_CALLBACK => function( $config ) {
                    ?>
                    <div class="wrap">
                        <h1><?php echo esc_html( $config['title'] ); ?></h1>
                        <p class="description"><?php esc_html_e( 'This is a network menu page.', 'oop-admin-pages' ); ?></p>
                    </div>
                    <?php
                },
            ),
        ),
    ) ) );

    $collection->register();
});