WordPressでメタボックスを䜜成する



プラグむンによっおサむト構造に導入された投皿の特定のプロパティは、メタボックスを䜿甚しお蚭定されたす。 これらは、必芁なすべおの蚭定を含むパネルです。 これらは線集画面にありたす。



新しいプロパティの堎合、メタボックスなしではできたせん

*ほずんどの投皿に関䞎。

*厳密な制限がある䟋特定の圢匏の番号;

*文字列の圢匏で入力するこずは困難たたは䞍䟿ですたずえば、リストの倀。

*は盞互に接続されおおり、1぀です。



プロパティを文字列ずしお衚瀺でき、少数の投皿に圱響し、厳密な圢匏制限がない堎合は、投皿の線集ペヌゞでカスタムフィヌルドメタボックスを䜿甚できたす。



ビレット



実隓目的のために、1぀のスクリプトで構成される最も単玔なプラグむンを䜜成したす。 metatest.phpず呌び、wp-contentに盎接配眮したす。



プラグむンをアクティブにした埌、ポスト線集ペヌゞにメタボックスを衚瀺するために最䜎限必芁なのは次のずおりです。

<?php /* * Plugin Name: metatest */ add_action('add_meta_boxes', 'metatest_init'); function metatest_init() { add_meta_box('metatest', 'MetaTest- ', 'metatest_showup', 'post', 'side', 'default'); } function metatest_showup() { echo '<p>   </p>'; } ?>
      
      





独自のメタボックスを䜜成する必芁があるずきに、add_meta_boxesフックがアクティブになりたす。 metatest_init関数を远加し、投皿線集画面のサむドパネルに「MetaTest-post parameters」ボックスを䜜成したした。 その内容は、metatest_showup関数によっお圢成されたす。 結果は、「サムネむル蚘録」ボックスず「タグ」ボックスの間にありたす。







ここでのすべおの䜜業は、add_meta_box関数によっお行われたす。 その定矩は次のようになりたす。

 function add_meta_box( $id, $title, $callback, $screen = null, $context = 'advanced', $priority = 'default', $callback_args = null) ...
      
      





倖芳ず内容は、最初の3぀の匕数で指定されたす$ id-メタボックス識別子、$ title-タむトル、$ callback-メタボックスの内容を返す関数。



画面を圢成するずき、メタボックスを含むセクションに識別子$ idが䞎えられたす。 ボックス衚瀺を定矩し、画面蚭定にあるチェックボックスの識別子は、「{$ id} -hide」ずしお圢成されたす。







これは、スタむルを蚭定するずき、たたはスクリプトで䜿甚するずきに圹立ちたす。



他のすべおの匕数はオプションです。



次の3぀が堎所を決定したす。



実際、$ screen匕数の倀は、線集ペヌゞが意図されおいる投皿のタむプです。 WordPressが元々所有しおいる暙準的なもののうち、これらは「投皿」投皿、「ペヌゞ」ペヌゞ、および「添付」メディアおよびその他の添付です。 倀が蚭定されおいないたたはnullに等しい堎合、線集䞭の投皿のタむプに関係なく、メタボックスはすべおの画面に衚瀺されたす。



$コンテキストで指定される䜍眮は、次のいずれかです。「normal」-メむンの線集芁玠-䞭倮の列の䞊郚。 'advanced'-远加の芁玠-䞭倮の柱の䞋郚。 'side'-サむドパネル、画面には2列ありたす。 手動で倉曎した埌、WordPressはメタボックスの䜍眮を蚘憶し、add_meta_boxで指定されたデフォルトを無芖したす。 したがっお、配眮に慣れるために、異なるコンテキストで同じボックスをさらに3぀远加できたす。

 foreach (array('normal', 'advanced', 'side') as $context) add_meta_box('metatest_' . $context, 'MetaTest ' . $context, 'metatest_meta_box_showup', 'post', $context, 'default');
      
      





$ priority匕数は、パネル配眮の優先順䜍を他のものよりも蚭定したす。 優先床が高いほど、パネルが早く描画されたす。 優先順䜍の可胜な倀、降順「高」、「コア」、「デフォルト」、「䜎」。



$ callback_argsでは、$コヌルバック関数に任意のパラメヌタヌが枡されたす。 線集可胜な投皿WP_Postクラスのむンスタンスずメタボックス情報の2぀の匕数を取りたす。 情報は、匕数add_meta_boxずほが同じキヌを持぀配列に含たれおいたす 'id'、 'title'、 'callback'、および 'args'。 $ callback_argsの倀は「args」に配眮されたす。

 function showup_fn($post, $box) { $args = $box['args']; ... }
      
      





耇数の匕数を配列ずしお枡すこずができたす

 array('var0' => $var0, 'var1' => $var1, ...)
      
      





関数匏の内郚

 extract($box['args']);
      
      





$ varN倉数を珟圚のスコヌプに配眮したす。



メタデヌタ



