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

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

<?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>';
	}

?>

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になるので安全です。

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;
	}

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

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

<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>

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) から各パッチ機能を個別に有効化・無効化できます。

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;

参考記事(外部サイト)

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

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

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

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

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

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

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

2)wp-content/plugins/wp-multibyte-patchの中のwpmp-config-sample.phpをwpmp-config.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で画像を背景に敷いているときは、パスのお読み変えも必要です。
その辺のノウハウは、皆さんがんばって挑戦してみて下さい。

wordpress の管理画面でメニューを自由に操るヒント

/wp-admin/admin-header.php の190行目付近
require(ABSPATH . ‘wp-admin/menu-header.php’);

「menu-header.php」と書いてあるが、サイドメニューのことだ!
ファイル構成的にはヘッダーファイルに含まれるということらしいが、紛らわしい。

wordpressでカスタムフィールドを使いすぎると

カスタムフィールドテンプレートなど便利なプラグインもありますが、
項目(フィールド)を沢山設けると動作がおかしくなることがあります。
原因はデータベースに登録するSQL分が長くなり、サーバーが全てをうまく処理できなくなってしまいます。
ほとんどのサーバーでは、SQL文の長さには制限があります。

カスタムフィールドのDBテーブルは柔軟性のある構造になっています。
この柔軟性な構造のため、複雑な長い SQL を発行します。
一つのカスタムフィールドにつき一つの JOIN(結合)が必要です。
5つのフィールドを参照しようとすると、5つの JOIN(結合)が必要になります。
JOIN は著しくパフォーマンスを低下させます。

Codex関数で表示すると、上記のようなことになりますので、
生のPHPでデータベースから直接取り出すことで回避できます。

WordPress 製作に便利なプラグイン

Disable Revisions and Autosave

http://exper.3drecursions.com/2008/07/25/disable-revisions-and-autosave-plugin/
WordPressのリビジョンと自動保存を停止させる。

Delete-Revision

http://wordpress.org/extend/plugins/delete-revision/
既にたまっているリビジョンを削除するプラグインです。

Duplicate Post

http://wordpress.org/extend/plugins/duplicate-post/
記事の複製プラグインです。テスト投稿などに使います。投稿を楽に増やせます。

参考

WordPressで肥大し続けるリビジョンを管理してすっきりさせる方法
 http://whitehatseo.jp/delete-revision-and-disable-revisions/
サーバ圧迫回避!WordPressのリビジョン機能の停止と過去分削除
 http://05step.com/2012/08/06/disable-delete-revision/

運用に便利なプラグイン

all-in-one-seo-pack
db-cache-reloaded-fix
google-sitemap-generator
sniplets
wordpress-importer

syntax-highlighter

バージョン3よりもバージョン2が好みの方も多いです。
なぜかって?
lightbox + syntax-highlighterバージョン3
の場合、lightboxが動きません。
http://wordpress.org/extend/plugins/syntax-highlighter/developers/

wordpressのカテゴリ一覧で記事の画像を表示する

ありがた迷惑なことに、
wordpressのバージョン3.*くらいから、一覧にはサマリー表示されています。
スマートフォン対策なんでしょうかね?

ということで、記事の詳細表示と同じにする方法です。

loop.php

変更前

