Skip to content

Kaikki WordPressistä, web-kehityksestä — ja paljon muuta

Kuinka poistaa Lisää ostoskoriin -painike WooCommercesta

Kuinka poistaa Lisää ostoskoriin -painike WooCommercesta

"Lisää ostoskoriin" -painike on WooCommercen perusmekanismi, joka pitää kauppasi toiminnassa. Mutta perus ei tarkoita aina sopivaa. Esittelysivusto ilman tilausmahdollisuutta, yksilöllisen hinnoittelun vaativa tilaustuote, loppuunmyyty tuote jota ei vielä haluta poistaa julkaisusta: kaikissa näissä tapauksissa tavallinen Lisää ostoskoriin on vain tiellä.

Voisit ottaa karkean lähestymistavan ja asettaa tuotteen tilaksi "piilotettu", mutta silloin se putoaa pois katalogista eikä sitä enää indeksoida. Paljon siistimpi ratkaisu on pitää tuotekortti näkyvissä ja poistaa tai korvata ostopainike. WooCommerce tarjoaa tähän useita koukkuja ja suodattimia, globaalista poistamisesta yksittäisen tuotteen tarkkaan piilottamiseen.

Alla ovat kaikki toimivat menetelmät yksinkertaisesta edistyneeseen. Jokainen on testattu WooCommercen nykyisellä versiolla.

💡 Pikakatsaus:

  • Koko sivusto kerralla: kaksi remove_action-kutsua functions.php-tiedostossa, yksi tuoteruudukolle ja yksi tuotesivulle
  • Etusivu ja arkistot: ehdollinen woocommerce_is_purchasable-suodatin käyttäen is_shop()-funktiota
  • Kaikki kategoriat tai yksi tietty kategoria: sama suodatin käyttäen is_product_category()- tai is_product_category('slug')-funktiota
  • Yksittäinen tuote: kolme tapaa, sisäänrakennettu hallintakytkin, varaston nollaus, suodatin product_id-tunnuksella
  • Niille jotka tarvitsevat painikkeen: korvaa se mukautetulla tekstillä tai "Pyydä tarjous" -painikkeella

1. Painikkeen poistaminen koko sivustolta

Jos kauppasi toimii puhtaasti esittelysivustona ilman ostotarkoitusta, yksinkertaisin tapa on poistaa painike globaalisti käyttämällä kahta koukkua aktiivisen teemasi functions.php-tiedostossa.

Ensimmäinen koukku käsittelee tuotekortit ruudukossa ([products]-lyhytkoodi, kauppasivu, kategoriat), kun taas toinen käsittelee yksittäiset tuotesivut:

1// Remove button from card grid
2remove_action(
3 'woocommerce_after_shop_loop_item',
4 'woocommerce_template_loop_add_to_cart'
5);
6
7// Remove button from product page
8remove_action(
9 'woocommerce_single_product_summary',
10 'woocommerce_template_single_add_to_cart',
11 30
12);

Tämä koodi on parempi sijoittaa ei suoraan teemasi functions.php-tiedostoon (jolloin muutokset uhkaavat kadota päivityksessä), vaan Code Snippets -lisäosan tai lapsiteeman kautta. Ennen muokkausten tekemistä, luo varmuuskopio; ilman sitä sinulla ei ole mihin palata.

2. Painikkeen piilottaminen etusivulla ja arkistosivuilla

Globaali poistaminen ei toimi kaikille. Yleinen skenaario: painikkeen tulisi säilyä tuotesivulla mutta kadota katalogista ja etusivulta (jossa tuotteet näytetään listana).

Tässä on remove_action-kutsun sijaan parempi käyttää woocommerce_is_purchasable-suodatinta is_shop()-ehtotarkistuksen kanssa:

1function ts_hide_cart_on_shop() {
2 if ( is_shop() || is_front_page() ) {
3 add_filter( 'woocommerce_is_purchasable', '__return_false' );
4 }
5}
6add_action( 'wp', 'ts_hide_cart_on_shop' );

wp-koukku laukeaa aikaisin, ennen renderöintiä, ja välttää toistuvat tarkistukset jotka hidastaisivat sivua. is_shop() kattaa pääkauppasivun, ja is_front_page() kattaa staattisen etusivun jos se näyttää WooCommerce-lyhytkoodia. Suodatin ei koske tuotesivuja, joten ostaminen toimii siellä normaalisti.

3. Painikkeen poistaminen kaikilta kategoriasivuilta

Sama periaate, mutta korvaa is_shop() funktiolla is_product_category() ilman parametria. Suodatin nappaa minkä tahansa tuotekategorian:

1function ts_hide_cart_in_categories() {
2 if ( is_product_category() ) {
3 add_filter( 'woocommerce_is_purchasable', '__return_false' );
4 }
5}
6add_action( 'wp', 'ts_hide_cart_in_categories' );

