カスタムフィールドの値を表示する(繰り返しフィールド、画像)

カスタムフィールドの値を表示する
繰り返しフィールドで、画像の場合

<?php
$rows = get_field('フィールド名' );
for($i = 0; $rows[$i] != ''; $i ++){
    $row = $rows[$i];
    $image = $row['サブフィールド名'];
    // echo '<pre>';
    // var_dump($image);
    // echo '</pre>';
    echo '<div style="margin-top:20px;">'.$image[title].'<div>';
    echo '<img src="'.$image[url].'" alt="'.$image[title].'" />';
}
?>

wordpressの管理画面にページを増やす

wordpressの管理画面に「ページ、メニュー」を増やす方法

1つだけ増やす例は沢山公開されているが、複数の場合は下記のように書く

function.php の最後に書きます。

// ページの追加
add_action( 'admin_menu', 'register_my_custom_menu_page' );
function register_my_custom_menu_page() {
    add_menu_page('管理画面の使い方', '予約管理', 'manage_options', 'yoyaku', 'add_manual_page', 'dashicons-welcome-learn-more', 3);
	add_menu_page('顧客管理の使い方', '顧客管理', 'manage_options', 'customer', 'add_manual_page2', 'dashicons-welcome-learn-more', 3);
}
// ページの中身のHTML
function add_manual_page() {
	include('../yoyakukanri.php');
}
function add_manual_page2() {
	include('../customer.php');
}

wordpressで「ログイン状態を保存する」が解除されてしまう

使っている theme の function.php に、下記のコードを追記することで
ログイン状態を維持できるようになる

function wplogin_rememberme_checked() {?>
    <script src="//code.jquery.com/jquery-1.11.1.js"></script>
    <script>
        $(document).ready(function(){
            $('#rememberme').prop('checked', true);
        });
    </script>
<?php }
add_action( 'login_enqueue_scripts', 'wplogin_rememberme_checked' );

WordPressでカテゴリ毎に公開・非公開を変更

<?php

include ('./wp-config.php');

$pdo = new PDO('mysql:host='.DB_HOST.';dbname='.DB_NAME.';charset=utf8', DB_USER, DB_PASSWORD);

// 該当カテゴリのPOST_IDの配列を生成
$post_id_array = array();
$sql = "SELECT * FROM `mint_term_relationships` WHERE `term_taxonomy_id` = '2'"; // カテゴリIDを指定
foreach($pdo->query($sql) as $item) {

	array_push($post_id_array, $item[object_id]);
}

var_dump($post_id_array);

// 公開フラグを変更する
for($i = 0; $post_id_array[$i] != ''; $i ++){

	// 公開
	// $sql = "UPDATE `mint_posts` SET `post_status` = 'publish', `comment_status` = 'open', `ping_status` = 'open' WHERE `ID` = '$post_id_array[$i]'";

	// 非公開
	$sql = "UPDATE `mint_posts` SET `post_status` = 'inherit', `comment_status` = 'closed', `ping_status` = 'closed' WHERE `ID` = '$post_id_array[$i]'";

	$statement = $pdo->query($sql);
}
?>

指定カテゴリの記事一覧、アイキャッチ有り


<?php
	$cat = 'カテゴリスラッグ';
	$num = '5';
	global $post;

	$term_id = get_category_by_slug($cat)->term_id;
	$myposts = get_posts('numberposts=' .$num. '&category_name=' .$cat);
	if ($myposts) {
		foreach($myposts as $post):
			setup_postdata($post);
			echo '<li><div class="blog_thumb"><a href=' .get_permalink(). '>';
			if ( has_post_thumbnail() ) {
				echo ''.get_the_post_thumbnail($page->ID, 'thumbnail'). '';
			} else {
				echo '<span class="no_image"><i class="fa fa-ban fa-2x" aria-hidden="true"></i>&nbsp;No images</span>';
			}
			echo '</a></div><div class="blog_data">';
			echo '<div class="blog_date">' .get_the_time('Y/n/j').'</div>';
			echo '<div class="blog_tit"><a href='.get_permalink().'>'. the_title("","",false).'</a></div>';
			echo '<div class="blog_content">' .mb_substr( strip_tags( $post -> post_content ), 0, 100 ). '...</div></div></li>';
		endforeach;
	echo '</ul><p><a href=' .get_category_link($term_id). '>カテゴリの一覧 ≫</a></p>';
	} else {
	echo '<p>記事がありません。</p>';
	}

?>

Strict Standards エラーを非表示にできない EC-CUBE2.4系

configファイルで ’error_reporting(E_ALL & ~E_DEPRECATED & ~E_STRICT);’と書いても効果なしでした。

/data/class/SC_Initial.php
102行目付近

function setErrorReporting() {
	error_reporting(E_ALL & ~E_NOTICE);
}

ここを書き換えたら Strict Standards エラー が非表示になった。

function setErrorReporting() {
	error_reporting(E_ALL & ~E_DEPRECATED & ~E_STRICT);
}

error_reporting(E_ALL & ~E_DEPRECATED & ~E_STRICT);

error_reporting(E_ALL & ~E_DEPRECATED & ~E_STRICT & ~E_NOTICE);

2018年以降のサーバーで、EC-CUBE2系を動かすには?

2016〜2018年頃、レンタルサーバーでPHPやSQLのバージョンアップにより
いろんなオープンソースが対応できなくなるケースが多発しています。

EC-CUBE2系の場合、症状は様々ですが
・サイトが表示されない
・インストールが完了できない
・その他

原因の一つとして
SET SESSION storage_engine = InnoDB の実行時に以下のエラーで実行できないケースがあります。

/data/class/db/dbfactory/SC_DB_DBFactory_MYSQL.php の 末尾付近を編集します。

    function initObjQuery(SC_Query &$objQuery) {
        // $objQuery->exec('SET SESSION storage_engine = InnoDB');
	$objQuery->exec('SET SESSION default_storage_engine = InnoDB');
        $objQuery->exec("SET SESSION sql_mode = 'ANSI'");
    }

Smartyで開発中にキャッシュ問題を回避する

template_c を毎回削除は手間がかかるので
毎回強制的にコンパイルさせます。

方法は Smarty.class.php を編集します。
場所は環境によって異なりますが今回は下記のディレクトリにありました。
/app/framework/lib/Smarty/libs/Smarty.class.php
361行目付近
$force_compile = false;
true にすればOKです。

公式サイトに書いてあります。
https://www.smarty.net/docsv2/ja/variable.force.compile.tpl

EC-CUBE3で設置URLから”/html/”をなくす

EC-CUBE3で設置URLから”/html/”をなくす以外にも、設置URLを変更する場合の方法です。

これで「html/」にアクセスするとデフォルトテンプレートでサイトが展開されているわけですが、やはり気になってしまうのはURLにどうしても「html」が入ってしまうことだと思います。

ファイルの移動

./html/ 配下のファイルを全て、一つ上の階層に移動します。
※ フォルダは移動しない。

「index.php」と「.htaccess」は上書きしてOKです。

ファイルの修正

index.php
Before require __DIR__.’/../autoload.php’;
After  require __DIR__.’/autoload.php’;

index_dev.php
require_once __DIR__.’/../vendor/autoload.php’;
$config_dev_file = __DIR__.’/../app/config/eccube/config_dev.yml’;
‘profiler.cache_dir’ => __DIR__.’/../app/cache/profiler’,
この3箇所を同じように「/../」→「/」としておきます。

app/config/eccube/path.yml
root_urlpath の「html」を消す。

以上で完了です。

WordPressでpathやURLを取得するためのタグと出力例

関数 解説 出力
ABSPATH インストールされた場所のパス C:\xampp\htdocs\xampp\example/(ローカルの場合)
/var/www/html/example/(サーバの場合)
admin_url() 管理画面のパス http://www.example.com/wp-admin/
content_url() wp-contentディレクトリのパス http://www.example.com/wp-content
get_attachment_link( $id ) 添付ファイルのIDを渡すと添付ページの URI を返す http://www.example.com/?attachment_id=$id
get_author_posts_url( $author ) 投稿者別のアーカイブページへのリンク。投稿者名を入力する http://www.example.com/?author=0
get_bloginfo( $show ) デフォルトはnameでサイト名が返ってくる。変数による違いは以下の通り。 http://localhost/xampp/example
$show = ‘admin_email’ admin@example.com
$show = ‘atom_url’ http://www.example.com/home/feed/atom
$show = ‘charset’ UTF-8
$show = ‘comments_atom_url’ http://www.example.com/home/comments/feed/atom
$show = ‘comments_rss2_url’ http://www.example.com/home/comments/feed
$show = ‘description’ Just another WordPress blog
$show = ‘home’ http://www.example.com/home (DEPRECATED! use url option instead)
$show = ‘html_type’ text/html
$show = ‘language’ en-US
$show = ‘name’ Testpilot
$show = ‘pingback_url’ http://www.example.com/home/wp/xmlrpc.php
$show = ‘rdf_url’ http://www.example.com/home/feed/rdf
$show = ‘rss2_url’ http://www.example.com/home/feed
$show = ‘rss_url’ http://www.example.com/home/feed/rss
$show = ‘siteurl’ http://www.example.com/home (DEPRECATED! use url option instead)
$show = ‘stylesheet_directory’ http://www.example.com/home/wp/wp-content/themes/largo
$show = ‘stylesheet_url’ http://www.example.com/home/wp/wp-content/themes/largo/style.css
$show = ‘template_directory’ http://www.example.com/home/wp/wp-content/themes/largo
$show = ‘template_url’ http://www.example.com/home/wp/wp-content/themes/largo
$show = ‘text_direction’ ltr
$show = ‘url’ http://www.example.com/home
$show = ‘version’ 3.5
$show = ‘wpurl’ http://www.example.com/home/wp
get_category_link( $id ) カテゴリーアーカイブページヘのリンク http://www.example.com/?cat=0
get_day_link( $year, $month, $day ) 日別アーカイブページのリンク。デフォルトは現在の日。 http://www.example.com/?m=20150313
get_edit_user_link( $user_id ) ユーザー情報編集画面用のパス http://www.example.com/wp-admin/profile.php
get_feed_link() FeedのURLを取得 http://www.example.com/?feed=rss2
get_month_link( $year, $month ) 年別アーカイブページのリンク。デフォルトは現在の年度。 http://www.example.com/?m=201503
get_page_link( $id ) 固定ページのパーマリンクを取得 http://www.example.com/?page_id=$id
get_permalink( $id ) $idを入力するとURLのスラッグを返す。パーマリンク設定によって異なる http://www.example.com/?p=$id
get_post_type_archive_link( $posttype ) カスタム投稿タイプのアーカイブページを返す。get_post_type_archive_link( get_post_type() )など http://www.example.com/$posttype
get_stylesheet() 現在適用されているテーマ(スタイルシート)のディレクトリ twentyten-child
get_stylesheet_directory() 現在適用されているテーマ(スタイルシート)のディレクトリ /var/www/html/example/wp-content/themes/twentyten-child
get_stylesheet_directory_uri() 現在適用されているテーマをURI表記で返す http://www.example.com/wp-content/themes/twentyten-child
get_stylesheet_uri() 現在適用されているテーマ(スタイルシート)のパス /var/www/html/example/wp-content/themes/twentyten-child/style.css
get_tag_link( $id ) タグアーカイブページヘのリンク。IDで指定してスラッグで返ってくる。 http://www.example.com/?tag=wordpress
get_template_directory() 親テーマのディレクトリ /var/www/html/example/wp-content/themes/twentyten
get_template_directory_uri() 親テーマのURI http://www.example.com/wp-content/themes/twentyten
get_term_link( $id ) カスタム分類アーカイブページヘのリンク。タクソノミーが無いとWP_Error Objectを返す http://www.example.com/custom-taxonomy
get_theme_root() テーマのディレクトリ /var/www/html/example/wp-content/themes
get_theme_root_uri() 親テーマのディレクトリ http://www.example.com/wp-content/themes
get_year_link( $year ) 年別アーカイブページのリンク。デフォルトは現在の年度。 http://www.example.com/?m=2015
home_url( $path, $scheme ) $pathにはホームURLからの相対パス。$schemeはhttpかhttpsもしくはrelative(相対パス) http://www.example.com/$path
includes_url() wp-includesのディレクトリを返す http://www.example.com/wp-includes/
plugin_dir_path( __FILE__ ) 現在のファイルのディレクトリを返す。pluginファイルに書けばプラグインのパスを返すが、必ずしもpluginのディレクトリを返すとは限らない /var/www/html/example/wp-content\themes\twentyten-child/
plugins_url() プラグインディレクトのパス http://www.example.com/wp-content/plugins
site_url() サイトのアドレスを表示。スラッシュは付かない http://localhost/xampp/example
the_permalink() 現在のページのパス http://www.example.com/
WP_CONTENT_DIR wp-contentディレクトリのパス /var/www/html/example/wp-content
wp_get_shortlink( $id ) 短縮URL、ショートリンクを表示する。パーマリンク設定で長いスラッグにしている場合に外部プログラムへ短いURLを渡したい場合などに使う http://www.example.com/?p=$id
WP_LANG_DIR languagesディレクトリのパス /var/www/html/example/wp-content/languages
wp_login_url() ログイン画面のパス http://www.example.com/wp-login.php
wp_logout_url() ログアウト用のパス http://www.example.com/wp-login.php?action=logout&_wpnonce=0000000000
wp_lostpassword_url() ログアウト用のパス http://www.example.com/wp-login.php?action=lostpassword
WP_PLUGIN_DIR プラグインディレクトのパス /var/www/html/example/wp-content/plugins
wp_registration_url() ユーザー登録用のパス http://www.example.com/wp-login.php?action=register
wp_upload_dir($time) アップロードディレクトリ URL。配列で返ってくる。$timeはデフォルトはnull。$time = ‘path‘ /var/www/html/example/wp-content/uploads
$time = ‘url‘ http://www.example.com/wp-content/uploads
$time = ‘subdir‘
$time = ‘basedir‘ /var/www/html/example/wp-content/uploads
$time = ‘baseurl‘ http://www.example.com/wp-content/uploads
$time = ‘error‘ bool(false)

