PHP code example of undefinedfr / undefined-wp-framework

1. Go to this page and download the library: Download undefinedfr/undefined-wp-framework library. Choose the download type require.

2. Extract the ZIP file and open the index.php.

3. Add this code to the index.php.
    
        
<?php
require_once('vendor/autoload.php');

/* Start to develop here. Best regards https://php-download.com/ */

    

undefinedfr / undefined-wp-framework example snippets





namespace App\PostType;

use Undefined\Core\PostType\PostType;

class Project extends PostType
{
    public static function getPostType(): string
    {
        return 'project';
    }

    protected static function getPostTypeConfig(): array
    {
        return [
            'singulier'  => 'Projet',
            'pluriel'    => 'Projets',
            'feminin'    => false,
            'menu_icon'  => 'dashicons-portfolio',
            'supports'   => ['title', 'editor', 'thumbnail'],
            'taxonomies' => ['project_category'],
        ];
    }

    // Hook appelé à la sauvegarde
    public static function onSavePost($post_id): void
    {
        // Logique personnalisée
    }
}


namespace App\Taxonomy;

use Undefined\Core\Taxonomy\Taxonomy;

class ProjectCategory extends Taxonomy
{
    public static function getTaxonomy(): string
    {
        return 'project_category';
    }

    protected static function getTaxonomyConfig(): array
    {
        return [
            'name'        => 'Catégorie',
            'pluriel'     => 'Catégories',
            'feminin'     => true,
            'post_types'  => ['project'],
            'hierarchical' => true,
        ];
    }

    // Hook appelé à la sauvegarde d'un terme
    public static function onSaveTerm($term_id, $tt_id, $update, $args): void
    {
        // Logique personnalisée
    }
}


namespace App\blocks\hero;

use Undefined\Core\Block\Block;
use Extended\ACF\Fields\Text;
use Extended\ACF\Fields\Image;

class Hero extends Block
{
    public $name = 'hero';
    public $title = 'Hero Banner';
    public $description = 'Bannière principale';
    public $category = 'custom';
    public $icon = 'cover-image';
    public $mode = 'preview';
    public $keywords = ['banner', 'header'];

