# Code Snippets

# Snippet - Prüfe ob Kunde Artikel im Besitz

### Beschreibung:

Prüfe ob Kunde Artikel im Besitz, und gebe das beim Artikel aus.

### Code:

```
add_action('woocommerce_before_single_product', function() {
    if (!is_user_logged_in()) {
        echo '<div style="padding:10px;background:#ffeeba;border-left:5px solid #f0ad4e;margin-bottom:15px;">
                🔒 Du bist nicht eingeloggt. Eine Besitzprüfung ist nicht möglich.
              </div>';
        return;
    }

    global $product;
    $user_id = get_current_user_id();
    $product_id = $product->get_id();

    $owns_product = wc_customer_bought_product('', $user_id, $product_id);

    if ($owns_product) {
        echo '<div style="padding:10px;background:#d4edda;border-left:5px solid #28a745;margin-bottom:15px;">
                ✅ Du besitzt dieses Produkt bereits.
              </div>';
    } else {
        echo '<div style="padding:10px;background:#f8d7da;border-left:5px solid #dc3545;margin-bottom:15px;">
                ❌ Du besitzt dieses Produkt nicht.
              </div>';
    }
});
```

### Ausführung:

Wenn man nicht eingeloggt ist bekommt man diese Meldung:

[![grafik.png](https://wiki.hacker-net.de/uploads/images/gallery/2025-03/scaled-1680-/7Z2kV0XzNiCy8epz-grafik.png)](https://wiki.hacker-net.de/uploads/images/gallery/2025-03/7Z2kV0XzNiCy8epz-grafik.png)

Wenn man eingeloggt ist, diese wenn gekauft

[![grafik.png](https://wiki.hacker-net.de/uploads/images/gallery/2025-03/scaled-1680-/lsKJ83VKHqzod23A-grafik.png)](https://wiki.hacker-net.de/uploads/images/gallery/2025-03/lsKJ83VKHqzod23A-grafik.png)

und wenn man es noch nicht besitzt

[![grafik.png](https://wiki.hacker-net.de/uploads/images/gallery/2025-03/scaled-1680-/EHyDCVjE9OsYyHiC-grafik.png)](https://wiki.hacker-net.de/uploads/images/gallery/2025-03/EHyDCVjE9OsYyHiC-grafik.png)

Man kann sich überlegen ob man sich die Ausgabe, das man es nicht besitzt spart. In dem Man dieses wieder auskommentiert bzw. den else block entfernt. Genauso wie die Prüfung ob eingeloggt, kann man auch entfernen wenn es nervt oder man nicht haben will.

# Snippet - Wenn Kunde Produkt aus kategorie in Besitz hat ist dieses nicht mehr kaufbar

### Beschreibung:

Wenn ein Kunde ein Produkt aus einer Kategorie im Besitz hat, sprich schon mal gekauft hat, kann er diesen Artikel nicht nochmals erwerben. Die menge Beschreibungsfelder etc. und in den Warenkorb werden via CSS ausgeblendet.  
Auch hier kann wieder entschieden werden, welche Sachen angezeigt werden sollen.  
Was nicht gebraucht wird, löschen oder auskommentieren.

### Code:

```
// Besitzprüfung + Hinweis + optional Kauf verhindern
add_action('woocommerce_before_single_product', function() {
    if (!is_user_logged_in()) {
        echo '<div style="padding:10px;background:#ffeeba;border-left:5px solid #f0ad4e;margin-bottom:15px;">
                🔒 Du bist nicht eingeloggt. Eine Besitzprüfung ist nicht möglich.
              </div>';
        return;
    }

    global $product;
    $user_id = get_current_user_id();
    $product_id = $product->get_id();
    $owns_product = wc_customer_bought_product('', $user_id, $product_id);
    $has_category = has_term('Homepagevorlagen', 'product_cat', $product_id);

    if ($owns_product) {
        echo '<div style="padding:10px;background:#d4edda;border-left:5px solid #28a745;margin-bottom:15px;">
                ✅ Du besitzt dieses Produkt bereits.
              </div>';

        if ($has_category) {
            echo '<div style="padding:10px;background:#fff3cd;border-left:5px solid #ffeeba;margin-bottom:15px;">
                    🛑 Du besitzt dieses Produkt bereits und es gehört zur Kategorie „Homepagevorlagen“. Ein erneuter Kauf ist nicht möglich.
                  </div>';

            // Dynamisch CSS einfügen, um Kaufbereich auszublenden
            add_action('wp_head', function() {
                echo '<style>
                    body.woocommerce.single-product .cart,
                    body.woocommerce.single-product .quantity,
                    body.woocommerce.single-product form.cart {
                        display: none !important;
                    }
                </style>';
            });
        }
    } else {
        echo '<div style="padding:10px;background:#f8d7da;border-left:5px solid #dc3545;margin-bottom:15px;">
                ❌ Du besitzt dieses Produkt nicht.
              </div>';
    }
});

```

# Snippet - Wenn Kunde ein explicites Produkt in Besitz hat ist dieses nicht mehr kaufbar

### Beschreibung:

Wenn ein Kunde ein bestimmtes Produkt im Besitz hat, sprich schon mal gekauft hat, kann er diesen Artikel nicht nochmals erwerben. Die menge Beschreibungsfelder etc. und in den Warenkorb werden via CSS ausgeblendet.  
Auch hier kann wieder entschieden werden, welche Sachen angezeigt werden sollen.  
Was nicht gebraucht wird, löschen oder auskommentieren. Unter target\_product\_id die id des produktes eintragen

### Code:

```
add_action('woocommerce_before_single_product', function() {
    if (!is_user_logged_in()) {
        echo '<div style="padding:10px;background:#ffeeba;border-left:5px solid #f0ad4e;margin-bottom:15px;">
                🔒 Du bist nicht eingeloggt. Eine Besitzprüfung ist nicht möglich.
              </div>';
        return;
    }

    global $product;
    $user_id = get_current_user_id();
    $product_id = $product->get_id();
    $owns_product = wc_customer_bought_product('', $user_id, $product_id);

    // Hier deine Ziel-Produkt-ID eintragen
    $target_product_id = 1234;

    if ($owns_product) {
        echo '<div style="padding:10px;background:#d4edda;border-left:5px solid #28a745;margin-bottom:15px;">
                ✅ Du besitzt dieses Produkt bereits.
              </div>';

        if ($product_id == $target_product_id) {
            echo '<div style="padding:10px;background:#fff3cd;border-left:5px solid #ffeeba;margin-bottom:15px;">
                    🛑 Du besitzt dieses Produkt bereits. Ein erneuter Kauf ist nicht möglich.
                  </div>';

            // Kaufbereich via CSS ausblenden
            add_action('wp_head', function() {
                echo '<style>
                    body.woocommerce.single-product .cart,
                    body.woocommerce.single-product .quantity,
                    body.woocommerce.single-product form.cart {
                        display: none !important;
                    }
                </style>';
            });
        }
    } else {
        echo '<div style="padding:10px;background:#f8d7da;border-left:5px solid #dc3545;margin-bottom:15px;">
                ❌ Du besitzt dieses Produkt nicht.
              </div>';
    }
});

```

# Snippet - Umleitung externer DNS name auf internen Docker instance - service Namen

### Beschreibung:

Damit der WP Cron Dienst in Verbindung mit Caddy im Docker funktioniert, müssen der Externe DNS Name auf den internen Namen umgeleitet werden. Hier heißt der Service Name wordpress, dieser ist in der Docker compose Datei zu finden.

### Code:

```
add_filter('cron_request', function($cron_request) {
    // Ersetze die externe HTTPS-Adresse durch den internen HTTP-Service-Namen
    $cron_request['url'] = str_replace('https://deine-externe-domain.de', 'http://wordpress', $cron_request['url']);
    return $cron_request;
});
```

# Snippet  - Artikel als neue Position im Warenkorb mit Textfeld aus Acowebs Product Addons

### Beschreibung:

Es gibt Artikel die mehrmal in den Warenkorb gelegt werden sollen, aber nicht gestapelt sondern als einzelne Position immer aufgelistet werden sollen, da sie Custom fields beinhalten.  
[Hier](https://wiki.hacker-net.de/books/wordpress/page/addon-product-addons-for-woocommerce-product-options-with-custom-fields "Addon - Product Addons for Woocommerce – Product Options with Custom Fields") aus dem Plugin Acowebs Product Addons, für Benutzerdefinierte Felder.

### Herausfinden des Feldnamens:  


Die Artikelseite Aufrufen. Rechtklcik in das Textfeld und auf untersuchen klicken

[![grafik.png](https://wiki.hacker-net.de/uploads/images/gallery/2025-05/scaled-1680-/jzmUnIA6Ffgh9heV-grafik.png)](https://wiki.hacker-net.de/uploads/images/gallery/2025-05/jzmUnIA6Ffgh9heV-grafik.png)

[![grafik.png](https://wiki.hacker-net.de/uploads/images/gallery/2025-05/scaled-1680-/vYGWyMxsTqEvncT3-grafik.png)](https://wiki.hacker-net.de/uploads/images/gallery/2025-05/vYGWyMxsTqEvncT3-grafik.png)

Hier in type="url" name="url\_3112976778"

url\_3112976778 ist der Wert der uns später interessiert.

[![grafik.png](https://wiki.hacker-net.de/uploads/images/gallery/2025-05/scaled-1680-/VjY5XJbnFOes07lG-grafik.png)](https://wiki.hacker-net.de/uploads/images/gallery/2025-05/VjY5XJbnFOes07lG-grafik.png)

### Snippet

In dem Beispiel haben wir url\_3112976778 gelassen damit man weiß wo es rein muss

Diese beiden Werte in der POST setzen

$cart\_item\_data\['addon-domain'\] = sanitize\_text\_field($\_POST\['url\_3112976778'\]);  
$cart\_item\_data\['unique\_key'\] = md5($\_POST\['url\_3112976778'\] . microtime());

```
add_filter('woocommerce_add_cart_item_data', 'force_unique_addon_domain_items', 10, 2);
function force_unique_addon_domain_items($cart_item_data, $product_id) {
    if (!empty($_POST['url_3112976778'])) {
        $cart_item_data['addon-domain'] = sanitize_text_field($_POST['url_3112976778']);
        $cart_item_data['unique_key'] = md5($_POST['url_3112976778'] . microtime());
    }
    return $cart_item_data;
}


/*add_filter('woocommerce_get_item_data', 'show_domain_in_cart', 10, 2);
function show_domain_in_cart($item_data, $cart_item) {
    if (isset($cart_item['addon-domain'])) {
        $item_data[] = array(
            'key' => 'Domain',
            'value' => esc_html($cart_item['addon-domain']),
        );
    }
    return $item_data;
}*/

add_action('woocommerce_add_order_item_meta', 'store_domain_in_order_meta', 10, 3);
function store_domain_in_order_meta($item_id, $values, $cart_item_key) {
    if (isset($values['addon-domain'])) {
      wc_add_order_item_meta($item_id, 'Domain', $values['addon-domain']);
    }
}

```

### Ergebnis:  
  


[![grafik.png](https://wiki.hacker-net.de/uploads/images/gallery/2025-05/scaled-1680-/ow3m6YkNXukJlH4R-grafik.png)](https://wiki.hacker-net.de/uploads/images/gallery/2025-05/ow3m6YkNXukJlH4R-grafik.png)

# ✅ Snippet - Mengenfeld gezielt ausblenden, über Productid oder Kategorie ausblenden - DEFEKT

### Beschreibung:

Mengenfeld gezielt ausblenden, über Productid oder Kategorie ausblenden.

### Snippet:

- n `$product_ids = array(42, 99);` → deine Produkt-IDs eintragen
- In `$category_slugs = array('zusatzartikel', 'einzeldomain');` → die Namen deiner Kategorien eintragen
- Titelform ist der Slug
- [![grafik.png](https://wiki.hacker-net.de/uploads/images/gallery/2025-05/scaled-1680-/yTVyu4RK8mSdTcRE-grafik.png)](https://wiki.hacker-net.de/uploads/images/gallery/2025-05/yTVyu4RK8mSdTcRE-grafik.png)

```
add_action('wp_head', 'hide_quantity_field_conditionally');

function hide_quantity_field_conditionally() {
    // === KONFIGURATION ===

    // Aktivieren oder deaktivieren
    $check_by_product_id = true;
    $check_by_category   = true;

    // Produkt-IDs (nur wenn $check_by_product_id = true)
    $product_ids = array(42, 99); // <-- hier deine Produkt-IDs eintragen

    // Kategorie-Slugs (nur wenn $check_by_category = true)
    $category_slugs = array('zusatzartikel', 'einzeldomain'); // <-- Slugs deiner Kategorien

    // === PRODUKTSEITE ===
    if (is_product()) {
        global $product;
        $hide = false;

        if ($check_by_product_id && in_array($product->get_id(), $product_ids)) {
            $hide = true;
        }

        if ($check_by_category && has_term($category_slugs, 'product_cat', $product->get_id())) {
            $hide = true;
        }

        if ($hide) {
            echo '<style>
                .woocommerce div.product form.cart .quantity {
                    display: none !important;
                }
            </style>';
        }
    }

    // === WARENKORB ===
    if (is_cart()) {
        $hide = false;

        foreach (WC()->cart->get_cart() as $cart_item) {
            $product = $cart_item['data'];

            if (
                ($check_by_product_id && in_array($product->get_id(), $product_ids)) ||
                ($check_by_category && has_term($category_slugs, 'product_cat', $product->get_id()))
            ) {
                $hide = true;
                break;
            }
        }

        if ($hide) {
            echo '<style>
                .woocommerce-cart table.cart td.product-quantity .quantity {
                    display: none !important;
                }
            </style>';
        }
    }
}

```

# Snippet - Verlinkte Produkte auf Produktseite anzeigen

### Beschreibung:

Unter Produktbeschreibung Verlinkte Produkte anzeigen.  
  
So ohne Snippet:

[![image.png](https://wiki.hacker-net.de/uploads/images/gallery/2026-01/scaled-1680-/itI8Vo4mNWcfJ9sL-image.png)](https://wiki.hacker-net.de/uploads/images/gallery/2026-01/itI8Vo4mNWcfJ9sL-image.png)

So mit Snippet

[![image.png](https://wiki.hacker-net.de/uploads/images/gallery/2026-01/scaled-1680-/90YwE0u1xAMyBjtE-image.png)](https://wiki.hacker-net.de/uploads/images/gallery/2026-01/90YwE0u1xAMyBjtE-image.png)

Welche Produkte werden angezeigt?  
Die, die verlinkt werden:

[![image.png](https://wiki.hacker-net.de/uploads/images/gallery/2026-01/scaled-1680-/UPJmDylSfDHnY3qK-image.png)](https://wiki.hacker-net.de/uploads/images/gallery/2026-01/UPJmDylSfDHnY3qK-image.png)

### Installation:

Code Snippet in die function.php oder über Snippet Manager Plugin

```
add_action('woocommerce_after_single_product_summary', 'show_crosssells_on_product_page', 16);

function show_crosssells_on_product_page() {
    global $product;
    $crosssell_ids = $product->get_cross_sell_ids();
    
    if (!empty($crosssell_ids)) {
        echo '<section class="cross-sells"><h2>Das könnte dich auch interessieren</h2>';
        $args = array(
            'post_type' => 'product',
            'posts_per_page' => 4,
            'post__in' => $crosssell_ids,
            'orderby' => 'post__in'
        );
        woocommerce_product_loop_start();
        $products = new WP_Query($args);
        while ($products->have_posts()) {
            $products->the_post();
            wc_get_template_part('content', 'product');
        }
        woocommerce_product_loop_end();
        wp_reset_postdata();
        echo '</section>';
    }
}

```