[WordPress] Jak stworzyć własną wtyczkę?

Tworzenie własnej wtyczki do WordPressa jest dość proste. System ten oferuje dość spore i dobrze udokumentowane API, z którym trzeba się zapoznać przed rozpoczęciem pracy nad wtyczką.

Przed rozpoczęciem kodowania zapoznaj się z Action Reference i Filter Reference. Filtry i akcje są podstawą rozbudowy funkcjonalności WordPressa bez konieczności ingerencji w pliki systemowe.

Przed utworzeniem lub pobraniem jakiejś wtyczki zastanów się czy jej funkcjonalności nie można stworzyć poprzez funkcję w pliku functions.php, bo jeśli tak to po co obciążać WordPressa dołączaniem kolejnych zbędnych plików?

Nazwa pliku wtyczki

Przed rozpoczęciem tworzenia wtyczki utwórz katalog z jej nazwą w katalogu /plugins. Nazwa katalogu powinna odzwierciedlać nazwę wtyczki. Jeśli Twoja wtyczka będzie składała się tylko z jednego pliku PHP nie musisz tworzyć dla niej katalogu, a bezpośrednio tworzysz plik PHP wtyczki w katalogu /plugins. Podobnie jak w przypadku nazwy katalogu, nazwa pliku PHP powinna odzwierciedlać nazwę wtyczki.

Na potrzeby niniejszego wpisu stworzymy wtyczkę dodającą tagi meta description i keywords na stronie postu każdego typu, a nazwa pluginu to Simple Meta Tags. Tworzymy więc plik simple-meta-tags.php.

Nagłówek

Nagłówek pliku wtyczki to zwykły wieloliniowy komentarz PHP. Nagłówek taki może zawierać oprócz nazwy wtyczki informacje o autorze, wersji, licencji oraz kilka innych (opcjonalnych). Wymaganym wierszem jest Plugin Name czyli nazwa wtyczki. W tej wtyczce dodamy jeszcze kilka innych wierszy z informacjami o niej:

<?php

	/**
	* Plugin Name: Simple Meta Tags
	* Description: Dodaje tagi meta description i keywords do postów.
	* Version: 1.0
	* Author: ukodowani.pl
	* Author URI: https://www.ukodowani.pl
	* License: GPL2
	*/

Oprócz nazwy wtyczki dodano jeszcze wiersze: opis, wersja, autor, strona autora, licencja i adres licencji.

Właściwy kod wtyczki

Teraz utworzymy klasę MetaTags z metodami: add_meta_tags, update, meta_tags_fields oraz add_meta_tags_meta_box.

class MetaTags {
	
		public function add_meta_tags() {
		
			global $post;
			
			if(is_singular()) {
			
				$meta_description = get_metadata('post', $post->ID, 'meta_description', true);
				$meta_keywords = get_metadata('post', $post->ID, 'meta_keywords', true);
				
				if($meta_description != '') {
				
					echo '<meta name="description" content="' . $meta_description . '" />' . "\n";
					
				}
				
				if($meta_keywords != '') {
				
					echo '<meta name="keywords" content="' . $meta_keywords . '" />' . "\n";
					
				}
				
			}
			
		}
		
		public function update($post_id) {
		
			if(!current_user_can('edit_post', $post_id)) return;
			
			if(wp_is_post_revision($post_id)) return;
			
			$meta_description = htmlentities($_POST['meta_description'], ENT_COMPAT | ENT_HTML401, 'UTF-8');
			$meta_keywords = htmlentities($_POST['meta_keywords'], ENT_COMPAT | ENT_HTML401, 'UTF-8');
			
			if(!empty($_POST['meta_description'])) {
			
				update_metadata('post', $post_id, 'meta_description', $meta_description);
				
			}
			
			else delete_metadata('post', $post_id, 'meta_description');
			
			if(!empty($_POST['meta_keywords'])) {
			
				update_metadata('post', $post_id, 'meta_keywords', $meta_keywords);
				
			}
			
			else delete_metadata('post', $post_id, 'meta_keywords');
			
		}
		
		public function meta_tags_fields($post) {
		
			$meta_description = get_metadata('post', $post->ID, 'meta_description', true);
			$meta_keywords = get_metadata('post', $post->ID, 'meta_keywords', true);
			
			echo '<p><label for="meta-description"><input type="text" name="meta_description" value="' . $meta_description . '" id="meta-description" placeholder="Opis..." style="width:100%;" /></label></p>';
			echo '<p><label for="meta-keywords"><input type="text" name="meta_keywords" value="' . $meta_keywords . '" id="meta-keywords" placeholder="Słowa kluczowe..." style="width:100%;" /></label></p>';
			
		}
		
		public function add_meta_tags_meta_box() {
		
			add_meta_box('meta_tags', 'Tagi meta', [$this, 'meta_tags_fields'], '', 'side', 'high');
			
		}
		
	}

Zarejestrowanie metod dla akcji

Pozostało jeszcze tylko utworzyć obiekt klasy MetaTags i zarejestrować wywołanie metod przy akcjach:

$meta_tags = new MetaTags();
	
add_action('wp_head', [$meta_tags, 'add_meta_tags'], 1);
add_action('save_post', [$meta_tags, 'update']);
add_action('add_meta_boxes', [$meta_tags, 'add_meta_tags_meta_box']);

To wszystko, wtyczka gotowa. Opiszę teraz pokrótce jakie zadania pełnią zdefiniowane metody:

  • Metoda add_meta_tags wywoływana przez akcję wp_head ma za zadanie wyświetlić tagi meta description i keywords na stronie postu każdego typu czyli post, strony i inne. Tagi te zostaną dodane do sekcji head strony tylko wtedy, gdy zostaną uzupełnione.
  • Metoda update ma za zadanie zaktualizować wartości dla tagów description i keywords, czyli po prostu aktualizujemy metadane dla danego postu funkcją API update_metadata.
  • W funkcji meta_tags_fields pobieramy i wyświetlamy wartości naszych tagów meta dla potrzeb edycji w panelu. Funkcja ta będzie użyta jako callback w funkcji add_meta_box.
  • Funkcja add_meta_tags_meta_box dodaje box na stronie edycji posta z polami do edycji naszych dwóch tagów. Funkcja ta wywołuje funkcję API add_meta_box, która ma za zadanie dodać taki box na stronie edycji posta w pasku po prawej stronie.

Komentarze

Popular

[C++] Jak obliczyć pole i obwód trapezu?

[PHP] Jak pobrać adres strony?

[HTML] Jak wyśrodkować tekst?