Painike säilyy yksittäisillä tuotesivuilla. Tämä on hyödyllistä kun katalogi toimii esittelynä ja ostaminen on mahdollista vasta tuotekortille siirtymisen jälkeen, esimerkiksi jotta käyttäjät lukevat ensin kuvauksen ja tekniset tiedot.

4. Painikkeen poistaminen käytöstä yhdelle kategorialle

Joskus yksi kategoria kaupassasi on tilaustuote, kun taas loput ovat vakiotuotteita. Siinä tapauksessa tarvitset kohdennetun eston kategorian polkutunnuksella:

1function ts_hide_cart_for_category() {
2 if ( is_product_category( 'pod-zakaz' ) ) {
3 add_filter( 'woocommerce_is_purchasable', '__return_false' );
4 }
5}
6add_action( 'wp', 'ts_hide_cart_for_category' );

Korvaa 'pod-zakaz' kohdekategoriasi todellisella polkutunnuksella. Löydät polkutunnuksen hallintapaneelista kohdasta "Tuotteet → Kategoriat" "Polkutunnus"-sarakkeesta. Suodatin poistaa ostomahdollisuuden hiljaisesti kaikilta kategorian tuotteilta; painike katoaa myös tuotesivulta, koska WooCommerce tarkistaa is_purchasable()-funktion sielläkin.

5. Painikkeen piilottaminen tietylle tuotteelle

Yleisin skenaario: yksi tuote sadoista täytyy tilapäisesti näyttää ilman tilausmahdollisuutta. WooCommerce tarjoaa kolme tapaa tähän.

Tapa 1: sisäänrakennettu hallintakytkin

Siirry muokkaamaan tuotetta, avaa "Varasto"-välilehti ja vaihda "Varastotilanne" tilaan "Loppu varastosta". Aseta "Salli jälkitilaukset" -valintaruutu tilaan "Älä salli". Tallenna tuote, ja Lisää ostoskoriin -painike katoaa automaattisesti.

Tuotteen varastotilan määrittäminen WooCommercessa

Tämä lähestymistapa ei vaadi koodia ja toimii suoraan. Haittapuolena on, että tuote merkitään "Loppu varastosta", mikä ei ole aina toivottavaa (esimerkiksi digitaalisille tuotteille tai palveluille, joissa "varasto" ei ole mielekäs käsite).

Tapa 2: varastomäärän nollaus

Samalla "Varasto"-välilehdellä poista valinta "Hallinnoi varastoa" tai aseta määräksi 0. Painike katoaa kun jäljellä oleva varasto saavuttaa nollan.

Tuotteen määrän nollaaminen ostopainikkeen piilottamiseksi

Tämä menetelmä toimii hyvin fyysisille tuotteille: heti kun viimeinen kappale myydään, painike katoaa itsestään. Kuitenkin, kuten ensimmäisessä tavassa, tuote saa loppuunmyyty-tilan.

Tapa 3: suodatin tuotetunnuksen perusteella

Jos sinun täytyy poistaa painike muuttamatta "varastossa"-tilaa, käytä suodatinta joka tarkistaa tunnuksen:

1function ts_disable_cart_for_product( $purchasable, $product ) {
2 $target_ids = array( 22, 47, 103 ); // Product IDs for which we remove the button
3 if ( in_array( $product->get_id(), $target_ids ) ) {
4 return false;
5 }
6 return $purchasable;
7}
8add_filter( 'woocommerce_is_purchasable', 'ts_disable_cart_for_product', 10, 2 );

Tässä mitä tapahtuu: woocommerce_is_purchasable-suodatin vastaanottaa nykyisen $purchasable-tilan ja $product-objektin. Jos $product->get_id() vastaa jotakin $target_ids-taulukon tunnuksista, se palauttaa false ja painike tukahdutetaan. Kaikille muille tuotteille palautetaan alkuperäinen tila.

$product->get_id() on WooCommerce 3.0:sta lähtien käytössä ollut metodi. Vanha $product->id-ominaisuus (suora kenttäviittaus) on vanhentunut ja tuottaa ilmoituksia lokeihin; älä käytä sitä.

Voit laajentaa $target_ids-taulukkoa tarpeen mukaan. Löydät tuotetunnuksen hallintapaneelista: vie hiiri tuotteen nimen päälle listassa, jolloin tunnus ilmestyy selaimen tilariville (tai avaa tuote ja katso numero URL-osoitteesta: post=22).

6. Painikkeen korvaaminen mukautetulla tekstillä

Joskus sinun ei tarvitse poistaa painiketta; sinun täytyy korvata se. Esimerkiksi tilaustuotteille saatat näyttää "Pyydä tarjous" linkillä yhteydenottolomakkeelle.

