Wordpress Admin Settings Pages Hinzufügen

Mit diesem Code Beispiel werden zwei Options / Settings Pages für Wordpress hinzugefügt. Dieser Code fügt nur die Seiten ins Menü ein. Es müssen noch Render Funktionen geschrieben werden, die eine Ausgabe erzeugen. Der Namespace ist optional, macht die Sache aber sauberer.

1. Settings-Page Registrieren (ohne Klasse)

<?php
 
namespace PluginNamespace\Adminpages;
 
add_action( 'admin_menu', 'PluginNamespace\Adminpages\add_admin_page' );
 
function add_admin_page() {
 
	$page_title    = 'Hauptseite';
	$menu_title    = 'Hauptseite';
	$capability    = 'edit_posts';
	$menu_slug     = 'plugin-hauptseite';
	$page_function = 'renderer_function_hauptseite'; // --> function renderer_function_hauptseite()
	$icon          = TDSR_URL . 'assets/gfx/icon_shield.png';
	$position      = 50;
	add_menu_page( $page_title, $menu_title, $capability, $menu_slug,  $page_function, $icon, $position );
 
	$parent_slug   = 'plugin-hauptseite';
	$page_title    = 'Submenü Titel';
	$menu_title    = 'Submenü Titel';
	$capability    = 'edit_posts';
	$menu_slug     = 'plugin-unterseite';
	$page_function = 'renderer_function_unterseite'; // --> function renderer_function_unterseite()
	add_submenu_page( $parent_slug, $page_title, $menu_title, $capability, $menu_slug, $page_function );
 
}

Damit Unterseiten bei bestehenden Setting-Seiten eingebaut werden, muss der parent-slug angepasst werden. Um z.b. unter “plugins” im Menü aufzutauchen:

	$parent_slug   = 'plugins.php'; // <--
 
	// ...
 
	add_submenu_page( $parent_slug, $page_title, $menu_title, $capability, $menu_slug, $page_function );

Mehr dazu in der Doku (siehe "used by"-Sektion).

2. Settings-Page als PHP-Klasse

Es kann nützlich sein Settings als PHP Class oder Objekt zu registrieren, damit alles in einem geschlossenem Objekt bleibt, z.b. für Plugins. Mit diesem Code wird eine Backendpage erzeugt.

<?php
 
namespace mein_namespace;
 
/**
 *
 */
class Overview
{
 
	private $plugin_url = '';
 
	function __construct( $plugin_url )
	{
		$this->plugin_url = $plugin_url;
		add_action( 'admin_menu', [ $this, 'add_page'] );
		add_action( 'admin_enqueue_scripts', [ $this, 'register_scripts_styles' ] );
	}
 
	public function add_page()
	{
		$page_title    = 'Tracking';
		$menu_title    = 'Tracking';
		$capability    = 'edit_posts';
		$menu_slug     = 'plugin-hauptseite';
		$page_function = [ $this, 'render_page'];
		$icon          = $this->plugin_url . 'assets/gfx/icon-line-chart-fill-white.png';
		$position      = 50;
		add_menu_page( $page_title, $menu_title, $capability, $menu_slug,  $page_function, $icon, $position );
	}
 
	public function register_scripts_styles(){
		// Style Registrieren (noch nicht einbetten)
		/*
		$handle  = 'plugin-admin-style';
		$src     = this->plugin_url . 'css/plugin_style.css';
		$deps    = [];
		$version = '1.0';
		wp_register_style( $handle, $src, $deps, $version );
		*/
 
		// Script Registrieren (noch nicht einbetten)
		/*
		$handle    = 'alpine';
		$src       = this->plugin_url  . 'js/alpine.min.js';
		$deps      = [];
		$version   = '3.0';
		$in_footer = false;
		wp_register_script( $handle, $src, $deps, $version,$in_footer );
		*/
	}
 
	public function render_page()
	{
		//wp_enqueue_script( 'alpine' ); // Registriertes Script einbinden
		//wp_enqueue_style( 'moewe-arrowchat-admin-style' ); // Registrierten Style einbinden
 
		echo "<h1>Test</h1>";
		include "html-datei.html";
	}
}

3. HTML Ausgabe und Speichern (rudimentär)

Page Renderer Function, so etwas wie:

function admin_setting_page_theme_links(){
	$menu_slug   = 'theme-links';
	$echo        = false;
	$form_action = menu_page_url( $menu_slug, $echo );
 
	$v = [
		'test_input' => save_and_load_option( 'test_input' ),
	];
 
	require_once 'tpl/admin-theme-links.php';
}
 
/* Rudimentäre Saving & Lade Function */
function save_and_load_option( $key, $default = null ){
	$value = get_option( $key, $default );
 
	if( isset( $_POST[$key] ) ){
		$new_value = $_POST[$key];
		$autoload  = false;
		update_option( $key, $new_value, $autoload );
		$value     = $new_value;
	}
 
	return $new_value;
}

HTML-Sub-File für das Template der Settings-Page, z.b.: tpl/page.php

<div class="wrap">
<h1>Your Plugin Page Title</h1>
<form method="post" action="<?php echo $form_action; ?>&action=save">
 
	<table class="form-table" role="presentation">
		<tbody>
			<tr>
				<th scope="row">
					<label for="">Label</label>
				</th>
				<td>
					<input name="test_input" type="text" id="" value="<?php echo $v['test_input']; ?>" class="regular-text" />
					<p class="description" id="tagline-description">Beschreibung</p>
				</td>
			</tr>
 
		</tbody>
	</table>
 
	<?php submit_button(); ?>
</form>
</div>

Page Tools