• 解決済 esusi

    (@esusi)


    初心者ながらエクセルの表をカスタムフィールドのボックスに貼り付けるだけで、
    ACFのリピーターフィールドに自動的に値が振り分けて登録されるようにしたくコードを作っています。
    (業務目的で品番などを振り分けて登録しておけると便利なため)

    思ったように動作するようにはできたのですが、
    「新規投稿」で公開ボタンを押した時だけAllowed memory size ofエラーが出てしまいます。(250MBぐらい)

    新しく記事を空で作るか、
    リピーターフィールドに空の行を作成した状態で
    「更新ボタン」を押した場合はうまく登録され、処理時間もかかっていないので問題ありません。

    場違いでしたらすみません。
    解決に結びつくアドバイスなど頂けたら幸いです。

    作成したコードは以下になります。

    function to_repeater(){
    global $post;
    $post_id = $post->ID;
    
    //カスタムフィールドに投稿されたテーブルから値を取得
    $str = post_custom('paste_field');
    $pattern="/(?<=<tr>).*?(?=<\/tr>)/mis";
    preg_match_all($pattern,$str,$matches[0]);
    $pattern="/(?<=<t[dh]>).*?(?=<\/t[dh]>)/mis";
    	foreach((array) $matches[0][0] as $val){
    		preg_match_all($pattern,$val,$matches[1]);
    		$matches[2][]=$matches[1][0];
    	}
    
    //リピーターフィールドに登録させるコード
    $field_key = "repeater";
    $field_value = get_field($field_key, $post_id);
    $array = $matches[2];
    $counter = 0;
    foreach ((array)$array as $key => $value) {
    $counter++;
    		if ( $counter >= 2 ) { //2行目以上の値のみ取得(1行目はラベルのため登録しない)
    			$type = $value[0];
    			$code = $value[1];
    			$field_value[] = array("type" => $type,"code" => $code);
    			update_field( $field_key, $field_value, $post_id );
    		}
    unset($array[$key]);
    }
    
    }
    add_action('wp_insert_post', 'to_repeater');
3件の返信を表示中 - 1 - 3件目 (全3件中)
  • 処理でメモリーを消費しているのでしょう。
    サーバーの仕様次第ですが、メモリーサイズを上げてみるのが最初でしょう。

    トピック投稿者 esusi

    (@esusi)

    맹조さん
    ご返答ありがとうございます。
    サーバーのメモリサイズも試したりしてみたんですが、うまく改善されずでした。
    .htaccessやini_setで変更する方法です。
    正直、しょぼいサーバーではあるのも原因かもしれませんが。

    ただ更新時だと全く問題なく動作するので、何か解決方法があるのではないかと考えてるのですが、
    新規投稿となると何が原因でメモリ消費しているのかわからず…

    心当たりがあればご教授頂ければありがたいです。

    トピック投稿者 esusi

    (@esusi)

    自己解決できました!!

    アクションフックを「wp_insert_post」から「admin_head-post.php」にしてみたところ、
    解決しました。

    原因はフックの中身がわからないのでよくわかりませんが・・・。
    解説できる方いらっしゃいましたらご教授頂きたいです。

3件の返信を表示中 - 1 - 3件目 (全3件中)
  • トピック「新規投稿時にAllowed memory size ofエラーが出る」には新たに返信することはできません。