web-dev-qa-db-ja.com

カスタムメタボックスをデフォルトで折りたたむ

私は私の投稿書き込み画面用にいくつかのカスタムメタボックスを作成しました。デフォルトでそれらの一部を折りたたんで表示させる方法はありますか?

念のために、正しい用語を使用していないか、質問で明確になっていないので、詳しく説明します。

ポストライト画面のメタボックスには、ボックスの右上隅にトグルスイッチがあります。この領域の上にマウスを置くと、小さな下向きの矢印と「クリックして切り替え」という単語が表示されます。クリックすると、メタボックスが折りたたまれ、コンテンツが非表示になり、メタボックスのタイトルバーのみが表示されます。私は全体のメタボックスを消すスクリーンオプションについては話していません(与えられたアカウントでのみ)。すべてのWPユーザーに対して、デフォルトで特定のメタボックスを折りたたみモードで表示したいだけです。

更新:

Hakreの答えを読んで、トグルの状態がユーザーのために保存されているということを読んだ後、私はそれがどのように機能したいのかについていくつかの説明を加えたいと思いました。これが可能かどうかはわかりませんが、投稿が新しくなったときにメタボックスをデフォルトで折りたたむようにして、ユーザーがそれらを展開するときに展開する必要があります。ただし、これらの設定を特定の投稿に対してローカルにしておきたいので、新しい投稿を作成するとすべてのメタボックスが折りたたまれます。

7
matt

デフォルトで折りたたまれた、または閉じられたメタボックスを表示するには、class属性にclosedを追加すると閉じて表示されることを知っておくと便利です。クラス名にclosedを含むすべてのメタボックスのメインdivは、閉じた形式で表示されます。

矢印をクリックすると、削除または追加(切り替え)されます。これは投稿エディタページで対話的に行われます。手動でclosedクラス名を追加しても、firebugなどの開発者ツールを使用してブラウザでそれを実行した場合にのみ機能します。

Wordpressは通常各メタボックスのトグル状態のステータスを追跡するので、最初にトグル状態を設定するのは、特定のユーザーがエディタにアクセスしたとき、またはユーザーに追加されたときを閉じるためだけにする必要があります。

これらのメタボックスのうちどれが閉じられているかのデータはユーザーのオプションの中に保存されています。ボックスを切り替えるたびに、それを保存しているajaxリクエストがあります。

update_user_option($user->ID, "closedpostboxes_$page", $closed, true);

$closedは、閉じられているすべてのメタボックスIDのカンマ区切りリストです。 $pageは投稿エディタ(あなたが要求したもの)に対して "post"に設定されています。そのため、新しいユーザーが作成されたとき(または既存のすべてのユーザー用にプラグインがインストールされたとき)、その設定をメタボックスのIDで拡張できます。これで仕事ができます。

あなたが知る必要がある唯一の事はあなたのメタボックスのIDです、しかし私はあなたがすでにそれを知っていると確信しています。そうでない場合は、メタボックスを登録した場所のコードを確認してください。

さらに、閉じているものの横に、チェックボックスに対応するように、隠されているものを設定することもできます。それはhiddenpostboxes_$pageオプションです。

更新

いくつかのコードでは、オプションを追加する方法について説明しました。

function collapseBoxForUser($userId, $page, $boxId) {
    $optionName = "closedpostboxes_$page";
    $close = get_user_option($optionName, $userId);
    $closeIds = explode(',', $close);
    $closeIds[] = $boxId;
    $closeIds = array_unique($clodeIds); // remove duplicate Ids
    $close = implode(',', $closeIds);
    update_user_option($userId, $optionName, $close);
}

その関数を適切な値で呼び出すだけで、boxIdが値に挿入されます。次にエディタが画面にその値をロードするとき(たとえば、ajaxリクエストを介して)、そのボックスを閉じて表示する必要があります。

7
hakre

これを行うもう1つの方法は、get_user_optionでフックを使用することです。

function closed_meta_boxes( $closed ) {
    if ( false === $closed )
        $closed = array( 'submitdiv', 'postcustom', 'anothermetaboxid' );

    return $closed;
}
add_filter( 'get_user_option_closedpostboxes_{post_type_slug}', 'closed_meta_boxes' );
6
sorich87

ユーザー登録フックにフックしてポストボックスの状態変更を適用することもできます。新しいユーザーが作成されるたびに単純に実行されます。

add_action( 'user_register', 'set_user_closedboxes' );
function set_user_closedboxes( $uid ) {
    update_user_meta( $uid, 'closedpostboxes_{type}',array('submitdiv','postcustom'));
}

ここで{type}はあなたの適切な投稿タイプで、配列は隠すボックスのIDを保持するべきです(submitdivとpostcustomは2つの例です)。

既存のユーザーを更新したい場合はクエリを書く必要がありますが、上記は新しく作成/登録されたユーザーをカバーする必要があります。

コードはテストされていませんが、それが機能しない理由はありません。問題があれば報告してください。

それが役立つことを願っています..

1
t31os