2026年6月28日
2026年6月28日
YITH WooCommerce Wishlistのエラーを解決する方法
はじめに
YITH WooCommerce Wishlistでウィッシュリストに追加ボタンがループページ・商品ページに表示されない・共有したウィッシュリストURLにアクセスすると404エラーになる・ゲストユーザーがブラウザを閉じるとウィッシュリストが消える・ウィッシュリストから一括カート追加ができないといった問題は、パーマリンク設定・ウィッシュリスト専用ページの未設定・セッション設定が原因です。
症状・原因
- 商品一覧や商品詳細ページにハートマーク(ウィッシュリスト追加)ボタンが表示されない
https://example.com/wishlist/にアクセスすると「ページが見つかりません」と表示される- ゲストユーザーがウィッシュリストに追加後、別ページに移動すると消えている
- ウィッシュリストページの「カートに追加」ボタンをクリックしても反応がない
解決手順
ステップ1:Wishlistの状態を確認する
# YITH Wishlistの設定を確認
wp eval "
// バージョン確認
if (defined('YITH_WCWL_VERSION')) {
echo 'YITH WCWL version: ' . YITH_WCWL_VERSION . PHP_EOL;
}
// ウィッシュリストページを確認
\$page_id = yith_wcwl_get_wishlist_page_id();
echo 'Wishlist page ID: ' . \$page_id . PHP_EOL;
if (\$page_id) {
echo 'Wishlist URL: ' . get_permalink(\$page_id) . PHP_EOL;
echo 'Page status: ' . get_post_status(\$page_id) . PHP_EOL;
echo 'Has shortcode: ' . (has_shortcode(get_post_field('post_content', \$page_id), 'yith_wcwl_wishlist') ? 'yes' : 'NO') . PHP_EOL;
}
// ウィッシュリストのDB確認
global \$wpdb;
\$table = \$wpdb->prefix . 'yith_wcwl';
\$count = \$wpdb->get_var(\"SELECT COUNT(*) FROM {\$table}\");
echo 'Wishlist items in DB: ' . \$count . PHP_EOL;
// ゲスト設定確認
\$settings = get_option('yith_wcwl_settings', []);
echo 'Guest can use: ' . (\$settings['wishlist_enable_guest'] ?? '1') . PHP_EOL;
"
# パーマリンクをリセット
wp rewrite flush --hard
echo "Rewrite rules flushed"
ステップ2:ウィッシュリストの追加・削除をカスタマイズする
// functions.php: Wishlist追加/削除処理
// ① ウィッシュリスト追加時にカスタム処理
add_action('yith_wcwl_added_to_wishlist', function(int $product_id, int $wishlist_id, int $user_id): void {
error_log(sprintf('[WCWL] Product %d added to wishlist %d by user %d',
$product_id, $wishlist_id, $user_id));
// ユーザーへの通知(例:特定商品が追加された場合)
if ($product_id === 99) { // 特定の商品ID
$user = get_user_by('id', $user_id);
$email = $user ? $user->user_email : '';
if ($email) {
wp_mail($email, 'ウィッシュリストに追加されました',
get_the_title($product_id) . 'をウィッシュリストに追加しました。');
}
}
}, 10, 3);
// ② ウィッシュリストから削除時の処理
add_action('yith_wcwl_removed_from_wishlist', function(int $product_id, int $wishlist_id): void {
error_log(sprintf('[WCWL] Product %d removed from wishlist %d', $product_id, $wishlist_id));
});
// ③ 在庫切れ商品をウィッシュリストから自動通知
add_action('woocommerce_product_set_stock', function(\WC_Product $product): void {
if (!$product->is_in_stock()) return;
// この商品をウィッシュリストに持っているユーザーを取得
global $wpdb;
$table = $wpdb->prefix . 'yith_wcwl';
$users = $wpdb->get_col($wpdb->prepare(
"SELECT DISTINCT user_id FROM {$table} WHERE prod_id = %d AND user_id > 0",
$product->get_id()
));
foreach ($users as $user_id) {
$user = get_user_by('id', $user_id);
if ($user) {
wp_mail($user->user_email,
'在庫が復活しました!',
get_the_title($product->get_id()) . 'の在庫が復活しました。今すぐチェックしてください。'
);
}
}
});
ステップ3:ウィッシュリストの表示をカスタマイズする
// functions.php: Wishlist表示カスタマイズ
// ① ウィッシュリストボタンのテキストをカスタマイズ
add_filter('yith_wcwl_add_to_wishlist_button_classes', function(array $classes): array {
$classes[] = 'my-custom-wishlist-btn';
return $classes;
});
// ② ウィッシュリストアイコンのHTMLをカスタマイズ
add_filter('yith_wcwl_add_to_wishlist_label', function(string $label, bool $is_added): string {
if ($is_added) {
return '<span class="wishlist-heart active">❤</span> お気に入りに追加済み';
}
return '<span class="wishlist-heart">♡</span> お気に入りに追加';
}, 10, 2);
// ③ 商品ループでウィッシュリストボタンの位置を変更
remove_action('woocommerce_after_shop_loop_item', [YITH_WCWL_Frontend(), 'loop_add_to_wishlist_button'], 10);
add_action('woocommerce_before_add_to_cart_form', [YITH_WCWL_Frontend(), 'loop_add_to_wishlist_button'], 10);
// ④ ウィッシュリストの商品数をヘッダーに表示
function get_wishlist_count(): int {
if (!function_exists('yith_wcwl_count_all_products')) return 0;
return (int) yith_wcwl_count_all_products();
}
ステップ4:ゲストユーザーのウィッシュリストを管理する
// functions.php: ゲストWishlist管理
// ① ゲストのウィッシュリストをセッションで保持
add_action('wp_login', function(string $username, \WP_User $user): void {
// ログイン時にゲストのウィッシュリストをユーザーに引き継ぐ
if (!function_exists('YITH_WCWL')) return;
$session_wishlist = WC()->session->get('yith_wcwl_items', []);
if (empty($session_wishlist)) return;
foreach ($session_wishlist as $product_id) {
YITH_WCWL()->add(
$product_id,
0, // variation_id
false, // quantity
false, // wishlist_id(デフォルトを使用)
$user->ID
);
}
WC()->session->set('yith_wcwl_items', []);
error_log(sprintf('[WCWL] Transferred %d items from guest to user %d',
count($session_wishlist), $user->ID));
}, 10, 2);
// ② ウィッシュリストを他のユーザーと共有する
function get_shareable_wishlist_url(int $user_id = 0): string {
$user_id = $user_id ?: get_current_user_id();
if (!$user_id) return '';
$wishlist_id = yith_wcwl_get_wishlist_id_from_user($user_id);
if (!$wishlist_id) return '';
$token = get_user_meta($user_id, '_wcwl_share_token', true);
if (!$token) {
$token = wp_generate_password(12, false);
update_user_meta($user_id, '_wcwl_share_token', $token);
}
return add_query_arg('token', $token, get_permalink(yith_wcwl_get_wishlist_page_id()));
}
ステップ5:ウィッシュリストのデータを一括操作する
# ウィッシュリストのデータを確認・クリーンアップ
wp eval "
global \$wpdb;
\$table = \$wpdb->prefix . 'yith_wcwl';
// テーブルの存在確認
\$exists = \$wpdb->get_var(\"SHOW TABLES LIKE '{\$table}'\");
echo 'Table exists: ' . (\$exists ? 'yes' : 'NO') . PHP_EOL;
if (\$exists) {
// 統計
echo 'Total records: ' . \$wpdb->get_var(\"SELECT COUNT(*) FROM {\$table}\") . PHP_EOL;
echo 'Unique users: ' . \$wpdb->get_var(\"SELECT COUNT(DISTINCT user_id) FROM {\$table}\") . PHP_EOL;
echo 'Unique products: ' . \$wpdb->get_var(\"SELECT COUNT(DISTINCT prod_id) FROM {\$table}\") . PHP_EOL;
// 削除済み商品のウィッシュリストレコードをクリーンアップ
\$deleted = \$wpdb->query(\"
DELETE w FROM {\$table} w
LEFT JOIN {\$wpdb->posts} p ON w.prod_id = p.ID
WHERE p.ID IS NULL
\");
echo 'Cleaned orphan records: ' . \$deleted . PHP_EOL;
}
"
// functions.php: ウィッシュリストのCSVエクスポート
// ① ウィッシュリストをCSVでエクスポート
add_action('wp_ajax_export_wishlist_csv', function(): void {
if (!current_user_can('manage_woocommerce')) {
wp_die('Unauthorized');
}
global $wpdb;
$table = $wpdb->prefix . 'yith_wcwl';
$rows = $wpdb->get_results("SELECT user_id, prod_id, dateadded FROM {$table} ORDER BY dateadded DESC");
header('Content-Type: text/csv; charset=UTF-8');
header('Content-Disposition: attachment; filename="wishlist-export.csv"');
echo "\xEF\xBB\xBF"; // BOM
$out = fopen('php://output', 'w');
fputcsv($out, ['ユーザーID', '商品ID', '商品名', '追加日']);
foreach ($rows as $row) {
fputcsv($out, [$row->user_id, $row->prod_id, get_the_title($row->prod_id), $row->dateadded]);
}
fclose($out);
exit;
});
注意事項
- ウィッシュリストページが404になる場合、まず「設定 → パーマリンク」を保存してください。次にYITHの設定で「ウィッシュリストページ」に正しいページが設定されており、そのページに
[yith_wcwl_wishlist]ショートコードが含まれているか確認してください - ゲストユーザーのウィッシュリストはWooCommerceのセッション(クッキー)を使用します。キャッシュプラグインがセッション関連のクッキーをキャッシュしている場合、ゲストのウィッシュリストが正常に機能しないことがあります
- YITH WCWL Premiumでは「在庫切れ通知」機能が標準搭載されていますが、無料版ではカスタムコードで実装する必要があります
まとめ
YITH WooCommerce Wishlist修復は①yith_wcwl_get_wishlist_page_id()でページ確認・DBテーブルの存在確認・パーマリンクリセット、②yith_wcwl_added_to_wishlistフックで追加時の通知・在庫復活時のウィッシュリスト保持者への一斉通知、③yith_wcwl_add_to_wishlist_labelフィルターでボタンテキスト・アイコンカスタマイズ・ループでのボタン位置変更、④wp_loginフックでゲストのウィッシュリストをログイン時に引き継ぎ、⑤DBの孤立レコードクリーンアップ・CSVエクスポート機能で管理する手順で解決します。