サポート » 使い方全般 » 下書き,レビュー待ち,公開の記事ステータスの判定

  • 解決済 souyukiya

    (@souyukiya)


    いつもお世話になります。

    投稿記事の記事ステータスを「下書き」「レビュー待ち」「公開」にそれぞれ切り替えたとき、「下書き」「レビュー待ち」状態の記事URLへアクセスした場合には該当の記事内容は表示されなくて、「公開」にした時は表示されるという分岐判定を行っている箇所(WPのソース)はどこにあたるのでしょうか。

    記事ステータスが「下書き」「レビュー待ち」の時も記事内容を少し加工して表示したいと考えています。(DBにはwp_postsテーブルのpost_contentフィールドに記事内容が入っているのでどうにか取り出す事は出来るのですが)

    どなたかご存じでしたら教えて下さい。
    よろしくお願い致します。

11件の返信を表示中 - 1 - 11件目 (全11件中)
  • モデレーター jim912

    (@jim912)

    souyukiyaさん、こんにちは。

    どこのソースと問われれば、wp-includes/query.phpの2392行目から2465行目のデータベースクエリーを生成している部分となります。

    「下書き」「レビュー待ち」「公開」を変更すると、post_statusフィールドが変わりますので、表示を行う際に、publishのみなどの条件のクエリーを発行し、ステータスによって、表示・非表示が変わるということになるのです。

    単に表示したいだけであれば、get_posts()の引数でpost_statusにdraftとかセットすれば持ってくることが出来ます。後は表示する際にdraftなのかpendingなのかで内容を加工、表示のプロセスを取るというのがよろしいかと。

    元の関数に手を入れるのは可能であれば極力避けた方が、後で困らないので。

    jim912様、V.J.Catkick様

    ご返信ありがとうございます。

    $post = get_posts(“p=1&post_status=’draft'”);
    var_dump($post);

    上記のように例えば投稿IDが1で下書きの記事を取りだそうとした場合、WPにログインしていない場合、$post がNULLになります。ちなみに記事の公開状態は「一般公開」で、パスワードなどで保護はしていません。ログインしている状態だと正常に取り出せます。

    今、テストでWPをクリーンインストールした状態(プラグインなど無し)の状態で管理者アカウントしかないのでプラグイン周りが邪魔してるとは考えられない状態です。

    システムにログインしない状態でも下書きやレビュー待ち記事を出すにはどこか設定が必要なのでしょうか。

    今やってみたんですが、

    $pd = get_posts( 'post_status=draft' );
    

    これでdraftの中身がログイン、非ログインに関わらず入ってますねぇ。おそらくは:

    ×post_status=’draft’
    ○post_status=draft

    じゃないかな、と思いますがどうでしょうか?

    V.J.Catkick 様

    ご返信ありがとうございます。

    $pd = get_posts( ‘post_status=draft’ );

    上記で下書き記事は取得出来ました。
    もしこの条件指定に、特定投稿記事(post)のIDを追加するのは、

    $pd = get_posts( ‘post_status=draft&p=100’ );

    上記の構文で正しいでしょうか。
    想定ではIDが100の記事(この記事はpost_statusがdraftです)が取得できるはずなんですが、取得出来ません。記述ミスな気もしますが何か間違っていますでしょうか。

    特定のIDで持ってくる場合には

    $id_number = 100;
    $pd = get_post( $id_number );
    

    と違う関数を使います。この場合は、post_statusに関わらず持ってきますので、後はいかようにも。

    get_posts()ではIDを特定しての呼び出しは出来ません。

    V.J.Catkick様
    度重なりご返答ありがとうございます。

    申し訳ございません。
    私の勘違いで、実際に使用している関数は”query_posts()”でした。

    query_postsを使用した理由は、私も勉強不足なのですが各種グローバル変数などを初期化してくれるので、query_postsした後、the_content()とcomments_template()を実行すればその該当記事と、記事に投稿できるコメントフォームを自動生成してくれるのが必要だった為です。(single.phpテンプレートで投稿が通常表示されるのを、”公開”時以外でも実現するため、ページ用テンプレートで上記のような処理をしています。)

    ですが今、

    $arg = array(
    	'post_status' => array('pending','draft','publish'),
    	'post__in' => array(100)
    );
    query_posts($arg);

    としても、IDが100の記事(下書き)が取得出来ないようです。
    初歩的な事かもしれませんが文法など何か間違っていますでしょうか。

    何度も申し訳ございませんがご教授頂ければ幸いです。

    >各種グローバル変数などを初期化

    ここだけなら

    $id_number = 100;
    $pd = get_post( $id_number );
    setup_postdata( $pd );
    
    the_content(); ←ここは適当に
    

    とやれば初期化してくれますので、the_content()とかが使えるようになります。上のコードは検証済。

    query_posts()の方はちょっと時間がなくて未検証ですが、ちゃんと動かないですねぇ。

    V.J.Catkick様

    ご指摘通り、setup_postdata()を使用して下書き記事を表示+コメント表示出来ました。
    しかしこの方法で表示されたコメント投稿フォームからコメントを投稿した場合、その取得(表示)した記事が”下書き”か”レビュー待ち”であった場合、「コメントを送信」ボタンを押下した後、真っ白画面になって先に進まない状態です。

    ちなみにこの取得した記のステータスが”公開”だった場合、正常にコメントは投稿可能でした。
    WPをクリーンインストールした時点で、同じように試した場合も同じ現象でしたのでプラグインなどが問題してる事は無いと思います。

    $post = get_post($postid);
    setup_postdata( $post );
    
    the_content();
    comments_template();

    現象の要因などをご存じでしょうか。
    何度もお力添え頂いている上で恐縮ですがよろしくお願い申し上げます。

    コードに問題がないようであれば、「下書き」「レビュー待ち」等にパブリックな扱いのコメントを入れる事は、おそらく想定されてないと思われます(世に出てない記事に対してコメントというのは論理的に矛盾という考え方)。

    ただ、一度パブリッシュしたエントリ(記事)に対し、パブリッシュ中にコメントを入れた後、再度ドラフトに戻した場合は例外らしく、コメントは残ります(この時点でコメントフォームが生きているかどうかは未検証)。

    comments_template()は単にcomment.phpを呼び出している(なければシステムデフォルトのファイルを呼んでいる)だけなので、利用中のコメントフォームがdraft等に対応しているかどうかにも左右されるかも知れません。

    V.J.Catkick様

    ご返信ありがとうございます。
    やはりWP自体の仕様ですか、わざわざありがとうございます。

    コメントの投稿部分は、wp-comment-post.phpが核なようなので、こちらを調べてみます。
    長々と初歩的な質問ばかりなのに親切丁寧にお付き合い頂いてありがとうございました。

11件の返信を表示中 - 1 - 11件目 (全11件中)
  • トピック「下書き,レビュー待ち,公開の記事ステータスの判定」には新たに返信することはできません。