web-dev-qa-db-ja.com

バックエンドメニューページにメタボックスを追加する方法

/メタボックス バックエンドメニューページに追加する必要があります Appearance-> Menus/wp-admin/nav-menus.php)に、すべての利用可能な 投稿タイプを一覧表示する デフォルトとカスタムの両方。

アーカイブページのみ ナビゲーションメニューに追加される各投稿タイプへのリンクを含むリストが含まれます。これは可能ですか?

3
Giraldi

ナビゲーションメニューインターフェイスの左側の一番上に表示されるメタボックスの例を次に示します。

/**
 * Instantiates the class
 */
add_action( 'admin_init', array( 'call_someClass', 'init' ) );

/**
 * The Class
 */
class call_someClass {
    const LANG = 'exch_lang';

    public static function init() {
    $class = __CLASS__;
    new $class;
    }

    public function __construct() {
    // Abort if not on the nav-menus.php admin UI page - avoid adding elsewhere
    global $pagenow;
    if ( 'nav-menus.php' !== $pagenow )
                    return;

        $this->add_some_meta_box();
    }

    /**
     * Adds the meta box container
     */
    public function add_some_meta_box(){
        add_meta_box(
            'info_meta_box_'
            ,__( 'Example metabox', self::LANG )
            ,array( $this, 'render_meta_box_content' )
            ,'nav-menus' // important !!!
            ,'side' // important, only side seems to work!!!
            ,'high'
        );
    }

    /**
     * Render Meta Box content
     */
    public function render_meta_box_content() {
        echo '<p>Example text</p>';
    }
}

Add_meta_boxの重要な部分は次のとおりです。

            ,'nav-menus' // important !!!
            ,'side' // important, only side seems to work!!!

Nav-menuの投稿タイプがありますが、メタボックスをサポートしていません、そしてnav-menu.phpは 'nav-menu'と 'side'の値を使うようにハードコードされています。あなたがこれを尊重する限り、あなたは合理的な範囲内であなたが喜ばせることなら何でもすることができます。

残念ながら、個々のメニュー項目自体に追加のフィールドを追加する。これを書いている時点では、リンク、ページなどは、それらのフィールドがハードコードされているので不可能です。あなたはそれらをjQuery経由で追加し、あなたがそれらを必要ならばバックエンドのフック経由でそれらを保存することができます。

8
Tom J Nowell

メタボックスは@TomJNowellによって既に回答されているので、投稿タイプリストを取得する方法を紹介します。

/**
 * Builds a html form element list depending on the param type
 * 
 * @param string $type | form element type; Valid: select/checkbox/radio
 * @param bool $echo | (optional) print or return
 * @return string $html
 */
public function get_post_types_list( $type, $echo = false )
{
    $name = ' name="nav-menu-post-types';
    $html = ! in_array( $type, array( 'checkbox', 'radio' ) ? "<{$type}{$name}'>" : '';
    foreach( array_keys( $GLOBALS['wp_post_types'] ) as $pt )
        $html .= 'select' === $type ? "<option>{$pt}</option>" : "<input type='{$type}' {$name}[]' value='{pt}' />";
    $html .= ! in_array( $type, array( 'checkbox', 'radio' ) ? "</{$type}>" : '';

    if ( $echo ) 
        return print $type;
    return $type;
}

テストされていませんが、動作するはずです。

2
kaiser

@ kaiserの解決策に代わるものはget_post_types()関数です。投稿タイプを少し細かく制御できるようになります。

1
mor7ifer