问题描述

我正在寻找一种方法来在管理区域中的 post 类型下设置默认的”View” 选项。例如,默认情况下,帖子将默认为”list” 视图而不是”excerpt” – 我想将其更改为摘录,默认情况下 – 实现此目的的最佳方法是什么?我已经做了一些这样的搜索,但是我陷入泥巴 thus-far 。任何帮助将不胜感激。谢谢!

最佳解决方案

虽然在核心中具有永久性设置的功能很好,但在实际被接受之前可能需要相当长的时间。 WordPress 3.5 还是相当遥远的。

所以我们来增加全局 $_REQUEST 数组。

add_action( 'load-edit.php', 'wpse34956_force_excerpt' );
function wpse34956_force_excerpt() {
    $_REQUEST['mode'] = 'excerpt';
}

这将锁定模式,一直强制 excerpt 模式,所以让我们来让用户决定,但要保持持久使用用户的元数据:

add_action( 'load-edit.php', 'wpse34956_persistent_posts_list_mode' );
function wpse34956_persistent_posts_list_mode() {
    if ( isset( $_REQUEST['mode'] ) ) {
        // save the list mode
        update_user_meta( get_current_user_id(), 'posts_list_mode', $_REQUEST['mode'] );
        return;
    }
    // retrieve the list mode
    if ( $mode = get_user_meta( get_current_user_id(), 'posts_list_mode', true ) )
        $_REQUEST['mode'] = $mode;
}

您可以通过考虑 $_GET['post_type']变量 (如果可用) 来进一步插入 post_type

add_action( 'load-edit.php', 'wpse34956_persistent_posts_list_mode' );
function wpse34956_persistent_posts_list_mode() {

    // take into account post types that support excerpts
    $post_type = isset( $_GET['post_type'] ) ? $_GET['post_type'] : '';
    if ( $post_type && !post_type_supports( $post_type, 'excerpt' ) )
        return; // don't care

    if ( isset( $_REQUEST['mode'] ) ) {
        // save the list mode
        update_user_meta( get_current_user_id(), 'posts_list_mode' . $post_type, $_REQUEST['mode'] );
        return;
    }

    // retrieve the list mode
    if ( $mode = get_user_meta( get_current_user_id(), 'posts_list_mode' . $post_type, true ) )
        $_REQUEST['mode'] = $mode;
}

中提琴!持续列表模式每个用户每个帖子类型,没有黑客。

次佳解决方案

后视图屏幕根据查询字符串中”mode” 参数的值从列表视图切换到摘录视图。如果”mode” 参数未设置,则 WordPress 默认为列表视图。

不幸的是,这个参数是不可过滤的,所以没有简单的方法来编程。

所以我要做一些我从来没有做过的事情… 我要告诉你如何攻击核心来使这项工作…

添加过滤器

打开/wp-admin/includes/class-wp-posts-list-table.php 并找到 prepare_items()方法 (围绕第 81 行) 。

在第 99 行,WordPress 检查是否在请求中设置了”mode” 参数,并使用此参数设置全局 $mode 变量:

$mode = empty( $_REQUEST['mode'] ) ? 'list' : $_REQUEST['mode'];

我们要更改此行以过滤默认设置。将此行更改为:

$mode = empty( $_REQUEST['mode'] ) ? apply_filters( 'default-posts-list-mode', 'list' ) : $_REQUEST['mode'];

现在,进入主题的 functions.php 文件,并添加以下代码:

add_filter( 'default-posts-list-mode', 'my_default_posts_list_mode' );
function my_default_posts_list_mode( $default ) {
    return 'excerpt';
}

这将挂接到过滤器并默认返回摘录模式。

由于我关于黑客核心的个人规则要求所有的黑客都可以归还给项目 (这样他们可以被转化为核心,不再被视为一个黑客),我有 opened a Trac ticket 这个增强功能,并提交了上面的代码作为补丁。请在票上加注,以便它可以进入 3.5 的核心 (我们在 3.4 的周期中太晚了,但是我们可以尝试推送下一个版本) 。

参考文献

注:本文内容整合自 Google/Baidu/Bing 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。