Buttonbar (WordPress)

Uit De Vliegende Brigade
Naar navigatie springen Naar zoeken springen

Buttonbar is een maatwerk-functionaliteit die eind 2019-begin 2020 is ontwikkeld voor een klantproject. Het biedt een visueel keuzemenu, oftewel button bar of knoppenbalk. Het maakt gebruik van ACF - Advanced Custom Fields. Ik noem het buttonbar, dus één woord en zonder hoofdletter.

Voor mij is het belangrijk dat ik buttonbars via API's kan lezen en aanmaken - Daar gaat dit artikel voornamelijk over.

Wel of niet geassociëerd met een pagina

De meeste buttonbars zijn geassociëerd met een pagina, bv. de pagina met id=7, de home page. De manier om die buttonbars te benaderen, is middels postmeta. Tot op heden (juni 2022) gaat dit artikel vooral over deze situatie.

Soms zijn buttonbars echter niet geassociëerd met een buttonbar, zoals de site-selector.

Site-selector

De site-selector is een buttonbar met aangepaste velden die niet geassociëerd met een pagina. Daarom dit aparte hoofdstuk over deze specifieke buttonbar

wp_options

Omdat deze buttonbar niet geassociëerd is met een pagina, vind je 'm niet terug in tabel wp_postmeta, maar in tabel wp_options:

select
   *
from
   wp_options
where
   option_name like "options_languages%";

Deel van de uitvoer:

+-----------+-------------------------------+----------------------------------------------------------------------------------------------------+----------+
| option_id | option_name                   | option_value                                                                                       | autoload |
+-----------+-------------------------------+----------------------------------------------------------------------------------------------------+----------+
|    332805 | options_languages             | 30                                                                                                 | no       |
|    332793 | options_languages_0_country   | Netherlands                                                                                        | no       |
|    332789 | options_languages_0_flag      | 56449                                                                                              | no       |
|    332795 | options_languages_0_language  | English                                                                                            | no       |
|    332791 | options_languages_0_link      | a:3:{s:5:"title";s:22:"Go to example.nl";s:3:"url";s:24:"https://example.nl";s:6:"target";s:0:"";} | no       |
|    332878 | options_languages_1_country   | Australia                                                                                          | no       |
|    332874 | options_languages_1_flag      | 65350                                                                                              | no       |
|    332880 | options_languages_1_language  | English                                                                                            | no       |
|    332876 | options_languages_1_link      | a:3:{s:5:"title";s:33:"Go to example.au";s:3:"url";s:35:"https://example.au";s:6:"target";s:0:"";} | no       |
+-----------+-------------------------------+----------------------------------------------------------------------------------------------------+----------+

Datamodel

Onderdelen van een buttonbar-regel van de site-selector:

Veld Details
Afbeelding Veld options_languages_x_flag. Hier wordt het post-ID van de afbeelding (wp_posts) opgeslagen
Link Veld options_languages_0_link met serialised content:
  • Tooltip
  • URL
  • Target (bv. _blank)
Country Veld options_languages_x_country, string
Language Veld options_languages_0_language, string

Lezen - WP-CLI

Toon alle meta-objecten van de home page (dit toont ook niet-ACF-velden):

wp post meta list 7

Fetch details van het link-veld van de eerste button van de eerste buttonbar op de home page:

$ wp post meta get 7 buttonbar_selection_0_link

array (
  'title' => '',
  'url' => 'http://knl.s1/heel-goed/',
  'target' => '',
)

Lees nu specifiek het URL-veld:

$ wp post meta pluck 7 buttonbar_selection_0_link url

http://knl.s1/heel-goed/

Lezen - SQL

  • Als het even kan, zou ik geen SQL gebruiken om ACF-velden aan te passen. Dit is slechts een voorbeeld
  • Alle buttonbar-velden hebben het sleutelwoord buttonbar_ in hun meta-key
# Alle buttonbar objects on the home page
#
select 
    * 
from 
    wp_postmeta 
where 
    post_id=7
    and
    meta_key like "%buttonbar%";
# All fields of the first buttonbar of the first button of the home page
# (only "selection" fields are used nowadays)
#
select 
    * 
from 
    wp_postmeta 
where 
    post_id=7
    and
    meta_key like "%buttonbars_0_buttonbar_selection_0_%"

Uitvoer:

