Answers:
尽管在核心中具有持久设置的功能很不错,但要真正接受它可能还需要一段时间。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;
}
中提琴!每个用户每个帖子类型的持久列表模式,没有黑客。
后视图屏幕根据查询字符串中“ 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版,我们为时已晚,但是我们可以尝试将其推向下一版本)。
$_REQUEST
全局add_action( 'edit.php', ... )
之类?
$_REQUEST
自己砍对象。随意发布另一个概述该如何完成的答案。
好的,所以在我悬赏后不久,我想到了以下解决方案。这是所有方式的默认行为,除了它会为所需的任何帖子类型选择摘录视图(而不是默认列表视图)。
<?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的补丁是核心的一部分时,显然,他的方法将是最好的方法,因为它不需要您走很长的路。我暂时不喜欢它,因为您必须编辑核心文件。
paged
不考虑(分页)+使用wp_redirect
而不是原始标头可能会更“干净”,而且我不确定重定向的效率如何。除此之外看起来很有趣。另外,$_GET['post_type']
可能未设置,如果打开错误会导致警告。+1表示努力和耐心。没意识到这个问题太老了。
$_GET
变量。至于$_GET['post_type']
,说实话,我并不为之烦恼,因为我只要求它用于自定义帖子类型,该类型始终存在。显然,这可以省略。@EAMann,您是对的,但是,这是我能想到的最佳解决方案。我尝试手动设置$_GET
参数,希望在读取之前将其设置好,但事实并非如此。