Functions.php (WordPress): verschil tussen versies

Uit De Vliegende Brigade
Naar navigatie springen Naar zoeken springen
 
(21 tussenliggende versies door dezelfde gebruiker niet weergegeven)
Regel 1: Regel 1:
Functies die ik soms onderbreng in <code>functions.php</code>
+
''functions.php'' is een PHP-bestand dat bij een ''theme'' hoort. Je kunt dit bestand gebruiken voor eigen code. Bv. code waarvoor het overkill is, om er een complete plugin omheen te bouwen.
  
== dvb_delete_all_products ==
+
== Casus: Importroutines (2019-2020) ==
 +
 
 +
Ik gebruik een handjevol eigen PHP-routines voor import van dingen in een WordPress-site. Rond 2019 plaatstte ik die routines in ''functions.php''. Eind 2019 ben ik daarmee gestopt: Ik vond het overkill dat er een handjevol routines worden gedeclareerd, die verder nooit gebruikt worden. Zie versies van vóór 6 augustus 2020 van dit artikel via [http://wiki.devliegendebrigade.nl/index.php?title=Functions.php_(WordPress)&action=history Geschiedenis weergeven]] voor de specifieke routines.
 +
 
 +
Nu, aug. 2020, vraag ik me af, of ik volgende keer tóch functions.php hiervoor wil gebruiken: Dan heb ik tenminste de functies die bij die specifieke site horen, op één plek bewaard. En misschien is er helemaal geen overhead qua ''registeren'' van functies, ''hooks'' of whatever als het alleen maar om functies gaat.
 +
 
 +
== Casus: Google Analytics (aug. 2020) ==
 +
 
 +
Dit betreft een site die met de ''site-builder'' ''Hoshi'' van ''Mikado'' is gemaakt.
 +
 
 +
=== Welke ''functions.php'' moet ik gebruiken? ===
 +
 
 +
<pre>
 +
find -name "functions.php"
 +
 
 +
./wp-content/themes/twentytwenty/functions.php
 +
./wp-content/themes/twentyseventeen/functions.php
 +
./wp-content/themes/hoshi/functions.php
 +
./wp-content/themes/hoshi/framework/modules/footer/functions.php
 +
./wp-content/themes/hoshi/framework/modules/header/functions.php
 +
./wp-content/plugins/wpforms-lite/vendor/woocommerce/action-scheduler/functions.php
 +
./wp-content/plugins/wpforms-lite/vendor/woocommerce/action-scheduler/deprecated/functions.php
 +
./wp-content/plugins/wpforms-lite/includes/functions.php
 +
./wp-content/plugins/wpforms-lite/includes/admin/builder/functions.php
 +
./wp-content/plugins/updraftplus/vendor/kriswallsmith/assetic/src/functions.php
 +
./wp-content/plugins/wp-mail-smtp/vendor/woocommerce/action-scheduler/functions.php
 +
./wp-content/plugins/wp-mail-smtp/vendor/woocommerce/action-scheduler/deprecated/functions.php
 +
./wp-content/plugins/wp-mail-smtp/vendor/guzzlehttp/guzzle/src/functions.php
 +
./wp-content/plugins/wp-mail-smtp/vendor/guzzlehttp/promises/src/functions.php
 +
./wp-content/plugins/wp-mail-smtp/vendor/guzzlehttp/psr7/src/functions.php
 +
./wp-content/plugins/wordpress-seo/vendor_prefixed/guzzlehttp/guzzle/src/functions.php
 +
./wp-content/plugins/wordpress-seo/vendor_prefixed/guzzlehttp/promises/src/functions.php
 +
./wp-content/plugins/wordpress-seo/vendor_prefixed/guzzlehttp/psr7/src/functions.php
 +
./wp-content/plugins/wordpress-seo/src/functions.php
 +
./wp-includes/functions.php
 +
</pre>
 +
 
 +
Vermoedelijk deze: <code>./wp-content/themes/hoshi/functions.php</code>: ''functions.php''-bestnaden horen blijkbaar bij themes.
 +
 
 +
=== Hoe te bewerken? ===
 +
 
 +
Je kunt ''functions.php'' rechtstresks bewerken vanuit het beheergedeelte van de betreffende site:
  
 
<pre>
 
<pre>
###############################################################
+
Appearance » Theme Editor » Theme files (rechterkant) » Theme functions
# dvb_delete_all_products
 
###############################################################
 
#
 
# * Handy for debugging
 
# * Source: https://www.wpini.com/delete-all-woocommerce-products/
 
# * Strompf, May 2019
 
#
 
function dvb_delete_all_products()
 
{
 
global $wpdb;
 
 
$sql_1 = "DELETE FROM ".$wpdb->prefix."term_relationships WHERE object_id IN (SELECT ID FROM ".$wpdb->prefix."posts WHERE post_type = 'product');";
 
$sql_2 = "DELETE FROM ".$wpdb->prefix."postmeta WHERE post_id IN (SELECT ID FROM ".$wpdb->prefix."posts WHERE post_type = 'product');";
 
$sql_3 = "DELETE FROM ".$wpdb->prefix."posts WHERE post_type = 'product';";
 
 
$sql_4 = "DELETE relations.*, taxes.*, terms.*
 
  FROM ".$wpdb->prefix."term_relationships AS relations
 
  INNER JOIN ".$wpdb->prefix."term_taxonomy AS taxes
 
    ON relations.term_taxonomy_id=taxes.term_taxonomy_id
 
  INNER JOIN ".$wpdb->prefix."terms AS terms
 
    ON taxes.term_id=terms.term_id
 
  WHERE object_id IN (SELECT ID FROM ".$wpdb->prefix."posts WHERE post_type='product');";
 
Paar fPaar f
 
try{
 
   
 
    $wpdb->query($sql_1);
 
    $wpdb->query($sql_2);
 
    $wpdb->query($sql_3);
 
    $wpdb->query($sql_4);
 
   
 
}catch(Exception $e){}
 
}
 
 
</pre>
 
</pre>
  
== dvb_delete_all_thumbnails ==
+
Da's handig, want dan heb je gelijk de goede versie van ''functions.php'', lijkt me.
 +
 
 +
Je kunt het betreffende bestand ook rechtstreeks op de betreffende server bewerken, bv.:
  
 
<pre>
 
<pre>
#
+
vim ./wp-content/themes/hoshi/functions.php
#######################################################################################
+
</pre>
# Remove all product-related images from the database
+
 
#######################################################################################
+
=== Child-theme aanmaken ===
#
+
 
# * Currently, I don't use galleries. Only removing thumbnails, is sufficient
+
In dit geval, blijkt ''functions.php'' al meer dan 1.000 regels aan code van Hoshi te bevatten, en ongetwijfeld is die code onderheving aan wijzigingen, als het theme bijgewerkt wordt → Tijd voor een ''child theme''.  
# * Only remove thumbnail-images, no other images (e.g., the site logo image - When an
 
#  image is used for both, it will be deleted - Don't use them for multiple functions!)
 
# * Images won't be removed from the upload-directory - Just to keep it simple
 
# * Strompf, May 2019
 
#
 
function dvb_delete_all_thumbnails()
 
{
 
# Access
 
#######################################################################################
 
#
 
# $pad = "/home/strompf/www/rt.dvb/";
 
# require_once($pad . "wp-load.php");
 
#
 
global $wpdb;
 
  
 +
{|
 +
|[[file:20200808-0930.png|thumb|Aanmaken van een child-theme, blijkt een fluitje van een cent te zijn. Zie [[Child-theme (WordPress)]] voor details]]
 +
|}
  
# Assemble queries
+
=== Nieuw functions.php-bestand aanmaken ===
#######################################################################################
 
#
 
$sql_01 = "drop table if exists ".$wpdb->prefix."image_tmp;";
 
$sql_02 = "create temporary table ".$wpdb->prefix."image_tmp select ".$wpdb->prefix."postmeta.meta_value as image_id from ".$wpdb->prefix."postmeta
 
join ".$wpdb->prefix."posts on ".$wpdb->prefix."postmeta.post_id = ".$wpdb->prefix."posts.ID where ".$wpdb->prefix."posts.post_type like 'product' and ".$wpdb->prefix."postmeta.meta_key like '_thumbnail_id';";
 
$sql_03 = "delete ".$wpdb->prefix."posts from ".$wpdb->prefix."posts join ".$wpdb->prefix."image_tmp on ".$wpdb->prefix."posts.ID = ".$wpdb->prefix."image_tmp.image_id;";
 
$sql_04 = "delete ".$wpdb->prefix."postmeta from ".$wpdb->prefix."postmeta join ".$wpdb->prefix."image_tmp on ".$wpdb->prefix."postmeta.post_id = ".$wpdb->prefix."image_tmp.image_id;";
 
  
 +
{|
 +
|[[file:20200808-0931.png|thumb|Ik neem aan, dat ik dit nieuwe lege bestand gewoon in de ''root'' van het child-theme moet aanmaken]]
 +
|}
  
# Ready to go?
+
=== GA-code invoegen in functions.php in child-theme ===
#######################################################################################
 
#
 
// echo "\nsql_01: ".$sql_01;
 
// echo "\nsql_02: ".$sql_02;
 
// echo "\nsql_03: ".$sql_03;
 
// echo "\nsql_04: ".$sql_04."\n";
 
  
 +
Vervolgens onderstaande code ingevoegd (maar uiteraard met de echte Google Analytics-ID):
  
# Go!
+
<pre>
#######################################################################################
+
<?php
#
+
add_action('wp_head', 'wpb_add_googleanalytics');
try
+
function wpb_add_googleanalytics()
{
+
{ ?>
$wpdb->query($sql_01);
+
  <!-- Global site tag (gtag.js) - Google Analytics -->
    $wpdb->query($sql_02);
+
  <script async src="https://www.googletagmanager.com/gtag/js?id=UA-123451066-1"></script>
    $wpdb->query($sql_03);
+
  <script>
    $wpdb->query($sql_04);
+
      window.dataLayer = window.dataLayer || [];
   
+
      function gtag(){dataLayer.push(arguments);}
}
+
      gtag('js', new Date());
catch(Exception $e){}
+
      gtag('config', 'UA-123451066-1');
}
+
</script>
 +
<?php
 +
} ?>
 
</pre>
 
</pre>
 +
 +
=== Test 1: Broncode ===
 +
 +
{|
 +
|[[file:20200808-0949.png|thumb|Ik kan de code terugvinden in de broncode van de site, en ook precies twee keer, en bovenaan in de code, dus vermoedelijk de ''head''-section - Allemaal heel goed]]
 +
|}
 +
 +
=== Test 2: Google Tag Manager ===
 +
 +
{|
 +
|[[file:20200808-0950.png|thumb|''Google Tag Manager'' ziet de tag, en interpreteert deze als twee tags, of op twee manieren. Ik vind Google Tag Manager vaak verwarrend en ik ga me hier niet verder druk om maken]]
 +
|}
 +
 +
=== Test 3: Google Analytics - Mobiel wel, desktop niet ===
 +
 +
{|
 +
|[[file:20200808-1050.png|thumb|Google Analytics detecteert mijn bezoek Vanaf m'n mobieltje. De site is een ''one-pager'', maar heeft daarnaast losse pagina's voor ''algemene voorwaarden'', en ''kinderen''. Het intake-formulier is een PDF-bestand zonder aparte pagina, en wordt hier niet geregistreerd]]
 +
|}
 +
 +
Wat je verder niet in afbeeldingen terugziet: Bezoekers via desktop werden vreemd genoeg niet gedetecteerd.
 +
 +
=== Oorzaak storing: Cache-schrijfrechten ===
 +
 +
Deze site gebruikt ''WP Fastest Cache''. De cache vind je hiero: </code>wp-content/cache</code>. Echter, nog een bestandsrechtenprobleem, werden de cache-bestanden niet bijgewerkt. Daardoor zagen bezoekers steeds de verkeerde pagina. Ook nadat de cache-plugin was uitgezet. Blijkbaar werd er niet gecached voor ''mobiel''.
 +
 +
== Zie ook ==
 +
 +
* [[Child-theme (WordPress)]]
 +
* [[Google Analytics & Wordpress]]
  
 
== Bronnen ==
 
== Bronnen ==
  
 
* https://www.wpini.com/delete-all-woocommerce-products/
 
* https://www.wpini.com/delete-all-woocommerce-products/
 +
* https://www.wpbeginner.com/glossary/functions-php/

Huidige versie van 8 aug 2020 om 11:48

functions.php is een PHP-bestand dat bij een theme hoort. Je kunt dit bestand gebruiken voor eigen code. Bv. code waarvoor het overkill is, om er een complete plugin omheen te bouwen.

Casus: Importroutines (2019-2020)

Ik gebruik een handjevol eigen PHP-routines voor import van dingen in een WordPress-site. Rond 2019 plaatstte ik die routines in functions.php. Eind 2019 ben ik daarmee gestopt: Ik vond het overkill dat er een handjevol routines worden gedeclareerd, die verder nooit gebruikt worden. Zie versies van vóór 6 augustus 2020 van dit artikel via Geschiedenis weergeven] voor de specifieke routines.

