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エクスポート機能で管理する手順で解決します。

お気軽にご相談ください

お見積りへ お問い合わせへ