1. Go to this page and download the library: Download pfaciana/wp-routines 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/ */
add_action( 'wp_routines', function ( \WP_Routines\Routines $routines ) {
// This is the long style first, then we'll go over shorthand options.
// $taskCallback can be any function that accepts a $stream as the first argument
$taskCallback = function ( \WP_Routines\Stream $stream ) {
$stream->send( 'Begin...' );
$result = do_some_complicated_thing();
echo $result;
$stream->flush();
};
// $pageConfig can be a config array or a `Page` object, here we'll define the config
// if the `Page` already exists, then this can be the string representing the $menu_slug
$pageConfig = [
'menu_slug' => 'page_name_123',
'menu_title' => 'Page 123',
'page_title' => 'Page 123 Console',
'capability' => 'manage_options',
'icon_url' => 'dashicons-tickets',
'groups' => [ 'Group Name #2', 'default' => 'Group Name' ],
'admin_menu_page' => TRUE,
'debug_bar_panel' => TRUE,
];
$taskConfig = [
'title' => 'Tab Name',
'group' => 'Group Name',
'page' => $pageConfig,
'callback' => $taskCallback,
'priority' => 10,
];
// Register the Task to the Routines manager via the config array
$task = $routines->addTask( $taskConfig );
// Or as a `Task` object
$task = $routines->addTask( new \WP_Routines\Task( $taskConfig ) );
# Here are a couple quick shorthand options
// 1) Send just a callable, the rest of the values will be auto generated
$routines->addTask( 'some_function' );
// 2) Or send the title and callback, and the rest of the values will be auto generated
$routines->addTask( 'Tab Title', 'some_function' );
// You can also add a group of tasks all at once by adding a `Tasks` class
$routines->addTasks( new Custom_Tasks_Class() );
// More on this later...
});
add_action( 'wp_routines', function ( \WP_Routines\Routines $routines ) {
// Create the page config array
// You should notice most of these keys match the arguments for the `add_menu_page` and `add_submenu_page` functions
// That's no coincidence, depending on if you add a `parent_slug` key, it will call once of those function using these values
$pageConfig = [
'menu_slug' => 'page_name_123',
'menu_title' => 'Page 123',
'page_title' => 'Page 123 Console',
'capability' => 'manage_options',
'icon_url' => 'dashicons-tickets',
'groups' => [ 'Group Name #2', 'default' => 'Group Name' ],
'admin_menu_page' => TRUE,
'debug_bar_panel' => TRUE,
];
// Register the Page to the Routines manager via the config array
$page = $routines->addPage( $pageConfig );
// Or as a `Page` object
$page = $routines->addPage( new \WP_Routines\Page( $pageConfig ) );
// At a bare minimum you can just send the $pageConfig['menu_slug']
$page = $routines->addPage( 'page_name_123' );
// The rest of the config array will be built with the default values
});
class Custom_Tasks_Class extends \WP_Routines\Tasks
{
// Set the page (Optional). If this is undefined, then it will go on the default page
protected $page = 'page_name_123';
// Optional Crons setup
protected $crons = [
'hourly' => [ // <- schedule name
'wp_ajax_and_cron_task' => 10, // <- method name & priority
],
'custom_schedules_name' => [ // <- schedule name
'just_a_cron_task' => [-999, 999], // <- method name & priorities
],
];
protected function preInit ( $config ) {
add_filter('cron_schedules', [$this, 'add_custom_cron_intervals'], 10, 1);
}
public function add_custom_cron_intervals ( $schedules ) {
$schedules['custom_schedules_name'] = [
'interval' => 15 * MINUTE_IN_SECONDS,
'display' => 'Once Every 15 Minutes',
];
return $schedules;
}
// Methods
protected function neither_ajax_or_cron () {
// This does not start with $taskPrefix, and is not in the $crons array
}
public function wp_ajax_import_data ( \WP_Routines\Stream $stream ) {
// Starts with $taskPrefix, but not in the $crons array
$stream->send('I only run as a task from the admin page.')
}
public function wp_ajax_and_cron_task ( \WP_Routines\Stream $stream ) {
// Starts with $taskPrefix AND is in the $crons (hourly)
$this->neither_ajax_or_cron();
$stream->send('I run both as a task and as a cron job.')
}
public function just_a_cron_task ( \WP_Routines\Stream $stream ) {
// Does not start with $taskPrefix, but is in the $crons (custom_schedules_name)
$this->neither_ajax_or_cron();
$stream->send('I only run as a cron job.')
}
}
// If you're not autoloading or adding to a page, then you must add the new instance to the $routines manager manually
add_action( 'wp_routines', function ( \WP_Routines\Routines $routines ) {
$routines->addTasks( new Custom_Tasks_Class() );
});
// Bare minimum setup
class Bare_Minimum_Tasks_Class extends \WP_Routines\Tasks {
public function wp_ajax_ ( $stream ) {
$stream->send( 'This is all you need to get this to work!' );
}
};
new class() extends \WP_Routines\Tasks {
public function wp_ajax_some_callable ( \WP_Routines\Stream $stream ) {
$stream->send( 'Hello World!' );
}
};
new class() extends \WP_Routines\Task {
public function render ( \WP_Routines\Stream $stream ) {
$stream->send( 'Hello World!' );
}
};
function render ( \WP_Routines\Stream $stream ) {
// Sending text (or html) to the client/browser console.
$stream->send("<b>Header</b>\n---");
( function () {
echo implode("\n", ['Row 1', 'Row 2', 'Row 3'];
} )();
$stream->flush();
// `send` and `flush` are very similar. The difference being that `send` accepts text (or html) and `flush` does not.
// `flush` calls `send`, with the text/html argument being the flushed buffer.
// If nothing is in the buffer, then the output text/html is an empty string.
// You typically would use `flush` when some code, which is out of scope of the `$stream` variable,
// sends something to the buffer, and you want that to be output in real time.
// A couple helpful methods that allow you track the status of a script.
// These values can be conditions that trigger an action or lack of an action.
// For example, if you are running out of execution time, you may want to gracefully end a script early
// or if you are close to max memory, it could be a sign of a memory leak or bad code, etc.
$currentAllocatedMemoryInMB = (int) $stream->getMemory();
$secondsRemainingBeforeScriptTimesout = (int) $stream->getTimeRemaining();
}
$stream->send( 'Line 1!' );
$stream->send( 'Line 2!' );
$stream->send( 'Line 3!' );
$stream->send( "\a\a\b" );
$stream->send( "New Line 2!" );