商品ページのテキストエリア文字数制限を設定するには

2014 年 7 月 16 日

ホーム フォーラム テンプレート(テーマ) 商品ページのテキストエリア文字数制限を設定するには

このトピックには16件の返信が含まれ、3人の参加者がいます。3 年、 4 ヶ月前 kitamuuu さんが最後の更新を行いました。

15件の投稿を表示中 - 1 - 15件目 (全17件中)
  • 投稿者
    投稿
  • #71371

    lareve
    参加者

    お世話になります。

    商品ページにテキストエリアの設定を考えてますが、
    テキストエリア内の文字数を制限する方法はありますでしょうか?

    御教示の程宜しくお願い致します。

    #71382

    kitamuuu
    参加者

    フィルターを使用したカスタマイズになりますが、
    商品をカートへ入れたときのエラーチェック関数の中に usces_filter_incart_check というフィルターがあるので、ここにテキストエリアの値が制限文字数を超えていたら、指定したエラーメッセージを出力する関数をフックするとよいと思います。

    #71390

    lareve
    参加者

    返信いただきありがとうございます。
    試してみようと思います。

    #71398

    lareve
    参加者

    お世話になります。

    すみません。
    プログラムについて、あまり詳しくない為、まずはフックの使い方を少し勉強しましたが、やはりどのようなプログラムを記述すれば良いのか分かりません。

    functios.phpに下記のような感じのプログラムを記述すれば良さそうということは分かりましたが、具体的にどのように記述すればいいのかが・・・?

    add_filter(‘usces_filter_incart_check ‘, ‘my_incart_chek’, 10, 3);
    function my_my_incart_chek() {
    ここから下をどのような記述にしたら良いのか分かりません。

    やりたいことは、テキストエリアの文字数が10文字を超えていたら「文字数が多すぎます」のようなエラーメッセージを表示したいのですが。

    申し訳ありませんが、再度御教示の程宜しくお願い致します。

    #71463

    lareve
    参加者

    お世話になります。

    上記の件、もうすこし自分で調べてみてfunctios.phpに下記のような記述をしましたが
    画面が真っ白になってしまって動きません。wordpressのエラーになってしまうようです。
    いったいどのように記述したら良いのでしょうか?

    <やりたいこと>
    所定のテキストエリアの文字数が20文字を超えていたら「最大文字数を超えています」の
    エラーメッセージを表示する。

    <functios.phpへの記述>
    /* 文字数制限 */
    add_filter(‘usces_filter_incart_check

    ‘,’my_incart_check’,10);
    function my_incart_check($mes) {
    var text_length = $(#”itemOption[846]”).val

    ().length;
    if(text_length > 20 ){
    $mes = ‘最大文字数を超えています’;
    }
    return $mes;
    }

    <備考>
    テキストエリアのidがitemOption[846]となっていました。

    すみませんが、御教示下さい。
    よろしくお願い致します。

    #71465

    kitamuuu
    参加者

    その記述ですと、PHPとJavascriptが入り混じっているのでエラーになってしまいます。
    記述はPHPで行って下さい。

    例えば

    
    add_filter( 'usces_filter_incart_check', 'my_incart_check', 10, 3 );
    function my_incart_check($mes, $post_id, $sku){
    	$mes[$post_id][$sku] .= 'エラー';
    	return $mes;
    }
    

    とすると、毎回「エラー」というメッセージが表示されるようになります。
    あとはテキストエリアの値を$_POSTで受け取り、mb_strlenというPHPの関数を使って
    文字数をカウントできるので、テキストエリアに入力された値が20文字を超えている場合にのみこの処理を行うよう、条件分岐をすればいいと思います。
    Welcartの[基本設定]>[共通オプション]を使ってテキストエリアを挿入しているのであれば、オプション名をひらがなや漢字等で指定していると、urlencodeされたものがテキストエリアのnameとなっているので以下のように取得して下さい。
    「オプション名」という記述は文字数制限したい共通オプション名に置き換えてください。

    
    $enc_txtarea_op = urlencode('オプション名');
    $textarea_val = $_POST['itemOption'][$post_id][$sku][$enc_txtarea_op];
    
    #71481

    lareve
    参加者

    kitamuuu様

    御教示いただきありがとうございます。

    小生の知識不足で何度も質問し申し訳ありませんが
    追加で御教示いただきたくお願いいたします。

    下記のような記述をしたのですが、うまくいきませんでした。
    オプション名は「文字列」という名前を付けてます。

    $enc_txtarea_op = urlencode(‘文字列’);
    $textarea_val = $_POST[‘itemOption’][$post_id][$sku][$enc_txtarea_op];
    $text_length = mb_strlen($textarea_val);

    add_filter( ‘usces_filter_incart_check’, ‘my_incart_check’, 10, 3 );
    function my_incart_check($mes, $post_id, $sku){
    if($text_length > 20 ){
    $mes[$post_id][$sku] .= ‘文字数エラー’;
    return $mes;
    }
    }

    また、御教示いただきました下記の記述を試したところ
    [カートへ入れる]を押すとカート画面へは移動しなくなったのですが
    「エラー」の文字が画面上に出力されません。

    add_filter( ‘usces_filter_incart_check’, ‘my_incart_check’, 10, 3 );
    function my_incart_check($mes, $post_id, $sku){
    $mes[$post_id][$sku] .= ‘エラー’;
    return $mes;
    }

    お手数おかけし申し訳ありませんが、何卒御教示の程宜しくお願い致します。

    • この返信は3 年、 4 ヶ月前に  lareve さんが編集しました。
    #71491

    kitamuuu
    参加者

    テキストエリアの値の取得は関数定義(function)の中に記述しないといけません。
    また、テキストエリアの値($textarea_val)を取得する前に、制限したいテキストエリアの値が$_POSTに含まれているかをチェックし、あるときだけ値を取得しないと、テキストエリアが設置されていない商品をカートにいれたときにエラーが起きてしまいます。

    [カートへ入れる]を押すとカート画面へは移動しなくなったのですが
    「エラー」の文字が画面上に出力されません。

    との事ですが、こちらではエラーの文字が赤文字で表示されますので、もう一度よく確認してみて頂けますか。

    #71497

    lareve
    参加者

    kitamuuu様

    迅速なご回答、誠に感謝いたします。。
    御教示いただいた通りテキストエリアの値の取得を関数定義(function)の中に記述し、
    制限したいテキストエリアの値が$_POSTに含まれているかをチェックする為、
    if(isset($_POST))を追記致しました。

    その結果、20文字を超えるとカートへ入れることができないようになりました。
    これだけでも、ほんとに嬉しいです。
    記述は下記の通りです。

    /*文字数制限エラー*/
    add_filter( ‘usces_filter_incart_check’, ‘my_incart_check’, 10, 3 );
    function my_incart_check($mes, $post_id, $sku){
    $enc_txtarea_op = urlencode(‘文字列’);
    $textarea_val = $_POST[‘itemOption’][$post_id][$sku][$enc_txtarea_op];
    if(isset($_POST)){
    $text_length = mb_strlen($textarea_val);
    if($text_length > 20 ){
    $mes[$post_id][$sku] .= ‘文字数エラー’;
    return $mes;
    }
    }
    }

    しかし、やはり「文字数エラー」が表示されずに困っております。
    なにか考えられる原因はありますでしょうか?
    テーマは、オリジナルのテーマを使用してますが、関係ありますか?

    度々のご質問で大変恐縮ですが、何卒御教示の程宜しくお願い致します。

    #71498

    lareve
    参加者

    kitamuuu様

    迅速なご回答、誠に感謝いたします。。<br>
    御教示いただいた通りテキストエリアの値の取得を関数定義(function)の中に記述し、<br>
    制限したいテキストエリアの値が$_POSTに含まれているかをチェックする為、<br>
    if(isset($_POST))を追記致しました。

    その結果、20文字を超えるとカートへ入れることができないようになりました。<br>
    これだけでも、ほんとに嬉しいです。<br>
    記述は下記の通りです。

    /*文字数制限エラー*/<br>
    add_filter( ‘usces_filter_incart_check’, ‘my_incart_check’, 10, 3 );<br>
    function my_incart_check($mes, $post_id, $sku){<br>
    $enc_txtarea_op = urlencode(‘文字列’);<br>
    $textarea_val = $_POST[‘itemOption’][$post_id][$sku][$enc_txtarea_op];<br>
    if(isset($_POST)){<br>
    $text_length = mb_strlen($textarea_val);<br>
    if($text_length > 20 ){<br>
    $mes[$post_id][$sku] .= ‘文字数エラー’;<br>
    return $mes;<br>
    }<br>
    }<br>
    }

    しかし、やはり「文字数エラー」が表示されずに困っております。<br>
    なにか考えられる原因はありますでしょうか?<br>

    テーマは、オリジナルのテーマを使用してますが、関係ありますか?
    例えば、背景画像を設定してますが、画像で「文字数エラー」の文字が
    隠れてしまう等ということはありますでしょうか?

    度々のご質問で大変恐縮ですが、何卒御教示の程宜しくお願い致します。

    #71543

    kitamuuu
    参加者

    もし、テーマの中でwc_templatesフォルダ内のwc_item_single.phpを使用していて、尚且つ、wc_item_single.phpの記述中のエラーを出力するための、usces_singleitem_error_messageという関数を削除してしまっていたら出力されません。
    wc_item_single.phpファイルを使用していないのであればこの点は関係ありません。

    また、カスタマイズの際には記述ミスなどのエラーをブラウザで確認できるよう、wp-config.php 内の define(‘WP_DEBUG’, false); を define(‘WP_DEBUG’, true); にして行ったほうが原因が特定しやすいです。何かエラーがでているならそれを解決する必要があります。カスタマイズが終わったらこの記述は元に戻してください。

    ちなみに

    
    if(isset($_POST)){
    

    だけではテキストエリアがあるかどうかはチェックできていないので

    
    if( $_POST['itemOption'][$post_id][$sku][$enc_txtarea_op] ){
    

    とする必要があります。
    また、前述したとおりこの分岐は、テキストエリアの値($textarea_val)を取得する前に記述しないといけないので、もう一度記述を見直して見て下さい。

    #71550

    lareve
    参加者

    kitamuuu様

    アドバイスいただき誠にありがとうございます。

    下記の通りの記述に変更致しました。

    /*文字数制限エラー*/
    add_filter( ‘usces_filter_incart_check’, ‘my_incart_check’, 10, 3 );
    function my_incart_check($mes, $post_id, $sku){
    if( $_POST[‘itemOption’][$post_id][$sku][$enc_txtarea_op] ){
    $enc_txtarea_op = urlencode(‘文字列’);
    $textarea_val = $_POST[‘itemOption’][$post_id][$sku][$enc_txtarea_op];
    $text_length = mb_strlen($textarea_val);
    if($text_length > 20 ){
    $mes[$post_id][$sku] .= ‘文字数エラー’;
    return $mes;
    }
    }
    }

    また、wc_item_single.phpを確認したところ、
    usces_singleitem_error_messageという関数は削除していなかったのですが、
    <?php get_header(); ?> が2重に記述されていることに気付いた為、
    1つ削除しました。
    これは、原因として考えられますでしょうか?

    以上を修正した後、wp-config.php 内の define(‘WP_DEBUG’, false); を
    define(‘WP_DEBUG’, true);に変更して動作確認を行った結果
    下記のようなメッセージが画面上に表示されたのですが、修正方法が分かりません。
    大変申し訳ないのですが、解読いただけると助かります。
    また、私のオリジナルテーマ内のfunctions.phpを添付致しますので
    ご確認いただけないでしょうか。

    Notice: Undefined variable: enc_txtarea_op in /home/la-reve/la-reve.com/public_html/wp-content/themes/LRV/functions.php on line 18

    Notice: Undefined index: in /home/la-reve/la-reve.com/public_html/wp-content/themes/LRV/functions.php on line 18

    ほんとにご迷惑おかけしており申し訳ありませんが、よろしくお願いいたします。

    • この返信は3 年、 4 ヶ月前に  lareve さんが編集しました。
    Attachments:
    You must be logged in to view attached files.
    #71554

    kitamuuu
    参加者

    すいませんissetが抜けていました。

    
    if( $_POST['itemOption'][$post_id][$sku][$enc_txtarea_op] ){
    

    
    if( isset($_POST['itemOption'][$post_id][$sku][$enc_txtarea_op]) ){
    

    としてください。

    #71565

    lareve
    参加者

    kitamuuu様

    すみません。
    どうしてもうまくいきません。
    昨日までは20文字以上をテキストエリアに記入するとカートページへは
    移動していなかったのですが、なぜかそれもできなくなってしまいました。

    一度、最初の状態にもどしてみて、教えていただいた下記の記述を試してみました。

    add_filter( ‘usces_filter_incart_check’, ‘my_incart_check’, 10, 3 );
    function my_incart_check($mes, $post_id, $sku){
    $mes[$post_id][$sku] .= ‘エラー’;
    return $mes;
    }

    結果、下記のようなエラーメッセージが表示されます。

    Notice: Undefined offset: 846 in /home/la-reve/la-reve.com/public_html/wp-content/themes/LRV/functions.php on line 18

    Notice: Undefined index: %E3%82%A8%E3%83%95%E3%82%A7%E3%82%AF%E3%83%88%E6%96%87%E5%AD%97 in /home/la-reve/la-reve.com/public_html/wp-content/themes/LRV/functions.php on line 18

    Warning: Cannot modify header information – headers already sent by (output started at /home/la-reve/la-reve.com/public_html/wp-content/themes/LRV/functions.php:18) in /home/la-reve/la-reve.com/public_html/wp-content/plugins/usc-e-shop/classes/usceshop.class.php on line 4492

    welcartのプラグイン自体が壊れてしまったのでしょうか?
    かなり心配です。

    なにか対策はありますでしょうか?

    #71570

    nanbu
    参加者

    こんにちは。

    $mes[$post_id][$sku] が存在するかどうかわからない時はコンキャットしてはいけません。
    正しくはこの様になります。

    
    add_filter( 'usces_filter_incart_check', 'my_incart_check', 10, 3 );
    function my_incart_check($mes, $post_id, $sku){
        $mes[$post_id][$sku] = 'エラー';
        return $mes;
    }
    
15件の投稿を表示中 - 1 - 15件目 (全17件中)

このトピックに返信するにはログインが必要です。