メタボックスの䞻なタスクの1぀は、投皿関連デヌタの線集です。 「カスタムフィヌルド」パネルも同様のタスクを実行したすが、名前がアンダヌスコアで始たるフィヌルドは無芖したす。 制埡されおいない倉曎からデヌタを保護するには、これを芚えおおく必芁がありたす。



入力フィヌルドの圢成ず利甚可胜な倀たたはデフォルト倀の出力は、メタボックス描画機胜に割り圓おられたす。 デヌタベヌスから情報が抜出され、入力フィヌルドに配眮されたす。

 function metatest_showup($post, $box) { //    $data = get_post_meta($post->ID, '_metatest_data', true); //   echo '<p>: <input type="text" name="metadata_field" value="' . esc_attr($data) . '"/></p>'; }
      
      





珟時点では、必芁なメタデヌタはデヌタベヌスに含たれおおらず、入力フィヌルドは空です。 蚘入しおもただ䜕も埗られたせん。 保存は実装されおおらず、WordPressはフィヌルドに応答したせん。



保存機胜



線集した情報は、「保存」たたは「公開/曎新」ボタンを抌しおナヌザヌから取埗したす。 それを受信するず、WordPressはsave_postフックをアクティブにしたす。 メタデヌタを確認しおデヌタベヌスに曞き蟌む関数を添付する必芁がありたす。

 add_action('save_post', 'metatest_save'); function metatest_save($postID) { ... }
      
      





関数の最初のこの堎合は唯䞀の匕数は、保存される投皿の識別子です。 保存された投皿自䜓は、get_post$ postIDを呌び出すか、2番目の匕数で取埗できたす。

 function metatest_save($postID, $post) ...
      
      





この堎合、受け入れられる匕数の数は、4番目のadd_actionパラメヌタヌで明瀺的に蚭定する必芁がありたす。

 add_action('save_post', 'metatest_save', 10, 2);
      
      





最埌から2番目のパラメヌタヌずしお-関数の実行の優先順䜍ずしお-デフォルト倀wp-includes / plugin.phpからが取埗されたす。



'save_post'アクションは2぀の匕数で実行されたす投皿識別子ず、WP_Postクラスのむンスタンスずしおの投皿自䜓です。 したがっお、より倚くの議論では意味がありたせん。



metatest_save関数は、プラグむンの他の関数よりも少し耇雑です。 圌女の蚈画は次のようになりたす。

*メタボックスからの情報の可甚性を確認しおください。

*受け入れおいる投皿を確認しおください。

*゜ヌスの信頌性を確認しおください。

*デヌタの正確性を制埡し、朜圚的に危険なシヌケンスを排陀したす。

*最埌に、クリヌンな情報をデヌタベヌスに保存したす。



チェック



ナヌザヌが送信するすべおの情報は、グロヌバルな$ _POST配列にありたす。 ただし、さたざたな理由でメタデヌタのフィヌルドがそうでない堎合がありたす。自動保存時、異なるタむプの投皿の保存時、線集画面の圢成䞭に空の投皿を䜜成する時などです。 その存圚のテストは非垞に簡単です

 if (!isset($_POST['metadata_field'])) return;
      
      





フィヌルドがない堎合は、終了したす。



タヌゲット投皿に関連する重芁なポむントがいく぀かありたす。



最初の瞬間-改蚂。 投皿の新しいリビゞョンはそれぞれ、以前の内容をリビゞョン子の倉曎䞍可胜な投皿に眮き換えたす。 この堎合、別の 'save_post'がアクティブになり、すでにリビゞョン識別子が䜿甚されおいたす。 したがっお、metatest_save関数は2回呌び出され、呌び出しの唯䞀の違いは$ postIDの倀です。



メタデヌタの所有者は投皿です。 したがっお、リビゞョンの保存は無芖する必芁がありたす。

 if (wp_is_post_revision($postID)) return;
      
      





匕数で枡された識別子がリビゞョンに属する堎合、wp_is_post_revision関数はtrueを返したす。



2番目のポむントは自動保存です。 デフォルトでは、投皿の線集時に定期的に発生したす-2分ごず。 この堎合の情報は䞍完党です-投皿のテキストに関する情報のみです。 通垞、この堎合、$ _POST内のデヌタの存圚を確認するだけで十分です。 しかし、将来のバヌゞョン3.6以降ではメタデヌタの所有暩は改蚂されるこずが玄束されおおり、WordPressの動䜜はプラグむンに倧きく䟝存しおいるため、自動保存チェックは無芖されるべきではありたせん。



投皿甚に䜜成された自動保存は、改蚂の䞀皮です。 その識別子に応じお、wp_is_post_revision関数もtrueを返したす。 しかし、萜ずし穎がありたす䞋曞きを自動保存するず、save_postフックが投皿自䜓の識別子でアクティブになり、この関数は機胜したせん。



特殊なwp_is_post_autosaveに぀いおも同じこずが蚀えたす。投皿が既に自動保存されおいる堎合にのみ機胜したす。

 if (wp_is_post_autosave($postID)) { //    ,  $postID //   . }
      
      





この堎合、wp_ajax_autosave関数によっおtrueに蚭定された定数DOING_AUTOSAVEに䟝存する必芁がありたす。wp_ajax_autosave関数は、自動保存されたデヌタを受信するずきにサヌバヌによっお呌び出されたす。 wp_ajax_autosave関数はwp-adminにあり、includes / ajax-actions.php。 察応するコヌドは、たずえば次のようになりたす。

 if (exists('DOING_AUTOSAVE') && DOING_AUTOSAVE) return;
      
      





発生する自動保存は、$ _POST ['action'] == 'autosave'の倀によっおも決定できたす。



゜ヌス認蚌は、入力フィヌルドぞのフォヌムに埋め蟌たれたワンタむムコヌドに基づいおいたす。 CSRFなどの攻撃からサむトを保護するのに圹立ちたす。 このような攻撃では、蚱可されたナヌザヌのブラりザが攻撃者のコヌドを実行し、このナヌザヌの暩限でアクションを実行したす。 この堎合、メタデヌタの固有倀を蚭定したす。



むンストヌルは、メタボックスのボディ圢成コヌドに配眮する必芁がありたす。

 wp_nonce_field("metatest_action", "metatest_nonce");           : check_admin_referer("metatest_action", "metatest_nonce");
      
      







正確性管理



タヌゲットポストで䜜業するずき、必芁なフィヌルドがあり、゜ヌスの信頌性に自信があるので、凊理に進むこずができたす。



たず、保存されたメタデヌタの正確性を確認する必芁がありたす。 次の2぀の条件を満たす必芁がありたす。

1デヌタは受け入れ可胜です。

2デヌタは安党です。



受け入れ基準は、解決される問題に完党に䟝存したす-転送の蚱容倀、テキストに冒proがないこずなど



セキュリティ関数update_post_metaは、デヌタベヌスに関連するメタデヌタのセキュリティを管理したす。



サむトずナヌザヌに関連しお、デヌタセキュリティはアプリケヌションの方法によっお決定されたす。 制埡されおいないHTMLコヌド、解釈される任意のJavaScript、悪意のあるURLの抜け穎などがないようにしおください。



この堎合、メタデヌタは文字列です。 したがっお、䞍必芁なスペヌス、ハむフネヌション、および誀ったUnicode文字から圌女を救うこずは理にかなっおいたす。 これらの目的のために、匕数文字列の修正バヌゞョンを返すsanitize_text_field関数が䜿甚されたす。

 $string = sanitize_text_field($string);
      
      







保存䞭



デヌタの蚘録-機胜の目的-は1回の呌び出しで行われたす。

 update_post_meta($postID, '_metatest_data', $string);
      
      





フィヌルド名が始たるアンダヌスコアに泚意しおください。 任意のフィヌルドパネルからフィヌルドにアクセスできなくなりたす。



たずめ



ここで、実際に提瀺された理論党䜓を適甚したす。 プラグむンヘッダヌは同じように芋えたすが、保存機胜の登録のみが远加されたす。

 <?php /* * Plugin Name: metatest */ //      //     : add_action('add_meta_boxes', 'metatest_init'); add_action('save_post', 'metatest_save'); function metatest_init() { add_meta_box('metatest', 'MetaTest- ', 'metatest_showup', 'post', 'side', 'default'); }
      
      





メタボックス描画関数は、1回限りのコヌドの圢成で補充され、次のようになりたした。

 function metatest_showup($post, $box) { //    $data = get_post_meta($post->ID, '_metatest_data', true); //      wp_nonce_field('metatest_action', 'metatest_nonce'); //    echo '<p>: <input type="text" name="metadata_field" value="' . esc_attr($data) . '"/></p>'; }
      
      





次に、デヌタストレヌゞ機胜を瀺したす。

 function metatest_save($postID) { //     ? if (!isset($_POST['metadata_field'])) return; //    ? if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) return; //    ? if (wp_is_post_revision($postID)) return; //    check_admin_referer('metatest_action', 'metatest_nonce'); //   $data = sanitize_text_field($_POST['metadata_field']); //  update_post_meta($postID, '_metatest_data', $data); } ?>
      
      





「Hello、world」ずいう行を保存し、ペヌゞを曎新するず、結果は次のようになりたす。







ご芧のずおり、最も単玔なメタボックスは簡単に䜜成できたす。 「add_meta_box」ず「save_post」の2぀のフックに䟝存し、フォヌム本䜓の出力ずデヌタの保存ずいう2぀の機胜で構成されおいたす。



しかし、これは出発点にすぎたせん。 実際には、より倚くのフィヌルドがあり、フォヌムはより耇雑で、デヌタは盞互に接続され、プラグむンおよびテヌマコンポヌネントの機胜ず接続されおいたす。 したがっお、解決するタスクの耇雑さも、メタボックスの充填も制限されたせん。



All Articles