Nu, aug. 2020, vraag ik me af, of ik volgende keer tóch functions.php hiervoor wil gebruiken: Dan heb ik tenminste de functies die bij die specifieke site horen, op één plek bewaard. En misschien is er helemaal geen overhead qua registeren van functies, hooks of whatever als het alleen maar om functies gaat.

Casus: Google Analytics (aug. 2020)

Dit betreft een site die met de site-builder Hoshi van Mikado is gemaakt.

Welke functions.php moet ik gebruiken?

find -name "functions.php"

./wp-content/themes/twentytwenty/functions.php
./wp-content/themes/twentyseventeen/functions.php
./wp-content/themes/hoshi/functions.php
./wp-content/themes/hoshi/framework/modules/footer/functions.php
./wp-content/themes/hoshi/framework/modules/header/functions.php
./wp-content/plugins/wpforms-lite/vendor/woocommerce/action-scheduler/functions.php
./wp-content/plugins/wpforms-lite/vendor/woocommerce/action-scheduler/deprecated/functions.php
./wp-content/plugins/wpforms-lite/includes/functions.php
./wp-content/plugins/wpforms-lite/includes/admin/builder/functions.php
./wp-content/plugins/updraftplus/vendor/kriswallsmith/assetic/src/functions.php
./wp-content/plugins/wp-mail-smtp/vendor/woocommerce/action-scheduler/functions.php
./wp-content/plugins/wp-mail-smtp/vendor/woocommerce/action-scheduler/deprecated/functions.php
./wp-content/plugins/wp-mail-smtp/vendor/guzzlehttp/guzzle/src/functions.php
./wp-content/plugins/wp-mail-smtp/vendor/guzzlehttp/promises/src/functions.php
./wp-content/plugins/wp-mail-smtp/vendor/guzzlehttp/psr7/src/functions.php
./wp-content/plugins/wordpress-seo/vendor_prefixed/guzzlehttp/guzzle/src/functions.php
./wp-content/plugins/wordpress-seo/vendor_prefixed/guzzlehttp/promises/src/functions.php
./wp-content/plugins/wordpress-seo/vendor_prefixed/guzzlehttp/psr7/src/functions.php
./wp-content/plugins/wordpress-seo/src/functions.php
./wp-includes/functions.php

