在管理员中设置默认列表“视图”


8

我正在寻找一种在管理区域的帖子类型下设置默认“查看”选项的方法。例如,默认情况下,帖子将默认为“列表”视图,而不是“摘录”-我想默认将其更改为摘录-实现此目的的最佳方法是什么?我已经对此进行了一些搜索,但到目前为止一直被困在泥泞中。任何帮助将不胜感激。谢谢!

Answers:


9

尽管在核心中具有持久设置的功能很不错,但要真正接受它可能还需要一段时间。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;
}

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


1
好的解决方案。在我为此悬赏后不久,就容易多了!但是,既然您有解决方案,尽管我认为我会采用您的方式,但我会给您赏金,因为这实际上是持久性的,而不是像默认行为那样,只有摘录而不是列表。编辑,可以在17小时内授予它,所以请耐心等待!
霍什·萨迪克

谢谢,很高兴能为您提供帮助。一个非常有趣的问题。
soulseekah 2012年

感谢这个@soulseekah,我也使用了它,效果很好。正如您当时提到的“ WordPress 3.5仍然相距甚远”-此代码是否仍可以与最新的WordPress版本一起使用?
user3438958

5

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

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

因此,我将要做一些我从未做过的事情……我将告诉您如何破解Core来实现这项工作……

添加过滤器

打开/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';
}

默认情况下,这将连接到过滤器并返回摘录模式。

由于我个人关于入侵Core的规则要求将所有hack都归还给项目(这样就可以将它们归入Core,而不再计为hack),因此,我为此功能打开了Trac票证,并提交了上面的代码作为补丁。请权衡一下票证,以便它可以进入3.5版的内核(对于3.4版,我们为时已晚,但是我们可以尝试将其推向下一版本)。


1
很酷。绝对认为“这”是破解内核的原因-因此,将来,您不必:)
Zach 2012年

1
此票证上也正在进行讨论-加上进一步的补丁程序,提出了一个用户选项,而不仅仅是过滤器。如果您决定实际入侵Core,请保持对话状态,因为如果将来的版本中发生更改,则还需要更改代码。
EAMann 2012年

在我们等待核心采用补丁/建议的同时,为什么不仅仅破坏$_REQUEST全局add_action( 'edit.php', ... )之类?
soulseekah 2012年

@Soulseekah很好的选择...只是不喜欢$_REQUEST自己砍对象。随意发布另一个概述该如何完成的答案。
EAMann 2012年

1
+1使其具有一些出色的补丁程序,从而可以将它们带到核心,希望我们很快会看到变更集。
soulseekah 2012年

2

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

<?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的补丁是核心的一部分时,显然,他的方法将是最好的方法,因为它不需要您走很长的路。我暂时不喜欢它,因为您必须编辑核心文件。


1
这很有道理。但是,paged不考虑(分页)+使用wp_redirect而不是原始标头可能会更“干净”,而且我不确定重定向的效率如何。除此之外看起来很有趣。另外,$_GET['post_type']可能未设置,如果打开错误会导致警告。+1表示努力和耐心。没意识到这个问题太老了。
soulseekah 2012年

2
我用这种方法的问题是它涉及到重定向。因此,您加载WP不是一次,而是两次,只是为了进入发布列表页面。
EAMann 2012年

@Soulseekah,您是对的,没想到,我已经更新了代码以考虑所有$_GET变量。至于$_GET['post_type'],说实话,我并不为之烦恼,因为我只要求它用于自定义帖子类型,该类型始终存在。显然,这可以省略。@EAMann,您是对的,但是,这是我能想到的最佳解决方案。我尝试手动设置$_GET参数,希望在读取之前将其设置好,但事实并非如此。
霍什·萨迪克
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.