web-dev-qa-db-ja.com

ページ更新後のショートコードからWordpressの一時的なファイルを削除する

誰かが私を助けてくれることを願っています。そのページが更新されたとき、私は投稿/ページにあるすべてのショートコードのための一時的なものを削除する必要があります。そのため、ページを更新すると、そのページにあるショートコードだけの一時的な要素が削除されます。それが不可能な場合は、すべてのショートコードトランジェントがページの更新時に削除されると役立ちます。

私はsave_postアクションを使用しようとしましたが何も起こらないので、私は何か間違ったことをしているに違いありません。

また、問題は、ポストIDと静的変数の増分に基づいてショートコードIDを生成していることです。

だから、私がshortcode-template.phpのトランジェントを削除するためにメソッドを呼び出すときだけ私は現在のページIDにアクセスすることができ、それから私はページID /ショートコードIDの組み合わせに関連するトランジェントを削除することができます。しかし、その後、ショートコードがロードされるたびにトランジェントは削除されます。そして、私がdelete_transient関数を呼び出さなければ、何も起こらないのでsave_postアクションにフックされていないようです。

これは、現在のページIDをClass内で取得することはできないが、ページ上のどこかで使用されている場合に限られるためです。しかし、それを回避する方法はわかりません。

これが私のクラスです:

  class MainClass {

            private static $shortcode_increment = 0;

            private function __construct() {
                add_action( 'save_post', array( $this, 'update_page_delete_transient') );
            }

            public static function increment_id() {
                global $post;

                self::$shortcode_increment++;

                return 'shortcode_' . $post->ID . "_" . self::$shortcode_increment;
            }

            // delete the shortcode cache on page update
            public function update_page_delete_transient() {

            delete_transient( 'weather_'.self::increment_id() );
            }
    }

任意の助けは大歓迎です。ありがとう。

更新

私は理解しているように、そのアクションが発生したときにそのアクションに追加された関数をアクティブにする必要があるので、その関数を呼び出す必要はありません。それともありますか?

たとえば、アクション自体は構造内にあるため、クラスがshortcode-template.phpでインスタンス化された後、アクションに追加された関数は自動的にアクティブになりますか?それとも動作させるためにはshortcode-template.phpのdelete_transient関数を呼び出す必要がありますか?しかし、私がそうするとき、それはウィジェットがロードされるたびに実行されるだけで、保存ポスト/ページにはありません。

アップデート2

だから、私はIDをインクリメント機能から投稿IDを削除した場合、私はひどく上記のアップデート1から問題を解決することができます。 delete_transient関数は、オブジェクトのインスタンスを作成したときにアクティブになり、ページ/ポストセーブ時に呼び出されます。

残っている問題は、新しいショートコードが作成されたときにdelete_transient内でのみIDが増加した場合、どのようにして一意のショートコードIDをshortcode-template.php関数に渡すかです。あるいは、メインクラスのdelete_transient関数になんらかの方法でPage IDとShortcode IDを渡すことができれば、さらに良いでしょう。そのため、更新時に特定のショートコードの特定のトランジェントを削除することもできます。

shortcode-template.phpからObjectメソッドにデータを渡す方法はありますか?

1
Arakis

ショートコードのすべてのデータを1つの変数に保存する場合は、簡単にリセットできます。

ショートコード(擬似コード)のどこかに例を示します。

$page_cache = get_transient("page_{$page_id}");
if ( empty($page_cache ) ){
  global $shortcode_index;
  $page_cache[$shortcode_index] = **some data that cached**;
  set_transient( "page_{$page_id}", $page_cache, **some time** );
  $shortcode_index++;
  ****
}

そして保存後にpage_idで削除することができます

 delete_transient( "page_{page_id}" );
1
Igor Sorish