Vermoedelijk deze: ./wp-content/themes/hoshi/functions.php: functions.php-bestnaden horen blijkbaar bij themes.

Hoe te bewerken?

Je kunt functions.php rechtstresks bewerken vanuit het beheergedeelte van de betreffende site:

Appearance » Theme Editor » Theme files (rechterkant) » Theme functions

Da's handig, want dan heb je gelijk de goede versie van functions.php, lijkt me.

Je kunt het betreffende bestand ook rechtstreeks op de betreffende server bewerken, bv.:

vim ./wp-content/themes/hoshi/functions.php

Child-theme aanmaken

In dit geval, blijkt functions.php al meer dan 1.000 regels aan code van Hoshi te bevatten, en ongetwijfeld is die code onderheving aan wijzigingen, als het theme bijgewerkt wordt → Tijd voor een child theme.

Aanmaken van een child-theme, blijkt een fluitje van een cent te zijn. Zie Child-theme (WordPress) voor details

Nieuw functions.php-bestand aanmaken

Ik neem aan, dat ik dit nieuwe lege bestand gewoon in de root van het child-theme moet aanmaken

GA-code invoegen in functions.php in child-theme

Vervolgens onderstaande code ingevoegd (maar uiteraard met de echte Google Analytics-ID):

<?php
add_action('wp_head', 'wpb_add_googleanalytics');
function wpb_add_googleanalytics()
{ ?>
   <!-- Global site tag (gtag.js) - Google Analytics -->
   <script async src="https://www.googletagmanager.com/gtag/js?id=UA-123451066-1"></script>
   <script>
      window.dataLayer = window.dataLayer || [];
      function gtag(){dataLayer.push(arguments);}
      gtag('js', new Date());
      gtag('config', 'UA-123451066-1');
</script>
<?php
} ?>

