SQLのタブに以下をペーストして実行。
UPDATE wp_term_relationships SET term_taxonomy_id=REPLACE(term_taxonomy_id,"置き換えるカテゴリーID","置き換えた後のカテゴリーID")
単純に置換しているだけなので、例えば置き換えるカテゴリーIDを”6”とすると、16や66といった、数字の6がすべて置き置き換わるので注意。
SQLのタブに以下をペーストして実行。
UPDATE wp_term_relationships SET term_taxonomy_id=REPLACE(term_taxonomy_id,"置き換えるカテゴリーID","置き換えた後のカテゴリーID")
単純に置換しているだけなので、例えば置き換えるカテゴリーIDを”6”とすると、16や66といった、数字の6がすべて置き置き換わるので注意。
xサーバーからwpXクラウドへの移行作業を行う際、データベースのインポート時にUnknown character set: ‘utf8mb4’とUnknown collation: ‘utf8mb4_unicode_520_ci’といったエラーが出た時の対処法。
テキストエディタでSQLファイルを開き、以下のように置換。
utf8mb4_unicode_520_ci → utf8_general_ci
utf8mb4 → utf8
上記2つの処理を順番に行う。
テキストエディタはEmEditorがおすすめ。大きなファイルでもサクサク開くことができる。
EmEditorはシェアソフト。
ファイルが大きすぎてエディタで開けない場合は、エクスポート時にテーブルを選択して分割しながら移行を行う。
Create excel file with 4 columns (for simple 301, 302 or 307 redirects) and name the columns as source, target, code, match. In the second row, first column enter source URL you wish to redirect and destination URL in 2nd column / 2nd row. Repeat the steps as illustrated in below sample CSV file and save as .CSV file format. (Don’t save as worksheet)
テーブルを作る際は列数に注意。
source:ソースURL(必須)
target:ターゲットURL(必須)
regex:正規表現(空欄可;行を設定しない場合のデフォルトは1);正規表現をチェックの場合は1、正規表現をチェックしない場合は空欄
type:操作(空欄可;行を設定しない場合のデフォルトはURL)
code:操作(空欄可;行を設定しない場合のデフォルトは301)
match:一致条件(空欄可;行を設定しない場合のデフォルトはURL)
hits:転送数(空欄可);通常はここは空欄
title:説明?(空欄可)
| source | target | code | match |
| /old-url-1/ | www.url.com/new-url-1/ | 301 | url |
| /old-url-2/ | www.url.com/new-url-2/ | 301 | url |
| /old-url-3/ | www.url.com/new-url-3/ | 302 | url |
| /old-url-4/ | www.url.com/new-url-4/ | 307 | url |
| /old-url-5/ | www.url.com/new-url-5/ | 302 | url |
UPDATE wp_term_relationships SET term_taxonomy_id = (SELECT term_taxonomy_id FROM wp_term_taxonomy WHERE term_id = ここに結合先のtagID) WHERE term_taxonomy_id = (SELECT term_taxonomy_id FROM wp_term_taxonomy WHERE term_id = ここに結合元のtagID)
上記コードをSQLで実行するとカテゴリーを結合できる。
ただし、投稿一覧のカウント数には反映されない。
※wp-config で使用しているデータベースの情報を閲覧できる
下書きやゴミ箱に入った投稿を一括で削除できるプラグインは存在するが、投稿数が多いとエラーになってしまうという場合がある。
そんな時はphpmyadminで削除する方法がお勧めだ。
以下のコードで削除できる
DELETE a , b , c FROM wp_posts a LEFT JOIN wp_term_relationships b ON ( a.ID = b.object_id ) LEFT JOIN wp_postmeta c ON ( a.ID = c.post_id ) WHERE a.post_type = 'post' AND a.post_status = 'draft';
以下のコードで削除できる
DELETE a , b , c FROM wp_posts a LEFT JOIN wp_term_relationships b ON ( a.ID = b.object_id ) LEFT JOIN wp_postmeta c ON ( a.ID = c.post_id ) WHERE a.post_type = 'post' AND a.post_status = 'trash';
例えば2つの投稿タイプ、製品(product)と納入事例(case)があり、単純に、あるタクソノミーに属する製品をループで回して一覧表示するのは、ごくごく簡単なことだ。
今回実現したいのは、ループで回した製品(product)毎に、その製品の納入事例(case)を表示させるというケース。
つまり、ループを入れ子で使いたいのだ。または二重ループや多重ループというのだろうか。
そして、さらに言うと、製品と納入事例は同じカスタム分類(タクソノミー)で紐付いており、その値を取得してループに使用したい。
さらに言うと、それを固定ページのテンプレートで管理し、固定ページのカスタムフィールドの値でタクソノミーを指定することで、作業を簡略化したい。
以下で実現できたので、コードを整えてメモしておく。
<?php
////親ループ
$parm = array(
'post_type' => '投稿タイプ',
'tax_query' => array(
array(
'taxonomy' => esc_attr(get_post_meta($post->ID,'カスタムフィールド', true)),//カスタムフィールドでタクソノミーを指定
'field' => 'slug',//カスタムフィールドをスラッグで指定するかIDで指定するか
'terms' => esc_attr(get_post_meta($post->ID,'カスタムフィールド', true)),//カスタムフィールドでタームを指定
),
),
'showposts' => 4
);
$my_query = new WP_Query($parm);
?>
<?php if($my_query->have_posts()): ?>
<?php while ($my_query->have_posts()) : $my_query->the_post(); ?>
<!--ループの内容-->
<?php
//親ループで回した投稿から取得するタームのタクソノミーを指定
$terms = get_the_terms($post->ID,'タクソノミー');
foreach($terms as $term){//タームのスラッグを取得
$term_slug = $term -> slug;
}
// カスタムフィールドで関連付けたければ $term_slug = get_post_meta($post->ID,'カスタムフィールド',TRUE);
?>
<?php
////子ループ
$parm = array(
'post_type' => '投稿タイプ',
'tax_query' => array(
array(
'taxonomy' => 'タクソノミー',
'field' => 'slug',
'terms' => $term_slug,
),
),
'showposts' => 4
);
$sub_query = new WP_Query($parm);
// カスタムフィールドで関連付けたければ meta_key' => 'カスタムフィールドの値', 'meta_value' => $term_slug,
?>
<?php if($sub_query->have_posts()): ?>
<?php while ($sub_query->have_posts()) : $sub_query->the_post(); ?>
<!--ループの内容-->
<?php endwhile; ?>
<?php endif;
////子ループここまで
?>
<?php endwhile; ?>
<?php endif;
////親ループここまで
?>
上記のコードを応用して、カスタム投稿タイプsiteとlinkを作成し、サイトごとにリンクリストを作成するコードを以下に紹介。
<?php ////親ループ $parm = array( 'post_type' => 'site', 'orderby' => 'menu_order', 'order' => 'ASC', 'showposts' => -1 ); $my_query = new WP_Query($parm); ?> <?php if($my_query->have_posts()): ?> <?php while ($my_query->have_posts()) : $my_query->the_post(); ?> <dl class="clearfix"> <dt><a href="<?php echo $post->link_url; ?>" target="_blank" title="<?php echo $post->link_title; ?>"><?php the_title(); ?></a></dt> <dd><?php $cflsn = get_post_meta($post->ID,'link_site_name',TRUE); // カスタムフィールドlink_site_nameの値を格納 ?> <?php ////子ループ $parm = array( 'post_type' => 'link', 'meta_key' => 'link_site_name', 'meta_value' => $cflsn, 'orderby' => 'menu_order', 'order' => 'ASC', 'showposts' => -1 ); $sub_query = new WP_Query($parm); // カスタムフィールドlink_site_nameでサイト名を取得し同じサイト名のリンクを吐き出す ?> <?php if($sub_query->have_posts()): ?> <?php while ($sub_query->have_posts()) : $sub_query->the_post(); ?> <a href="<?php echo $post->link_url; ?>" target="_blank" title="<?php echo $post->link_title; ?>"><?php the_title(); ?></a> <?php endwhile; ?> <?php endif; ////子ループここまで ?> </dd> </dl> <?php endwhile; ?> <?php endif; ////親ループここまで ?>
以下の様なデータをcsvで管理し、インポート機能を使えば処理も簡単だ。
|
ID |
post_status |
post_type |
link_site_name |
link_title |
post_title |
link_url |
menu_order |
|
|
publish |
site |
サイト名 |
対策キーワード |
リンクテキスト |
リンクURL |
1 |
|
|
publish |
link |
サイト名 |
対策キーワード |
リンクテキスト |
リンクURL |
|
Woocommerce会員がログインしている状態で、資料請求や、見積依頼等を行う場合、フォームに会員情報が自動で入力されている状態が好ましい。
WoocommerceとContactform7を連携させてユーザー情報を自動入力させる方法を紹介したいと思う。
今回自動入力させたい項目は以下。
function wpcf7_form_tag_filter($tag){
if(is_admin() || !is_array($tag)) return $tag;
$name = $tag['name'];
$user = wp_get_current_user();
if($user) {
if($name == 'billing_company') { $tag['values'] = (array) $user->billing_company; }
if($name == 'billing_last_name') { $tag['values'] = (array) $user->billing_last_name; }
if($name == 'billing_first_name') { $tag['values'] = (array) $user->billing_first_name; }
if($name == 'billing_phone') { $tag['values'] = (array) $user->billing_phone; }
$pref = array(
"JP01"=>"北海道", "JP02"=>"青森県", "JP03"=>"岩手県", "JP04"=>"宮城県", "JP05"=>"秋田県", "JP06"=>"山形県", "JP07"=>"福島県", "JP08"=>"茨城県", "JP09"=>"栃木県", "JP10"=>"群馬県", "JP11"=>"埼玉県", "JP12"=>"千葉県", "JP13"=>"東京都", "JP14"=>"神奈川県", "JP15"=>"新潟県", "JP16"=>"富山県", "JP17"=>"石川県", "JP18"=>"福井県", "JP19"=>"山梨県", "JP20"=>"長野県", "JP21"=>"岐阜県", "JP22"=>"静岡県", "JP23"=>"愛知県", "JP24"=>"三重県", "JP25"=>"滋賀県", "JP26"=>"京都府", "JP27"=>"大阪府", "JP28"=>"兵庫県", "JP29"=>"奈良県", "JP30"=>"和歌山県", "JP31"=>"鳥取県", "JP32"=>"島根県", "JP33"=>"岡山県", "JP34"=>"広島県", "JP35"=>"山口県", "JP36"=>"徳島県", "JP37"=>"香川県", "JP38"=>"愛媛県", "JP39"=>"高知県", "JP40"=>"福岡県", "JP41"=>"佐賀県", "JP42"=>"長崎県", "JP43"=>"熊本県", "JP44"=>"大分県", "JP45"=>"宮崎県", "JP46"=>"鹿児島県", "JP47"=>"沖縄県",
);
$getuserstate = $user->billing_state;
if($name == 'billing_state') { $tag['values'] = (array) $pref[$getuserstate]; }
if($name == 'billing_postcode') { $tag['values'] = (array) $user->billing_postcode; }
if($name == 'billing_city') { $tag['values'] = (array) $user->billing_city; }
if($name == 'billing_address_1') { $tag['values'] = (array) $user->billing_address_1; }
if($name == 'billing_address_2') { $tag['values'] = (array) $user->billing_address_2; }
}
return $tag;
}
add_filter('wpcf7_form_tag', 'wpcf7_form_tag_filter', 11);
上記のポイントは「県」がコードで表示されてしまうのを防ぐため以下のコードを使用していることだ。
$pref = array( "JP01"=>"北海道", "JP02"=>"青森県", "JP03"=>"岩手県", "JP04"=>"宮城県", "JP05"=>"秋田県", "JP06"=>"山形県", "JP07"=>"福島県", "JP08"=>"茨城県", "JP09"=>"栃木県", "JP10"=>"群馬県", "JP11"=>"埼玉県", "JP12"=>"千葉県", "JP13"=>"東京都", "JP14"=>"神奈川県", "JP15"=>"新潟県", "JP16"=>"富山県", "JP17"=>"石川県", "JP18"=>"福井県", "JP19"=>"山梨県", "JP20"=>"長野県", "JP21"=>"岐阜県", "JP22"=>"静岡県", "JP23"=>"愛知県", "JP24"=>"三重県", "JP25"=>"滋賀県", "JP26"=>"京都府", "JP27"=>"大阪府", "JP28"=>"兵庫県", "JP29"=>"奈良県", "JP30"=>"和歌山県", "JP31"=>"鳥取県", "JP32"=>"島根県", "JP33"=>"岡山県", "JP34"=>"広島県", "JP35"=>"山口県", "JP36"=>"徳島県", "JP37"=>"香川県", "JP38"=>"愛媛県", "JP39"=>"高知県", "JP40"=>"福岡県", "JP41"=>"佐賀県", "JP42"=>"長崎県", "JP43"=>"熊本県", "JP44"=>"大分県", "JP45"=>"宮崎県", "JP46"=>"鹿児島県", "JP47"=>"沖縄県", ); $getuserstate = $user->billing_state;
Woocommerceで国を削除する方法に関するメモ。
Woocommerceは様々な国からの注文に対応しているため、標準で「国」を選べるような仕様になっているが、日本国内で使用する場合は、逆にこの設定が邪魔となる。
ただ単純に見えないようにするならばCSSで非表示にしてしまうのも手だが、フィルターフックで非表示にする方法を以下に紹介する。
add_filter( 'woocommerce_checkout_fields' , 'custom_override_checkout_fields' );
add_filter( 'woocommerce_billing_fields' , 'custom_override_billing_fields' );
add_filter( 'woocommerce_shipping_fields' , 'custom_override_shipping_fields' );
function custom_override_checkout_fields( $fields ) {
unset($fields['billing']['billing_country']);
unset($fields['shipping']['shipping_country']);
return $fields;
}
function custom_override_billing_fields( $fields ) {
unset($fields['billing_country']);
return $fields;
}
function custom_override_shipping_fields( $fields ) {
unset($fields['shipping_country']);
return $fields;
}
「国フィールド」は請求先や送付先にも表示されるため、上記のようなコードが必要になる。
WordPressで固定ページにタグ付けし、任意のページにそのページと同じタグの付いたページを関連ページとして表示させる方法を紹介する。
例えば、赤ワインというページに「ワイン」とタグ付けし、同じタグの付いたページを、赤ワインページに表示させたいという場合だ。これを固定ページで実現するためにはまず、固定ページでもタグ機能を使えるできるようにする必要がある。
以下のコードをfunction.phpに追記
function add_tag_to_page() {
register_taxonomy_for_object_type('post_tag', 'page'); }
add_action('init', 'add_tag_to_page');
続いて、要となる同じタグでループを回すコード。
<?php
$original_post = $post;
$tags = wp_get_post_tags($post->ID);
$tagIDs = array();
if ($tags) {
$tagcount = count($tags);
for ($i = 0; $i < $tagcount; $i++) {
$tagIDs[$i] = $tags[$i]->term_id;
}
$args=array(
'tag__in' => $tagIDs,//指定した複数のタグ(表示するページのタグ) のいずれかを含む投稿のみを表示
'post__not_in' => array($post->ID),//表示中のページを除外
'posts_per_page'=>'12',//投稿表示数
'post_type' => 'page',//投稿タイプ array('post','page')なども使える
'orderby' => 'menu_order',//並び順
'order' => 'ASC'//降順か昇順か
);
$my_query = new WP_Query($args);
if( $my_query->have_posts() ) { ?>
<?php while ($my_query->have_posts()) : $my_query->the_post();//ループのスタート ?>
<?php endwhile; wp_reset_query(); ?>
<?php } else { ?>
<?php } }?>
さらに、応用編で固定ページに任意のカスタフィールドの値で、関連ページとして表示させるかを選択したい、というケース。
上記のコードに以下を追加すればOK。
'order' => 'ASC',//降順か昇順か 'meta_key' => 'カスタムフィールド名',//指定したカスタムフィールド 'meta_value' => 'カスタムフィールドの値',//上記カスタムフィールドの値