web-dev-qa-db-ja.com

「標準」の投稿形式を削除することは可能ですか?

私はプロジェクトでポストフォーマットを多用していますが、標準オプションは現在必要ありません。不必要なUIであることを超えて、それが誤って選択された場合、実際には壊れた動作を引き起こします。他のフォーマットの着信コンテンツを適切に処理するStandard用のテンプレートを設定できるかもしれませんが、投稿が正しく割り当てられていないことを隠すことで、捜索がさらに困難になります。 (そしてこの回避策は常に実行可能であるかもしれません。)本当の問題はラジオボタンがちょうどそこにあるべきでないということです。

フォーマットサポートを削除するために私が見た唯一のオプションは、その機能を完全に無効にするremove_theme_support('post-formats')です。私はただ一つの選択肢がなくなってほしいのです。

5
Su'

投稿編集画面について最初に覚えておくべきことは、すべて(投稿タイトル、編集者、パーマリンクなどを除く)がメタボックスであるということです。メタボックスは簡単に追加および削除できるので、CSSやJSのハッキングは必要ありません。標準の投稿フォーマットを表示したくないですか。デフォルトのメタボックスを削除して自分のものを転がしてください。

まずadd_meta_boxes_{$post_type}にフックして、古いフォーマットのdivを削除し、そしてあなた自身のものを追加してください。

<?php
add_action( 'add_meta_boxes_post', 'wpse41940_meta_boxes' );
function wpse41940_meta_boxes( $post )
{
    remove_meta_box(
        'formatdiv',
        $post->post_type,
        'side'
    );
    add_meta_box( 
        'wpse41940_formatdiv', 
        _x( 'Format', 'post format' ), 
        'wpse41940_format_meta_box', 
        $post->post_type, 
        'side', 
        'core' 
    );
}

デフォルトの投稿フォーマットメタボックスのコードは、関数wp-admin/includes/meta-boxes.php内のpost_format_meta_boxにあります。ここにあります:

<?php
function 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' );

    if ( is_array( $post_formats[0] ) ) :
        $post_format = get_post_format( $post->ID );
        if ( !$post_format )
            $post_format = '0';
        // 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;
}

最も簡単な方法は、取引全体をコピーし、関数の名前を変更して、必要なものを変更することです。名前、これはこれを変更することを意味します。

$post_format = get_post_format( $post->ID );
if ( !$post_format )
    $post_format = '0';

以下に "デフォルトのフォーマット"を脇に(またはあなたがそれになりたいものは何でも)設定する。

$post_format = get_post_format( $post->ID );
if ( !$post_format )
    $post_format = 'aside';

この行も削除する必要があります。

<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
function wpse41940_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' );

    if ( is_array( $post_formats[0] ) ) :
        $post_format = get_post_format( $post->ID );
        if ( !$post_format )
            $post_format = 'aside';
        if ( $post_format && !in_array( $post_format, $post_formats[0] ) )
            $post_formats[0][] = $post_format;
    ?>
    <div id="post-formats-select">
        <?php foreach ( $post_formats[0] as $format ) : ?>
        <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><br/>
        <?php endforeach; ?><br />
    </div>
    <?php endif; endif;
}

最後に、get_post_formatがfalseを返さないようにするか、フォーマットがない場合はデフォルトのフォーマットも返さないようにすることをお勧めします。投稿形式は単なる分類法なので、get_the_termsにフックして、常に投稿形式があるようにすることができます。フォーマットは投稿が追加されたときに作成されるため、分類が存在しない場合は分類を追加する必要があります。

<?php
add_filter( 'get_the_terms', 'wpse41940_filter_formats', 10, 3 );
function wpse41940_filter_formats( $terms, $post_id, $taxonomy )
{
    if( 'post_format' != $taxonomy ) return $terms;
    if( empty( $terms ) )
    {
        $aside = get_term_by( 'slug', 'post-format-aside', 'post_format' );
        // post formats are created as posts are saved in them.
        // so this is a bit of a hack
        if( $aside )
        {
            $terms[] = $aside;
        }
        else
        {
            $term = wp_insert_term( 'post-format-aside', 'post_format' );
            $terms[] = get_term( $term['term_id'], 'post_format' );
        }
    }
    return $terms;
}

