web-dev-qa-db-ja.com

カスタム投稿タイプごとに異なる投稿フォームオプション

投稿タイプごとに投稿フォーマットを追加したいです。たとえば、投稿タイプが 'Gallery'です。この投稿に「画像」、「ギャラリー」、「ビデオ」を追加します。通常の投稿では、私は別の投稿フォーマットのリストを使いたいと思います。

私が試してみます:

function postf()
{
    global $post_ID;

    $postType = get_post_type( $post_ID );

    if( $_GET['post_type'] || $postType == 'gallery-custompost' )
    {
        add_theme_support( 'post-formats', array( 'image', 'gallery', 'video' ) );
        add_post_type_support( 'gallery-custompost', 'post-formats' );
    }
}
add_action('init', 'postf');

新しい投稿を追加しても機能しますが、編集しようとすると投稿の形式が表示されません。

誰かが私がそれをしなければならない方法について何か考えを持っていますか?

4
Mike

次のように、add_post_type_supportを使用する代わりに投稿タイプを登録するときに、引数に投稿フォーマットのサポートを追加してみてください。

$args = array(
    ...
    'supports' => array('title', 'editor', 'author', 'post-formats')
); 
register_post_type('gallery-custompost', $args);

運があるかどうかを確認してください。

1

投稿フォーマットのメタボックスに表示されるリストを変更することはできますが、投稿を保存すると、送信された値が登録済みの投稿フォーマットと比較され、コードが実行されなかった可能性があります。

私の解決策は、あなたがあなたのテーマで使用する all postフォーマットを登録し、それから標準のメタボックスをあなた自身のもので置き換えることによってそれらを投稿タイプに基づいて制限することです。これはメタボックスで利用可能なオプションを制限するだけで、投稿を保存するときにそれらを制限することはありませんが、冒険好きなユーザーが「許可しない」投稿フォーマットを設定できないように追加チェックを追加できます。

// Register all post types that we will use
add_action( 'after_setup_theme', 'wpse16136_after_setup_theme', 11 );
function wpse16136_after_setup_theme()
{
    add_theme_support( 'post-formats', array( 'aside', 'gallery', 'video' ) );
}

// Register our custom post type, and link the post formats to the post types
// Yes, you can (ab)use add_post_type_support to save extra data like this
add_action( 'init', 'wpse16136_init' );
function wpse16136_init()
{
    register_post_type( 'wpse16136', array(
        'public' => true,
        'label' => 'WPSE 16136',
        'supports' => array( 'title', 'editor' ),
    ) );
    add_post_type_support( 'wpse16136', 'post-formats', array( 'gallery', 'video' ) );
    add_post_type_support( 'post', 'post-formats', array( 'aside', 'gallery' ) );
}

// Replace the standard meta box callback with our own
add_action( 'add_meta_boxes', 'wpse16136_add_meta_boxes' );
function wpse16136_add_meta_boxes( $post_type )
{
    if ( ! get_post_type_object( $post_type ) ) {
        // It's a comment or a link, or something else
        return;
    }
    remove_meta_box( 'formatdiv', $post_type, 'side' );
    add_meta_box( 'wpse16136_formatdiv', _x( 'Format', 'post format' ), 'wpse16136_post_format_meta_box', $post_type, 'side', 'core' );
}

// This is almost a duplicate of the original meta box
function wpse16136_post_format_meta_box( $post, $box ) {
    if ( current_theme_supports( 'post-formats' ) && post_type_supports( $post->post_type, 'post-formats' ) ) :
    $post_formats = get_theme_support( 'post-formats' );

    // This is our extra code
    // If the post type has registered post formats, use those instead
    if ( is_array( $GLOBALS['_wp_post_type_features'][$post->post_type]['post-formats'] ) ) {
        $post_formats = $GLOBALS['_wp_post_type_features'][$post->post_type]['post-formats'];
    }

    if ( is_array( $post_formats[0] ) ) :
        $post_format = get_post_format( $post->ID );
        if ( !$post_format )
            $post_format = '0';
        $post_format_display = get_post_format_string( $post_format );
        // Add in the current one if it isn't there yet, in case the current theme doesn't support it
        if ( $post_format && !in_array( $post_format, $post_formats[0] ) )
            $post_formats[0][] = $post_format;
    ?>
    <div id="post-formats-select">
        <input type="radio" name="post_format" class="post-format" id="post-format-0" value="0" <?php checked( $post_format, '0' ); ?> /> <label for="post-format-0"><?php _e('Standard'); ?></label>
        <?php foreach ( $post_formats[0] as $format ) : ?>
        <br /><input type="radio" name="post_format" class="post-format" id="post-format-<?php echo esc_attr( $format ); ?>" value="<?php echo esc_attr( $format ); ?>" <?php checked( $post_format, $format ); ?> /> <label for="post-format-<?php echo esc_attr( $format ); ?>"><?php echo esc_html( get_post_format_string( $format ) ); ?></label>
        <?php endforeach; ?><br />
    </div>
    <?php endif; endif;
}
1
Jan Fabry

投稿形式は "Post"投稿タイプに登録されたカスタム分類法です。 異なる ポストタイプに「ポストフォーマット」分類法を使用したい場合は、単に「ポスト」ポストタイプのサポートを有効にするのではなく、そのポストタイプに登録する必要があります。タイプ。

0
Chip Bennett