nglife
投稿の際は下記の情報をお書き添えください。
-------------------------------------------
WordPress のバージョン:(例 6.0.2)
Welcart のバージョン:(例 2.8.1)
PHP のバージョン:(例 8.0)
Welcart専用の拡張プラグインとバージョン:(例 DL Seller 3.4.1、SKU Select 1.4.2)
ご利用の親テーマとバージョン :(例 Welcart Basic 1.7.1)
ご利用の子テーマとバージョン :(例 Welcart Beldad 1.4)
症状を確認したブラウザ:
サーバー【重要】:(会社名、サービス名)
--------------------------------------------
フォーラムへの返信
-
投稿者投稿
-
nglife参加者
こんにちは。
「php.ini」を編集可能なのであれば「max_input_vars」の値を増やしてみると改善されるかもしれません。大体「1000」あたりが設定されているかと思いますが必要に応じて「1500~2000」程度に設定するのが良いかなと思います。
※闇雲に増やすのもセキュリティ上問題ありますのでほどほどに>共通オプションがいつのまにか200件超
ということですと、画面内HTML上の「<input>」の数が膨大になっているはずです。先ほどの「max_input_vars」は一度に送信できる「<input>」の数と捉えていただければOKです。この許容値を超えてしまうと仰るような現象が起こる可能性は高いと思います。見当違いでしたらすみませんがご参考までに。
※よくよく見たらyuchelleさんは解決済み?でしたね。soholandさんはどういう状態か分かりませんが参考になればと思います- この返信は5年前にnglifeが編集しました。
nglife参加者横から失礼します。
ご指摘のいわゆる無名(匿名)関数
add_action('hoge',function(){…})
は、PHP5.3から使用できると思います。PHP: 無名関数 – Manual
http://php.net/manual/ja/functions.anonymous.php
>5.3.0 無名関数が使えるようになりました。掲示のエラー文は確かに無名関数が解釈できない故のエラーと思われますが、5.3未満の環境ということはないでしょうか。
※補足ですがこの箇所には元々「create_function()」が使われていました。
http://php.net/manual/ja/function.create-function.php
>この関数は PHP 7.2.0 で 非推奨になります。この関数に頼らないことを強く推奨します。また、話は変わりますが、
add_action('admin_notices', function(){ echo addcslashes($msg,'"'); });
↑については、
add_action('admin_notices', function() use($msg){ echo addcslashes($msg,'"'); });
のように「use($msg)」を付け加えないとfunction()の中で$msgが使えないかと思います。
※この記述が含まれる関数「wc_mkdir()」自体、1.9.11では一見呼ばれていることもなさそう?なので今々は問題ないようにも思いますが。連々とすみません。少々気になったので補足まで。
nglife参加者1点追記で↑の2. 3. それぞれにおいてsubmitボタン押下時に下記内容がchromeのコンソールで表示されます。
[Deprecation] Synchronous XMLHttpRequest on the main thread is deprecated because of its detrimental effects to the end user’s experience. For more help, check https://xhr.spec.whatwg.org/.
トークン取得時に走るXMLHttpRequestの同期通信についての警告と思います。
デバイス環境によってはこのトークン取得通信がブラウザ側でブロックされてしまう恐れもあるのではないかと思いました。
※Windows/chrome:66.0.3359.181ではブロックされずに動作していました。参考:非同期じゃないXMLHttpRequestをメインスレッドで使うのはもうオワコンらしい
https://qiita.com/kozy4324/items/a0179cfd761f7bfb03ff今後を考えますと、
・ボタン押下時(ないし違うタイミングで)非同期にトークン取得→完了後にsubmit遷移可能
とするのがベターのように思いました。合わせてご確認のほどよろしくお願い申し上げます。
nglife参加者こんにちは。
$html .= '<div class="quant">' . __('Quantity', 'usces');' $html .= wcad_the_itemQuant('return'); $html .= '</div>'
仰る数量部分を変数($html)へ格納したい場合には2行目の関数にreturnを渡すと意図した動作になると思います。ただ、全ての関数がそういう仕様というわけではないのでご注意ください。
nglife参加者ご対応誠にありがとうございます。大変助かりました。
なるほどスパムになっていたのですね。お手間をお掛けいたしました…。
今後ともどうぞよろしくお願いいたします。
nglife参加者>「/wc-cart」は、サイト上のどのページにあたるのでしょうか?
正確には「/wc_cart」と思いますが、商品をカートに入れた際に表示される最初のカート画面です。>(カートの中は「/users-cart」だと思いますが…)
仰る通り実URLは「/users-cart」ですが、何かしらGoogleAnalytics計測用のプラグインを入れられている場合にはWelcartの機能としてカート内のページそれぞれに「/wc_」から始まるものが割り当てられるようになっています(本来は全て「/usces-cart」)。カート画面:/wc_cart
購入者情報:/wc_customer
届け先・支払情報:/wc_delivery
確認画面:/wc_confirm
完了画面:/wc_ordercompletion自動連携機能ですね。参考になれば幸いです。
nglife参加者nanbuさん
Welcartさん早々のご対応誠にありがとうございました。
受注データが正常に取得できているのを確認できました。1.9.6のコード(本件の関係箇所)を拝見させて頂きましたが例えば
/usc-e-shop/classes/orderList2.class.phpの379行目
$this->placeholder_escape = $wpdb->placeholder_escape();
のように最新のメソッドをコールしている箇所につきましては、念のため後方互換を取られた方がよいのかなとも思いました↓if( method_exists($wpdb, 'placeholder_escape') ){ $this->placeholder_escape = $wpdb->placeholder_escape(); }
何にせよ迅速なご対応厚く御礼申し上げます。
今後ともどうぞよろしくお願いいたします。nglife参加者uchinokoさんと全く同様の現象が起きております。
恐らく「新型受注リスト」のみの問題で特に「(LIKE検索ベースの)検索条件を指定した際」に起こるようです。10月31日(火)前後にWPのコアファイル(自動)アップデートがあったようで、
/wp-includes/wp-db.php
(=$wpdb)のprepare()関数が仕様変更されているようでした。第二引数以降に「%」が含まれていると一時的にハッシュ値で置き換えられるようになったようです。また、そのハッシュ値は「query()」を通る際に元の「%」に戻されるようです。恐らくこれによるものと思います。
同ファイルに
1. placeholder_escape()/ハッシュ値生成
2. add_placeholder_escape()/ハッシュ値で「%」を置き換え
3. remove_placeholder_escape()/ハッシュ値を「%」に戻すの関数が追加されておりました。
※それぞれ「WP:4.8.3」からの追加のようですが、私含めそれ以前のWPを使用されている方でもコアファイル自動アップデートが適用されるとこれらの更新が適用されてしまいます。$wpdb->prepare()が呼ばれると、
→ 2. add_placeholder_escape()
→ 1. placeholder_escape()の順に内部でコールされ、1. の途中で3. がフックに登録されるようです↓
add_filter( 'query', array( $this, 'remove_placeholder_escape' ), 0 );
ただ、リストDL時には$wpdb->prepare()が呼ばれていないためにこの連鎖が出来ていないようでした。
Welcartの新型受注リスト用クラス
/wp-content/plugins/usc-e-shop/classes/orderList2.class.phpの仕様として「$searchWhere」や「$searchHaving」にクエリ文を格納し、リストDL時にはこの変数からクエリ文を復帰していると思います。ただこの場合、各変数にはハッシュ値を含むクエリ文が格納されてしまっているのとprepare()がコールされないことから3. のフック登録が行われずハッシュ値を元に戻せていないままリストのデータ取得クエリが発行されてしまっているのだと思います。また、クエリ文(構文)としては正常なのでエラーは出ずにデータ件数が0になってしまうと思われます。
私の調べた範囲では以上のような推測となりますが早期ご対応をいただけると助かります。
どうぞよろしくお願いいたします。
- この返信は7年前にnglifeが編集しました。
nglife参加者こんにちは。
usces_is_options()は「商品にオプションが登録されているかどうか」を判断する条件判定用の関数で引数は受け付けていません。
意図するオプションに対して処理を行いたい場合には、少し回りくどいですが下記のようなやり方があります。<?php if (usces_is_options()) : ?> <?php while (usces_have_options()) : //オプション項目ループ if (usces_getItemOptName() === "COLOR") : ?> オプション「COLOR」の説明 <?php endif; endwhile; ?> <?php endif; ?>
usces_getItemOptName()はループ中のオプション名を取得する関数です。商品にオプションがある場合、登録されているオプションの名前を一つ一つチェックしてCOLORがあった場合に説明文を出力します。他オプションでも個別の追加処理をしたい場合にはwhileの中のif分岐を増やせばOKです。
PHPに詳しい方でその他オプション項目毎に分岐やカスタマイズを行いたいという場合には、いっそのこと(商品に登録されている)オプション項目全てを変数として保持しておけば任意の場所でスムーズに処理が行えます。オプション項目取得には、「usces_get_opts(投稿ID, 配列キー指定)」を使用します(返り値:配列)。
例:オプション名「COLOR」「SIZE」で異なる説明文を出力したい場合
<?php //商品に登録されているオプション全て取得 global $post; //念のため $opts = usces_get_opts($post->ID, "name"); //変数名($opts)は他と被らないようなもの ?> <?php if(isset($opts["COLOR"])) : ?> オプション「COLOR」の説明 <?php endif; ?> //他HTMLやらPHPコード <?php if(isset($opts["SIZE"])): ?> オプション「SIZE」の説明 <?php endif; ?>
usces_get_opts()の第2引数にオプション名(name)を指定して登録オプション配列を取得します。処理をしたいオプション名が配列キーに含まれる場合処理をする。といった感じです。コードもすっきりとして見やすいかと思います。
usces_get_opts()で返ってくる配列
$opts[第2引数で指定したキーの持つ値] => array(
“meta_id”=> オプションの登録ID
“name” => オプション名
“means” => inputのタイプ(数字)
“essential” => 必須項目かどうか
“value” => オプションの持つ値(選択肢等)
“sort” => 管理画面内でのオプション登録順
);
の6つの項目からキー指定が可能です。
※第2引数に指定がない場合「sort(=管理画面内でのオプション登録順)」が設定されます
※第2引数に何を設定しようが中身の6つの項目は常に保持されます(色々処理に使えます)気付けばボリュームが出てしまい申し訳ありませんがカスタマイズをされる他の方にもご参考までに。
nglife参加者カートページ内で注文情報のテーブルhtmlを呼び出す関数「uesces_addressform()」は、カートテンプレートの各ファイルに記載されています。「wc_confirm_page.php」内だと「confirm」という引数を与えて記載されています。この引数は関数内で条件分岐に用いられます。
引数「confirm」の場合、フックは
1,「usces_filter_apply_addressform」でなく
2,「usces_filter_apply_addressform_confirm」になります。
※1,は読み込まれませんまた、「配送先情報のテーブル行のみ」にフック・処理を行う場合には、「usces_filter_shipping_address_info」が用意されていますのでこちらを用います(引数「confirm」の場合のみ利用可能)。
「template_func.php」の中に関数「uesces_addressform()」があり、その中に一連のフックが記載されています。ご参考までに。
nglife参加者こんにちは。
>・10個以上は送料無料
とのことですが、もしかすると管理画面サイドバー「Welcart Shop > 基本設定」内の「ショップ設定 > 送料無料条件」の欄に「10」と入力されていないでしょうか。ここには「金額」を入力します。念のため。下記も併せてご確認下さい。
・「内容確認」画面に送料が加算されない(過去の投稿)
https://www.welcart.com/community/forums/topic/%E3%80%8C%E5%86%85%E5%AE%B9%E7%A2%BA%E8%AA%8D%E3%80%8D%E7%94%BB%E9%9D%A2%E3%81%AB%E9%80%81%E6%96%99%E3%81%8C%E5%8A%A0%E7%AE%97%E3%81%95%E3%82%8C%E3%81%AA%E3%81%84・基本設定 @ Welcart オンライン・マニュアル|ECサイト構築プラグイン
https://www.welcart.com/documents/manual-2/%E5%9F%BA%E6%9C%AC%E8%A8%AD%E5%AE%9Anglife参加者既に解決されていたらすみません。最近メール本文変更絡みの投稿もちらほらあるようなので参考として最後の最後で。
仰る動作も正規表現とコードの処理構造を整えることで実現出来るかと思います。
前回のコードを以下のコードに丸々変更して下さい。これもスマートではありませんが。。。add_filter("usces_filter_send_order_mail_bodyall", "my_filter_send_order_mail_bodyall", 10, 2); function my_filter_send_order_mail_bodyall($msg_body, $data){ $ptns = array( array( "ptn" => "^" . __('** content of ordered items **','usces') . "$", "rep" => __('【お支払内容】','usces') ), array( "ptn" => "^" . __('Order number','usces') . "\t:", "rep" => __('お支払い番号','usces') . "\t:" ), array( "ptn" => "^" . __( 'order date','usces' ) . "\t: ", "rep" => __('お支払い日時','usces') . "\t: " ), array( "ptn" => "^" . __('Items','usces') . "\t\t: ", "rep" => __('ご請求内容','usces') . "\t\t: " ), array( "ptn" => "^" . __('Unit price','usces') . " ", "rep" => __('金額','usces') . " ", "rmv" => __(' * ','usces') . "[0-9]*$" ), array( "ptn" => "^" . __('total items','usces') . "\t: ", "rep" => __('合計金額','usces') . "\t: " ) ); $msg_body = explode("\r\n", $msg_body); foreach($msg_body as $k => $msg){ foreach($ptns as $ptn_arr){ if($ptn_arr["ptn"] != ""){ $ptn = "/" . $ptn_arr["ptn"] . "/u"; $rep = $ptn_arr["rep"]; if(preg_match($ptn, $msg)){ if(isset($ptn_arr["rmv"]) && $ptn_arr["rmv"] != ""){ $rmv_ptn = "/" . $ptn_arr["rmv"] . "/u"; if(preg_match($rmv_ptn, $msg)){ $msg = preg_replace($rmv_ptn, "", $msg); } } $msg_body[$k] = preg_replace($ptn, $rep, $msg); } } } } $msg_body = implode("\r\n", $msg_body); return $msg_body; }
「× 数量」を含む一文は単価→金額の変更処理と共に複数回出現する可能性があるため、メッセージ本文全てを「改行(¥r¥n)を区切り文字」として一時配列に格納しforeachで処理するような形を取っています。
「× 数量」のみで検索を掛けると誤置換もありそうなので、単価→金額の変更処理のついでに同一文に含まれる「× 数量」を消去しています。正規表現に関しては馴染みがないと非常に理解しづらい部分では有りますが実現できることが格段に増えますので頑張ってみて下さい。下記のようなチェックサイトもあるので上手く活用してみて下さい。
「PHP正規表現チェッカー」
http://www.rider-n.sakura.ne.jp/regexp/regexp.php最早Welcartの話ではなくなってしまい大変恐縮ですがどうぞご参考に。
nglife参加者>上記は【ご注文内容】と表示されるところですが、これを【お支払内容】に変更したいのです。
>また、注文番号→お支払い番号、注文日時→お支払い日時、商品→ご請求内容、単価→金額、商品合計→合計金額・・・としたいのですが、可能でしょうか?可能は可能です。本文に対して検索を掛けてヒットした場合に希望文言に置換する流れです。
出来ればフィルターを細かく区切った方が(置換の)誤作動を抑えられると思いますが、取り敢えず1つのフィルターで対処した場合です。
キリがなくなってきますので、以下で最後と致します(すみません)。add_filter("usces_filter_send_order_mail_bodyall", "my_filter_send_order_mail_bodyall", 10, 2); function my_filter_send_order_mail_bodyall($msg_body, $data){ $ptns = array( array( "ptn" => "\r\n" . __('** content of ordered items **','usces') . "\r\n", "rep" => "\r\n" . __('【お支払内容】','usces') . "\r\n" ), array( "ptn" => __('Order number','usces') . "\t:", "rep" => __('お支払い番号','usces') . "\t:" ), array( "ptn" => __( 'order date','usces' ) . "\t: ", "rep" => __('お支払い日時','usces') . "\t: " ), array( "ptn" => __('Items','usces') . "\t\t: \r\n", "rep" => __('ご請求内容','usces') . "\t\t: \r\n" ), array( "ptn" => __('Unit price','usces') . " ", "rep" => __('金額','usces') . " " ), array( "ptn" => __('total items','usces') . "\t: ", "rep" => __('合計金額','usces') . "\t: " ) ); foreach($ptns as $ptn_arr){ if($ptn_arr["ptn"] != ""){ $ptn = "/" . $ptn_arr["ptn"] . "/u"; $rep = $ptn_arr["rep"]; if(preg_match($ptn, $msg_body)){ $msg_body = preg_replace($ptn, $rep, $msg_body); } } } return $msg_body; }
若干パワープレイです。
意図せぬ動作になっても責任は負えませんがコードをご参考に後はご自身でカスタマイズしてみて下さい。nglife参加者横から失礼します。
希望されているサンキューメールですが、テーマfunctions.phpに下記追加してみてください。
多分いけるかと思います。add_filter("usces_filter_apply_mail_addressform", "my_filter_apply_mail_addressform", 10, 4); function my_filter_apply_mail_addressform($formtag, $type, $data, $order_id){ if($type === "order_mail_customer"){ $formtag = ""; } return $formtag; } add_filter("usces_filter_send_order_mail_meisai", "my_filter_send_order_mail_meisai", 10, 4); function my_filter_send_order_mail_meisai($meisai, $data, $cart, $entry){ $ptn = "/\r\n". __('Shipping','usces') .".+?\r\n/u"; if(preg_match($ptn, $meisai)){ $meisai = preg_replace($ptn, "", $meisai); } return $meisai; } add_filter("usces_filter_send_order_mail_shipping", "my_filter_send_order_mail_shipping", 10, 3); function my_filter_send_order_mail_shipping($msg_shipping, $data, $entry){ $msg_shipping = ""; return $msg_shipping; }
※諸々細かい説明は割愛します。すみません。
※作業中のコード(フィルター)は全て消して上のコードのみで試してみてください。nglife参加者>最初のSKU価格しか表示されないのですが、複数ある場合は、すべて表示させたいと思っています。
提示のコード内、
<?php if (usces_is_skus()) : ?>
から、商品ページが持つSKU毎にループ処理をしてそれぞれ価格を取得・表示という流れになるかと思います。・条件分岐「usces_is_skus()」内を修正
<?php if (have_posts()) : ?> <div class="thumbindex"> <?php while (have_posts()) : the_post(); usces_the_item(); ?> <div class="thumbnail_box"> <div class="thumimg"><?php usces_the_itemImage($number = 0, $width = 230, $height = 200 ); ?></div> <div class="thumtitle" rel="bookmark"><?php usces_the_itemName(); ?></div> <?php if (usces_is_skus()) : ?> <?php while(usces_have_skus()) : //SKUループここから ?> <div class="price"><?php usces_the_itemPriceCr(); ?><?php usces_guid_tax(); ?></div> <?php endwhile; usces_reset_skus(); //SKUループここまで ?> <?php endif; ?> </div><!-- thumbnail_box --> <?php endwhile; ?> </div>
1点、投稿ループの開始時に記述されている
usces_the_item();
はくれぐれも消さないよう注意して下さい。
※離れているので一見関係なさそうですが、これがないとSKUループ(usces_have_skus())が効かなくなります。 -
投稿者投稿