CMS関連

【EC-CUBE2】複数商品・複数届け先を選ぶと「お支払方法・お届け時間等の指定」画面で、「お届け時間の指定」が空っぽになる不具合について

EC-CUBEのコミュニティーでも質問させてもらったのですが、自己解決したので、ここにもメモ書き。

なお、この不具合はMySQLを使っている場合に起こります(PostgreSQLなら起こりません)

 

不具合の内容

例えば、商品A・B・C・D・Eをそれぞれ5個ずつカートに入れます。(合計25個)
ログインして「お届け先の指定」画面で、「複数のお届け先に送る」を選択し、「お届け先の複数指定」画面を開きます。
その画面で、商品ごとに(A・B・C・D・Eごとに)
1個目は届け先a
2個目は届け先b
3個目は届け先c
4個目は届け先d
5個目は届け先e
と指定し、「選択したお届け先に送る」ボタンを押します。

↓こんな感じ

そうすると、なぜか次の画面で「お届け時間の指定」が空っぽになります。

本来であれば、↓こんな風にお届け先ごとに時間帯を選択できるプルダウンが表示されます。

 

原因と解決方法

原因はセッションを保存するカラムのデータ型でした。

購入フローのセッションデータは、
「dtb_order_temp」テーブルの「session」カラム
「dtb_session」テーブルの「sess_data」カラム
の2つに保存されるようなのですが、ここのカラムのデータ型は、「text」になっていました。

「text」型だと、65,535バイトまでしか保存できませんが、上記の例のような届け先を設定をすると、65,535バイトを超えます。
そのため、データが不十分な状態で保存されてしまい、届先データが消えてしまうという問題が起きていました。(実際確認すると中途半端な状態でデータが入っていました)

ここのカラムのデータ型を「longtext」型に変えることによってこの現象は起こらなくなりました。

「dtb_order_temp」テーブル

「dtb_session」テーブル

ちなみにPostgreSQLでもこのカラムはtext型ですが、PostgreSQLの場合は、text型は「制限無し可変長文字列」みたいですね。
だからPostgreSQLでは正常なのに、MySQLだと不具合が起きてしまっていたようです。

もしMySQLを使っている方がいらっしゃいましたらご注意を。

 

追記

改めて、「EC-CUBE2 session long text型」でググったら、該当記事がいっぱい出てきた^^;

修正方法についてはやっぱりこれで問題ないみたい。

結構昔からある不具合なのに、直さないんだなぁ・・・

総合管理者 | 2018年04月19日 | コメント(0) | トラックバック(0) | CMS関連

json_encodeかと思ったらserializeだった話

json_encodeされたデータとserializeされたデータはパッと見似ています。

なので、json_encodeでエンコードされたデータだと思って、json_decodeでデコードしようとしても、serializeでエンコードされたデータだったら、デコードされません(当然)

serializeでエンコードされたデータは、unserializeでデコードしましょう。

json_encode→json_decode

serialize→unserialize

どっちか試してみて、だめなら片方でやればOK

EC-CUBEやWordpressのデータは、serializeでエンコードされていることが多いです。

総合管理者 | 2018年04月19日 | コメント(0) | トラックバック(0) | CMS関連

スラッグ名の重複対策 改

そもそもの原因についてはこちら

【WordPress】スラッグ名が重複すると、公開中の投稿ページが404になる

上記の対策方法を、こちらの記事「スラッグ名の重複対策」で書かせてもらいましたが、よくよく考えてみたら、こんなに複雑に考える必要はありませんでした。

つまり、下書きだろうが、スラッグ名を確定させてしまえばよい!(というか、なぜそうなってないのか)

プログラム修正版はこちらです。

function change_post_name($post_id){
	if(!wp_is_post_revision($post_id)){
		$get_post = get_post($post_id);
		if(!empty($get_post->post_name)){
			remove_action('save_post', 'change_post_name', 13, 2 );
			if($get_post->post_status == "draft" || $get_post->post_status == "pending"){
				$post_name = wp_unique_post_slug($get_post->post_name, $post_id, "publish", $get_post->post_type, $get_post->post_parent);
				wp_update_post( array( 'ID' => $post_id, 'post_name' => $post_name) );
			}
			add_action('save_post', 'change_post_name', 13, 2 );
		}
	}
}
add_action('save_post', 'change_post_name', 13, 2 );

7行目のwp_unique_post_slugは、wp_insert_post関数内で使用されてる、ユニークなスラッグ名を付けてくれる関数です。