WordPressのリビジョン機能を停止する

WordPressのリビジョン機能は、編集するたびに、以前の状態を保存されます。
編集画面を開いていると、数分に一度、自動保存もされます。

1つの記事に対し、数十から数百に及ぶこともあり、データベースの肥大化、動作が重くなる原因となります。

リビジョン削除のプラグインもありますが、プラグインを増やすことも動作が重くなる要因なので
ソースコードで停止する方法です。

wp-config.php に次の一行を追記します。

define('WP_POST_REVISIONS', false);

※ ABSPATH よりも前に記載しないと効きません。

welcart 商品の並び順をドラッグアンドドロップで変える

商品マスタ(商品一覧)のテンプレートファイル
/wp-content/plugins/usc-e-shop/includes/usces_item_master_list.php

詳細

/home/hashimoto/www/yoga-lien.com/wp-content/plugins/usc-e-shop/js にファイルを追加
jquery-1.8.0.min.js
jquery-ui.js

商品一覧のテンプレート(一覧大規模変更)
/home/hashimoto/www/yoga-lien.com/wp-content/plugins/usc-e-shop/includes/usces_item_master_list.php

// 並び替えページ
”usces_item_popup.php”を追加(新設)した。

”itemList.class.php” にてソート順を変更した

手法:$rows[L:410付近]の並び順を変えることで成功!

DB wp_posts.to_ping 型をtext → int に変更

// Heart-Lab Start
//-------------------------------------------------

/*
echo '<pre>';
var_dump($rows);
echo '</pre>';*/

// 商品IDのソート順
$id_array = array();
$pdo = new PDO('mysql:host='.DB_HOST.';dbname='.DB_NAME.';charset=utf8', DB_USER, DB_PASSWORD);
$sql = "SELECT * FROM `wp_posts` WHERE `post_mime_type` = 'item' AND `post_type` = 'post' AND `post_status` = 'publish' ORDER BY `to_ping` ASC";
foreach($pdo->query($sql) as $item) {
// 	echo $item[ID].' -- ';
	array_push($id_array, $item[ID]);
}
// var_dump($id_array);

// $rows の並び順を変える
for($i = 0; $id_array[$i] != ''; $i ++){
	for($a = 0; $rows[$a] != ''; $a ++){
		if($id_array[$i] == $rows[$a][ID]){
			$new_rows[$i][ID] = $rows[$a][ID];
			$new_rows[$i][item_code] = $rows[$a][item_code];
			$new_rows[$i][item_name] = $rows[$a][item_name];
		}
	}
}

// echo '<pre>';
// var_dump($new_rows);
// echo '</pre>';

$rows = $new_rows;

// Heart-Lab END
//-------------------------------------------------

”usces_item_popup.php”

<html lang="ja" class="no-js"><head><meta charset="UTF-8">
<!-- WR -->
<style>
a {
 color: gray;
}
.wr_menu li {
	display: inline-block;
	margin: 0 20px 30px 0;
}
.ns {
	display: block;
	float: left;
	border: 1px solid silver;
	width: 500px;
	height: 60px;
	background: white;
	overflow: hidden;
	margin: 0 0 5px 0;
}
.w100 {
	display: block;
	float: left;
	width: 80px;
}
.w200 {
	display: block;
	float: left;
	width: 300px;
	overflow: hidden;
}
#tablenavi {
	display: none;
}
</style>
</head>
<body>
<?php
error_reporting(E_ALL & ~E_NOTICE);
$act1 = ''; $act2 = ''; $act3 = '';
if($_GET["wr"] == 'lesson'){
	$act1 = ' style="color:red;font-weight: bold"';
}elseif($_GET[wr] == 'shopping'){
	$act2 = ' style="color:red;font-weight: bold"';
}else{
	$act3 = ' style="color:red;font-weight: bold"';
}
echo '<div class="wr_menu">';
echo '<li><a href="?page=usces_itemedit&wr=all"'.$act3.'>All</a></li>';
echo '<li><a href="?page=usces_itemedit&wr=lesson"'.$act1.'>Lesson</a></li>';
echo '<li><a href="?page=usces_itemedit&wr=shopping"'.$act2.'>Shopping</a></li>';
echo '</div>';
?>


<script type="text/javascript">
<!--
function p_reload(){
var pwin=window.opener;
pwin.location.reload();
pwin.focus();
window.close();
}
//-->
</script>
<button type="button" onclick="p_reload()" style="float: right;">閉じる</button>
<br><br>


<form action="" method="post">
      <input type="submit" id="submit" value="並び順を保存する" onClick="alert('並べ替え完了です')"/>
            <ul class="sortable">
<!-- WR -->



<?php

include("../../../../wp-config.php");
$pdo = new PDO('mysql:host='.DB_HOST.';dbname='.DB_NAME.';charset=utf8', DB_USER, DB_PASSWORD);


// 並べ替え
if($_POST[result] != ''){
	
	$sort_ids = explode(",", $_POST[result]);
	
	for($i = 0; $sort_ids[$i] != ''; $i ++){
		if($_GET[wr] == 'shopping'){
			$a = $i;
		}else{
			$a = $i + 10000;
		}
		$sql = "UPDATE `wp_posts` SET `to_ping` = '$a' WHERE `ID` = '$sort_ids[$i]'";
		$statement = $pdo->query($sql);
	
	}
}


$sql = "SELECT * FROM `wp_posts` WHERE `post_mime_type` = 'item' AND `post_type` = 'post' AND `post_status` = 'publish' ORDER BY `to_ping` ASC";


foreach($pdo->query($sql) as $item) {
	
	$print_flg = 0;
	
	if($_GET[wr] == 'shopping'){
		$sql2 = "SELECT * FROM `wp_term_relationships` WHERE `object_id` = '$item[ID]' AND `term_taxonomy_id` = '5'";
		$statement2 = $pdo->query($sql2);
		$item2 = $statement2->fetch(PDO::FETCH_ASSOC);
		
		if($item2[object_id] != ''){
			$print_flg = 1;
		}
	}
	if($_GET[wr] == 'lesson'){
		$sql2 = "SELECT * FROM `wp_term_relationships` WHERE `object_id` = '$item[ID]' AND `term_taxonomy_id` = '3'";
		$statement2 = $pdo->query($sql2);
		$item2 = $statement2->fetch(PDO::FETCH_ASSOC);
		
		if($item2[object_id] != ''){
			$print_flg = 1;
		}
	}
	
	if( ($_GET[wr] == '') || ($_GET[wr] == 'all') ) $print_flg = 1;
	
	if($print_flg == 1){
		
		// 商品情報取得
		$sql2 = "SELECT * FROM `wp_postmeta` WHERE `post_id` = '$item[ID]' AND `meta_key` = '_isku_'";
		$statement2 = $pdo->query($sql2);
		$item2 = $statement2->fetch(PDO::FETCH_ASSOC);
		
		$hoge = explode(";", $item2[meta_value]);
		
		$wr_array = array();
		for($i = 0; $hoge[$i] != ''; $i ++){
			
			$hhh = explode('"', $hoge[$i]);
			
	// 		echo $i.'> '.$hhh[1].'<br>';
			array_push($wr_array, $hhh[1]);

		}
		

		$ID = $item["ID"]; ///////idのようなモノ
		$code = $wr_array[1];
		$price = number_format($wr_array[7]);
		$stock_num = number_format($wr_array[11]);
		
		// 在庫有無
		if($stock_num == 0){
			$stock_text = '<span style="color:red;">在庫切れ</span>';
		}else{
			$stock_text = '.';
		}
		
		// 公開状態
		if($item[post_status] == 'publish'){
			$open_text = '公開';
		}else{
			$open_text = '<span style="color:red;">非公開</span>';
		}
		
		// カテゴリ
		$sql3 = "SELECT * FROM `wp_term_relationships` WHERE `object_id` = '$ID' AND `term_taxonomy_id` != '2'";
		$statement3 = $pdo->query($sql3);
		$item3 = $statement3->fetch(PDO::FETCH_ASSOC);
		
		$sql4 = "SELECT * FROM `wp_terms` WHERE `term_id` = '$item3[term_taxonomy_id]'";
		$statement4 = $pdo->query($sql4);
		$item4 = $statement4->fetch(PDO::FETCH_ASSOC);
		$category = $item4[name];
		
		
		// 画像
		$sql2 = "SELECT * FROM `wp_postmeta` WHERE `post_id` = '$item[ID]' AND `meta_key` = '_thumbnail_id'";
		$statement2 = $pdo->query($sql2);
		$item2 = $statement2->fetch(PDO::FETCH_ASSOC);
		
		$sql2 = "SELECT * FROM `wp_posts` WHERE `ID` = '$item2[meta_value]'";
		$statement2 = $pdo->query($sql2);
		$item2 = $statement2->fetch(PDO::FETCH_ASSOC);
		$img = $item2[guid];
		$post_name = $item2[post_title];
		
		// url
		$sql2 = "SELECT * FROM `wp_options` WHERE `option_name` = 'siteurl'";
		$statement2 = $pdo->query($sql2);
		$item2 = $statement2->fetch(PDO::FETCH_ASSOC);
		$http_url = $item1[option_value];
		
		$item[post_title] = mb_strimwidth( $item[post_title], 0, 85, '…','UTF-8' );
		
		echo '<li class="ns" id="'.$ID.'">
			<div class="w100"><img src="'.$img.'" width="60" alt="IMG"></div>
			<div class="w100">'.$ID.'</div>
			<div class="w200">'.$code.'<br>'.$item[post_title].'</div>
			<!--
			<div class="w100">'.$price.'</div>
			<div class="w100">'.$stock_num.'</div>
			<div class="w100">'.$stock_text.'</div>
			<div class="w100">'.$category.'</div>
			<div class="w100">'.$open_text.'</div>
			-->
			</li><!-- ----リスト---- -->';
	}

	

}

