web-dev-qa-db-ja.com

フォームアクション後にページを更新する

すべての投稿が表示されているリスティング投稿ページがあります。各投稿の行で、削除、アーカイブなどのアクションを実行できます。

  • 「アーカイブ」ボタンがあります。
  • それをプッシュすると、「この記事をアーカイブしますか?」というモーダル(フォーム)が表示されます。
  • モーダルには送信ボタンがあります。これはフォームアクションを実行し、ページを更新して、アーカイブされたばかりの投稿を非表示にします。

私の問題:私の投稿はアーカイブされていますが、私のページから消える前に2回ページを更新する必要があります。 [送信]をクリックするとページが更新されますが、2回目の再読み込みでは非表示になっている投稿が表示されます。

私は私が間違った行動をしていると思います。 functions.phpの私のコード:

add_action('archive_post','archive_action');
function archive_action($pid) { 
    if(isset($_POST['archive']))
    {   
        update_post_meta($pid, 'archived', "1");
        //other code
    }

    ?>
<div id="archive-modal" class="modal fade" role="dialog">
    <div class="modal-dialog">
        <div class="box_title">
            <?php printf(__("Do you want archive this",'metheme'), $pid);?>
            <a class="pull-right" href="#" data-dismiss="modal">&times;</a>
        </div>
        <div class="box_content">
            <form method="post" action=""> 
                <input type="submit" name="archive" style="width:100%; text-align:center;" ?>" />
            </form>
        </div>
    </div>
</div>
<?php }

$post->idをarchiveに渡すために、この関数を私のループで呼び出します。

do_action('archive_post', $pid);

これまでに試したこと

  • code:not workingのように、ページを更新するためのフォームaction=""は空です。投稿は残り、もう一度更新した場合にのみ表示されなくなります。
  • $_POST関数のwp_redirect(get_permalink());beforeと同じ。
  • echo '<meta http-equiv="refresh" content="0.5;url='.$mylink.'" />';は動作しますが、これもまたページを2回更新します。以前と同じように自動化されているだけです。

他に解決策はありますか?何が足りないの?

2
huraji

あなたのページが送信されたならば、あなたは$_SERVER['HTTP_REFERER']が利用可能であることをかなり確かにすることができます。

それで、あなたはどちらかをすることができます:wp_redirect($_SERVER['HTTP_REFERER']);またはheader('Location: ' . $_SERVER['HTTP_REFERER'])

これはあなたがすでに行っているのと同じページにリダイレクトするでしょう。

4
DarkNeuron

initフックで検索してアクションを実装できなかったことこの回避策を見つけました。確かにこれは最善ではありませんが、うまく機能します。

echo "<script type='text/javascript'>
        window.location=document.location.href;
        </script>";

$_POST命令の最後にあります。誰かがより良い解決策を持っている場合は、共有することを歓迎します。

2
huraji

あなたの関数archive_actionはすでにループが作られたときに実行されるからです。関数をinitアクションにフックしてみてください。そうすれば、それはループの前に実行されます。

もう1つの優れたアプローチはajaxを使うことです。そのため、Ajaxを介してリクエストをアーカイブに送信し、javascriptを使用してDOMから投稿を削除します。

0
Bruno Cantuaria