これがすべてです - プラグインとして

6
chrisguitarguy

あなたのコメントに基づいて:

そのフォーマットで何かが終わってしまうと、テンプレート化は間違ったものになり(他のフォーマットのカスタマイズの度合いによって程度は異なりますが)、すべての投稿にアクセスしてそれが何らかの形になっていることを知らずに判断する良い方法はありません。他のフォーマット標準をテンプレートにする理由もまったくありません(私の場合は使用されません。はい、実際には)。私がしたとしてもそれでもフォールバックが大丈夫に見えることは可能ではないかもしれません、そして私が言ったようにそれはちょうど今標準のものが明らかに間違って見えるようにならないので上記の発見問題をさらに悪化させるでしょう。

最も正しい アプローチはあなたのためのものだと思います Post Format分類法をまったく使わないこと ;むしろ、あなたは あなた自身のカスタム分類法 を使うべきです。 Post Formatの分類法は使用することを目的としているため使用していません。また、目的の目的には役立ちません。それでは、なぜ四角い釘を丸い穴に押し込むのですか?

あなた自身の分類法を登録するだけで(ポストフォーマット分類法登録コードから有用な部分をコピーすることさえできます)、そして "標準的な"用語/処理を完全に省略します。

2
Chip Bennett

これは半ハッキングな回避策ですが、すべてのニーズを満たすと私は思います。まず、何らかの理由で「標準」の投稿形式として設定されている投稿がある場合を処理するためのテンプレートロジックを実装します。

$format = get_post_format();
if ( false === $format ) // post format is 'standard'
    $format = 'aside'; // set it instead to 'aside' (or whatever you want)
<?php get_template_part( 'content', $format ); ?>

次に、管理インターフェイスにカスタムCSSとJSを追加する簡単なプラグインを作成します。/wp-content/pluginsの下に "myplugin"ディレクトリを作成し、このコードを "myplugin.php"に配置します。

<?php
/*
Plugin Name: My Admin Theme
Plugin URI: http://yoursite.com
Description: My WordPress Admin Theme - Add Custom CSS and JS.
Author: Your Name
Version: 1.0
*/

function my_admin_head() {
        echo '<link rel="stylesheet" type="text/css" href="' .plugins_url('wp-admin.css', __FILE__). '">';
        echo '<script type="text/javascript" src="' .plugins_url('wp-admin.js', __FILE__). '"></script>';
}

add_action('admin_head', 'my_admin_head');
?>

次に、/ myplugin /フォルダーにも、上記のwp-admin.cssファイルとwp-admin.jsファイルを作成します。

Wp-admin.cssに、あなたの作者には見えないように "Standard"オプションを削除するスタイルを入れてください。

/* Custom styles to remove the Standard option from the view in the post page */
#post-formats-select input:nth-child(1),
#post-formats-select label:nth-child(2),
#post-formats-select br:nth-child(3) {
    display:none;
}

最後に、wp-admin.jsに、ユーザーにデフォルトで使用させる投稿形式を選択するJavaScriptの行を配置します。

jQuery(document).ready(function() {
    jQuery('input:radio[name=post_format][value=aside]').click();
});

このアプローチの注意点は、これが実際にWPの標準投稿フォーマットを削除するのではなく、単にJavaScriptとCSSを使ってあなたの著者からそれを隠すことです。作成者のブラウザでJSが有効になっていない場合でも、[標準]投稿が選択されたデフォルトになります。私はこれがまだこの問題に対する最良かつ唯一の解決策であると信じています。

がんばろう!

1
GavinR

投稿形式を追加して、許可された投稿形式の配列でフィルタリングするだけでは不十分ですか。多分私は質問が正しくないことを理解していない。

テーマのfunctions.phpにあります。 AsideとImageの投稿フォーマットを許可しました。

add_theme_support( 'post-formats', array( 'aside', 'image' ) );

0
bueltge