0

WordPressサイトの問題を修正するように依頼されました。この問題は、ページの代わりに投稿を使用する必要があるという事実が原因で発生します。ただし、サイトは稼働中であり、最も迅速なオプションは、ある種のハックを使用して問題を修正することです。

サイトにはイベントセクションがあり、各イベントはページです(これは問題であり、実際には投稿である必要があります)。今後のイベントと過去のイベントを設定するために、投稿日が使用されます。したがって、今後のイベントの投稿ステータスは「future」になります。

正しいquery_post()を使用してイベントを正常に表示するイベントのリストページがあります。クリックして実際のイベント(将来のページ)に移動すると問題が発生しますが。管理者としてログインしている場合はページが表示されますが、ログインしていない場合は404ページが表示されます。

今、彼らが投稿するなら、「未来は今です!」プラグインはこの問題を解決します。問題を回避する唯一の方法は、コアのWordpressファイルの一部を書き直すことだと感じています。

どんなアドバイスでも素晴らしいです、私はワードプレスで多くの経験を持っているので、あなたが私を正しい方向に向けることができたとしても。

乾杯、ジェイソン

[アップデート]

詳細な回答をありがとうmaiorano84。長期的には投稿に移動するつもりですが、その間にURLを変更せずにできるだけ早く修正するように要求されました(今日、リンクをチェックせずにイベントのリストを含む大量のメールを送信しました)

この場合、wordpressがテンプレートをロードする段階に到達しないため、post_statusfutureを含めるというソリューションは機能しません。ワードプレスコアの何かがそれがそこまで到達するのを妨げています。理想的には、それらがフックである場合、その間にこの動作をオーバーライドするために使用できますが、それに関しては、コアファイルを一時的に編集します。

【アップデート2】

編集が必要な2つの関数、またはそれらに関連するフックを使用する関数がわかりました。

まず、is_404()将来のページを404として追加しないように変更する必要があります

次にis_page()、ページが将来の場合はtrueを返す必要があります

【アップデート3】

私はこれをコアで行う方法を見つけました。2682行目に移動するwp-includes/query.phpと、古い関数の代わりにこれをコピーして正しく機能します。もっと良い方法があれば教えてください。ありがとう。

        /** Future Pages **/
    // Check post status to determine if post should be displayed.
    if ( !empty($this->posts) && ($this->is_single || $this->is_page) ) {
        $status = get_post_status($this->posts[0]);
        $post_status_obj = get_post_status_object($status);;
        if ( !$post_status_obj->public ) {
                if  ( $post_status_obj->protected ) {
                        $this->is_preview = true;
                        print_r($status);
                        if ( 'draft' != $status ) {
                            $this->posts[0]->post_date = current_time('mysql');
                            } else {
                            $this->posts = array();
                        }
                } elseif ( $post_status_obj->private ) {
                    if ( ! current_user_can($read_cap, $this->posts[0]->ID) )
                        $this->posts = array();
                } else {
                    $this->posts = array();
                }
        }
        /** END **/
4

1 に答える 1

1

ページ クエリに「future」の post_status パラメータを実際に追加できます。やりたいことをするためにコアファイルを変更するべきではありません。したがって、page.php および archive.php テンプレート (またはイベント表示を制御するその他の関連テンプレート) では、次のようなことができます。

<?php
$params = array('posts_per_page'=>-1, 'post_status'=>'publish,future');
$query = new WP_Query($params);
if($query->have_posts()) : while($query->have_posts()) : $query->the_post();
?>
<!-- YOUR PAGE HTML HERE -->
<?php
endwhile;endif;
wp_reset_postdata();
?>

これは単純化しすぎていますが、対応するファイルで正しいクエリを使用すると、ページを好きなように表示できます。

詳細はこちら: http://codex.wordpress.org/Class_Reference/WP_Query

検討する価値のあるもう1つのこと。これはあなたの質問の一部ではありませんでしたが、問題をうまく解決できる可能性があります。

クライアントのサーバーにサブドメインを作成して、ユーザー エクスペリエンスを中断することなくすべてを修正できるようにしてみませんか? 既存のデータベースを開発環境に簡単にインポートし、ライブ バージョンに影響を与えずに必要なすべての変更を加えることができます。

思考の糧。私のアドバイスは、これを芽のうちに摘み取って、できるだけ早くページを投稿に変換することです。そうしないと、Web サイトがすぐに混乱してしまいますが、それはあなた次第です。

お役に立てれば。

アップデート:

コア ファイルを変更しないことをお勧めしますが、すべてが修正されるまでの最後の手段である場合は、そのままにしておいてください。これは、役立つと思われる「WPフレンドリー」ソリューションです。

add_action('wp','future_redirect', 0);
function future_redirect($WP_Object)
{
    $page = is_page() ? get_page(get_the_ID()) : false;
    if($page && $page->post_status == 'future')
    {
        wp_redirect(/*YOUR REDIRECT URL*/);
        exit();
    }
    return $WP_Object;
}
于 2012-05-30T20:19:22.257 に答える