ウェブサイト検索

PHP を使用して Wordpress の投稿とページを作成する - 101


  1. 1.現在読んでいる: PHP を使用して WordPress の投稿とページを作成する – 101 のチュートリアル
  2. <スパン>2. PHP を使用した WordPress 投稿の管理 – 作成と更新

インストール時に「ダミーデータ」を自動的にインストールして、すぐに完全に機能する Web サイトを作成できると主張する WordPress のテーマやプラグインを見たことがあるでしょう。 PHP 関数のみを使用してこれを実現する方法を紹介します。

これは次の場合に役立ちます。

  • テーマまたはプラグインには特定の投稿またはページが必要です。
  • 上で説明したように、プレミアム ダミー インストールを提供したいと考えています。
  • 投稿の作成を自動化したいと考えています。
  • あなたはただ学びたいだけなのです。

このチュートリアルでは、「迅速かつ汚い」実用的なソリューションを実現するための簡単な初心者向け関数を作成します。後の別のチュートリアルでは、ここで学んだことを拡張して堅牢で使いやすい投稿システムを作成する方法を学びます。

すべてのハウツーを読むのではなく、既存のコードを試してみたいという方のために、最後の関数とその使用例と注意事項を示します。

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.' );

ステップバイステップガイド

PostCreator() という PHP 関数を作成します。この関数は特定のパラメーターを受け取る必要があります。各パラメータにはデフォルトが与えられているため、技術的には関数を呼び出すときにパラメータを指定する必要はありません。しかし、それのどこが楽しいのでしょうか?

function PostCreator(

	$name      = 'AUTO POST',
	$type      = 'post',
	$content   = 'DUMMY CONTENT',
	$category  = array(1,2),
	$template  = NULL,
	$author_id = '1',
	$status    = 'publish'
) {

	// function output here

}

次に、次の組み込み関数に必要な定数をいくつか定義します。 (これは、定数を使用しないように書き直すこともできますが、基本的な PostCreator() 関数を拡張するときに便利だと思うので定数を使用していますが、それは別のチュートリアルの話です。

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、ここまでは順調です。ここで、重複した投稿/ページが生成されないようにいくつかの検証を組み込みました (これは悪夢です、信じてください!)。この検証では、同じ名前の投稿/ページがすでに存在するかどうかがチェックされます。存在する場合は新しいものは作成されませんが、存在しない場合は自動的に作成されます。

投稿のタイトルをチェックすることにした理由は、WordPress がページを生成するために必要なのはそれだけであるためです (残りは自動的に生成されます)。この検証を実行する他の方法には、「スラッグ」または投稿 ID との照合などがあります。これらすべてについては、後のチュートリアルで説明します。

これは、プラグインまたはテーマで投稿/ページが必要な場合に特に便利です。私が最初にこれをプラグインの 1 つとして開発したのは、ページに特定のページ テンプレートが存在する必要があるためです。この関数では、単に PostCreator() が WordPress の「admin_init」であることを維持しました。これは、誰かがそれを削除しようとした場合(なんて大胆な!)、残りのプラグインの問題を防ぐためにすぐに再作成されることを意味します。

自分のブログが乗っ取られることを望んでいる人はいないでしょう。そのため、何が起こっているのかを明確に伝え、場合によってはブログをオフにするオプションを提供するようにしてください。

さて、検証に戻ります。次のコードは次のとおりです。

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 );
}

それで、ここで一体何が起こっているのでしょうか?

これは基本的に同じプロセスを 2 回繰り返すことになります。投稿とページの扱い方が少し異なるため、これを行っています。また、定数 POST_TEMPLATE は、ページを作成しようとしている場合にのみ定義されます。これは、そのパラメータを受け入れることができるのはページだけであるためです (つまり、標準の投稿を作成しようとしている場合は無視されます)。