meta_id	post_id	meta_key					meta_value
------	-------	-----------------------------------------	----------
912631	7	buttonbars_0_buttonbar_selection_0_title	ABC
912632	7	_buttonbars_0_buttonbar_selection_0_title	field_5e450082734a2
912633	7	buttonbars_0_buttonbar_selection_0_image	2851
912634	7	_buttonbars_0_buttonbar_selection_0_image	field_5e450106734a3
912635	7	buttonbars_0_buttonbar_selection_0_link		a:3:{s:5:"ti...
912636	7	_buttonbars_0_buttonbar_selection_0_link	field_5e450111734a4

Opnieuw is link het enige veld met serialised content.

Lezen - PHP-API

Script om het datamodel van een pagina met een buttonbar uit te lezen:

<?php
# Set variables
###############
#
$site_path = "/var/www/example.com";
$page_id = 14278; # The page for which the datamodel is extracted

# Load library
##############
#
require_once($site_path . "/wp-load.php");

# Get datamodel given page
##########################
#
print_r(get_fields($page_id));

Ik vergeet wel eens hoe je een PHP-script executeert vanaf Bash. Zo dus:

php -f bestandsnaam.php

Dit is de output van een pagina met een buttonbar, waar alleen de twee titels zijn ingevuld:

Array
(
    [buttonbar_title] => Knoppenbalk-titel
    [buttonbar_expand_text] => Knoppenbalk-uitbreid
    [buttonbar_selection] => 
    [buttonbar_all] => 
    [buttonbar] => Array
        (
            [buttonbar_title] => Knoppenbalk-titel
            [buttonbar_expand_text] => Knoppenbalk-uitbreid
            [buttonbar_selection] => 
            [buttonbar_all] => 
        )

)

Voor een pagina met een twee buttonbars, is de uitvoer al een paar A4'tjes lang (zie Historie van deze pagina om deze te zien - Ik heb het in juni 2022 verwijderd).

Schrijven - PHP-API

Dit is de hiërarchie van een buttonbar:

butonbar_title
buttonbar_expand_text
buttonbar_selection
   title
   image (diverse subvelden)
   link (diverse subvelden)
   ...
   title
   image
   link
buttonbar_all
   title
   image (diverse subvelden)
   link (diverse subvelden)
   ...
   title
   image
   link

Merk op, dat je onder buttonbar_selection en buttonbar_all een zich herhalende structuur hebt. Ik geloof dat dit een repeater heet, in ACF-terminologie.

ACF biedt API-calls voor schrijven en bijwerken van velden:

  • update_field - Om een bestaand veld bij te werken of te beschrijven
  • add_row - Vermoedelijk nodig om repeaters te vullen.

buttonbar_titel

Simpel:

require_once("/var/www/example.com/wp-load.php");

$return_value = update_field("buttonbar_title", "Blub", 51116);

echo "Return_value: '";
print_r($return_value);
echo "'\n";

Return-code

  • Als de operatie geslaagd is (dwz., er staat nu een waarde die er daarvoor niet stond), dan retourneert de functie '1'
  • Operatie niet geslaagd (dwz., er was nix te updaten), dan retourneert de functie niets. Dus een lege string
  • Als de operatie een foutmelding tegenkomt (bv. als je een niet-bestaand veld probeert bij te werken), krijg je een code retour. Bv. '395903' (ik had de naam van het veld verandert)
  • Je kunt deze functie dus ongestraft herhalen met dezelfde data. In het ergste geval krijg je lege strings terug :).

buttonbar_expand_text

Dit gaat hetzelfde als voor buttonbar-titel:

require_once("/var/www/example.com/wp-load.php");

$return_value = update_field("buttonbar_expand_text", "Blub2", 51116);

echo "\nReturn_value: '";
print_r($return_value);
echo "'\n";

buttonbar_selection - DIT WERKT NIET

Hieronder wordt update_field gebruikt voor het vullen van de buttons. Ik dacht dat dit werkte (begin 2020), maar dat lijkt toch anders te liggen (mei 2020). Misschien dat add_row de oplossing is. Helaas krijg ik dat nog niet goed aan de praat: Ik krijg lege rijen (dus ik ben warm!).

<?php

# Set variables
############################################
#
$site_path	=	"/var/www/example.com";
$page_name	=	"buttonbar-testpage";
$post_id	=	14278;


# Load library
############################################
#
require_once($site_path . "/wp-load.php");


# buttonbar_selection-object aanmaken
#####################################
#
$field_key = "buttonbar_selection";
$value_01[]=array
(
   "title"   => "title (test)",
   "image"   => array
   (
      # Afbeelding-ID
      ###############
      #
      # * ID van een bestaande afbeelding op de site
      # * Helaas kun je niet bv. bestandsnaam gebruiken
      # * Velden zoals "title" worden overruled door de info bij de afbeelding
      #
      "ID" => 14276
   ),
   "link" => array
   (
      "url" => "http://example.com/shop/"
   )
);

# buttonbar_selection-object schrijven
#####################################
#
update_field($field_key, $value_01, $post_id);

buttonbar_all - DIT WERKT NIET

Variant op het script hierboven:

require_once("/var/www/example.com/wp-load.php");

$button_title	   = "Blazer";
$image_id	   = 2949;
$link		   = "http://example.com/shop/bd/blazer-bd/";
$field_key	   = "buttonbar_all";
$wp_brandpage_id   = 51116;

$return_value = create_button($button_title, $image_id, $link, $field_key, $wp_brandpage_id);

echo "\nReturn_value: '";
print_r($return_value);
echo "'\n";


######################################################################################
# Function create_button()
######################################################################################
#
function create_button($button_title, $image_id, $link, $field_key, $wp_brandpage_id)
{
   $button[]=array(
      "title"	=> $button_title,
      "image"	=> array("ID"=>$image_id),
      "link"	=> array("url"=>$link)
   );

   $return_value = update_field($field_key, $button, $wp_brandpage_id);
   return $return_value;
}

Database-model

Buttonbar maakt gebruik van ACF-velden (maatwerkvelden). Zie ACF (Advanced Custom Fields, WordPress) voor details.

Zie ook