Test 1: Broncode

Ik kan de code terugvinden in de broncode van de site, en ook precies twee keer, en bovenaan in de code, dus vermoedelijk de head-section - Allemaal heel goed

Test 2: Google Tag Manager

Google Tag Manager ziet de tag, en interpreteert deze als twee tags, of op twee manieren. Ik vind Google Tag Manager vaak verwarrend en ik ga me hier niet verder druk om maken

Test 3: Google Analytics - Mobiel wel, desktop niet

Google Analytics detecteert mijn bezoek Vanaf m'n mobieltje. De site is een one-pager, maar heeft daarnaast losse pagina's voor algemene voorwaarden, en kinderen. Het intake-formulier is een PDF-bestand zonder aparte pagina, en wordt hier niet geregistreerd

Wat je verder niet in afbeeldingen terugziet: Bezoekers via desktop werden vreemd genoeg niet gedetecteerd.

Oorzaak storing: Cache-schrijfrechten

Deze site gebruikt WP Fastest Cache. De cache vind je hiero: wp-content/cache. Echter, nog een bestandsrechtenprobleem, werden de cache-bestanden niet bijgewerkt. Daardoor zagen bezoekers steeds de verkeerde pagina. Ook nadat de cache-plugin was uitgezet. Blijkbaar werd er niet gecached voor mobiel.

Zie ook

Bronnen