CMS関連
EC-CUBEでクレジットカード決済が表示されない
EC-CUBEで「イプシロン決済モジュール」を導入し、設定も一通り完了したのですが、なぜか商品購入フローの「お支払方法・お届け時間等の指定」で「クレジットカード決済」の選択が表示されないという現象になってしまいました。
イプシロン側の設定も、EC-CUBE側のイプシロンモジュールの設定も問題なく見えます。
基本情報管理>支払方法設定にも、ちゃんと「クレジットカード決済」は追加されています。
なぜ登録されない・・・と「LC_Page_Shopping_Payment.php」の中身を調べてみたところ
if (in_array($payment['payment_id'], $payments_deliv)) {
というところではじかれている様子。
deliv・・・ということはと、基本情報管理>配送方法設定を調べたところ、「取扱支払方法」の設定で「クレジットカード決済」にチェックが入っていませんでした。
凡ミス・・・
総合管理者 | 2016年01月19日 | コメント(0) | トラックバック(0) | CMS関連
EC-CUBEテンプレート用タグ
メモ。
随時更新中・・・
パス用タグ
- <!--{$smarty.const.ROOT_URLPATH}-->
EC-CUBEで設定したウェブルートのURLパス。
ドメイン:無し
出力例:/ - <!--{$smarty.const.TOP_URL}-->
EC-CUBEで設定したトップページのURLパス。
ドメイン:あり
出力例:https://nandani.sakura.ne.jp/ - <!--{$smarty.const.CART_URL}-->
カートへのURLパス。
ドメイン:あり
出力例:https://nandani.sakura.ne.jp/cart/ - <!--{$smarty.const.P_DETAIL_URLPATH}-->
商品詳細ページへのベースURLパス。
ドメイン:無し
実際に商品ページへ行くには後ろに商品IDを付ける必要あり。
例:<!--{$smarty.const.P_DETAIL_URLPATH}--><!--{$arrProduct.product_id|u}-->
出力例:/products/detail.php?product_id=1 - <!--{$smarty.const.IMAGE_SAVE_URLPATH}-->
アップロードした画像のフォルダへのURLパス。
ドメイン:なし
出力例:/upload/save_image/ - <!--{$TPL_URLPATH}-->
テンプレートへのURLパス。
ドメイン:無し
出力例:/user_data/packages/default/
総合管理者 | 2015年12月17日 | コメント(0) | トラックバック(0) | CMS関連
商品ページの変数【EC-CUBE】
かなり雑にメモ。
EC-CUBEの商品ページ用のテンプレートで、商品情報が入っている「$arrProduct」の中身は、以下のキーで取得できます。
■product_id
■name
■maker_id
■status
■comment1
■comment2
■comment3
■comment4
■comment5
■comment6
■note
■main_list_comment
■main_list_image
■main_comment
■main_image
■main_large_image
■sub_title1
■sub_comment1
■sub_image1
■sub_large_image1
■sub_title2
■sub_comment2
■sub_image2
■sub_large_image2
■sub_title3
■sub_comment3
■sub_image3
■sub_large_image3
■sub_title4
■sub_comment4
■sub_image4
■sub_large_image4
■sub_title5
■sub_comment5
■sub_image5
■sub_large_image5
■sub_title6
■sub_comment6
■sub_image6
■sub_large_image6
■del_flg
■creator_id
■create_date
■update_date
■deliv_date_id
■plg_giftpaper_noshi
■product_code_min
■product_code_max
■price01_min
■price01_max
■price02_min
■price02_max
■stock_min
■stock_max
■stock_unlimited_min
■stock_unlimited_max
■point_rate
■deliv_fee
■maker_name
■price01_min_inctax
■price01_max_inctax
■price02_min_inctax
■price02_max_inctax
取得例:商品IDを取得する場合
<!--{$arrProduct.product_id}-->
総合管理者 | 2015年12月11日 | コメント(0) | トラックバック(0) | CMS関連 | PHP関連
WordPressの見落としがちな設定(ゴミ箱)
お客様から、記事が勝手に消えてしまったという連絡を受けました。
話をよく聞いてみると、とりあえず非公開にしたいからゴミ箱に移動させていたとのこと。
いや、そういう時はステータスを「下書き」にするか、公開状態を「非公開」にしてほしいのですが・・・
うっかり「完全に削除する」をクリックしてしまったのではないかと思ったのですが、よくよく調べてみると、Wordpressではゴミ箱に移動した記事は、30日経つと自動的に消えてしまうそうな。
これは知らなかった。
ちなみに、wp-config.phpに
define('EMPTY_TRASH_DAYS', 日数);
と追記することで、保存期間は設定できるらしい。
WordPressでゴミ箱から復元する方法と保存期間を変更する方法 | WordPress奮闘記
とりあえずゴミ箱には、消えても良い記事だけを入れましょう。
総合管理者 | 2015年10月17日 | コメント(0) | トラックバック(0) | CMS関連
bloginfoが非推奨?【WordPress】
今更ながら、bloginfoで一部パラメータの使用が非推奨になっているのに教えてもらって気付きました。
ただ、全部がアウトというわけではなく、Codexを見る限り非推奨になっているパラメータは
- 'siteurl'
- 'home'
の2つ。
代わりは
- echo site_url()
- echo home_url()
です。(どちらも返り値があるタイプなので出力する場合は要echo)
ちなみに、非推奨になったのは2.2のときみたい(結構前だな)
非推奨とはいえ、一応現在(version4.2.4)でも使用できています。
こういう場合の対策として、基本的に関数はさらにラッピングしといて、functions.phpだけ修正すればOKみたいにしておくべきだろうか・・・
それも面倒だなぁ。
参照サイト
総合管理者 | 2015年08月18日 | コメント(0) | トラックバック(0) | CMS関連
メニューをカスタマイズ(WordPress)
WordPressの外観>メニューで作ったメニューは、wp_nav_menu関数で簡単出力されます。
階層も反映されてて便利なのですが、どうしてもこの関数は実現できないことが発生したため、独自に関数を作ることにしました。
メニューをデータを取得するには、wp_get_nav_menu_itemsを使用して配列で取得します。
ただし階層構造にはなってません。
なので、以前の記事「WordPressのサイトマップを作る【プラグインなし】」を参考に、階層構造で作り直して出力します。
function my_wp_nav_menu($menu_type, $menu_item_parent = 0, $ul_use_flag = 0){ $return = ""; $menu_items = wp_get_nav_menu_items('main_navi'); $menu_trees = array(); if($menu_items){ $exist_flag = 0; foreach($menu_items as $menu_item){ //親が引数($menu_item_parent)と同じもののみ if($menu_item_parent == $menu_item->menu_item_parent){ if($exist_flag == 0){ if($ul_use_flag == 1) $return .= '<ul class="sub-menu">'."\r\n"; $exist_flag = 1; } //リンクの開き方 $target = ''; if($menu_item->target){ $target = 'target="_blank"'; } //class $class = 'menu-item'; if($menu_item->classes[0]){ $class .= ' '.implode(" ", $menu_item->classes); } //title要素 $attr_title = ''; if($menu_item->attr_title){ $attr_title = 'title="'.$menu_item->attr_title.'"'; } $return .= '<li class="'.$class.'"><a href="'.$menu_item->url.'" '.$target.' '.$attr_title.'>'.$menu_item->title."</a>"; $return .= my_wp_nav_menu($menu_type, $menu_item->ID, 1); $return .= '</li>'."\r\n"; } } if($exist_flag == 1){ if($ul_use_flag == 1) $return .= '</ul>'."\r\n"; } } return $return; }
使用する場合は以下の通り
<ul> <?php echo my_wp_nav_menu('main_navi'); ?> </ul>
これで大体wp_nav_menu関数の標準設定と同じ挙動となります。
再帰のたびに、wp_get_nav_menu_itemsで全部取りなおすので、あんまり効率は良くないですが、とりあえずこれで改造し放題です。
総合管理者 | 2015年07月08日 | コメント(0) | トラックバック(0) | CMS関連 | PHP関連
投稿件数が0件の時、archive.phpでpost_typeを取得する方法
投稿件数が0件のカスタム投稿ページを開いた場合、archive.phpでは、get_post_type()の返り値がfalseとなり、post_typeが取得できません。
その場合は、
get_query_var('post_type')
で取得できるようになります。
こういうケースは結構あるので、get_post_type()ではなくこっちで取得するようにしたほうが良いですね。
参考サイト
総合管理者 | 2015年07月02日 | コメント(0) | トラックバック(0) | CMS関連
wp_list_categories・get_categoriesでデータが取得できない
WordPressであり、Wordpressとは関係ない話。
WordPress管理画面の「カテゴリー」画面で、カテゴリー一覧にまったく表示されない現象になってしまいました。
wp-config.phpでデバッグをtrueにしても、Noticeが並ぶだけで何もエラーは表示されない。
フロントエンドでも、wp_list_categories・get_categoriesが使えない状態に。
これまでの経験でいえば、カテゴリーの並び替え系プラグインが原因で、一度並び替えを行って保存すると直ることが多いのですが、今回はそれでも直らない。
仕方ないので、Wordpress本体の中身を追っていくうち、wp-includes/taxonomy.phpの中にあるfunction get_termsにSQLが書かれていたので、出力して、phpMyAdminで実行したところ、以下のエラーが表示されました。
Got error 28 from storage engine
調べてみたところ、サーバの容量が不足していると起こる現象のようです。
参考元:MySQLで「Got error 28 from storage engine…」と出るときの対処法
Tera Termで「df -h」を実行したところ、確かに100%になってました・・・
クライアントのサーバなので、勝手にファイルを削除するわけにもいかないから、とりあえず削除してよいか問い合わせているところ。
まさかこんなところが原因とは。
プラグインやテーマが原因かと思って、切ったりつけたり編集したり、無駄に時間食った・・・
総合管理者 | 2015年03月15日 | コメント(0) | トラックバック(0) | CMS関連 | DB関連 | サーバー関連
WordPressの検索機能をカスタマイズ
WordPressの検索の欠点として
- カスタムフィールドが対象外
- カテゴリー・タグ(タクソノミー)が対象外
というものがあります。
最近は内容フィールドは使用せず、カスタムフィールドに中身を入れるといった場合もあるので、これでは大変不便です。
ということで、検索機能をカスタマイズし、これらからも引っ張ってくるようにします。(ついでに抜粋からも)
なお、検索処理のカスタマイズは「pre_get_posts」をフックした関数にて行います。
pre_get_postsについては、こちらをご覧ください(query_postsを捨てよ、pre_get_postsを使おう【追記あり】【報告あり】)。
functions.phpに下記を追加します。
※pre_get_postsをフックした関数がすでに存在していている場合は、うまく編集してください。
function my_pre_get_posts($query) { //管理画面には適応しない if ( is_admin() || ! $query->is_main_query() ) return; //検索画面の場合 if($query->is_search()){ global $wpdb; $keywords = get_search_query(); if($keywords){ $keywords = str_replace(" ", " ", $keywords); $keyword_array = explode(" ", $keywords); $post_ids = array(); $post_ids_exists = array(); foreach($keyword_array as $keyword){ $post_ids_meta = array(); //カスタムフィールド $post_ids_post = array(); //タイトル・内容 $post_ids_term = array(); //カテゴリー if($keyword){ $keyword = '%' . like_escape( $keyword ) . '%'; //カスタムフィールド内を検索 $post_ids_meta = $wpdb->get_col( $wpdb->prepare( " SELECT DISTINCT post_id FROM {$wpdb->postmeta} WHERE meta_value LIKE '%s' ", $keyword ) ); //タイトルと内容・抜粋から検索 $post_ids_post = $wpdb->get_col( $wpdb->prepare( " SELECT DISTINCT ID FROM {$wpdb->posts} WHERE post_title LIKE '%s' OR post_content LIKE '%s' OR post_excerpt LIKE '%s' ", $keyword, $keyword, $keyword ) ); //カテゴリー名から検索 $term_ids = $wpdb->get_col( $wpdb->prepare( " SELECT DISTINCT term_id FROM {$wpdb->terms} WHERE name LIKE '%s' ", $keyword) ); //ヒットしたカテゴリーが所属する投稿 if($term_ids){ $term_id = implode(",", $term_ids); $post_ids_term = $wpdb->get_col( $wpdb->prepare( " SELECT DISTINCT object_id FROM {$wpdb->term_relationships} WHERE term_taxonomy_id IN (%s) ", $term_id) ); } //各処理で取得した投稿IDをマージする。 $post_ids_tmp = array(); $post_ids_tmp = array_merge($post_ids_meta, $post_ids_post, $post_ids_term); //重複している投稿IDのみ抜き出す(AND検索のため) if($post_ids_tmp){ //検索ワード1つ目の場合、$post_ids_existsのキーに投稿IDを入れていく(内容はtrue) if(empty($post_ids_exists)){ foreach($post_ids_tmp as $post_id){ $post_ids_exists[$post_id] = 1; } } //検索ワード2つ目以降の場合 else{ //○つ目の投稿IDを$post_ids_exists_tmpキーに入れていく(内容はtrue) $post_ids_exists_tmp = array(); foreach($post_ids_tmp as $post_id){ $post_ids_exists_tmp[$post_id] = 1; } //1つ目の$post_ids_existsと、○つ目の$post_ids_exists_tmpとを比較し、存在しない場合はunsetする。 foreach($post_ids_exists as $post_id => $value){ if($post_ids_exists_tmp[$post_id] != 1){ unset($post_ids_exists[$post_id]); } } } } } } //まとめた$post_ids_existsのキー(投稿ID)を、内容に移す if($post_ids_exists){ foreach($post_ids_exists as $post_id => $value){ $post_ids[] = $post_id; } } if($post_ids){ $query->set('post__in', $post_ids); }else{ $query->set('post__in', array(0)); } }else{ $query->set('post__in', array(0)); } $query->set('s', ''); //本来の検索は邪魔になるので削除しておく } } add_action( 'pre_get_posts', 'my_pre_get_posts' );
最後に、
$query->set('s', '');
を行っているため、検索結果ページで、$sやget_query_var('s')から検索ワードを取得できなくなっています。
そのため、search.phpのget_header()の前に
$wp_query->query_vars["s"] = $wp_query->query["s"];
を追記してください。
これで$sやget_query_var('s')を使って検索ワードを取得できるようになります。
しかし結構ごつい処理をしてるので重くなりそうな気も・・・大丈夫かな。
参考サイト
nandani | 2014年12月17日 | コメント(2) | トラックバック(0) | CMS関連
Firefoxは勝手にアクセスする
WordPressで、独自にページアクセス数をカウントする機能を作成していたのですが、1ページにアクセスしただけなのに、次のページまで加算されてしまう現象になってしまいました。
どうもwp_head()があると、別のページも加算されてしまう模様。
しかし怪しいところは無い。なぜだ・・・と思っていたら、こんな記事を見つけました。
お、おう・・・マジか。
なんてありがた迷惑な機能・・・
とりあえずrel="next"を消す必要があるようなので、こちらのサイト(Firefoxはlink relを先読みする模様)を参考にfunctions.phpに下記を追記しました。
remove_action('wp_head', 'adjacent_posts_rel_link_wp_head');
う~ん。
今回SEO対策を考慮しなくてよいサイトだったのでよかったのですが、rel="next" rel="prev"は本来必要な記述。
SEOを考慮しながら、独自でアクセス数をカウントする機能を追加しなくてはならない場合のことも考えておかねば。
ちなみに、アクセスごとにカウントを取る仕組みは、single.phpに
$pageview_prev = get_post_meta($post->ID, "pageview", "true"); $pageview = $pageview_prev + 1; update_post_meta($post->ID, 'pageview', $pageview, $pageview_prev);
を追記するだけの簡単なものです。
Google Analyticsとかどうしてるんだろう?
まあ賢いGoogle先生だから何かしらのフィルタリングをしているのだろうけど。
nandani | 2014年12月15日 | コメント(0) | トラックバック(0) | CMS関連