&lt;?php if ( is_archive() || is_search() ) : // Only display excerpts for archives and search. ?&gt;
&lt;div class=&quot;entry-summary&quot;&gt;
&lt;?php the_excerpt(); ?&gt;
&lt;/div&gt;&lt;!-- .entry-summary --&gt;
&lt;?php else : ?&gt;
&lt;div class=&quot;entry-content&quot;&gt;
&lt;?php the_content( __( &#039;Continue reading &lt;span class=&quot;meta-nav&quot;&gt;&amp;rarr;&lt;/span&gt;&#039;, &#039;twentyten&#039; ) ); ?&gt;
&lt;?php wp_link_pages( array( &#039;before&#039; =&gt; &#039;&lt;div class=&quot;page-link&quot;&gt;&#039; . __( &#039;Pages:&#039;, &#039;twentyten&#039; ), &#039;after&#039; =&gt; &#039;&lt;/div&gt;&#039; ) ); ?&gt;
&lt;/div&gt;&lt;!-- .entry-content --&gt;
&lt;?php endif; ?&gt;

変更後

&lt;div class=&quot;entry-content&quot;&gt;
&lt;?php the_content(); ?&gt;
&lt;?php wp_link_pages( array( &#039;before&#039; =&gt; &#039;&lt;div class=&quot;page-link&quot;&gt;&#039; . __( &#039;Pages:&#039;, &#039;twentyten&#039; ), &#039;after&#039; =&gt; &#039;&lt;/div&gt;&#039; ) ); ?&gt;
&lt;/div&gt;&lt;!-- .entry-content --&gt;

これならば、だれでも簡単にできると思います。

wordpressの記事の文字数指定

wordpressの記事の文字数指定は、テンプレートタグ the_excerpt()でできます。

ちなみに、全文表示はthe_content()。

the_excerpt() は日本語の場合うまく動作しません。

wordpress日本語版にはこれを修正するプラグイン WP Multibyte Patchが同梱されているので、

それを有効にすると、OKです。

wordpress にログインしているユーザーの情報を表示する

<?php
global $current_user;
get_currentuserinfo();

echo 'Username: ' . $current_user->user_login . "\n";
echo 'User email: ' . $current_user->user_email . "\n";
echo 'User level: ' . $current_user->user_level . "\n";
echo 'User first name: ' . $current_user->user_firstname . "\n";
echo 'User last name: ' . $current_user->user_lastname . "\n";
echo 'User display name: ' . $current_user->display_name . "\n";
echo 'User ID: ' . $current_user->ID . "\n";
?>

php 変数 に代入する方法(ユーザーIDをPHPに渡す)

global $current_user;
get_currentuserinfo();
$hoge = $current_user-->user_level;
echo '★'.$hoge.'<br>';

WordPress の管理画面がおかしくなる場合の対処法

WordPress の管理画面がcss が反映されない状態になってしまった。
以前にも別のサイトでなった記憶があるので、今回はきちんと対応してみた。

PHP を CGI モードで作動させる記述に問題がありそうだということで、
”AddHandler application/x-httpd-phpcgi .php” と書いていた。
横着せずに、必要な場合のみCGIモードにすることで回避できる。
▽ こんな感じに書く

# ファイルのアップロード
<files async-upload.php>
AddHandler application/x-httpd-phpcgi .php
</files>

# プラグインの新規インストール
<files plugin-install.php>
AddHandler application/x-httpd-phpcgi .php
</files>

# テーマの自動アップグレード
<files update.php>
AddHandler application/x-httpd-phpcgi .php
</files>

# コアアップグレード
<files update-core.php>
AddHandler application/x-httpd-phpcgi .php
</files>

うちの場合 ”CORESERVER” ですが、条件が揃えば他のサーバーでも発生すると思われます。

wordpressの記事内でphpを使う(runPHP)

unPHP というプラグインを利用します。
配布元:http://wordpress.org/extend/plugins/runphp/

1)通常のプラグインのようにアップロードし有効にします。

2)設定 → runPHP で、有効にする権限をチェックします。

3)ユーザー → 各ユーザーのプロフィールで
「I can activate or deactivate runPHP on a post.」にチェックします。
「ビジュアルリッチエディターを使用しない」にチェックします。

4)投稿ページの下のほうにに「run PHP code?」があるのでチェックすれば投稿記事内でPHPが使えます。

親カテゴリのIDを取得する

親カテゴリのIDを取得する

&lt;?php 
    /* 現在のカテゴリ-の取得 */
    $cat_now = get_the_category();
    $cat_now = $cat_now[0];
    // echo '&lt;pre'&gt;';var_dump($cat_now);echo ''&lt;/pre'&gt;'; // 子カテゴリに関するいろんなデータの配列

    /*親カテゴリーのID取得*/
    $parent_id = $cat_now-&gt;category_parent;
    echo $parent_id;
?&gt;

現在のカテゴリを抽出する

/* 現在のカテゴリ-の取得 */
$cat_now = get_the_category();
$cat_now = $cat_now[0];
echo '&lt;pre&gt;';var_dump($cat_now);echo '&lt;/pre&gt;';
$cat_now = $cat_now->term_id;
echo '★'.$cat_now.'★';

worepress でlightbox が動かないのはなぜ!

久々にライトボックスのプラグインを設定する。
チョロイチョロイ となめてかかったら、思わぬ落とし穴があった。
アホくさいけど、これを知らないと動きません v(^^)

lightbox

皆さんも小難しく考えて、「rel=”lightbox”」を手で書いてみたりしていませんか?
最近のバージョンは「rel=”…」はいらないようです。
生サイズ画像へのリンクをライトボックス化してくれると覚えましょう。
リンクを生成してくれる機能は持ち合わせていないようです。

ヘッダーのtitleを整形する

デフォルトでは「 サイト名 ≫ ページ名 」のようになっている。
SEO対策としては少々足りない気がする。
「 ページ名 ≫ サイト名 」 としたいが単に順番を変えると「≫」が先頭にきてしまう。
phpで置換するのもよいが、その前に公式マニュアルを調べると、書いてありました。
http://wpdocs.sourceforge.jp/テンプレートタグ/wp_titleの中断くらいに「ブログ名とタイトルを反転して区切る」という項目があります。

&lt;title&gt;
&lt;?php wp_title('--', true, 'right'); ?&gt;
&lt;?php bloginfo('name'); ?&gt;
&lt;/title&gt;

区切り文字(記号)を右付にできるんですね。

WordPressでカテゴリを指定して記事を表示する。

// 元

&lt;?php if (have_posts()) : while (have_posts()) : the_post(); ?&gt;

// カテゴリを指定して表示する

&lt;?php if (have_posts()) :  query_posts('&posts_per_page=20&cat=47');  ?&gt;
&lt;?php while (have_posts()) : the_post(); ?&gt;
posts_per_page=20、表示する記事数
cat=47、カテゴリIDなのだが、パーマリンクを変更するとこれが効かない。
category_nama=***、これでできた。

// 複数カテゴリを指定して表示する

&lt;?php query_posts(array('category__in' =&gt; array(25,24,23,10))); ?&gt;
&lt;?php if (have_posts()) : while (have_posts()) : the_post(); ?&gt;

ビジュアルエディタを使用しない

WordPress の投稿・編集で「ビジュアルリッチエディタ」を使いたくなることもある。
「ビジュアルリッチエディタ」の有効・無効の設定は「設定」にはない。
「ユーザー」にある。
なぜ?と思うかもしれないが、サイトの管理者と運用者、投稿者、などにより管理画面の簡易性を求めるためである。wp_20100102

WordPress のデータベースに接続

<?php
// Config読込み
include $_SERVER[DOCUMENT_ROOT]."/wp-config.php";// MySQLに接続 ------------------
$db = mysql_connect(DB_HOST,DB_USER,DB_PASSWORD);
//mysql_query("SET NAMES utf8″);
// DB指定(確認用)
if(!mysql_select_db(DB_NAME, $db)){
// echo '<div style="color:red;">メインデータベースに接続できません。</div>';
}elseif(mysql_select_db(DB_NAME, $db)){
echo '<div style="color:green;">DB指定OK!('.DB_NAME.')</div>';
}
// < EOF > MySQLに接続 ------------------

// $sql="SELECT * FROM `dtb_product_categories` WHERE `product_id` = '$_GET[product_id]'";
// $rs = mysql_query($sql,$db);
// $item = mysql_fetch_assoc($rs);
// var_dump($item);
?>

新規投稿・編集のテキストエリアのサイズ調整

私の場合、該当ファイル本体をいじっているが、こんなところで調整できるらしい?
Wordpressの記事を書くボックスが狭いのはなぜだろう?
疑問だが、どうせ別なエディタで編集してペーストだから、頬って置いたが、こんな機能があったことは知らなかった。
こういうのって、素人さんのほうがしているのかもしれない。
少々恥ずかしい発見でした。

wpman_20091220

サイトマップ生成プラグイン

WordPressでサイトマップ自動生成プラグイン

Dagon Designのがよさそうなので Download

プラグインを有効にしたら、サイトマップ用に固定ページをつくって一行書くだけ!

&lt;!-- ddsitmapgen --&gt;

※ハイフンとddsitmapgenの間にスペースがないと動作しないようだ。
ddsitmapgen
 
 

もう少々高度なことをしたい場合、

テーマディレクトリに”sitmap.php”を作る。
内容は下記のように記述する。

&lt;?php
/*
Template Name: SITEMAP
*/
?&gt;

&lt;?php get_header();?&gt;

&lt;div id="sitemap"&gt; 
    &lt;?php echo ddsg_create_sitemap(); ?&gt;
&lt;/div&gt;

&lt;?php get_footer(); ?&gt;

固定ページをつくる。

タイトル"サイトマップ"
パーマリンク"http://heart-lab.net/technology/sitmap"

本文は空でよい。
ページのテンプレートに ‘SITEMAP” を選択する。
ddsitmapge2

あとは、テンプレートでお好きなようにどうぞ!!

・・・カスタマイズしないとイマイチなプラグインかもしれないことに気付いてしまった。

オープンソースなのだから、汎用性を言うことを考えれば、この程度の(作りこんでいない)ベースになるものがいいのかもしれない。

記事IDから親カテゴリ情報抽出

wordpress のDB構成というのはとても洗練された無駄の無いものです。
その反面、記事IDからカテゴリを抽出しようとすると、3重の逆ループをかけなければなりません。
3重逆ループってどこかで聞いたような…ルービックキューブの公式を見出すことと同じです。
覚えるとか慣れるということではなく、出すことと同じ難易度ということになります。
これができると一人前の数学者かもしれません。

&lt;?php

    // MySQLに接続 ------------------

    $sql="SELECT * FROM `tech_posts` WHERE `post_status` = 'publish' ORDER BY `ID` DESC";
    $hack .= '&lt;br&gt;'.$sql.'&lt;br&gt;';
    $rs = mysql_query($sql,$db);
    $i = 0;
    while($item = mysql_fetch_assoc($rs)){
        $hack .= '■'.$item[ID].'■';
        if($i &lt;= 9){
            
            // カテゴリID抽出
            $sql2="SELECT * FROM `tech_term_relationships` WHERE `object_id` = '$item[ID]'"; // post_id がマッチしたら
            $rs2 = mysql_query($sql2,$db);
            
            $item2 = mysql_fetch_assoc($rs2);
            if( ($item2[term_taxonomy_id] &gt;= "2") && ($item2[term_taxonomy_id] &lt;= "8") ){
                
                $sql3="SELECT * FROM `tech_term_relationships` WHERE `object_id` = '$item[ID]'";
                $rs3 = mysql_query($sql3,$db);
                $item3 = mysql_fetch_assoc($rs3);
                
                // カテゴリID整形
                    $idid1 = '00'.$item3[term_taxonomy_id].'-';

ソースコード全文はこちら

「サイトを開く」のリンクを新しいタブで開くようにする。

wp_man20091204a

[File] wp-admin/admin-header.php
[Line] 104

&lt;a href="&lt;?php echo trailingslashit( get_bloginfo('url') ); ?&gt;" target="_blank" title="&lt;?php _e('Visit site') ?&gt;"&gt;&lt;/

なんだこんなこと?と馬鹿にしないでください。
2クリックか?1クリックか?
作業は倍か半分かというとても大きな違いです。
コレラが積み重なると大きなボトルネックなになります。

気がつくたびに、小さなことでもクリアしていかないと、最速の開発はできません。

WordPress の バックアップ

WordPress Database Backup というプラグインがある。

ダウンロードサイトは、http://www.ilfilosofo.com/blog/wp-db-backup

これは、とても素晴らしい!

他のプラグインは、あっても困らないが、無くても困らないものばかり。

これは、一度使ったら、手放せない。

30分もあれば作れる簡単なプラグインだが、配布してくれるのがうれしい。

いや、違う、まともなプラグインを作る輩が存在することが嬉しい!

サーバー内にバックアップしたところで、サーバがとまればそれまで、

主導でダウンロードしようものなら、そのうちに飽きてしまう。

しかし、設定しだいでは、毎日、バックアップしメールで送ってくれるしカラクリのようだ。

望むならば、1時間毎にも設定できる。

まあ、普通は1週間が妥当かもしれない。

自分の場合は、1日一回にした。

2日分もデータが飛んだら、大きな損失になる。

1時間に一回は多いような気がするので、

昼間、仕事をしている時間帯、つまりデータが次々と更新される時間帯に限り、

2時間に一回、バックアップをメールで送信にカスタマイズしようとも考えている。

…目視確認、DBに再インポートできるか確認、というのも、わずらわしいので、

受信して、DB検証をしてくれる、サーバーでも作ろうか。。。?

「最新の投稿」のMAXを変える

wp-includes/default-widgets.php
542行目付近

if ( !$number = (int) $instance['number'] )
$number = 10;
else if ( $number &lt; 1 )
$number = 1;
else if ( $number &gt; <strong>15</strong> )
$number = <strong>15</strong>;

同ファイル内に15という数値が沢山あるので、一括置換してしまおう!
バージョンによっては、1っ箇所の場合もある、その辺は、自分でソースコードをきちんと読んでから変更してください。
※ ソースコードを理解しないまま、見たり聞いたりした情報だけで作業を行うことは、とても危険です。

WordPressで日付に曜日を表示する

$kizi_id =  $post-&gt;ID;
// echo $kizi_id.'&lt;br&gt;';
// Config読込み
include $_SERVER[DOCUMENT_ROOT]."/wp-config.php";// MySQLに接続 ------------------
$db = mysql_connect(DB_HOST,DB_USER,DB_PASSWORD);
//mysql_query("SET NAMES utf8″);
// DB指定(確認用)
if(!mysql_select_db(DB_NAME, $db)){
    // echo '&lt;div style="color:red;"&gt;メインデータベースに接続できません。&lt;/div&gt;';
}elseif(mysql_select_db(DB_NAME, $db)){
    // echo '&lt;div style="color:green;"&gt;DB指定OK!('.DB_NAME.')&lt;/div&gt;';
}
// &lt; EOF &gt; MySQLに接続 ------------------

$sql="SELECT * FROM `tech_posts` WHERE `ID` = '$kizi_id'";
$rs = mysql_query($sql,$db);
$item = mysql_fetch_assoc($rs);
// var_dump($item);
$date = $item[post_date];
list($date, $gomi) = explode(' ', $date);
// echo $date.'&lt;br&gt;';
list($year, $month, $mday) = explode('-', $date);
// echo $yy.'=='.$mm.'=='.$mday.'&lt;br&gt;';

//日付から曜日を判定する関数
function date2wday($year, $month, $mday) {
if($month == 1 || $month == 2) {
    $year--;
    $month += 12;
}
$wday = ($year + intval($year/4) - intval($year/100) + intval($year/400) +
                intval((13*$month+8)/5) + $mday) % 7;
    return $wday;
}
$wday = date2wday($year, $month, $mday);

$arr_wday = array("日", "月", "火", "水", "木", "金", "土");
$str_wday2 = $arr_wday[$wday];

$str_wday2 = $str_wday2 . "曜日";

// echo $str_wday2;

↑こういうことをしなくても、↓これでできる。

&lt;?php the_date("Y年 n月 j日 l"); ?&gt;

カスタムフィールドを抽出して条件分岐

カスタムフィールドの値により様々なアイコンを表示する。
コンナ感じかな?

<?php
    // echo post_custom('施工実績(ジャンル)');
    $hoge = post_custom('施工実績(ジャンル)');
    // echo $hoge;
    if($hoge == '新築'){
        $echoimg = 'icon_mini_new.png';
    }elseif($hoge == 'リフォーム'){
        $echoimg = 'icon_mini_rehome.png';
    }elseif($hoge == '外構・ミニハウス'){
        $echoimg = 'icon_mini_gaikou.png';
    }elseif($hoge == '店舗'){
        $echoimg = 'icon_mini_shop.png';
    }
?>
<img src="<?php bloginfo('template_directory'); ?>/images/<?php echo $echoimg; ?>">