?>

<?php

		// url
		$sql2 = "SELECT * FROM `wp_options` WHERE `option_name` = 'siteurl'";
		$statement2 = $pdo->query($sql2);
		$item2 = $statement2->fetch(PDO::FETCH_ASSOC);
		$http_url = $item2[option_value];
?>

<!-- WR -->
             </ul>
      <input type="hidden" id="result" name="result" />
</form>




<script src="<?php echo $http_url; ?>/wp-content/plugins/usc-e-shop/js/jquery-1.8.0.min.js"></script>
<script src="<?php echo $http_url; ?>/wp-content/plugins/usc-e-shop/js/jquery-ui.js"></script>
<script>
$(function() {
	$(".sortable").sortable();
	$(".sortable").disableSelection();
	$("#submit").click(function() {
		var result = $(".sortable").sortable("toArray");
		$("#result").val(result);
		$("form").submit();
	});
});
</script>

<div style="clear:both;"></div>
<!--
<pre>
<?php var_dump($_POST); ?>
</pre>
-->
<!-- WR -->

Welcart の商品情報の取り出し方

商品名、説明などは、wp-posts に記録され、その他の情報は wp-postmeta に記録されています。

例)データベース

// 商品情報取得
$sql2 = "SELECT * FROM `wp_postmeta` WHERE `post_id` = '$item[ID]' AND `meta_key` = '_isku_'";
$statement2 = $pdo->query($sql2);
$item2 = $statement2->fetch(PDO::FETCH_ASSOC);

$hoge = explode(";", $item2[meta_value]);

$wr_array = array();
for($i = 0; $hoge[$i] != ''; $i ++){
	
    $hhh = explode('"', $hoge[$i]);
	
    // echo $i.'> '.$hhh[1].'<br>';
    array_push($wr_array, $hhh[1]);
}

上記のような方法で整形したデータ

0> code
1> L-20170926
2> name
3> 
4> cprice
5> 
6> price
7> 1500
8> unit
9> 
10> stocknum
11> 8
12> stock
13> 0
14> gp
15> 0
16> sort
17> 0
18> 

WordPressでログインURLを変える

1) TOPディレクトリに「heart-lab-login.php」というファイルを作る。
内容は下の通り。

<?php
define( 'ANYWHERE_LOGIN', sha1( 'keyword' ) );
require_once './wp-login.php';
?>

2) テーマファイルのfunction.php に下記を追記する


define( 'ANYWHERE_LOGIN_PAGE', 'heart-lab-login.php' );
add_action( 'login_init', 'heart_lab_login_init' );
add_filter( 'site_url', 'heart_lab_login_site_url', 10, 4 );
add_filter( 'wp_redirect', 'heart_lab_login_wp_redirect', 10, 2 );

if ( ! function_exists( 'heart_lab_login_init' ) ) {
	function heart_lab_login_init() {
		if ( !defined( 'ANYWHERE_LOGIN' ) || sha1( 'keyword' ) != ANYWHERE_LOGIN ) {
			status_header( 403 );
			exit;
		}
	}
}

if ( ! function_exists( 'heart_lab_login_site_url' ) ) {
	function heart_lab_login_site_url( $url, $path, $orig_scheme, $blog_id ) {
		if ( ( $path == 'wp-login.php' || preg_match( '/wp-login\.php\?action=\w+/', $path ) ) &&
			( is_user_logged_in() || strpos( $_SERVER['REQUEST_URI'], ANYWHERE_LOGIN_PAGE ) !== false ) )
			$url = str_replace( 'wp-login.php', ANYWHERE_LOGIN_PAGE, $url );
		return $url;
	}
}

if ( ! function_exists( 'heart_lab_login_wp_redirect' ) ) {
	function heart_lab_login_wp_redirect( $location, $status ) {
		if ( strpos( $_SERVER['REQUEST_URI'], ANYWHERE_LOGIN_PAGE ) !== false )
			$location = str_replace( 'wp-login.php', ANYWHERE_LOGIN_PAGE, $location );
		return $location;
	}
}

3) その結果
「wp-admin」「wp-login.php」は403になるので安全です。

カテゴリの表示順を逆にする(EC-CUBE)

デフォルトでは、後から登録したカテゴリが上になってしまう。

通常、登録するときは、上から入力していくと、全てが逆順に表示され、順番の入れ替えがとても面倒になる。

対策として、SQLのソート順を逆にする。

(フロント表示、管理画面の左のカテゴリディレクトリ表示)
/data/class/helper/SC_Helper_Category.php [line:544]

// $where = "del_flg = 0 AND $pid_name = ? ORDER BY rank DESC";
   $where = "del_flg = 0 AND $pid_name = ? ORDER BY rank ASC";

(カテゴリの追加変更ツリー)
/data/class/pages/admin/products/LC_Page_Admin_Products_Category.php
上記に習い、カテゴリのソート順を変更する
ORDER BY rank DESC ⇒ ORDER BY rank ASC

とても簡単なカスタマイズだが、少しづつ使いやすくするには、EC-CUBEのバカ機能を沢山直さなければならない。

WordPress[twentysixteen] テーマのリセットCSS

twentysixteen

 html, body, div, span, object, iframe, h1, h2, h3, h4, h5, h6, p, blockquote, pre, abbr, address, cite, code, del, dfn, em, img, ins, kbd, q, samp, small, strong, sub, sup, var, b, i, dl, dt, dd, ol, ul, li, fieldset, form, label, legend, table, caption, tbody, tfoot, thead, tr, th, td, article, aside, canvas, details, figcaption, figure,  footer, header, hgroup, menu, nav, section, summary, time, mark, audio, video { margin:0; padding:0; border:0; outline:0; font-size:100%; vertical-align:baseline; background:transparent; }  body { line-height:1; }  article,aside,details,figcaption,figure, footer,header,hgroup,menu,nav,section {  display:block; }  nav ul { list-style:none; }  blockquote, q { quotes:none; }  blockquote:before, blockquote:after, q:before, q:after { content:''; content:none; }  a { margin:0; padding:0; font-size:100%; vertical-align:baseline; background:transparent; }  / change colours to suit your needs / ins { background-color:#ff9; color:#000; text-decoration:none; }  / change colours to suit your needs / mark { background-color:#ff9; color:#000;  font-style:italic; font-weight:bold; }  del { text-decoration: line-through; }  abbr[title], dfn[title] { border-bottom:1px dotted; cursor:help; }  table { border-collapse:collapse; border-spacing:0; }  /* change border colour to suit your needs  */ hr { display:block; height:1px; border:0;  border-top:1px solid #cccccc; margin:1em 0; padding:0; }  input, select { vertical-align:middle; }




.skip-link, .menu-toggle, .site-header-menu {
	display: none;
}


/* カラム設定
-------------------------------------------------*/
#masthead {
	width: 100%;
}
	.site-header-main {
		max-width: 1000px; 
		margin: 0 auto;
		border: 1px solid silver;
	}
#content {
	width: 100%;
	margin: 20px 0 40px 0;
}
	#content_inner {
		max-width: 1000px; 
		margin: 0 auto;
		border: 1px solid silver;
	}
#footer {
	width: 100%;
}
	#footer_inner {
		max-width: 1000px; 
		margin: 0 auto;
		border: 1px solid silver;
	}

mint apache2 cgi 設定

見落としがちなCGIを有効にする設定

設定ファイルに絶対間違いはないのにCGIプログラムが動かず、そのソースが表示されるときにはどうしたら良いんだろう?

その場合は、ApacheにCGIを実行するモジュールが組み込まれているか確認します。

$ sudo apache2ctl -M|grep cgi
cgi_module (shared)
このコマンドでcgi_moduleが表示されない時には、ApacheにCGIモジュールが組み込まれていません。

UbuntuのApacheパッケージでCGIモジュールを読みこませるには、/etc/apache2/mods-available/cgi.loadをmods-enabledにコピーまたはリンクを作成します。

$ cd /etc/apache2/mods-enabled
$ sudo ln -s ../mods-available/cgi.load .
$ ls -l | grep cgi
lrwxrwxrwx 1 root root 26 11月 3 11:58 cgi.load -> ../mods-available/cgi.load
これでApacheを再起動するとCGIプログラムが動くようになるはずです。

configはこんな感じ

<Directory /home/hashimoto/www/>
#	Options Indexes FollowSymLinks
	AllowOverride All
	Require all granted
	
	Order allow,deny
	allow from all
	Options +ExecCGI
	AddHandler cgi-script .cgi
</Directory>

EC-CUBEで管理画面にログインできない時

data/class/pages/admin/LC_Page_Admin_Index.php


//                 if (SC_Utils_Ex::isBlank($this->arrErr)) {
//                     $this->lfDoLogin($objFormParam->getValue('login_id'));
// 
//                     SC_Response_Ex::sendRedirect(ADMIN_HOME_URLPATH);
//                 } else {
//                     // ブルートフォースアタック対策
//                     // ログイン失敗時に遅延させる
//                     sleep(LOGIN_RETRY_INTERVAL);
// 
//                     SC_Utils_Ex::sfDispError(LOGIN_ERROR);
//                 }
           if (true) {

                $this->lfDoLogin($objFormParam->getValue('login_id'));
                SC_Response_Ex::sendRedirect(ADMIN_HOME_URLPATH);
            }else{
                SC_Utils_Ex::sfDispError(LOGIN_ERROR);
            }

CORESERVER に EC-CUBEを設置する 2.*系

1..htaccess ファイル
AddHandler application/x-httpd-phpcgi .php
———-
2..user.ini ファイルを作成し、以下の一行を記述
magic_quotes_gpc = on
———-
3..user.ini ファイルを .htaccess と同階層にアップロード

EC-CUBEをログイン状態にする

EC-CUBEをログイン状態にする(2.11系)

他のシステムでログイン中のユーザーが
連動したEC-CUBEにログイン状態を維持する場合などに利用。

data/class/CS_Customer.php
186行目付近

function isLoginSuccess($dont_check_email_mobile = false) {
// ログイン時のメールアドレスとDBのメールアドレスが一致している場合
if (isset($_SESSION['customer']['customer_id'])
	&& SC_Utils_Ex::sfIsInt($_SESSION['customer']['customer_id'])
) {
	$objQuery =& SC_Query_Ex::getSingletonInstance();
	$email = $objQuery->get('email', 'dtb_customer', 'customer_id = ?', array($_SESSION['customer']['customer_id']));
	if ($email == $_SESSION['customer']['email']) {
	// モバイルサイトの場合は携帯のメールアドレスが登録されていることもチェックする。
	// ただし $dont_check_email_mobile が true の場合はチェックしない。
	if (SC_Display_Ex::detectDevice() == DEVICE_TYPE_MOBILE && !$dont_check_email_mobile) {
		$email_mobile = $objQuery->get('email_mobile', 'dtb_customer', 'customer_id = ?', array($_SESSION['customer']['customer_id']));
		return isset($email_mobile);
	}
	return true;
	}
}
return false;
}

上をコメントアウトして、下のように希望のコードに変える。
この処理でログイン状態にはなるが、擬似ログインとも言える。
決済に必要な情報がセッションにあるかどうかは、確認し適宜補填すること。

下の例は、他のシステムにログインしていると「$_SESSION[‘member_id’]」がNULLでない。
その場合、EC-CUBEでもログイン状態と認めるケース。

function isLoginSuccess() {
	if($_SESSION['member_id'] != ''){
		return true;
	}else{
		return false;
	}
}

WordPressでmod_rewriteが効かない

# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /web1.download/
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /web1.download/index.php [L]
</IfModule>
# END WordPress

WordPressでパーマリンクが有効にならない時
mod_rewriteが効かないと勘違いしやすい
サーバー設定かと思い「http.conf」などを見て、動かいないはずがない、変だぞ!
そんなことにハマるケースも多いです。

.htaccess を見ても文法ばかりを気にして、ドメインが違っているなんて、気づきにくいことかもしれません。
またハマってしまったので。。。

4行目、8行目にドメインが記載されています。

カスタムフィールドの保存方法を見てみよう!

カスタムフィールドは、wp_options というテーブルに保存されます。サイトの基本情報やプラグイン、テーマファイルなど、様々な設定情報と同じテーブルに保存されています。書き方も暗号かとおもうほど複雑難解です。慣れれば読めるようになります。
しかし、画像の場合ここには保存されずにIDのみが保存されます。

記事やページを記録する wp-posts というテーブルに保存されていますので、上記から抽出したIDを元にソートをかけると、やっと目的の画像ファイル名にたどり着けます。

↓wp_options

wordpress のデータベース構造は最小公倍数に設計されているのでとてもシンプルですが、構造がシンプルな代わりに保存方法が無限にありますので解析するにはかなりの熟練が必要です。

EC-CUBE のカートをカスタマイズするときの悩み

「SC_CartSession.php」内で処理するのだが

var_dump($_POST)

が採れる場所と空になる場所がある

よく読めばいいことなのだが割愛して$_POSTを取得できる場所

247行目付近の

if (!$find) { の中では「$_POST」を取得できる。

そこ(247行目付近)で一旦セッションなどに保存すれば他の場所でも利用できる。

 

他の場所でPOSTを採取しようとしてもできないので、とにかくここでSESSIONに仮保存する。

EC-CUBE の制作で「status」って何?

ず〜っとひっかかっていたことがあるので、書きます。
EC-CUBE の制作で「status」って何?

「status」というのは「地位、権力」といった意味があります。
カタカナで書くと「スターテス」もしくは「ステイタス」です。

EC-CUEBは時々、間違った外来カタカタを使うことでも有名です。
「state」は「状態,ありさま,ようす,様相;事態,事情,形勢」という意味です。

なぜ、「state」とすべき箇所を「status」とするのか

答えは。。。。。簡単。。。。関係者が低知能なのです。

以前のバージョンでは
「footer」を「fotter」と書いてありました。
小学生レベルのローマ字読みですね。

「status」はどんなところで使われているのか?

商品の状態、公開か非公開か、まさに状態「state」と表現すべき箇所で「status」です。
同じように、受注の対応状況、「発送済み、入金待ち」など、まさに状態「state」と表現すべき箇所で「status」です。

まだまだ続きます

何でも複数形にしようとしたがる

例えば商品一覧

↓EC-CUBEでは puroducts_list なんです。
puroducts_list = 商品たち一覧

↓product_list でいいと思うのですが。
product_list = 商品_一覧

「たくさんあります。沢山リスト。」みたいに二回書くのが好きみたいです。

中学生レベルの複数形の表現くらいはマスターしてからプログラミング業務に従事してほしいものです。

これが日本のweb業界の平均以上というかTOPクラスの人たちの知能レベルです。

同じ日本人として恥ずかしい限りです。

画像を ”vertical-align: middle;” する

画像の縦位置というか上下位置というか、中央に表示する。

.listphoto {
	width: 150px;
	height: 150px;
	border: 1px solid silver;
	display: table;
}
.listphoto .vertical_middle {
	width: 100%;
	height: 100%;
	display: table-cell; 
	vertical-align: middle;
}
.listphoto  .vertical_middle  img {
	padding: 2px;
	max-height: 146px;
	max-width: 146px;
	border: none;
	vertical-align: middle;
}

AUTO_INCREMENTの値を更新する

AUTO_INCREMENTの値として代入する数値は「’」コロンで囲まない。

$sql = "ALTER TABLE `dtb_products_class_product_class_id_seq` AUTO_INCREMENT = 777";

ついでに
EC-CUBE のあるバージョンで発生した事例。

CSVによる商品登録のさい
dtb_products_class_product_class_id_seq や dtb_products_product_id_seq において
・AUTO_INCREMENT を更新する
・sequence を更新する
両方更新しないと管理画面からの商品登録でエラーになる。

さくらのレンタルサーバでEC-CUBEを動かす

レンタルサーバー|さくらインターネット に EC-CUBEを設置するには少々コツがいります。

ファイルパーミッション(アクセス権)は
ディレクトリ(フォルダ): 0705
*.php: 0705
*.tpl: 0705
その他のファイル: 0604

EC-CUBEのルートディレクトリにある.htaccess は削除します。
かわりにサーバーの管理画面からphp.iniが設定できるので、 magic_quotes_gpc = off にします。

エラーメッセージ、問題ないが多くの警告が表示されますので、これもOFFにします。

EC-CUBEでブロックを一括変更する

dtb_blocposition を操作することで対応できる。

device_type_id PC=10、携帯電話=1、スマートフォン=2
page_id トップページ=1、一覧ページ=2、詳細ページ=3、マイページ=4、その他カスタムで作成したページへID付与。(dtb_pagelayout参照)
target_id 0=Unused、1=LeftNavi、2=MainHead、3=RightNavi、4=MainFoot、5=TopNavi、6=BottomNavi、7=HeadNavi、8=HeaderTopNavi、9=FooterBottomNavi、10=HeaderInternalNavi (mtb_target参照)
bloc_id カテゴリー=1、利用ガイド=2、かごの中=3等。(dtb_bloc参照)
bloc_row カラム内でのブロックの表示優先順位。0は非表示で、target_idに5(未使用ブロック)が選択されている場合に設定可能。
filename カテゴリー=1、利用ガイド=2、かごの中=3等。(dtb_bloc参照)bloc_idと対応している。

ブロックIDを調べるには dtb_bloc を見る。

参考処理コード

<html dir="ltr" lang="ja">
<head>
<meta charset="UTF-8" />
</head>
<body>
<?php
include './data/config/config.php';

$db = mysql_connect(DB_SERVER.":".DB_PORT,DB_USER,DB_PASSWORD);
mysql_query("SET NAMES utf8");
mysql_select_db(DB_NAME, $db);
$sql1 = "SELECT * FROM `dtb_category` WHERE `category_id` = '1'";
$rs1 = mysql_query($sql1,$db);
$item1 = mysql_fetch_assoc($rs1);
var_dump($item1);

// ページIDのMAX
$page_id_max = '37';
// 表示するカラムID
$target_id = '3';



$sql1 = "SELECT * FROM `dtb_blocposition`";
$rs1 = mysql_query($sql1,$db);

// UPDATE
while($item1 = mysql_fetch_assoc($rs1)){
	
	
	if( ( ($item1[bloc_id] == 6) || ($item1[bloc_id] == 3) || ($item1[bloc_id] == 8) || ($item1[bloc_id] == 2) || ($item1[bloc_id] == 10) ) && ($item1[device_type_id] == 10) ){
		
		
		// 表示順
		if($item1[bloc_id] == 6){
			$bloc_row = 0;
		}elseif($item1[bloc_id] == 3){
			$bloc_row = 1;
		}elseif($item1[bloc_id] == 8){
			$bloc_row = 2;
		}elseif($item1[bloc_id] == 2){
			$bloc_row = 3;
		}elseif($item1[bloc_id] == 10){
			$bloc_row = 4;
		}
		
		// 表示する
		$sql2 = "UPDATE `dtb_blocposition` SET `target_id` = '$target_id', `bloc_row` = '$bloc_row' WHERE `device_type_id`='10' AND `page_id`='$item1[page_id]' AND `bloc_id`='$item1[bloc_id]'";
		
	}else{
		// 表示しない(カラム)
		$sql2 = "UPDATE `dtb_blocposition` SET `target_id` = '0', `bloc_row` = '0' WHERE `device_type_id`='10' AND `page_id`='$item1[page_id]' AND `bloc_id`='$item1[bloc_id]'";
	}
	
	// echo $sql2.'<br>';
	
	$rs2 = mysql_query($sql2,$db);
}


// 該当ページの、該当ブロックの登録がない場合はINSERT


// 表示するブロックIDの配列
$array_block_id = array(6,3,8,2,10);

// 該当ページIDをループ
for($i = 0; $i <= $page_id_max; $i ++){
	$page_id = $i;
	
	for($a = 0; $array_block_id[$a] != ''; $a ++){
		$sql3 = "SELECT * FROM `dtb_blocposition` WHERE `device_type_id`='10' AND `page_id`='$page_id' AND `bloc_id`='$array_block_id[$a]'";
		$rs3 = mysql_query($sql3,$db);
		$item3 = mysql_fetch_assoc($rs3);
		// var_dump($item3);
		// echo '<br>';
		
		if($item3 == ''){
			
			// 表示順
			if($array_block_id[$a] == 6){
				$bloc_row = 0;
			}elseif($array_block_id[$a] == 3){
				$bloc_row = 1;
			}elseif($array_block_id[$a] == 8){
				$bloc_row = 2;
			}elseif($array_block_id[$a] == 2){
				$bloc_row = 3;
			}elseif($array_block_id[$a] == 10){
				$bloc_row = 4;
			}
			
			$sql4 = "INSERT INTO `dtb_blocposition` (
							`device_type_id`, `page_id`, `target_id`, `bloc_id`, `bloc_row`, `anywhere`
						) VALUES (
							'10', '$page_id', '$target_id', '$array_block_id[$a]', '$bloc_row', '0'
						)";
			// echo $sql4.'<br>';
			$rs4 = mysql_query($sql4,$db);
		}
	}
}


echo '処理完了!';


?>
</body>
</html>

郵便番号(住所変換用)の登録を10秒で出来る方法

EC-CUBE では、
基本情報管理 → 郵便番号DB登録
で 郵便番号の住所変換が出来るようになる。

しかし 「郵便番号DB登録」は とても時間がかかる。
サーバーのスペックにもよるが30分くらいかかるケースも少なくない。

下記のようにSQL文を書いて流し込むと
遅いサーバーでも10秒くらいで出来る。

処理の流れとしては、
1) KEN_ALL_utf-8.CSV を一行ずつ読み込む
2)「,」カンマで分割して、SQL文を発行する

$line = file('./data/downloads/KEN_ALL_utf-8.CSV');
for($i = 0; $line[$i] != ''; $i ++){
// for($i = 0; $i <= 10; $i ++){
	
	echo $i.'<br>';
	
    $array = explode(",", $line[$i]);
    
	$sql1 = "INSERT INTO `mtb_zip` (
				`code`, `old_zipcode`, `zipcode`, `state_kana`, `city_kana`, `town_kana`, `state`, `city`, `town`, `flg1`, `flg2`, `flg3`, `flg4`, `flg5`, `flg6`
				) VALUES (
				'$array[0]','$array[1]','$array[2]','$array[3]','$array[4]','$array[5]','$array[6]','$array[7]','$array[8]','$array[9]','$array[10]','$array[11]','$array[12]','$array[13]','$array[14]'
				)";
	$rs1 = mysql_query($sql1,$db);
	// echo $sql1.'<br>';
}

 
私がすごいのではない。
EC-CUBE がダメダメなのだ(--;

特定カテゴリを指定して記事一覧を表示する

<ul>
<?php
	$category_recent_post = 5; 	// 記事数
	$category_recent_id = 1;	// カテゴリID
	$posts = get_posts('numberposts=' . $category_recent_post . '&category=' . $category_recent_id);
	global $post;
	if($posts) {
		foreach($posts as $post) {
			setup_postdata($post);
			echo '<li><a href="' . get_permalink() . '">' . get_the_title() . '</a></li>';
		}
	}
?>
</ul>

EC-CUBEのリストコメントやメモ欄もHTMLタグを許可する

俗に言う「(タグ許可)」です。

confium.php を見てみると
<!–{$arrForm.note|h|nl2br}–>
<!–{$arrForm.main_comment|nl2br_html}–>

|h|nl2br → |nl2br_html
これだけです。

。。。おっと、待った。
まだでした。

LLTEXT_LEN にしてあげたほうがいいですね。

wordpressの検索機能は複数キーワード対応?

wordpressの検索で複数キーワードは使えないのか?

半角カンマで区切ればできますが、

スペース区切りとかではNGです。

。。。直すしかない。

「WP Multibyte Patch プラグイン」を有効にするだけです。

WP Multibyte Patch プラグインの主な機能

投稿抜粋

「文字数ベース」抜粋の補助機能を提供します。抜粋の最大文字数と more 文字列を設定ファイルより変更できます。

文字列カウント方式の設定

言語設定が ja の場合、デフォルトで文字列カウント方式の設定を「文字数ベース」に固定します。

検索

検索の際に全角スペースを区切り文字として認識させます。また、検索文字列内の重複するスペースを取り除きます。

メール送信

送信メールのエンコーディングを JIS (ISO-2022-JP) 、UTF-8、自動判別の3つのモードから選ぶことができます。有効時のデフォルトは JIS (ISO-2022-JP) です。WordPress 本体の実装とは異なり、UTF-8 モードではボディ部も base64 エンコード (7bit) します。

トラックバック受信

日本語を含む多くのエンコーディングのデータが破壊される問題を修正します。

ピンバック受信

マルチバイト文字で書かれたページからのピンバック処理機能一式 (エンコーディング検出、変換、トリム) を実装します。また、一部の UTF-8 文字が破壊される問題を修正します。

ファイル名サニタイズ

マルチバイトを含むファイル名のファイルがアップロード、またはメール添付された場合にファイル名を md5 に変換します。

管理パネル

  • ダッシュボードの「最近のコメント」、「最近の下書き」でマルチバイト文字列が正しく抜粋されるようにします。
  • 投稿エディターの文字数表示機能を正しく動作させます。
  • 既存コンテンツへの内部リンクを検索する際のインクリメンタルサーチを2文字から動作させます。
  • 日本語フォントの表示にあわせ、管理パネルのフォントファミリーを sans-serif 系に統一、イタリック体を標準に変えます。

BuddyPress 抜粋関数

bp_create_excerpt() でマルチバイト投稿の抜粋が作られない問題を修正します。HTML タグを取り除いた形の文字数ベースの抜粋を生成します。本機能はデフォルトではオフになっておりますので、ご利用の際は wpmp-config.php を編集して有効化してください。

ご注意: Activity の抜粋機能は表示時ではなく Activity データ記録時の実データに適用されます。また、抜粋化されるタイプとされないタイプの投稿があります。これらは BuddyPress の仕様によるものですのでご了承ください。

Twenty Twelve の Open Sans 対策

Twenty Twelve テーマの Open Sans Web フォントが一部ブラウザにおいて日本語表示の不具合を引き起こす問題の対応として、翻訳ファイルの有無に関わらず当該フォントの無効化を行う機能を提供します。

その他

設定ファイル (wpmp-config.php) から各パッチ機能を個別に有効化・無効化できます。

カートに入れるタグ

EC-CUBEで、ブログなどから直接買い物かごに入れる場合などに利用する。

<form name="form1" id="form1" method="post" action="'.ROOT_URLPATH.'products/detail.php?product_id='.$item1&#91;product_id&#93;.'">
<input type="hidden" name="transactionid" value="'.$_SESSION&#91;transactionid&#93;.'" />
<input type="hidden" name="mode" value="cart" />
<input type="hidden" name="product_id" value="'.$item1&#91;product_id&#93;.'" />
<input type="hidden" name="product_class_id" id="product_class_id4" value="'.$item2&#91;product_class_id&#93;.'" />
<input type="hidden" name="quantity" value="1" />
	<input type="image" src="'.ROOT_URLPATH.'user_data/packages/default/img/set-cart.jpg">
</form>

※ 注意点
http://hogehoge.com/car に投げても商品は入りません。
あて先は「 products/detail.php?product_id=123 」
post する mode は cart

CSCARTでwindowsサーバーにインストールする方法

追加言語のインストール中 JA:
. . .
Error_occurred

なんてエラーで止まる。
原因は「ftp_connect」関数が使えないことらしい。
Windowsサーバーではインストールできないということだ。
でもWindowsサーバーで動かす方法はある。
Linuxサーバーでインストールしたものを移植すればいい。

公式マニュアルより
http://manual.cs-cart.jp/?page_id=347

CS-Cart日本語版v2.1.4-jp-1よりPHP標準の「ftp_connect」関数が利用できないサーバーはCS-Cartアップグレード時に手動でのファイルパーミッション操作が必要などの理由よりインストールができなくなっております。

WordPress のカテゴリにカスタムフィールドを追加する

この記事ではWordpress3.2を使用しています。

カテゴリー編集に項目を追加

さっそくですがカテゴリー編集画面に項目を追加してみましょう。
現在使用している「functions.php」に以下を追加します。

functions.php

	add_action ( 'edit_category_form_fields', 'extra_category_fields');
	function extra_category_fields( $tag ) {
	    $t_id = $tag->term_id;
	    $cat_meta = get_option( &quot;cat_$t_id&quot;);
	?>
	<tr class=&quot;form-field&quot;>
		<th><label for=&quot;extra_text&quot;>その他テキスト</label></th>
		<td><input type=&quot;text&quot; name=&quot;Cat_meta[extra_text]&quot; id=&quot;extra_text&quot; size=&quot;25&quot; value=&quot;<?php if(isset ( $cat_meta['extra_text'])) echo esc_html($cat_meta['extra_text']) ?>&quot; /></td>
	</tr>
	<tr class=&quot;form-field&quot;>
		<th><label for=&quot;upload_image&quot;>画像URL</label></th>
		<td>
			<input id=&quot;upload_image&quot; type=&quot;text&quot; size=&quot;36&quot; name=&quot;Cat_meta[img]&quot; value=&quot;<?php if(isset ( $cat_meta['img'])) echo esc_html($cat_meta['img']) ?>&quot; /><br />
			画像を追加: <img src=&quot;images/media-button-other.gif&quot; alt=&quot;画像を追加&quot;  id=&quot;upload_image_button&quot; value=&quot;Upload Image&quot; style=&quot;cursor:pointer;&quot; />
		</td>
	</tr>
	<?php
	}
	

項目を追加したい場合は「$cat_meta」の配列名を変更して追加してください。
これでカテゴリー編集画面を見ると下図のようになっているはずです。

カテゴリー編集に項目が追加された

メタデータの保存

項目を追加しただけでは保存されませんので、保存する処理を記述しましょう。
先ほど記述した「extra_category_fields」の下に追加します。

functions.php

	add_action ( 'edited_term', 'save_extra_category_fileds');
	function save_extra_category_fileds( $term_id ) {
	    if ( isset( $_POST['Cat_meta'] ) ) {
		   $t_id = $term_id;
		   $cat_meta = get_option( &quot;cat_$t_id&quot;);
		   $cat_keys = array_keys($_POST['Cat_meta']);
			  foreach ($cat_keys as $key){
			  if (isset($_POST['Cat_meta'][$key])){
				 $cat_meta[$key] = $_POST['Cat_meta'][$key];
			  }
		   }
		   update_option( &quot;cat_$t_id&quot;, $cat_meta );
	    }
	}
	

画像アップ用のjs&cssの読み込み

追加した項目がテキストフィールドだけなら必要ありませんが、今回は画像フィールドもあるので、その場でアップロードできるようにcssとjsを読み込みます。
まずは新しいjavascriptを作成します。

upload.js

	(function($) {
		$(function() {
			$('#upload_image_button').click(function() {
				formfield =$('#upload_image').attr('name');
				tb_show('', 'media-upload.php?type=image&amp;post_id=&amp;TB_iframe=true');
				return false;
			});
			window.send_to_editor = function(html) {
				imgurl = $('img',html).attr('src');
				$('#upload_image').val(imgurl);
				tb_remove();
			}
		});
	})(jQuery);
	

このjsファイルは「upload.js」として現在使用しているテーマの「js」フォルダに保存します。

次に「functions.php」に戻って下記を追加します。

functions.php

	add_action('admin_print_scripts', 'my_admin_scripts');
	add_action('admin_print_styles', 'my_admin_styles');
	function my_admin_scripts() {
		global $taxonomy;
		if( 'category' == $taxonomy ) {
			wp_enqueue_script('media-upload');
			wp_enqueue_script('thickbox');
			wp_register_script('my-upload', get_bloginfo('template_
directory') .'/js/upload.js');
			wp_enqueue_script('my-upload');
		}
	}
	function my_admin_styles() {
		global $taxonomy;
		if( 'category' == $taxonomy ) {
			wp_enqueue_style('thickbox');
		}
	}
	

これで画像を追加の横のアイコンをクリックすると、いつもの画像を挿入するウィンドウが表示されます。

画像をアップロード画面

テンプレートファイルでの表示

入力したデータをテンプレートで表示してみます。
ここではリスト表示をしてみます。

	&lt;ul class=&quot;clearfix&quot;&gt;
	&lt;?php
	$tag_all = get_terms(&quot;category&quot;, &quot;fields=all&quot;);
	foreach($tag_all as $value):
	$cat_data = get_option('cat_'.intval($value-&gt;term_id));
	?&gt;
	&lt;li&gt;
	&lt;?php echo esc_html($value-&gt;name) ?&gt;
	&lt;img src=&quot;&lt;?php echo esc_html($cat_data['img']) ?&gt;&quot; width=&quot;110&quot; height=&quot;110&quot; /&gt;
	&lt;?php echo esc_html($cat_data['extra_text']) ?&gt;&lt;br /&gt;
	&lt;/li&gt;
	&lt;?php endforeach; ?&gt;
	&lt;/ul&gt;
	

カテゴリーで追加したカスタムフィールドのデータは「wp_options」に保存されていますので、「term_id」でidを取得したら「get_option」で取得できます。

WordPress のCSSをリセットする

WordPress にデザインをかけようとするとデフォルトのCSSが細かすぎて厄介者だ!

毎日のようにWordpressを使っていると無駄を省きたいと考えるのは皆同じことだろう。

最近主流のデザインは
ヘッダーやフッターの背景は画面いっぱい、ヘーダーの内容・フッターの内容は指定幅、というものがほとんどだ。

下記のようなCSSを基本にスタートすると作業が早い。

WordPress のCSSリセット済みThameを見る

WordPress のCSSリセット済みThameを見る

※ID名・クラス名が増えているので、注意する。

herder.php と footer.php に<3つ(#header_inner、#main_inner、#footer_inner)を追記することが必須です。 ↓style.css

/*
Theme Name: Twenty Eleven
Theme URI: http://wordpress.org/extend/themes/twentyeleven
Author: the WordPress team
Author URI: http://wordpress.org/
Description: The 2011 theme for WordPress is sophisticated, lightweight, and adaptable. Make it yours with a custom menu, header image, and background -- then go further with available theme options for light or dark color scheme, custom link colors, and three layout choices. Twenty Eleven comes equipped with a Showcase page template that transforms your front page into a showcase to show off your best content, widget support galore (sidebar, three footer areas, and a Showcase page widget area), and a custom "Ephemera" widget to display your Aside, Link, Quote, or Status posts. Included are styles for print and for the admin editor, support for featured images (as custom header images on posts and pages and as large images on featured "sticky" posts), and special styles for six different post formats.
Version: 1.4
License: GNU General Public License v2 or later
License URI: http://www.gnu.org/licenses/gpl-2.0.html
Tags: dark, light, white, black, gray, one-column, two-columns, left-sidebar, right-sidebar, fixed-width, flexible-width, custom-background, custom-colors, custom-header, custom-menu, editor-style, featured-image-header, featured-images, full-width-template, microformats, post-formats, rtl-language-support, sticky-post, theme-options, translation-ready
Text Domain: twentyeleven
*/

/* =Reset default browser CSS. Based on work by Eric Meyer: http://meyerweb.com/eric/tools/css/reset/index.html
-------------------------------------------------------------- */

html, body, div, span, applet, object, iframe,
h1, h2, h3, h4, h5, h6, p, blockquote, pre,
a, abbr, acronym, address, big, cite, code,
del, dfn, em, font, ins, kbd, q, s, samp,
small, strike, strong, sub, sup, tt, var,
dl, dt, dd, ol, ul, li,
fieldset, form, label, legend,
table, caption, tbody, tfoot, thead, tr, th, td {
border: 0;
font-family: inherit;
font-size: 100%;
font-style: inherit;
font-weight: inherit;
margin: 0;
outline: 0;
padding: 0;
vertical-align: baseline;
}
:focus {/* remember to define focus styles! */
outline: 0;
}
body {
background: #fff;
line-height: 1;
}
ol, ul {
list-style: none;
}
table {/* tables still need 'cellspacing="0"' in the markup */
border-collapse: separate;
border-spacing: 0;
}
caption, th, td {
font-weight: normal;
text-align: left;
}
blockquote:before, blockquote:after,
q:before, q:after {
content: "";
}
blockquote, q {
quotes: "" "";
}
a img {
border: 0;
}

narticle, aside, details, figcaption, figure,
footer, header, hgroup, menu, nav, section {
display: block;
}

/* ここからデザイン
------------------------------------------------------*/

html {}

body {
font-family: "メイリオ", meirio, Verdana,"ヒラギノ角ゴ Pro W3","Hiragino Kaku Gothic Pro","MS Pゴシック","MS PGothic",sans-serif;
font-size: 12px;
line-height: 20px;
}

#page {

}

/* カラム割
-------------------------------------------------------*/
/*
メニューバー、背景を画面幅いっぱいに、でもコンテンツは指定幅にという流行のレイアウトに対応

画面幅のカラム(インデントなし)
指定幅のカラム(インデントあり)
*/

#header {

}
#header_inner {
width: 1000px;
margin: 0 auto;
}
#main {
width: 1002px;
margin: 0 auto;
}
#main_inner {
float: left;
width: 1000px;
margin: 0 auto;
}
#footer {
clear: both;
}
#footer_inner {
width: 1000px;
margin: 0 auto;
}

/* メインカラムとサイドバーの関係 */
#primary {
float: right;
width: 696px;
}
#secondary {
float: left;
width: 300px;
}

/* レイアウト確認Border
#header, #header_inner, #main, #main_inner, #footer, #footer_inner, #primary, #secondary {border: 2px solid red; }*/

#header {
border: 1px solid skyblue;
}
#header_inner {
border: 1px solid limegreen;
}
#main_inner {
border: 1px solid gray;
}
#primary {
border: 1px solid mediumvioletred;
}
#secondary {
border: 1px solid mediumturquoise;
}
#footer {
border: 1px solid blueviolet;
}
#footer_inner {
border: 1px solid magenta;
}

/* EOF)カラム割 */

/* =Print
----------------------------------------------- */

@media print {
body {
background: none !important;
font-size: 10pt;
}
footer.entry-meta a[rel=bookmark]:link:after,
footer.entry-meta a[rel=bookmark]:visited:after {
content: " [" attr(href) "] "; /* Show URLs */
}
#page {
clear: both !important;
display: block !important;
float: none !important;
max-width: 100%;
position: relative !important;
}
#branding {
border-top: none !important;
padding: 0;
}
#branding hgroup {
margin: 0;
}
#site-title a {
font-size: 21pt;
}
#site-description {
font-size: 10pt;
}
#branding #searchform {
display: none;
}
#branding img {
display: none;
}
#access {
display: none;
}
#main {
border-top: none;
box-shadow: none;
}
#primary {
float: left;
margin: 0;
width: 100%;
}
#content {
margin: 0;
width: auto;
}
.singular #content {
margin: 0;
width: 100%;
}
.singular .entry-header .entry-meta {
position: static;
}
.entry-meta .edit-link a {
display: none;
}
#content nav {
display: none;
}
.singular .entry-header,
.singular .entry-content,
.singular footer.entry-meta,
.singular #comments-title {
margin: 0;
width: 100%;
}
.singular .hentry {
padding: 0;
}
.entry-title,
.singular .entry-title {
font-size: 21pt;
}
.entry-meta {
font-size: 10pt;
}
.entry-header .comments-link {
display: none;
}
.page-link {
display: none;
}
.singular #author-info {
background: none;
border-bottom: none;
border-top: none;
margin: 2.2em 0 0;
padding: 0;
}
#respond {
display: none;
}
.widget-area {
display: none;
}
#colophon {
display: none;
}

/* Comments */
.commentlist &gt; li.comment {
background: none;
border: 1px solid #ddd;
-moz-border-radius: 3px 3px 3px 3px;
border-radius: 3px 3px 3px 3px;
margin: 0 auto 1.625em;
padding: 1.625em;
position: relative;
width: auto;
}
.commentlist .avatar {
height: 39px;
left: 2.2em;
top: 2.2em;
width: 39px;
}
.commentlist li.comment .comment-meta {
line-height: 1.625em;
margin-left: 50px;
}
.commentlist li.comment .fn {
display: block;
}
.commentlist li.comment .comment-content {
margin: 1.625em 0 0;
}
.commentlist .comment-edit-link {
display: none;
}
.
commentlist &gt; li::before,
.commentlist &gt; li.bypostauthor::before {
content: '';
}
.commentlist .reply {
display: none;
}

/* Post author highlighting */
.commentlist &gt; li.bypostauthor {
color: #444;
}
.commentlist &gt; li.bypostauthor .comment-meta {
color: #666;
}
.commentlist &gt; li.bypostauthor:before {
content: none;
}

/* Post Author threaded comments */
.commentlist .children &gt; li.bypostauthor {
background: #fff;
border-color: #ddd;
}
.commentlist .children &gt; li.bypostauthor &gt; article,
.commentlist .children &gt; li.bypostauthor &gt; article .comment-meta {
color: #666;
}

}

/* =IE7
----------------------------------------------- */

#ie7 article.intro {
margin-left: -7.6%;
margin-right: -7.6%;
padding-left: -7.6%;
padding-right: -7.6%;
max-width: 1000px;
}
#ie7 section.featured-post {
margin-left: -7.6%;
margin-right: -7.6%;
max-width: 850px;
}
#ie7 section.recent-posts {
margin-right: 7.6%;
}

/* =IE8
----------------------------------------------- */

#ie8 section.feature-image.large img {
width: 100%;
} 

WordPress のCSSリセット済みThameを見る

WordPress のCSSリセット済みThameを見る

[WordPress]テンプレート用タグのチートシート

My WordPress Cheat Sheet」というサイトで、Wordpressのテンプレート用のタグのチートシートが公開されている。便利なので(。_。)φメモメモ ・・・ウッシッシ

テーマのファイル構成

  • header.php – ヘッダー部分
  • index.php – メイン部分
  • sidebar.php – サイドバー部分
  • footer.php – フッター部分
  • single.php – 記事テンプレート
  • page.php – ページテンプレート
  • comments.php – コメントテンプレート
  • search.php – 検索結果
  • searchform.php – 検索フォーム
  • archive.php – アーカイブ
  • functions.php – 特別機能
  • 404.php – 404エラーページ

ループ

&lt;?php if(have_posts()) : ?&gt;
   &lt;?php while(have_posts()) : the_post(); ?&gt;
// HTMLやPHPのコード
   &lt;?php endwhile; ?&gt;
&lt;?php else : ?&gt;
&lt;?php endif; ?&gt;

テンプレート・インクルード・タグ

&lt;?php get_header(); ?&gt;
&lt;?php get_sidebar(); ?&gt;
&lt;?php get_footer(); ?&gt;
&lt;?php comments_template(); ?&gt;

ブログ情報タグ

&lt;?php bloginfo('name'); ?&gt; - ブログタイトル
&lt;?php bloginfo('charset'); ?&gt; - ブログのcharset
&lt;?php bloginfo('description'); ?&gt; - キャッチフレーズ
&lt;?php bloginfo('url'); ?&gt; - ブログのURL
&lt;?php bloginfo('rss2_url'); ?&gt; - RSSのURL
&lt;?php bloginfo('template_url'); ?&gt; - テンプレートディレクトリのURL
&lt;?php bloginfo('pingback_url'); ?&gt; - トラックバックのURL
&lt;?php bloginfo('stylesheet_url'); ?&gt; - CSSファイルのURL
&lt;?php bloginfo('wpurl'); ?&gt; - WordPressのURL

条件タグ

is_home() // メインページかどうか
is_front_page() // フロントページかどうか
is_single() // 個別記事のページかどうか
is_sticky() - check if a post is sticky
is_page() // 個別ページかどうか
is_category() // あるカテゴリーのアーカイブページかどうか

共通タグ

&lt;?php the_time(); ?&gt; - 記事の投稿時間
&lt;?php the_date(); ?&gt; - 記事の投稿月日
&lt;?php the_title(); ?&gt; - 記事のタイトル
&lt;?php the_permalink(); ?&gt; - 記事のパーマリンク
&lt;?php the_category(); ?&gt; - 記事のカテゴリ
&lt;?php the_author(); ?&gt; - 記事の投稿者
&lt;?php the_ID(); ?&gt; - 記事のID
&lt;?php wp_list_pages(); ?&gt; - 全ページのリスト出力
&lt;?php wp_tag_cloud(); ?&gt; - タグクラウド
&lt;?php wp_list_cats(); ?&gt; - 全カテゴリのリスト出力
&lt;?php get_calendar(); ?&gt; - カレンダー
&lt;?php wp_get_archives() ?&gt; - 日付別アーカイブリスト
&lt;?php posts_nav_link(); ?&gt; - 記事の前後のページへのリンク
&lt;?php next_post_link(); ?&gt; - 記事の次のページへのリンク
&lt;?php previous_post_link(); ?&gt; - 記事の前のページへのリンク

ナビゲーションメニュー

// カテゴリーベース
&lt;ul id="menu"&gt;
&lt;li &lt;?php if(is_home()) { ?&gt; class="current-cat"&lt;?php } ?&gt;&gt;
&lt;a href="&lt;?php bloginfo('home'); ?&gt;"&gt;Home&lt;/a&gt;&lt;/li&gt;
&lt;?php wp_list_categories('title_li=&orderby=id'); ?&gt;
&lt;/ul&gt;

// ページベース
&lt;ul id="menu"&gt;
&lt;li &lt;?php if(is_home()) { ?&gt; class="current_page_item"&lt;?php } ?&gt;&gt;
&lt;a href="&lt;?php bloginfo('home'); ?&gt;"&gt;home&lt;/a&gt;&lt;/li&gt;
&lt;?php wp_list_pages('sort_column=menu_order&depth=1&title_li='); ?&gt;
&lt;/ul&gt;

あるカテゴリの記事

&lt;?php query_posts('category_name=Name&showposts=10'); ?&gt;

カスタム・テンプレートファイルのインクルード

&lt;?php include (TEMPLATEPATH . '/searchform.php'); ?&gt;

参考記事(外部サイト)

EC-CUBEで受注メールが送信されない(ロリポップなど)

リターンパスの問題
MAIL_BACKENDがmailの場合、リターンパスがサーバ名の入った記載になってしまう事があります。
MAIL_BACKENDをsendmailに変更したうえで簡単なカスタムを施してやることで、問題なくリターンパスが設定したメールアドレスが記述されます。
mailのままカスタムしてやる方法もありますが、sendmailにしてすすめる方が簡単なのでおすすめです。

対処方法
パラメータ設定/MAIL_BACKENDをsendmailに変更。
data/class/SC_SendMail.php でPathを調整すると無事送信できた。
詳細はこちら

EC-CUBE 2.11系でPDF帳票(納品書)がエラーになる

Adobe のエラーが表示されたり。印刷が出来ない。表示が途中まで。症状は様々です。

data/module/fpdi/japanese.php

function Footer()
{
    $this->SetY(-15);
    $this->SetFont('Arial','I',8);
    #$this->Cell(0,10,''.$this->PageNo().' / {nb}',0,0,'C');
}

$this->SetFont(‘Arial’,’I’,8);
$this->SetFont(”,’I’,8);
として、フォント名の指定を止めると治る。

EC-CUBEカスタマイズ事例集

ECCUBEカスタマイズの紹介やデモサイトのご案内です。
毎日、EC-CUBEを弄っていますので、ほんの一例のご紹介です。

デモサイトは機能制限が多いです。一部意図的に機能を止めてあるものもあります。(ソースを盗む輩がいるのでご了承くださいませ。)

難易度の高いものをデモとして公開しています。
難易度の低いもの(簡単なカスタマイズ)は「ページ左側のカテゴリ」からご覧ください。ソースコードも一部公開しています。

ショッピングモール

【DEMO】http://heart-lab.net/technology/demo/craftcrowd/

カスタマイズをいろいろ混ぜてみた

会員ランクで価格変動、口コミ新着、口コミランキング、購入数で価格変動、お友達紹介機能、など
【DEMO】http://heart-lab.net/technology/demo/eccube-iroiro/

商品規格をCSVで無限に増やす

(規格多数のEC-CUBE、規格はCSVで自由に変更できる、規格数も無限)
動作を軽くするのが夢でした!
【DEMO】http://heart-lab.net/technology/demo/eccube-options-v1/

さらにカスタマイズして
セット商品販売ができました。
http://keihinland.com/

選択肢により価格が変動します。
【DEMO】http://heart-lab.net/technology/demo/eccube-options-price/

会員ランクで価格変動

DEMO
【DEMO】http://heart-lab.net/technology/demo/eccube-2114-customer_rank
導入事例
http://fontanamoco.jp/

沢山買えばマケマッセ (購入個数で価格変動)

【DEMO】(調整中)
http://heart-lab.net/technology/demo/eccube-kazu
導入事例
http://best-print.jp/

共同購入 (「購入個数で価格変動」の拡張機能)

解説ページ
【DEMO】http://heart-lab.net/technology/demo/joint_shopping/
管理画面も公開中!

御覧になりたいデモがございましたらリクエストにお答えいたします。
hsmt@heart-lab.net

カスタマイズ一覧をすべて見る

受注メール送信を、一時的に止める

/data/class/SC_SendMail.php

268行目付近
$result = $this->objMail->send($recip, $header, $this->body);
をコメントアウトする。

/**
	* TXTメール送信を実行する.
	*
	* 設定された情報を利用して, メールを送信する.
	*
	* @return void
	*/
function sendMail($isHtml = false) {
	$header = $isHtml ? $this->getHTMLHeader() : $this->getTEXTHeader();
	$recip = $this->getRecip();
	// メール送信
	$result = $this->objMail->send($recip, $header, $this->body);
		if (PEAR::isError($result)) {
			GC_Utils_Ex::gfPrintLog($result->getMessage());
			GC_Utils_Ex::gfDebugLog($header);
			return false;
		}
	return true;
}

EC-CUBEデータベースに接続の基本コード

php5〜php7

Database に接続

$pdo = new PDO('mysql:host='.DB_SERVER.';dbname='.DB_NAME.';charset=utf8', DB_USER, DB_PASSWORD);

ヒットがユニークの場合

$sql = "SELECT * FROM `tb_hogehoge`";
$statement = $pdo->query($sql);
$item = $statement->fetch(PDO::FETCH_ASSOC);
var_dump($item);

Roop の場合

$sql = "SELECT * FROM `tb_hogehoge`";
foreach($pdo->query($sql) as $item) {
	var_dump($item);
}

↓php7 から使えなくなる。

バージョン2.4系

$db = mysql_connect(DB_SERVER.":".DB_PORT,DB_USER,DB_PASSWORD);
// mysql_query("SET NAMES utf8");
mysql_set_charset('utf8');
mysql_select_db(DB_NAME, $db);
$sql1 = "SELECT * FROM `dtb_category` WHERE `category_id` = '$_GET[category_id]'";
$rs1 = mysql_query($sql1,$db);
$item1 = mysql_fetch_assoc($rs1);

バージョン2.11系

// Config読込み
// バージョン2.4系
// include $_SERVER[DOCUMENT_ROOT]."/data/install.php";
// バージョン2.11系
// include $_SERVER[DOCUMENT_ROOT]."/config/config.php";
// install.php を include しなくてもいいみたい。

//------------------------------------------------------
// MySQLに接続開始
    $db = mysql_connect(DB_SERVER.":".DB_PORT,DB_USER,DB_PASSWORD);
    // mysql_query("SET NAMES utf8");
    mysql_set_charset('utf8');
    // DB指定(確認用)
    if(!mysql_select_db(DB_NAME, $db)){
        // echo "&lt;div style=\"color:red;\"&gt;\nメインデータベースに接続できません。&lt;/div&gt;\n";
    }elseif(mysql_select_db(DB_NAME, $db)){
        // echo "&lt;div style=\"color:green;\"&gt;\nDB指定OK!(".DB_NAME.")&lt;/div&gt;\n\n\n";
    }
//------------------------------------------------------

$sql1 = "SELECT * FROM `dtb_category` WHERE `category_id` = '$_GET[category_id]'";
$rs1 = mysql_query($sql1,$db);
$item1 = mysql_fetch_assoc($rs1);

MT5 特定のカテゴリ一覧を表示する

指定したカテゴリと、その下の階層のカテゴリが表示されます。

<ul>
<h3>カテゴリ名</h3>
<MTSubCategories category="カテゴリ名" sort_order="ascend">
<MTIfNonZero tag="MTCategoryCount">
<li><a href="<$MTCategoryArchiveLink$>" title="<$MTCategoryDescription$>"><MTCategoryLabel></a>
<MTElse>
<li><MTCategoryLabel>
</MTElse>
</MTIfNonZero>
</li>
</MTSubCategories>
</ul>

Firefox で モバイルサイトの動作検証をするには

EC-CUBEの2.3系、2.4系では、/mobile でPCからもモバイルサイトにアクセスできた。

2.11系では、自動判別されているのでアクセスできない。
Firefox の ユーザーエージェント・スイッチャー でも「非対応機種です。」となってしまう。

モバイルの動作確認を実機で行うのは効率が悪い。

どうしよう?

そこで、Firefox の ユーザーエージェント・スイッチャー を生かす方法をご紹介します。

”SC_Helper_Mobile.php” の2箇所をコメントアウトします。

function lfMobileCheckCompatibility() {
    if (!SC_MobileUserAgent_Ex::isSupported()) {
        // header('Location: ' . ROOT_URLPATH . 'unsupported/' . DIR_INDEX_PATH);
        // exit;
    }
}

これで、Firefoxのアドオンを使えば、PCブラウザでモバイルサイトの動作検証ができるようになります。

EC-CUBE 2.11 で商品登録ができない

EC-CUBE 2.11 で商品登録ができない
と思いきや

EC-CUBE 2.11 で商品登録ができない
シーケンスの調整で解決しました。

2.4系では、MySQLの場合 auto increment でしたが、
2.11系では、別テーブルにシーケンスを設定しているようです。
dtb_products_product_id_seq
dtb_products_class_product_class_id_seq

カテゴリ関係のテーブルも同様です。

こちらのサイトを参考にしました。

受注登録(受注管理)、受注メール、の商品名を操作する

規格を増やした場合など、
記録方法がとても複雑になってしまいます。
そのため動作が重くなるなど、デメリットに悩まされます。

そこで、
商品名(規格1、規格2、・・・・規格N)
のようにすることで、沢山の規格を軽快に利用できるようになりました。

カスタマイズの要は、
”SC_Helper_Purchase.php” の
「function registerOrderDetail」内で、product_name をUODATEする。

今のことろ、この手法がベストな感じです。

↓ソースコードは、整理できたら公開します。
こちらです。

eccube 2.11 ページ詳細 編集で システムエラー

設置パスがデフォルトのままならば、この問題は発生しない。

public_html
├html
└data

この構成を崩す場合、defaine.php を変更するのだが、Pathの処理に問題があり、管理画面の一部の機能がシステムエラーになる。
修復方法はとても面倒だ。お客様のご要望でどうしてもバージョン2.11で動かさねばならない。

簡易な回避方法は、
sfChangeCheckBox を使っていないのに書いてあるのがまずいらしい。
コメントアウトしてしまおう。

ソースコード解説はこちらです

EC-CUBE2.11で会員登録の初期値を仮会員にする

パラメータ設定でできるはずだが、動かない
/data/cache/mtb_constants.php のパーミッションを確認する
このファイルが更新されなければ、反映されない。

「管理者の承認が必要」とするには、
メールテンプレートを調整して、ユーザーが認証URLへアクセスできないようにする。

ファイルを編集して実装する場合
対象ファイル:/data/class/helper/SC_Helper_Customer.php

ソースコードはこちら

WordPress アーカイブ日付の日本語化

管理画面で、日本語を選択すれば、アーカイブ日付も日本語表示されます。
まれに、英語版Wordpressをインストールしてしまったとかデータベースの原因で、根本的な修正が必要な場合があります。

根本的な修正の対象ファイル、ソースコード解説はこちらです。

EC-CUBE から paypal へ「住所・氏名・メルアド」を渡す

ECcubeからペイパルの支払いページに移った時、フォームに自動入力する。

対象ファイル:data/downloads/module/mdl_paypal/paypal_link.tpl
以下を追加

    <!--{assign var=key value="first_name"}-->
    <input type="hidden" name="<!--{$key}-->" value="<!--{$arrForm&#91;$key&#93;.value}-->" />
    <!--{assign var=key value="last_name"}-->
    <input type="hidden" name="<!--{$key}-->" value="<!--{$arrForm&#91;$key&#93;.value}-->" />
    <!--{assign var=key value="state"}-->
    <input type="hidden" name="<!--{$key}-->" value="<!--{$arrForm&#91;$key&#93;.value}-->" />

※ 上記テンプレートの変更に伴い、モジュールファイルも調整が必要です。

これで、ページ遷移時にフォームへ自動入力されました。

paypal へ投げる金額に送料が加算されてしまうのを回避する