    protected function _setGroupField(): void
    {
        parent::_setGroupField();

        $this->groupField['fields'] = [
            Text::make('Titre', 'title')
                ->


// app/Controllers/AccountController.php

use Undefined\Core\Controllers\AbstractController;

class AccountController extends AbstractController
{
    // Action par défaut: /account/
    public function indexAction()
    {
        if (!is_user_logged_in()) {
            $this->_redirect('/login');
        }

        $this->_setTitle('Mon compte');
        $this->_setData([
            'user' => wp_get_current_user(),
        ]);

        $this->render();
    }

    // Action: /account/orders
    public function ordersAction()
    {
        $this->_setData([
            'orders' => $this->getOrders(),
        ]);

        $this->render();
    }

    // POST sur /account/orders
    public function ordersPostAction()
    {
        // Traitement du formulaire
        $this->_addNotice('success', 'Commande mise à jour');
        $this->_redirect('/account/orders');
    }
}


// app/Router.php

use Undefined\Core\Router;

class AppRouter extends Router
{
    public function __construct()
    {
        parent::__construct();

        // Route simple
        $this->addRule('account');

        // Route avec section
        $this->addRule('account', 'orders');

        // Route avec paramètres dynamiques
        $this->addRule('account', 'order', [
            'order_id' => '([0-9]+)'
        ]);
    }
}

use Undefined\Core\Request;

$request = Request::createFromGlobals();

// Accès aux paramètres
$request->query->get('page');           // $_GET['page']
$request->request->get('email');        // $_POST['email']
$request->cookies->get('session_id');   // $_COOKIE['session_id']
$request->server->get('REQUEST_METHOD');
$request->headers->get('Content-Type');

// Méthode générique (cherche dans attributes, query, request, session)
$request->get('param', 'default');

// Contenu brut
$request->getContent();

$request->request->getText('name');      // sanitize_text_field
$request->request->getEmail('email');    // sanitize_email
$request->request->getTextarea('bio');   // sanitize_textarea_field
$request->request->getUrl('website');    // esc_url_raw
$request->request->getFilename('file');  // sanitize_file_name
$request->request->getKey('slug');       // sanitize_key
$request->request->getSlug('title');     // sanitize_title

// Méthodes standard
$request->request->get('key', 'default');
$request->request->getInt('page', 1);
$request->request->getBoolean('active');
$request->request->getAlpha('code');
$request->request->getAlnum('ref');
$request->request->getDigits('phone');
$request->request->has('field');
$request->request->all();


namespace App\Actions;

use Undefined\Core\Actions;

class ThemeActions extends Actions
{
    protected $_hooks = [
        // Format simple
        'setupTheme' => 'after_setup_theme',

        // Format avancé
        'loadScripts' => [
            'hook'          => 'wp_enqueue_scripts',
            'priority'      => 20,
            'accepted_args' => 1,
            'remove_on_admin' => true,
        ],
    ];

    public function theme_setupTheme()
    {
        add_theme_support('post-thumbnails');
        add_theme_support('title-tag');
        register_nav_menus([
            'primary' => 'Menu principal',
        ]);
    }

    public function theme_loadScripts()
    {
        wp_enqueue_script('custom-script', '...');
    }
}


namespace App\Filters;

use Undefined\Core\Filters;

class ThemeFilters extends Filters
{
    protected $_hooks = [
        'excerpt' => 'excerpt_length',
        'mimeTypes' => [
            'hook'     => 'upload_mimes',
            'priority' => 10,
        ],
    ];

    public function theme_excerpt($length)
    {
        return 30;
    }

    public function theme_mimeTypes($mimes)
    {
        $mimes['svg'] = 'image/svg+xml';
        return $mimes;
    }
}


namespace App\Ajax;

use Undefined\Core\Ajax;

class FormAjax extends Ajax
{
    protected $_ajaxFunctions = [
        'submit_contact_form',
        'load_more_posts',
    ];

    public function submit_contact_form()
    {
        check_ajax_referer('undefined_ajax_nonce', 'nonce');

        $email = sanitize_email($_POST['email']);
        $message = sanitize_textarea_field($_POST['message']);

        // Traitement...

        wp_send_json_success(['message' => 'Email envoyé']);
    }

    public function load_more_posts()
    {
        $page = intval($_POST['page']);

        $posts = get_posts([
            'posts_per_page' => 10,
            'offset' => ($page - 1) * 10,
        ]);

        wp_send_json_success(['posts' => $posts]);
    }
}


namespace App\Assets;

use Undefined\Core\Assets\Assets;

class ThemeAssets extends Assets
{
    protected $_scripts = [
        'vendor' => [
            'handle'   => 'vendor',
            'filename' => 'vendor.js',
            'deps'     => ['jquery'],
            'version'  => '1.0',
            'infooter' => false,
        ],
        'app' => [
            'handle'   => 'app',
            'filename' => 'app.js',
            'deps'     => ['vendor'],
            'version'  => '1.0',
            'infooter' => true,
            'args'     => [], // Données localisées
        ],
    ];

    protected $_styles = [
        'theme' => [
            'handle'   => 'theme',
            'filename' => 'theme.css',
            'deps'     => [],
            'version'  => '1.0',
        ],
    ];
}

add_filter('undfnd_assets_app_object_name', function($name) {
    return 'myApp'; // window.myApp au lieu de window.args
});

use Undefined\Core\Mails\Mail;

Mail::init()
    ->to('[email protected]')
    ->cc('[email protected]')
    ->bcc('[email protected]')
    ->from('Mon Site <[email protected]>')
    ->subject('Confirmation de commande #{{ order_id }}')
    ->template('emails/order-confirmation.twig', [
        'order_id'   => 123,
        'items'      => $orderItems,
        'total'      => '99.00€',
        '_html_content' => '<strong>HTML non échappé</strong>',
    ])
    ->attach('/path/to/invoice.pdf')
    ->send();


namespace App\Command;

class ImportCommand
{
    public $name = 'import';

    /**
     * Import des produits
     *
     * ## OPTIONS
     *
     * [--file=<file>]
     * : Fichier CSV à importer
     *
     * ## EXAMPLES
     *
     *     wp import products --file=products.csv
     *
     * @param array $args
     * @param array $assoc_args
     */
    public function products($args, $assoc_args)
    {
        $file = $assoc_args['file'] ?? 'import.csv';

        \WP_CLI::log("Import depuis $file...");

        // Logique d'import...

        \WP_CLI::success('Import terminé !');
    }
}

// Désactivé automatiquement :
// GET /wp-json/wp/v2/users
// GET /wp-json/wp/v2/users/1


namespace App;

use Undefined\Core\App;

class MyApp extends App
{
    protected function __construct()
    {
        // Initialisation
    }
}

// Usage
$app = \App\MyApp::getInstance();

// Accès rapide via la fonction app()
$app = app();