WP Branches For Postの修正

会社で使ってるWordPressのエディタをやっとGutenbergに移行しようとしたんだが、公開済みの記事を更新する際に、既存の記事を公開中でキープしたまま下書き保存してレビューに回したり、ってことをするために入れてたプラグイン(WP Post Branches)がなんとGutenberg非対応だった。3年以上更新が止まっていた…。参考記事

そんなわけで代替プラグインを探していて、WP Branches For Postというやつにたどり着いたんだが、有効ダウンロード数”10+”というめっちゃマイナーなヤツだった。紹介記事もほとんど見かけない。

でもまあ何とかなるだろうと導入してみたんだが、ブランチを公開するところでエラーが出る。「公開に失敗しました。返答が正しいJSONレスポンスではありません。」だとさ。

公開時にエラー

テーマやプラグインとの相性かなと思って、自宅サーバでも試したけどやっぱり同じなので、ちょっとプラグインのソースを見てみたら、変なところ(219行目)に”exit;”があったので、これをコメントアウトしたら、エラーは出なくなった。それでいいのか???

		wbfp_copy_post_taxonomies( $id, $original_id, $post['post_type'] );
		wbfp_inherited_branch_revision( $id, $original_id );
		wp_delete_post( $id, true );
		wp_safe_redirect( admin_url( '/post.php?post=' . $original_id . '&action=edit&message=1' ) );
//		exit;
 	}
}	
add_action( 'publish_page', 'wbfp_original_post_pages_update', 9999, 2 );
add_action( 'publish_post', 'wbfp_original_post_pages_update', 9999, 2 );

と思ったけど、直前のAPI(wp_safe_redirect())の説明を見てみたら「直後にexitを呼ぶべき」と書かれてるなぁ。

ブランチを公開Ver.に上書きしたあと、公開Ver.の編集ページにリダイレクトしようとしてるのかな。messageって引数がよく分からんので削ってみるか…。おっと、exit;のコメントを解除するの忘れてた。

うーん、すんなりいかんなあ。リダイレクトされない…。なんだろなー。リダイレクトだけで実験してみてもだめ。ここではリダイレクトできないってことなのかなあ。

Ajaxのせいか!分かんないんだよなー。

いつのバージョンからか、編集画面の公開ボタンとかがAjax化されていて、サーバ側のPHPでリダイレクトしようとしても呼び出し側がAjaxだとハンドリングできないので、PHPからJSONレスポンスでリダイレクト先URLを渡して、Ajax側のJavaScriptでリダイレクトせよ、とのこと。参考

しかし、既存画面のボタンとそのコールバック関数は、難解なJavaScriptに埋もれてさっぱり分からん…。

ええい、無理やりリダイレクトしてやれ!

--- ./post-branch.php	2020/11/13 02:19:45	1.1
+++ ./post-branch.php	2020/11/20 14:54:41
@@ -109,6 +109,58 @@
 add_action ( 'wp_before_admin_bar_render', 'wbfp_add_button_in_adminbar' );
 
 /*
+ * 公開ボタンにリダイレクト処理を無理やり追加
+ * 参考情報:
+ *  https://matsumu.com/2020/02/23/1-160/
+ *  https://qiita.com/amamamaou/items/624c22adec32515e863b
+ *  https://memocarilog.info/wordpress/7570
+ */
+function custom_block_editor_settings() {
+	// ブランチの場合だけ処理を追加
+	$branch_id = get_the_ID();
+	$original_id = get_post_meta( $branch_id, '_original_post_id', true );
+	if ( ! $original_id ) {
+		return;
+	}
+	
+	// リダイレクト先のURL(オリジナルの編集ページ)
+	$url = admin_url( '/post.php?post=' . $original_id . '&action=edit&message=1' );
+
+	?>
+	<script>
+		// 2つ目の「公開」ボタンに追加する処理
+		// ※Ajax呼び出しを数秒待ってからオリジナルの編集ページへリダイレクト
+		function custom_publish_action() {
+			setTimeout(
+				function () {
+					window.location.href = "<?php echo $url; ?>";
+				},
+				2000);
+		}
+		
+		// 1つ目の「公開」ボタンに追加する処理
+		// ※2つ目の「公開」ボタンが表示されるのを待って、クリック後に上の関数(オリジナルへのリダイレクト)を追加する
+		function custom_prepublish_action() {
+			setTimeout(
+				function () {
+					//alert("<?php echo $url; ?>");
+					document.querySelector( '.editor-post-publish-button' ).addEventListener("click", custom_publish_action);
+				},
+				500);
+		}
+
+		// ページロード後に1つ目の「公開」ボタンに処理(※)を追加する
+		// ※2つ目の「公開」ボタンクリック後にもう1アクション
+		window.onload = function() {
+			// https://qiita.com/KKKarin/items/ccb8ed361ab9acd1f9cf
+			document.querySelector( '.editor-post-publish-button__button' ).addEventListener("click", custom_prepublish_action);
+		};
+	</script>
+<?php
+}
+add_action('admin_print_scripts-post.php', 'custom_block_editor_settings' );
+
+/*
  *	Add css for adminbar-icon
  */
 function wbfp_add_css() {
@@ -215,8 +267,8 @@
 		wbfp_copy_post_taxonomies( $id, $original_id, $post['post_type'] );
 		wbfp_inherited_branch_revision( $id, $original_id );
 		wp_delete_post( $id, true );
-		wp_safe_redirect( admin_url( '/post.php?post=' . $original_id . '&action=edit&message=1' ) );
-		exit;
+//		wp_safe_redirect( admin_url( '/post.php?post=' . $original_id . '&action=edit&message=1' ) );
+//		exit;
  	}
 }	
 add_action( 'publish_page', 'wbfp_original_post_pages_update', 9999, 2 );

ざっくり説明すると、最初から表示されてる公開ボタンを押すと、公開/キャンセルの確認画面が出てくるって流れなんだけど、それぞれの公開ボタンをHTMLタグのクラスで特定して、2つ目の公開ボタンのクリックイベントにリダイレクト処理を埋め込む、と言うもの。

しかし、2つ目の公開ボタンは表示されるまでJavaScriptで検出できないので、わざわざsleepモドキで待ってやったりして、無理やりリダイレクト成功。こんなのでいいのか??

たぽ
  • たぽ
  • カレン(ST206 3S-GE VVT-i)、BRZ(ZC6 RAエアコン有)でサーキットを走ってます。
    クルマ弄りは基本的にDIY。そのため(?)にガレージ付きの家建てました。

    数年前から登山にも目覚め、時々アウトドアな日記・動画もアップしてます。

1件のピンバック

コメントを残す

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください