有没有可能去掉“标准”的帖子格式?

时间:2012-02-10 作者:Su\'

我在一个项目中大量使用post格式,但目前不需要标准选项。除了成为UI中不必要的一部分之外,如果它被错误地选择,实际上还会导致行为中断。我可能会用一些复杂的逻辑为标准设置一个模板,以正确处理其他格式的传入内容,但真正要做的就是隐藏帖子分配不正确的事实,使其更难查找。(这种变通方法可能可行,也可能不总是可行。)真正的问题是单选按钮不应该在那里。

我看到的以任何方式删除格式支持的唯一选项是remove_theme_support(\'post-formats\') 这将彻底扼杀该功能。我只想去掉那个选项。

4 个回复
最合适的回答,由SO网友:chrisguitarguy 整理而成

关于帖子编辑屏幕,首先要记住的是,所有内容(除了帖子标题、编辑器、永久链接等)都是一个元框。由于您可以轻松添加和删除元框,因此无需对CSS和JS进行黑客攻击。不想显示标准帖子格式?删除默认的元框,并滚动自己的元框。

第一次钩入add_meta_boxes_{$post_type} 并删除旧的格式div,然后添加自己的格式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\' 
    );
}
您可以在中找到默认post格式元框的代码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,或者在没有格式的情况下也返回默认格式。Post格式只是一种分类法,因此我们可以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;
}
这些都是as a plugin.

SO网友:Chip Bennett

根据您的评论:

因为如果某个内容以这种格式结束,模板将出现错误(在不同程度上取决于其他格式的自定义程度),如果不访问每一篇文章,只知道它应该以其他格式出现,就无法确定这一点。也没有理由为标准设置模板(在我的情况下,它永远不会被使用;是的,真的)。如果我这样做了,回退看起来可能仍然不可能正常,正如我所说的那样,这只会使上述发现问题变得更糟,因为现在标准中的内容看起来不会那么明显错误。

我认为最正确的方法是适合你的not to use the Post Format taxonomy at all; 相反,您应该使用your own custom taxonomy. 您没有按预期使用Post格式分类法,它不符合您的目的;那么,为什么要把一个方形的钉子塞进一个圆孔呢?

只需注册您自己的分类法(见鬼,甚至从post格式的分类法注册代码中复制有用的位),并完全省略“标准”术语/处理。

SO网友:GavinR

这是一个半黑客的解决方法,但我认为它满足了您的所有需求。首先,实现模板逻辑来处理由于某种原因您确实有一篇文章被设置为“标准”文章格式的情况。

$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/folder中,创建上面引用的wp admin。css和wp管理员。js文件。

在wp admin中。css放置样式以删除“标准”选项,使其不被作者看到:

/* 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,用于选择您希望用户默认使用的post格式。

jQuery(document).ready(function() {
    jQuery(\'input:radio[name=post_format][value=aside]\').click();
});
这种方法需要注意的是,这实际上并不是删除WP中的标准post格式,而是简单地使用JavaScript和CSS向您的作者隐藏它。如果作者的浏览器中没有启用JS,“标准”帖子仍然是默认选中的。我相信这仍然是解决这个问题的最好和唯一的办法。

祝你好运

SO网友:bueltge

您添加帖子格式并通过允许的帖子格式数组进行筛选还不够吗?也许我不明白这个问题不对。

在函数中。主题php;允许旁白和图像的post格式。

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

结束

相关推荐

使用functions.php使子菜单项成为管理菜单中的主链接

我正在尝试使用这些函数自定义管理区域。php文件,使我的客户更容易处理。我之前收到的一个请求是将一些子菜单移到主导航中,希望能够完成。例如,我想让小部件和菜单出现在主导航中,而不是作为外观的子菜单。然后,我将一起删除“外观”选项卡。我已经能够删除选项卡,但无法为小部件和菜单创建新按钮。即使我可以得到帮助,而不是从技术上移动它们,而是创建一个新按钮并自己设置链接(例如,对于菜单->/nav Menus.php)。这有可能吗?谢谢