ペイパル へ投げる金額に送料が加算されてしまうのを回避する。
「商品価格+送料」をペイパルに投げると、送料にも消費税が加算されてしまう。
これを避けるために、純粋な商品価格のみをペイパルに投げるための処理。

	/**
		* パラメータ情報の初期化
		*/
	function initParam($arrData) {
		$this->objFormParam->addParam("cmd", "cmd", STEXT_LEN, "KVa", array("EXIST_CHECK", "MAX_LENGTH_CHECK"), PAYPAL_CMD);
		$this->objFormParam->addParam("business", "business", MTEXT_LEN, "KVa", array("EXIST_CHECK", "MAX_LENGTH_CHECK"), $arrData['business']);
		$this->objFormParam->addParam("undefined_quantity", "undefined_quantity", 1, "KVa", array("EXIST_CHECK", "MAX_LENGTH_CHECK"), PAYPAL_UNDEFINED_QUANTITY);
		$this->objFormParam->addParam("item_name", "item_name", 60, "KVa", array("EXIST_CHECK", "MAX_LENGTH_CHECK"), $arrData['item_name']);
		$this->objFormParam->addParam("currency_code", "currency_code", 3, "KVa", array("EXIST_CHECK", "MAX_LENGTH_CHECK"), PAYPAL_CURRENCY_CODE);
		
		// ペイパルのときは送料を引いて商品価格のみにする
		$arrData['payment_total'] = $arrData['payment_total'] - $arrData['deliv_fee'];
		
		$this->objFormParam->addParam("amount", "amount", STEXT_LEN, "n", array("NUM_CHECK", "EXIST_CHECK", "MAX_LENGTH_CHECK"), $arrData['payment_total']);
		$this->objFormParam->addParam("invoice", "invoice", STEXT_LEN, "n", array("EXIST_CHECK", "MAX_LENGTH_CHECK", "NUM_CHECK"), $arrData['order_id']);

EC-CUBE、ステータス変更でメールを自動送信する。

ステータスを「入金済み」にしたときに「ご入金確認メール」を自動送信する場合の例です。

メールテンプレートを追加する

/data/Smarty/templates/default/mail_templates/
order_mail.tpl をコピーして hoge_mail.tpl を新規に作成する。

「 管理画面 → システム設定 」で、
mtb_mail_template に追加
mtb_mail_tpl_pass にも追加

ここからが本題の自動送信処理です。

個別にステータスを変えた場合
/data/class/pages/admin/order/LC_Page_Admin_Order_Edit.php

/* DB登録処理 */
function lfRegistData($order_id) {
	$objQuery = new SC_Query();

	$objQuery->begin();

	// 入力データを渡す。
	$arrRet =  $this->objFormParam->getHashArray();
	foreach($arrRet as $key => $val) {
		// 配列は登録しない
		if(!is_array($val)) {
			$sqlval[$key] = $val;
		}
	}
	$sqlval['update_date'] = 'Now()';

	if (strlen($sqlval['deliv_date_year']) >= 0) {
		$sqlval['deliv_date'] = $sqlval['deliv_date_year'] . '-' . $sqlval['deliv_date_month'] . '-' . $sqlval['deliv_date_day'];
	}
	unset($sqlval['deliv_date_year']);
	unset($sqlval['deliv_date_month']);
	unset($sqlval['deliv_date_day']);

	unset($sqlval['total_point']);
	unset($sqlval['point']);
	unset($sqlval['commit_date']);

	$where = "order_id = ?";
	
	
	// ここから追加 ------------------------------
	// ここにメール送信処理を書きます。
	// ここまで追加 ------------------------------

	/*
		* XXX 本来なら配列だが, update 関数を string として
		*     チェックしているため...
		*/
	if (!isset($addcol)) $addcol = "";

	// 受注テーブルの更新
	$objQuery->update("dtb_order", $sqlval, $where, array($order_id), $addcol);

一括してステータスを変えた場合の対象ファイル
/data/class/pages/admin/order/LC_Page_Admin_Order_Status.php
ソースコード

OpenPNE でDBに接続

({php})
include OPENPNE_PATH.'config.php';
$db_array = $GLOBALS[_OPENPNE_DSN_LIST];
$db_array = $db_array[main][dsn];
// echo '<pre>'; var_dump($db_array); echo '</pre>';

//------------------------------------------------------
// MySQLに接続開始
	$db = mysql_connect($db_array[hostspec],$db_array[username],$db_array[password]);
	mysql_query("SET NAMES utf8");
	// DB指定(確認用)
	if(!mysql_select_db($db_array[database], $db)){
		echo "<div style=\"color:red;\">\nメインデータベースに接続できません。</div>\n";
	}elseif(mysql_select_db($db_array[database], $db)){
		// echo "<div style=\"color:green;\">\nDB指定OK!(".DB_NAME.")</div>\n\n\n";
	}
//------------------------------------------------------

// ↓一例です
// 自分のID
$c_member_id = $GLOBALS['AUTH']->uid();
// echo $c_member_id;

// 自分の性別
$sql5 = "SELECT * FROM `c_member_profile` WHERE `c_member_id` = '$c_member_id' AND `c_profile_id` = '1'";
$rs5 = mysql_query($sql5,$db);
$item5 = mysql_fetch_assoc($rs5);
({/php})

WordPressで記事一覧の文字数を変更する

WordPressで抜粋(the_excerpt)の文字数を変更する

で出来るはずと思いきや、2倍と文字はだめらしい。

1)標準装備のWP Multibyte Patchプラグインを有効化する。

2)wp-content/plugins/wp-multibyte-patchの中のwpmp-config-sample.phpをwpmp-config.phpにリネーム。

このファイルを編集すれば表示文字数が変更できる。

bbpressでプロファイルのフォームを並べ替える

「プロフィール編集のフォーム」を変更するには”function bb_profile_data_form”を編集する。

/bb-includes/functions.bb-template.php
L:2400付近

<table id="userinfo">
<?php
	if ( is_array($profile_info_keys) ) :
		$bb_current_id = bb_get_current_user_info( 'id' );
		
		// フォームの配列を置き換える
		echo '<pre>★'; var_dump($profile_info_keys); echo '</pre>'; // ←元の配列を表示してみる
		
		// 元の配列を参考に希望の配列と置き換える
		$profile_info_keys['first_name']['0'] = '';
		$profile_info_keys['first_name']['1'] = 'first_name';
		$profile_info_keys['last_name']['0'] = '';
		$profile_info_keys['last_name']['1'] = 'last_name';
		$profile_info_keys['display_name']['0'] = '';
		$profile_info_keys['display_name']['1'] = 'Display name as';
		$profile_info_keys['from']['0'] = '';
		$profile_info_keys['from']['1'] = 'Location';
		$profile_info_keys['user_email']['0'] = '';
		$profile_info_keys['user_email']['1'] = 'Email';
		$profile_info_keys['user_email']['2'] = 'email';
		$profile_info_keys['user_url']['0'] = '';
		$profile_info_keys['user_url']['1'] = 'Website';
		$profile_info_keys['user_url']['2'] = 'url';
		$profile_info_keys['occ']['0'] = '';
		$profile_info_keys['occ']['1'] = 'Occupation';
		$profile_info_keys['occ']['2'] = 'role';
		$profile_info_keys['interest']['0'] = '';
		$profile_info_keys['interest']['1'] = 'Interests';

memo

$profile_info_keys[‘*’][‘1,2,3’]
1:null
2:表示名
3:データの型

HTMLの整形は2483行目付近

EC-CUBE 2.11 で 会員登録の項目を増やす

フォーム
/data/Smarty/templates/default/frontparts/form_personal_input.tpl

確認画面
/data/Smarty/templates/default/entry/confirm.tpl

登録処理、Myページでの変更画面、入力チェック
/data/class/helper/SC_Helper_Customer.php
function sfCustomerEntryParam の後半で UPDATA で追加フィールドを登録する。

	function sfCustomerEntryParam (&$objFormParam, $isAdmin = false) {
		SC_Helper_Customer_Ex::sfCustomerCommonParam($objFormParam);
		SC_Helper_Customer_Ex::sfCustomerRegisterParam($objFormParam, $isAdmin);
		if($isAdmin) {
			$objFormParam->addParam("顧客ID", "customer_id", INT_LEN, 'n', array("NUM_CHECK"));
			$objFormParam->addParam('携帯メールアドレス', "email_mobile", MTEXT_LEN, 'a', array("NO_SPTAB", "EMAIL_CHECK", "SPTAB_CHECK" ,"EMAIL_CHAR_CHECK", "MAX_LENGTH_CHECK", "MOBILE_EMAIL_CHECK"));
			$objFormParam->addParam("会員状態", 'status', INT_LEN, 'n', array("EXIST_CHECK", "NUM_CHECK", "MAX_LENGTH_CHECK"));
			$objFormParam->addParam("SHOP用メモ", 'note', LTEXT_LEN, 'KVa', array("MAX_LENGTH_CHECK"));
			$objFormParam->addParam("所持ポイント", 'point', INT_LEN, 'n', array("NUM_CHECK"));
			
			
			// 項目追加
			// office_or 	office_name_kana 	office_name 	office_url 	office_gyousyu 	office_post0 	office_post1 	office_post2
			// mobile01 	mobile02 	mobile03	questionnaire0 	questionnaire1
			$objFormParam->addParam("会社名", 'office_or', INT_LEN, 'n', array());
			$objFormParam->addParam("会社名", 'office_name', LTEXT_LEN, 'n', array());
			$objFormParam->addParam("会社名カナ", 'office_name_kana', LTEXT_LEN, 'n', array());
			$objFormParam->addParam("会社URL", 'office_url', LTEXT_LEN, 'n', array());
			$objFormParam->addParam("業種", 'office_gyousyu', LTEXT_LEN, 'n', array());
			$objFormParam->addParam("役職", 'office_post0', LTEXT_LEN, 'n', array());
			$objFormParam->addParam("部署1", 'office_post1', LTEXT_LEN, 'n', array());
			$objFormParam->addParam("部署2", 'office_post2', LTEXT_LEN, 'n', array());
			$objFormParam->addParam("携帯メール1", 'mobile01', LTEXT_LEN, 'n', array());
			$objFormParam->addParam("携帯メール2", 'mobile02', LTEXT_LEN, 'n', array());
			$objFormParam->addParam("携帯メール3", 'mobile03', LTEXT_LEN, 'n', array());
			$objFormParam->addParam("質問1", 'questionnaire0', LTEXT_LEN, 'n', array());
			$objFormParam->addParam("質問2", 'questionnaire1', LTEXT_LEN, 'n', array());
			
		}
	}

表示に反映されない時は「SC_CustomerList.php」への追記を忘れているかも?

WordPress のデザインを EC-CUBE と同じにする

WordPress のヘッダー、サイドバー、フッターをEC-CUBEと同じように作っても良いが、変更があると、倍の作業になってしまう。
そこで、EC-CUBEのHTMLソースを自動で抽出して、Wordpress の該当部分に表示すると、合理的になる。

ソースの一例なので、任意に調整して利用する。

<body <?php body_class(); ?>>
<div id="wrapper" class="hfeed">

		<?php
			$data = 'http://'.$_SERVER&#91;SERVER_NAME&#93;.'/';
			$line = file($data);
			$i  =  0;
			while($line&#91;$i&#93;!=""){
				if(preg_match("/▼HEADER/", $line&#91;$i&#93;)) $print = 'on';
				if(preg_match("/▲HEADER/", $line&#91;$i&#93;)) $print = '';
				
				if($print == 'on') echo $line&#91;$i&#93;;
				$i ++;
			}
		?>


	<div id="main">

※ 注意
EC-CUBEのCSSを読み込んだり、それぞれのCSSの衝突を回避したりという作業も必須です。
CSSで画像を背景に敷いているときは、パスのお読み変えも必要です。
その辺のノウハウは、皆さんがんばって挑戦してみて下さい。