1function ts_replace_cart_button_single( $html, $product ) {
2 $target_ids = array( 22 );
3 if ( in_array( $product->get_id(), $target_ids ) ) {
4 return '<a href="/contact" class="button alt">Request a quote</a>';
5 }
6 return $html;
7}
8add_filter( 'woocommerce_loop_add_to_cart_link', 'ts_replace_cart_button_single', 10, 2 );

Tämä suodatin kaappaa painikkeen HTML:n ennen tulostusta ja korvaa sen mukautetulla linkillä käyttäen .button-luokkaa. Se toimii sekä tuoteruudukossa että tuotesivulla; WooCommerce käyttää samaa suodatinta molemmissa yhteyksissä.

Monimutkaisempaa logiikkaa varten (eri teksti eri tuotteille, mukautettu painike modaali-ikkunalla) tutustu woocommerce_template_single_add_to_cart-funktioon täydellistä painikepohjan ohitusta varten lapsiteeman kautta.

⁉️🤔 Usein kysytyt kysymykset

Onko functions.php-tiedoston suora muokkaaminen turvallista?

Ilman kokemusta ei. functions.php suoritetaan jokaisella pyynnöllä, ja syntaksivirhe siinä kaataa koko sivuston (valkoinen ruutu). Käytä Code Snippets -lisäosaa, joka tarjoaa käyttöliittymän PHP-pätkien lisäämiseen syntaksitarkistuksella ja automaattisella käytöstäpoistolla vakavissa virheissä. Vaihtoehtoisesti muokkaa FTP/SFTP:n kautta tallennettuasi toimivan kopion tiedostosta paikallisesti.

Kuinka piilotan painikkeen vain kirjautumattomilta käyttäjiltä?

Lisää is_user_logged_in()-tarkistus mihin tahansa yllä olevista ehdoista. Esimerkiksi: if ( ! is_user_logged_in() && is_shop() ) { add_filter(...); }. Vieraat näkevät esittelyn ilman painikkeita; rekisteröityneet käyttäjät saavat täyden toiminnallisuuden. Tämä on yleinen käyttötapaus tukkuvarastoille, joissa hinnat ja ostoskori tulevat saataville vasta kirjautumisen jälkeen.

Painike katosi mutta hinta ja variaatiot säilyivät; onko tämä normaalia?

Kyllä. remove_action-koukut ja woocommerce_is_purchasable-suodatin poistavat vain lisää ostoskoriin -painikkeen. Hinta ja variaatiovalitsimet (väri, koko) säilyvät visuaalisesti. Jos sinun täytyy piilottaa myös ne, lisää CSS: .single-product .variations_form, .single-product .price { display: none; }, tai käytä syvempää interventiota woocommerce_get_price_html-kautta.

Teemapäivityksen jälkeen kaikki muutokseni katosivat; kuinka suojaudun tältä?

Älä koskaan tee muutoksia suoraan pääteeman functions.php-tiedostoon. Mikä tahansa teemapäivitys ylikirjoittaa tiedoston. Kolme luotettavaa vaihtoehtoa: lapsiteema (omalla functions.php-tiedostollaan), Code Snippets -lisäosa (pätkät elävät tietokannassa ja säilyvät päivityksissä), tai yksinkertainen MU-lisäosa (/wp-content/mu-plugins/disable-cart.php, jota ei voi poistaa käytöstä hallintapaneelista ja johon päivitykset eivät vaikuta).

Voinko palauttaa painikkeen tietylle tuotteelle globaalin poiston jälkeen?

Kyllä. Kun woocommerce_is_purchasable-suodatin on palauttanut globaalisti __return_false, lisää toinen suodatin korkeammalla prioriteetilla, joka palauttaa true tarvituille tunnuksille: add_filter( 'woocommerce_is_purchasable', 'ts_enable_for_specific', 20, 2 );. Prioriteetti 20 suoritetaan 10:n jälkeen ja voi ohittaa paluuarvon.

Mikä menetelmä valita tehtävääsi

Jos rakennat esittelysivustoa ilman verkkomaksuja, käytä globaalia poistoa kahdella remove_action-kutsulla. Tarvitseeko estää ostot katalogissa mutta säilyttää ne tuotekorteissa? Käytä suodatinta is_shop()-funktiolla. Yksi ongelmallinen kategoria? Käytä is_product_category('slug'). Yksi tuote sadoista? Käytä sisäänrakennettuja varastoasetuksia tai tunnukseen perustuvaa suodatinta.

Ja mikä tärkeintä: ennen kuin muutat mitään functions.php-tiedostossa, tee varmuuskopio. Ei lisäosan kautta jota olet muokkaamassa, vaan täysi varmuuskopio hotellipalvelusi tai UpdraftPlus kautta. Viisi minuuttia varmuuskopiointiin säästää tunteja palauttamisessa.