在“管理”中设置默认列表“查看”

时间:2011-11-28 作者:Zach

我正在寻找一种在管理区域的帖子类型下设置默认“查看”选项的方法。例如,默认情况下,帖子将默认为“列表”视图,而不是“摘录”-我想在默认情况下将其更改为摘录-实现这一点的最佳方法是什么?我在这方面做了一些研究,但到目前为止,我陷入了困境。任何帮助都将不胜感激。谢谢

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

虽然在core中具有持久设置的特性很好,但它可能需要很长时间才能被实际接受。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;
}
可以进一步插值post_type 通过考虑$_GET[\'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;
}
维奥拉!每个用户每个帖子类型的持久列表模式,无黑客攻击。

SO网友:EAMann

post view(后期查看)屏幕根据“";的值从列表视图切换到摘录视图;“模式”;查询字符串中的参数。如果;“模式”;参数未设置,则WordPress默认为列表视图。

不幸的是,此参数不可过滤,因此没有简单的编程控制方法。

所以我要做一些我从没做过的事。。。我将告诉你如何破解Core使其工作。。。

添加过滤器

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

在第99行,WordPress检查;“模式”;参数已在请求中设置,并使用此参数设置全局$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的周期中已经太晚了,但我们可以尝试在下一个版本中实现这一点)。

SO网友:Hosh Sadiq

好吧,在我悬赏后不久,我想出了以下解决方案。这是所有方面的默认行为,除了它为您想要的任何帖子类型选择摘录视图(而不是默认列表视图)。

<?php

add_action( \'admin_init\', \'my_admin_init\' ); // initiate admin hook

function my_admin_init() {
    // if mode is not set redirect to a default mode.
    if(!isset($_GET[\'mode\'])) {
        if(\'forms\' == $_GET[\'post_type\'] || \'client-quotes\' == $_GET[\'post_type\'] ) {
            wp_redirect( admin_url( \'edit.php?mode=excerpt&\' . http_build_query( $_GET ) ) );
            exit;
        }
    }
}

?>
注意:我推荐Soulseekah的方法,如果您不想让它记住用户的选择,可以将我的代码与他的代码结合起来。注2:如果/当EAMann的补丁是核心的一部分时,显然他的方法是最好的,因为它不需要你走很长的路。我只是现在不喜欢,因为你必须编辑核心文件。

结束