wordpressでcustom post typeの投稿をremoteで行う

 

wordpressでCustomPostTypeを作成し、リモートのクライアント・プログラムから投稿を自動で行おうとしたのですが、結構コツが必要だったので、メモしておきます。

基本的にはクライアント側で「post_type」にカスタムのpost typeをセットすればいいのですが、そのままではwordpressが認識できず、wordpress側で対応を行っておく必要があります。

変更箇所は、httpdocs配下にuploadしたwordpressのディレクトリの中の以下のソースです。

wp-includes/class-wp-xmlrpc-server.php

wordpress側では、上記のphpで、xml-rpc投稿のハンドリングを行っています。デフォルトではこの中で「post」と「page」タイプの投稿にしか対応していないので、ここに、作成したcustom post type を追加する必要があるという訳です。

それでは、実際に変更してみましょう。

まずは、念のため、class-wp-xmlrpc-server.phpをバックアップしておき、テキストエディタで開いてみましょう。

変更箇所は「metaWeblog.newPost」をつかさどる関数ですので、「metaWeblog.newPost」で検索してみましょう。すると、「metaWeblog.newPost’ => ‘this:mw_newPost’」という行が見つかるかもしれません。「mw_newPost」が、新規投稿を行う関数になります。この関数名はwordpressのバージョンによって異なる可能性がありますので、実際に検索してみることをお勧めします。

修正対象の関数が分かれば、実際にその関数の中身を修正していきます。

まずは、post typeをハンドリングしている部分に、以下を加えます。(add this placeとなっている部分です)

if ( !empty( $content_struct['post_type'] ) ) {
			if ( $content_struct['post_type'] == 'page' ) {
				if ( $publish )
					$cap  = 'publish_pages';
				elseif ('publish' == $content_struct['page_status'])
					$cap  = 'publish_pages';
				else
					$cap = 'edit_pages';
				$error_message = __( 'Sorry, you are not allowed to publish pages on this site.' );
				$post_type = 'page';
				if ( !empty( $content_struct['wp_page_template'] ) )
					$page_template = $content_struct['wp_page_template'];
			} elseif ( $content_struct['post_type'] == 'post' ) {
				if ( $publish )
					$cap  = 'publish_posts';
				elseif ('publish' == $content_struct['post_status'])
					$cap  = 'publish_posts';
				else
					$cap = 'edit_posts';
				$error_message = __( 'Sorry, you are not allowed to publish posts on this site.' );
				$post_type = 'post';
			} 
			//↓↓↓↓↓add this place↓↓↓↓↓
			elseif ( $content_struct['post_type'] == 'videos' ) {
				if ( $publish )
					$cap  = 'publish_posts';
				elseif ('publish' == $content_struct['post_status'])
					$cap  = 'publish_posts';
				else
					$cap = 'edit_posts';
				$error_message = __( 'Sorry, you are not allowed to publish posts on this site.' );
				$post_type = 'videos';
			} 
			//↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑
			else {
				// No other post_type values are allowed here
				return new IXR_Error( 401, __( 'Invalid post type.' ) );
			}
		}

 

もう一つは、ユーザによって、投稿できるかどうかを制限している部分になります。

if ( isset($content_struct['wp_author_id']) && ($user->ID != $content_struct['wp_author_id']) ) {
			switch ( $post_type ) {
				case "post":
					if ( !current_user_can('edit_others_posts') )
						return(new IXR_Error(401, __('You are not allowed to post as this user')));
					break;
				case "page":
					if ( !current_user_can('edit_others_pages') )
						return(new IXR_Error(401, __('You are not allowed to create pages as this user')));
					break;
				//↓↓↓↓↓add this place↓↓↓↓
				case "videos":
					if ( !current_user_can('edit_others_pages') )
						return(new IXR_Error(401, __('You are not allowed to create types as this user')));
					break;
				default:
					return(new IXR_Error(401, __('Invalid post type.')));
					break;
				//↑↑↑↑↑↑↑↑↑↑
			}
			$post_author = $content_struct['wp_author_id'];
		}

 

どちらの箇所も、直前のpostタイプの記述をコピーして作成したカスタムポストタイプに変更すればOKです。

これで、wordpress側の対応が完了です。後は、javaやphpなど、お好きなxml-rpcクライアントを利用して投稿してください。投稿タイプ(post_type)をpostではなく、自分の作成したタイプに変更するのを忘れずに。

こんな記事も関係あるかも。読んでみてね。

コメントを残す

サブコンテンツ

このページの先頭へ