この関数の第3引数が、下書きの場合は、ユニークにしてくれません(第1引数のスラッグ名をそのまま返します)

ということであれば、第3引数だけ「publish」にして、ユニークなスラッグ名を取得し、保存し直せばよい!

ということで、作ってみたのですが、とりあえず大丈夫っぽい。

※このプログラムについて責任はとれませんので、自己責任でお願いします。

 

参考サイト

wp_unique_post_slug – WordPress私的マニュアル

総合管理者 | 2018年04月14日 | コメント(0) | トラックバック(1) | CMS関連

EC-CUBE2系でドメイン変更するとログインできなくなる

EC-CUBE2系を、テスト環境URLで構築して、本番環境URLに変更すると、サイト自体は表示されますが、ログインできなくなることがあります。

URLを変更する際は、まず「/data/config/config.php」の下記の部分を変更します。

define('HTTP_URL', 'http://xxxxxxxx/');
define('HTTPS_URL', 'https://xxxxxxxx/');

しかしこれだけ変更しても、管理画面にログインしようとするとシステムエラーとなってしまいました。

同じく、config.phpのAUTH_MAGICを変更するとよいという情報を得たので変更してみたのですがうまくいかず。(最終的にはこれは変更しないほうがよかったです※)

ということで、追加で下記を実行

  • データベースの、dtb_sessionテーブルを空にする
  • 「data/Smarty/templates_c」の「admin」フォルダとサイトテンプレート用フォルダを空にする。
  • ブラウザを立ち上げ直す(orブラウザを変えてみる)

これで正常にログインできるようになりました!

※AUTH_MAGICを変更していると、上記の3つを実行しても、「ログインIDとパスワードが間違っています」というエラーになりログインできなくなります。
元に戻したら、ログインできるようになりました。

総合管理者 | 2018年01月22日 | コメント(0) | トラックバック(0) | CMS関連

タイトル・内容のフック場所【WordPress】

タイトル・内容のフック場所は、フロントエンド、管理画面で異なるので注意が必要です。

フロントエンドの場合


//タイトルにフックをかける(the_titleをフック)
add_filter('the_title', hoge_the_title, 1);

//内容にフックをかける(the_contentをフック)
add_filter('the_content', hoge_the_content, 1);

バックエンドの場合


//投稿一覧のタイトル表示にフックをかける(the_postをフックし、内部で処理)
add_filter('the_post', hoge_the_post, 100);
function hoge_the_post($post){
//$post->post_titleを編集する 例:$post->post_title = htmlspecialchars($post->post_title);
return $post;
}

//編集画面のタイトル入力フィールドにフックをかける(title_edit_pre'をフック)
add_filter('title_edit_pre', hoge_the_title, 1);

//編集画面の内容フィールドにフックをかける(the_editor_contentをフック)
add_filter('the_editor_content', hoge_the_content, 1);

 

単純に、the_titleやthe_contentにフックするだけでは、管理画面の方で反映してくれないので注意。

特に投稿一覧では、表示だけならthe_titleのフックで行けますが、クイック編集の方にも反映させる場合は、the_postにフックし、$post->post_titleに処理を加える必要があります。

総合管理者 | 2018年01月08日 | コメント(0) | トラックバック(0) | CMS関連

固定ページにも抜粋をつける

固定ページでも、子ページを一覧で表示するなどの使い方をする場合があります。

その際に任意に設定できる抜粋がないと非常に困る(WPデフォルトでは無い)

固定ページでも抜粋を付ける場合は、使用しているテーマのfunction.phpにこれを追記します

add_post_type_support( 'page', 'excerpt' );

これで固定ページの編集画面にも抜粋が表示されるようになります

 

総合管理者 | 2017年12月14日 | コメント(0) | トラックバック(0) | CMS関連

wp_insert_attachmentだけではサムネイルが作られない

フォームから送られてきたファイルをメディアに登録されるようにするプログラムを作っていたのですが、実際にメディアには登録されるけど一覧でサムネイルが表示されない・・・

で、Codexをよく見たら、wp_insert_attachmentのあとに下記2つの関数も実行しなくてはならないとのこと

wp_generate_attachment_metadata
wp_update_attachment_metadata

さらにこの関数を実行するには、

require_once( ABSPATH . 'wp-admin/includes/image.php' );

の必要があります。

つまりこんな感じ。


require_once( ABSPATH . 'wp-admin/includes/image.php' );

