Twórz posty i strony Wordpress za pomocą PHP - 101
- 1. Aktualnie czytam: Twórz posty i strony WordPress przy użyciu PHP – samouczek 101
2. Zarządzaj postami WordPress za pomocą PHP – twórz i aktualizuj
Bez wątpienia widziałeś motywy i wtyczki WordPress, które rzekomo automatycznie instalowały dla Ciebie „fałszywe dane” podczas ich instalacji, dzięki czemu od razu masz w pełni funkcjonalną stronę internetową. Pokażę Ci metodę osiągnięcia tego przy użyciu wyłącznie funkcji PHP.
Może to być przydatne, jeśli:
- Twój motyw lub wtyczka wymaga określonych postów lub stron.
- Chcesz zapewnić fikcyjną instalację premium, jak opisano powyżej.
- Chcesz zautomatyzować tworzenie postów.
- Chcesz się po prostu uczyć.
W tym samouczku stworzymy prostą funkcję dla początkujących, aby uzyskać „szybkie i brudne” działające rozwiązanie. W dalszej części innego samouczka dowiemy się, jak rozszerzyć to, czego się tutaj nie nauczyliśmy, aby stworzyć solidny i łatwy w użyciu system publikowania.
Dla tych z Was, którzy wolą bawić się istniejącym kodem, zamiast czytać wszystkie instrukcje, oto nasza ostatnia funkcja wraz z przykładem jej użycia i uwagami.
if ( ! function_exists( 'PostCreator' ) ) {
function PostCreator(
$name = 'AUTO POST',
$type = 'post',
$content = 'DUMMY CONTENT',
$category = array(1,2),
$template = NULL,
$author_id = '1',
$status = 'publish'
) {
define( POST_NAME, $name );
define( POST_TYPE, $type );
define( POST_CONTENT, $content );
define( POST_CATEGORY, $category );
define( POST_TEMPLATE, '' );
define( POST_AUTH_ID, $author_id );
define( POST_STATUS, $status );
if ( $type == 'page' ) {
$post = get_page_by_title( POST_NAME, 'OBJECT', $type );
$post_id = $post->ID;
$post_data = get_page( $post_id );
define( POST_TEMPLATE, $template );
} else {
$post = get_page_by_title( POST_NAME, 'OBJECT', $type );
$post_id = $post->ID;
$post_data = get_post( $post_id );
}
function hbt_create_post() {
$post_data = array(
'post_title' => wp_strip_all_tags( POST_NAME ),
'post_content' => POST_CONTENT,
'post_status' => POST_STATUS,
'post_type' => POST_TYPE,
'post_author' => POST_AUTH_ID,
'post_category' => POST_CATEGORY,
'page_template' => POST_TEMPLATE
);
wp_insert_post( $post_data, $error_obj );
}
if ( ! isset( $post ) ) {
add_action( 'admin_init', 'hbt_create_post' );
return $error_obj;
}
}
}
/* All available options for PostCreator()
PostCreator( 'TITLE' , 'POST TYPE' , 'POST CONTENT' , 'POST CATEGORY' , 'TEMPLATE FILE NAME' , 'AUTHOR ID NUMBER' , 'POST STATUS');
TITLE - HTML Stripped Out. Simple String.
POST TYPE - Post type slug. Eg 'post' or 'page'. Custom Post Types are supported.
POST CONTENT - Content of the Post/Page. HTML allowed.
POST CATEGORY - An array of the integer ID's of the category/categories you want to link to your post
TEMPLATE FILE NAME - File name of the template. Only for Pages. In the format 'file_name.php'.
AUTHOR ID NUMBER - Integer value. Default is 1.
POST STATUS - Available options; [ 'draft' | 'publish' | 'pending'| 'future' | 'private' | custom registered status ]
If successful, PostCreator() returns nothing.
If there is an error PostCreator() returns a WP_error object.
*/
PostCreator( 'My Lorem Ipsum', 'page', 'With a sizable serving of Dolor. This was created using Harri Bell-Thomas\'s PostCreator function.' );Przewodnik krok po kroku
Będziemy tworzyć funkcję PHP o nazwie PostCreator() i będziemy potrzebować jej do przyjęcia określonych parametrów. Każdemu parametrowi przypisano wartość domyślną, więc technicznie rzecz biorąc, przy wywoływaniu funkcji nie trzeba określać żadnego z nich, ale hej, gdzie tu zabawa?
function PostCreator(
$name = 'AUTO POST',
$type = 'post',
$content = 'DUMMY CONTENT',
$category = array(1,2),
$template = NULL,
$author_id = '1',
$status = 'publish'
) {
// function output here
}Następnie zdefiniuję pewne stałe, które są niezbędne dla poniższej funkcji wbudowanej. (Można to przepisać, aby nie używać stałych, ale użyłem ich, ponieważ uważam je za przydatne podczas rozszerzania podstawowej funkcji PostCreator(), ale to historia na inny tutorial.
define( POST_NAME, $name );
define( POST_TYPE, $type );
define( POST_CONTENT, $content );
define( POST_CATEGORY, $category );
define( POST_TEMPLATE, '' );
define( POST_AUTH_ID, $author_id );
define( POST_STATUS, $status );OK, na razie wszystko w porządku. Teraz dodałem pewną weryfikację, aby zapobiec generowaniu zduplikowanych postów/stron (co jest koszmarem, zaufaj mi!). Ta weryfikacja sprawdza, czy post/strona o tej samej nazwie już istnieje. Jeśli tak, nie tworzy nowego, ale jeśli nie, tworzy go za ciebie.
Powodem, dla którego zdecydowałem się sprawdzić tytuł posta, jest to, że to wszystko, czego potrzebuje WordPress do wygenerowania strony (reszta jest generowana automatycznie). Inne sposoby przeprowadzania tej weryfikacji obejmują sprawdzanie „ślimaków” lub identyfikatorów pocztowych. Do tego wszystkiego dojdziemy w późniejszym samouczku.
Jest to szczególnie przydatne, jeśli post/strona jest wymagana przez wtyczkę lub motyw. Najpierw opracowałem to dla jednej z moich wtyczek, ponieważ wymagało to obecności strony z określonym szablonem strony. Dzięki tej funkcji po prostu zachowałem PostCreator() jako „admin_init” WordPressa, co oznacza, że jeśli ktoś spróbuje go usunąć (jak śmieci!), zostanie natychmiast utworzony ponownie, aby zapobiec problemom z resztą wtyczki.
Pamiętaj, że nikt nie chce, aby jego blog został przejęty, więc upewnij się, że wyraźnie poinformujesz go, co się dzieje, i być może zapewnisz mu opcję wyłączenia tej funkcji.
Wróćmy teraz do walidacji. Oto kolejny fragment kodu.
if ( $type == 'page' ) {
$post = get_page_by_title( POST_NAME, 'OBJECT', $type );
$post_id = $post->ID;
$post_data = get_page( $post_id );
define( POST_TEMPLATE, $template );
} else {
$post = get_page_by_title( POST_NAME, 'OBJECT', $type );
$post_id = $post->ID;
$post_data = get_post( $post_id );
}Więc co tu się do cholery dzieje?
Cóż, jest to zasadniczo ten sam proces powtórzony dwukrotnie. Robię to ze względu na nieco inne traktowanie postów i stron. Ponadto stała POST_TEMPLATE jest zdefiniowana tylko wtedy, gdy próbujesz utworzyć stronę, ponieważ tylko strony mogą zaakceptować ten parametr (tzn. zostanie on zignorowany, jeśli spróbujesz utworzyć standardowy post).
W pierwszym wierszu klauzuli IF (jej techniczna nazwa to „apodoza”, jeśli jeszcze tego nie wiesz) zdefiniowana jest zmienna $post. Jeśli istnieje post/strona o tej samej nazwie, która ma zostać utworzona, $post zostanie zapełniony danymi istniejącego wpisu (jako obiekt, a nie tablica, ale można to zmienić, jeśli jest to absolutnie konieczne). Ta zmienna służy do sprawdzania, czy Twój tytuł jest unikalny. Następne dwie linie umieściłem, ponieważ są one bardzo przydatne, jeśli chcesz rozszerzyć tę funkcję. Przykładem może być aktualizacja istniejącego wpisu, jeśli już istnieje.
Następna jest nasza zagnieżdżona funkcja, która zostanie dodana do haka „admin_head”. Oto jest;
function hbt_create_post() {
$post_data = array(
'post_title' => wp_strip_all_tags( POST_NAME ),
'post_content' => POST_CONTENT,
'post_status' => POST_STATUS,
'post_type' => POST_TYPE,
'post_author' => POST_AUTH_ID,
'post_category' => POST_CATEGORY,
'page_template' => POST_TEMPLATE
);
wp_insert_post( $post_data, $error_obj );
}Po prostu wykorzystuje wbudowaną funkcję WordPress (wp_insert_post) do generowania naszego postu/strony. Wypełniamy $post_data tablicą naszych parametrów (tutaj możesz zobaczyć używane przez nas stałe). Jest on tworzony i jeśli wystąpi błąd, generuje wartość logiczną $error_obj. PRAWDA=problem. FAŁSZ=Wszystko w porządku. Ostatnią rzeczą do zrobienia jest uruchomienie poprzedniej funkcji na panelu administracyjnym, ale tylko wtedy, gdy przejdzie ona weryfikację, i zwrócenie obiektu błędu.
if ( ! isset( $post ) ) {
add_action( 'admin_init', 'hbt_create_post' );
return $error_obj;
}Świetnie! Teraz stworzyliśmy naszą niesamowitą funkcję, użyjmy jej!
Stosowanie
Po prostu dołącz funkcję PostCreator() i uruchom ją.
Będzie to działać przy użyciu wartości domyślnych, ale co, jeśli chcemy możliwości dostosowania? Następnie używamy naszych parametrów.
PostCreator(
'TITLE',
'POST TYPE',
'POST CONTENT',
'POST CATEGORY',
'TEMPLATE FILE NAME',
'AUTHOR ID NUMBER',
'POST STATUS'
);W przypadku wszystkich tych opcji uważaj na używanie apostrofów. Upewnij się, że jeśli chcesz użyć apostrofu (z wyjątkiem tych otaczających same parametry), poprzedź go ukośnikiem odwrotnym. Np;
PostCreator( 'Alex\'s Post' );Parametr TITLE akceptuje wartość ciągu. Jest to pozbawione znaczników HTML.
Parametr POST TYPE akceptuje na przykład informację o typie postu; „post” lub „strona”. Obsługiwane są niestandardowe typy postów.
PostCreator( 'Alex\'s Post', 'page' );POST CONTENT akceptuje wartość ciągu. Będzie to treść utworzonego posta/strony. HTML jest tutaj dozwolony.
PostCreator( 'Alex\'s Post', 'page', 'The force is strong with this one…' );KATEGORIA POST akceptuje tablicę liczb całkowitych. Liczby całkowite odpowiadają identyfikatorowi kategorii/kategorii przypisanych do wpisu/strony.
PostCreator( 'Alex\'s Post', 'page' , 'The force is strong with this one…' , array( 1, 2 ) );NAZWA PLIKU SZABLONU to wartość ciągu znaków definiująca pożądany szablon strony nowej strony. Działa to tylko w przypadku stron. Format będzie; „nazwa_pliku.php”.
PostCreator(
'Alex\'s Post',
page',
'The force is strong with this one…',
array( 1, 2 ) ,
'fullwidth_page.php'
);NUMER IDENTYFIKACYJNY AUTORA jest wartością całkowitą identyfikatora autora.
PostCreator(
'Alex\'s Post',
'page',
'The force is strong with this one…',
array( 1, 2 ) ,
'fullwidth_page.php',
'1'
);STATUS POSTU pozwala na zdefiniowanie stanu tworzonego wpisu/strony. Domyślnie jest „opublikowany”.
Dostępne opcje; [ „szkic” | „publikuj” | „oczekuje”| „przyszłość” | „prywatny” | niestandardowy status rejestracji]
PostCreator(
'Alex\'s Post',
'page',
'The force is strong with this one…',
array( 1, 2 ) ,
'fullwidth_page.php',
'1',
'publish'
);Podsumowanie
WordPress to wyjątkowo potężne narzędzie, ale czasami może być niesforne. Mam nadzieję, że ten prosty fragment okaże się przydatny, być może dowiesz się przy okazji kilku rzeczy. Czekajcie na następny, w którym zamierzam przekonwertować to, co zrobiliśmy już w tym artykule, na klasę PHP, dodając więcej funkcjonalności i stabilności. Aby zobaczyć podgląd, sprawdź kod na Githubie: PostController
Jeśli masz jakieś pytania, po prostu zadaj je w sekcji komentarzy poniżej.