IF 句の最初の行 (ご存知ない方のために、その技術名は「アポドーシス」です) で、$post 変数が定義されています。作成しようとしているのと同じ名前の投稿/ページがある場合、$post には既存のエントリのデータが入力されます (配列ではなくオブジェクトとして、ただしこれは絶対に必要な場合に変更できます)。この変数は、タイトルが一意であるかどうかをテストするために使用されます。次の 2 行は、この機能を拡張する場合に非常に役立つため、ここに含めました。この例としては、既存の投稿がすでに存在する場合はそれを更新することが考えられます。

次に、「admin_head」フックに追加されるネストされた関数です。ここにあります;

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 );
}

簡単に言うと、これは WordPress の組み込み関数 (wp_insert_post) を使用して投稿/ページを生成しています。 $post_data にパラメーターの配列を入力します (使用中の定数はここで確認できます)。これが作成され、エラーがある場合はブール値 $error_obj が生成されます。 TRUE=問題があります。 FALSE=問題ありません。最後に行うことは、前の関数を管理ヘッドで実行することですが、検証に合格した場合のみ、エラー オブジェクトを返します。

if ( ! isset( $post ) ) {
	add_action( 'admin_init', 'hbt_create_post' );
	return $error_obj;
}

素晴らしい!素晴らしい関数を作成したので、使ってみましょう。

使用法

PostCreator() 関数を含めて実行するだけです。

これはデフォルト値を使用して実行されますが、カスタマイズ可能性が必要な場合はどうすればよいでしょうか?次に、パラメータを使用します。

PostCreator(
	'TITLE',
	'POST TYPE',
	'POST CONTENT',
	'POST CATEGORY',
	'TEMPLATE FILE NAME',
	'AUTHOR ID NUMBER',
	'POST STATUS'
);

これらすべてのオプションでは、アポストロフィの使用に注意してください。アポストロフィを使用する場合は (パラメータ自体を囲むアポストロフィを除く)、必ずその前にバックスラッシュを付けてください。例えば;

PostCreator( 'Alex\'s Post' );

TITLE パラメータは文字列値を受け入れます。これは HTML タグを取り除いたものです。

POST TYPE パラメータは、たとえば、投稿タイプのスラッグを受け入れます。 「投稿」または「ページ」。カスタム投稿タイプがサポートされています。

PostCreator( 'Alex\'s Post', 'page' );

POST CONTENT は文字列値を受け入れます。これが作成された投稿/ページのコンテンツになります。ここでは HTML が許可されています。

PostCreator( 'Alex\'s Post', 'page', 'The force is strong with this one…' );

POST CATEGORY は整数の配列を受け入れます。整数は、投稿/ページに関連付けられたカテゴリの ID に対応します。

PostCreator( 'Alex\'s Post', 'page' , 'The force is strong with this one…' , array( 1, 2 ) );

TEMPLATE FILE NAME は、新しいページの目的のページ テンプレートを定義する文字列値です。これはページに対してのみ機能します。形式は次のようになります。 「ファイル名.php」。

PostCreator(
	'Alex\'s Post',
	page',
	'The force is strong with this one…',
	array( 1, 2 ) ,
	'fullwidth_page.php'
);

AUTHOR ID NUMBER は、著者の ID の整数値です。

PostCreator(
	'Alex\'s Post',
	'page',
	'The force is strong with this one…',
	array( 1, 2 ) ,
	'fullwidth_page.php',
	'1'
);

POST STATUS では、作成された投稿/ページの状態を定義できます。デフォルトでは「公開」になっています。

利用可能なオプション; [ 「草案」 | 「公開」 | 「保留中」| 「未来」 | 「プライベート」 |カスタム登録状況】

PostCreator(
	'Alex\'s Post',
	'page',
	'The force is strong with this one…',
	array( 1, 2 ) ,
	'fullwidth_page.php',
	'1',
	'publish'
);

まとめ

WordPress は非常に強力なツールですが、時には手に負えない場合もあります。この簡単な抜粋が役に立つことを願っており、おそらくその過程で 1 つか 2 つのことを学ぶことができます。次回の記事では、この記事ですでに行ったことを PHP クラスに変換して、機能と安定性をさらに追加します。スニーク プレビューについては、Github のコードをチェックしてください: PostController

ご質問がございましたら、下のコメント欄にご記入ください。