$attachment = array(
'guid' => "(ファイルのURL)",
'post_mime_type' => "(ファイルのタイプ)",
'post_title' => "(ファイルのタイトル)",
'post_content' => '',
'post_status' => 'inherit'
);

$attach_id = wp_insert_attachment( $attachment, "(ファイル名)", 0);
$attach_data = wp_generate_attachment_metadata( $attach_id, "(ファイルのパス)");
wp_update_attachment_metadata( $attach_id, $attach_data );

これで、メディアに登録される際にサムネイルも生成されるようになりました。

総合管理者 | 2017年12月13日 | コメント(0) | トラックバック(0) | CMS関連

Movable Type6系でフォルダー・カテゴリーが保存できない【Ajax error: error】

今日、Movable Type6でフォルダーを作成し、「変更を保存」ボタンをクリックしたところ、以下のエラーがアラートで帰ってきました。

Ajax error: error

・・・なにこれ?

さらにカテゴリーのほうでも、同様に上記のエラーが出て保存できない。

どうしてもカテゴリーとフォルダーを追加しなくてならなかったため、phpMyAdminを入れて、そっちでデータベースに直接入れてみようかと思ったところ、なんかこっちでもエラーが出てSQLがちゃんと実行されない!?

MTに引き続きphpMyAdminでも起こるって、ほんとなんだこれ!

と思っていたら、後輩が「もしかして、WAFのせいかも」との一言。

なるほど、可能性はあると思い、サーバーのコンパネに入りWAFの設定を変更したところ、正常に動作するようになりました・・・

あー、冷や汗かいた・・・

WAFってセキュリティ高めてくれるのは良いんですが、どうも苦手です。

ちなみに今回のサーバーはzenlogicでした。

皆さんも注意しましょう。

総合管理者 | 2017年07月11日 | コメント(0) | トラックバック(0) | CMS関連 | サーバー関連

予約公開ができない場合【WordPress】

WordPressで予約公開ができない場合、原因は色々とあります。

このことは色んなサイトで紹介されています。

でも、たまに公開に失敗するなど原因がよくわからない不具合も起こります。

WordPressの予約投稿は、
一定のアクセスがないと実行されないという仕様になっています。

アクセスがないブログは予約投稿ができないといっても過言ではありません。

WordPressの予約投稿に失敗する原因と見るべき重要ポイントのまとめ! | 自作PCテクニカルセンター

という話まであり、正直Wordpressの予約公開はあまり信用できません。

 

ということで、解決方法として、こんな感じのプログラムをheader.phpの先頭に入れてみました。

if(is_home() || is_front_page()){
	//予約の投稿のみ取得(MAX20件)
	$get_posts = get_posts(array(
		"posts_per_page" => 20,
		"post_type" => "any",
		"post_status" => "future"
	));

	if($get_posts){
		foreach($get_posts as $get_post){
			//現在が予約日時を過ぎている場合
			if($get_post->post_date < current_time("Y-m-d H:i:s")){ 
				//公開処理 
				$save_post = array(
					"ID" => $get_post->ID,
					"post_status" => "publish"
				);
				wp_update_post($save_post);
			}
		}
	}
}

※トップページアクセスの場合のみ反応するようにしています。

post_statusがfutureになっている記事だけ取得し、予約日時が過ぎているものだけ、publishに更新するという簡単なプログラム

ちゃんと動いているし、負荷もそれほどかからないし問題なさそう。(※動作に責任は持ちません)

 

 

総合管理者 | 2017年06月05日 | コメント(0) | トラックバック(0) | CMS関連

WordPressのマルチサイトで参加サイトが表示されない

マルチサイト化されているWordpressのサーバーを移転したところ、参加サイトが表示されなくなってしまいました。

↓この部分

もちろんログインしたアカウントはすべてのサイトに所属しています。

プラグインのせいかと思って全部切ってみたのですが、治らず。

移転時にバージョンアップしたからかとも思いましたが、他のサイトで使っている同じバージョンのWordpressでは、こんな問題は起きたことがありません。

移転中だったのでベーシック認証をかけていたのですが、まさかこれじゃないだろうと思いながらも試しに解除してみたら、表示されるようになりました!

原因はベーシック認証!

こんなことあるのか・・・

ちなみに、一度表示されるようになったら、以降は再びベーシック認証をかけてもちゃんと表示されます。

総合管理者 | 2017年03月08日 | コメント(0) | トラックバック(0) | CMS関連

Copyright(c) 2010 - 2018 ダリの雑記