質問: get_role( 'subscriber' ); $role->add_cap( 'read_private_posts' ); $role->add_cap( 'edit_posts' ); } add_action( 'after_setup_theme', 'enable_view_drafts'); 私はafter_setup_themeの代わりにinitフックを試しました。運がありません。私の理解するところでは、ロールへの変更はデータベースに保存されるので、一度だけ行えばよいということです。これが私がafter_setup_themeフックを使って関数を呼び出す理由です。しかし、私が普通のユーザーとしてページにアクセスしようとすると、投稿内容を表示する代わりに404ページが表示されます。プレビューurl(site.com/?p=212&preview=true)もロードしようとしましたが、うまくいきませんでした。これらは私の推測です: 一般ユーザは下書き投稿を読むのに十分なcapsを持っていません。 フロントエンドでドラフト投稿をテストして表示することは、どのユーザー(管理者を含む)でも不可能です。 自分がやろうとしていることを達成するために、どのような変更を加える必要がありますか?それが不可能な場合は、他にどのような解決策を提案しますか? 注: 私はプラグインベースのソリューションを探していません。
回答: 私は上記の@ toschoの答えよりも簡単な方法だと思ったことでこの問題を解決しました。私のユースケースは、社内イントラネットステージングサイトと一般向けサイトで同じデータベースを使用していることです。ワークフローは、作成前に作成者がドラフトを作成し、イントラネットサイトでドラフトを閲覧する他のユーザーと共有することです。ドラフトを見るためにレビューアにログインを要求したくなかったので、env_productionのホスト名に基づいてwp-configファイルに設定されている定数$_server['server_name']に依存しています。ここでのenv_productionのチェックは何をしているのでしょう。本番サイトが表示されている場合は、これらのフィルタをすべてショートさせるだけです。wp_queryが$ wp_query-> posts配列からすべての投稿を削除した後にフックする必要があるので、これは少し奇妙ですが、安定していて安全なようです。/* * on staging site home and archives, drafts should be visible. */ function show_drafts_in_staging_archives( $query ) { if ( env_production ) return; if ( is_admin() || is_feed() ) return; $query->set( 'post_status', array( 'publish', 'draft' ) ); } add_action( 'pre_get_posts', 'show_drafts_in_staging_archives' ); /* * make drafts visible on staging site single views. * * (because on single views, wp_query goes through logic to make sure the * current user can edit the post before displaying a draft.) */ function show_single_drafts_on_staging( $posts, $wp_query ) { if ( env_production ) return $posts; //making sure the post is a preview to avoid showing published private posts if ( ! is_preview() ) return $posts; if ( count( $posts ) ) return $posts; if ( !empty( $wp_query->query['p'] ) ) { return array ( get_post( $wp_query->query['p'] ) ); } } add_filter( 'the_posts', 'show_single_drafts_on_staging', 10, 2 ); フィルタには2つの部分があります。 "pre_get_posts"フックのフィルタはステージングサイトのデフォルトのpost_statusを 'publish、draft'に設定します。これはアーカイブリストのドラフト投稿を返します。 wp_queryクラスには、現在の管理者が編集できない限り、ドラフト投稿をクエリ結果から削除するための厄介なロジックがいくつかあるため、単一のビューには個別のフィルタが必要です。この問題を回避するには、「the_posts」をフィルタリングし、必要な投稿を追加して結果に戻します。