Ik krijg een paar dingen niet veranderd met deze WP PHP shortcode..

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Rebel Kain

Rebel Kain

02/05/2021 11:48:25
Quote Anchor link
Ik had een code nodig om een leeftijd te tonen op basis van datum op 1 van mijn WP sites. Na lang zoeken en wat aanpassingen heb ik de juiste code die dat precies doet.

Zit alleen met een paar kleine issues die ik niet voor elkaar krijg.

Allereerst is dit de code;

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
/* datum en leeftijd */
function determine_age($atts, $content = null) {
  extract( shortcode_atts( array(
    'dob' => '',
    'date' => 1,
    'dateformat' => 'j F Y'
  ), $atts ) );
 if ($dob == '') $dob = $content;
 $age = ($content == null) ? floor((time() - strtotime($dob)) / 31556926) : floor((time() - strtotime($content)) / 31556926);
 return ($date) ? date($dateformat, strtotime($dob)) . ' (leeftijd: ' .  $age . ')' : $age;
  setlocale(LC_ALL, 'nl_NL');
}
add_shortcode('age', 'determine_age');


De eerste issue; Ik heb al van alles geprobeerd toe te voegen maar wat ik ook probeer, de maanden blijven in het Engels tonen ondanks dat WP in het Nederlands staat ingesteld en setLocale op NL staat.

Tweede issue; De shortcode moet ingevoerd worden op de Amerikaanse datum dus [age]20210502[/age] irritant als je onze manier gewend ben dus ik wil dat de shortcode [age]02052021[/age] wordt. Als ik dat nu in tik dan toont ie een hele andere datum startend met 1 januari.

Derde issue; Ik wil de front-end tekst kleur veranderen. Maar bij inspecteren heb ik niets waar ik een CSS code aan kan hangen.

Waarschijnlijk super makkelijk voor een ervaren PHP gebruiker wat ik overduidelijk niet ben :)

Alvast bedankt voor de hulp.
 
PHP hulp

PHP hulp

13/05/2021 02:04:00
 
- Ariën -
Beheerder

- Ariën -

02/05/2021 11:58:53
Quote Anchor link
Uit de manual van date
Quote:

To format dates in other languages, you should use the setlocale() and strftime() functions instead of date().
Gewijzigd op 02/05/2021 11:59:08 door - Ariën -
 
Rebel Kain

Rebel Kain

02/05/2021 12:07:27
Quote Anchor link
- Ariën - op 02/05/2021 11:58:53:
Uit de manual van date
Quote:

To format dates in other languages, you should use the setlocale() and strftime() functions instead of date().

Bedankt voor reactie, ik heb die pagina al eens gelezen en geprobeerd het toe te voegen in de code maar dat is me tot zover niet gelukt, krijg steeds errors met opslaan omdat ik eigenlijk gewoon geen idee heb waar wat precies hoort en wat er vervangen moet worden.

Zou je voor mij de juiste code willen laten zien?

Bedankt!
 
- Ariën -
Beheerder

- Ariën -

02/05/2021 12:09:59
Quote Anchor link
Wat lukt er niet aan met strftime dan?
Example #1 laat al perfect zien hoe het werkt.

Quote:
%A A full textual representation of the day Sunday through Saturday


Toevoeging op 02/05/2021 12:21:36:

En over je datum probleem, met deze reguliere expressie met preg_match_all kan je de datum uit elkaar trekken naar losse eenheden, zodat je die zelf kan verwerken.

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
<?php
$date
="20120912";
if (preg_match_all("^([0-9]{4})([0-1][0-9])([0-3][0-9])$^",$date,$arr))
    {

        echo "De datum voldoet aan de eisen!";
        print_r($arr);
    }
else{
        echo "Datum komt niet overeen met de expressie";
    }

?>
Gewijzigd op 02/05/2021 12:23:13 door - Ariën -
 
Rebel Kain

Rebel Kain

02/05/2021 12:21:58
Quote Anchor link
- Ariën - op 02/05/2021 12:09:59:
Wat lukt er niet aan met strftime dan?
Example #1 laat al perfect zien hoe het werkt.

Quote:
%A A full textual representation of the day Sunday through Saturday

Ik heb dit toegevoegd;
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
setlocale(LC_TIME, "nl_NL");
echo strftime(" in Dutch is %A,");

Maar er gebeurt gewoon niets, de maand blijft in Engels tonen. Moet ik iets verwijderen? Moet het op een bepaalde lijn in de code?
 
- Ariën -
Beheerder

- Ariën -

02/05/2021 12:24:01
Quote Anchor link
Misschien missen er locales op je server?
Waar draai je op? Linux? Windows?
 
Rebel Kain

Rebel Kain

02/05/2021 12:35:51
Quote Anchor link
- Ariën - op 02/05/2021 12:24:01:
Misschien missen er locales op je server?
Waar draai je op? Linux? Windows?

Hmm dat zou kunnen, ik begrijp wat je bedoeld maar weet nog niet zeker waar ik moet kijken want meeste van mijn sites zijn in het Engels maar de site draait op een ubuntu server met Plesk. Ik ga op onderzoek.
 
- Ariën -
Beheerder

- Ariën -

02/05/2021 12:40:28
Quote Anchor link
Kan je locale -a uitvoeren in je shell, of via system()?
Dan moet je een lijst zien met welke locales je systeem ondersteunt.
 
Rebel Kain

Rebel Kain

02/05/2021 12:51:11
Quote Anchor link
Zekers, ook met dat ben ik overigens een amateur haha al run ik een stuk of 12 sites op 10 self hosted servers gheghe maar idd zo te zien geen Nl

C
C.UTF-8
en_AG
en_AG.utf8
en_AU.utf8
en_BW.utf8
en_CA.utf8
en_DK.utf8
en_GB.utf8
en_HK.utf8
en_IE.utf8
en_IL
en_IL.utf8
en_IN
en_IN.utf8
en_NG
en_NG.utf8
en_NZ.utf8
en_PH.utf8
en_SG.utf8
en_US
en_US.iso88591
en_US.utf8
en_ZA.utf8
en_ZM
en_ZM.utf8
en_ZW.utf8
POSIX
 
- Ariën -
Beheerder

- Ariën -

02/05/2021 12:56:25
Quote Anchor link
Inderdaad, die lijken te missen.

Kan je het op deze manier eens installeren?
sudo apt-get install language-pack-nl

Daarna moet hij als het goed is wel in de lijst staan.
Gewijzigd op 02/05/2021 12:57:29 door - Ariën -
 
Rebel Kain

Rebel Kain

02/05/2021 13:04:34
Quote Anchor link
- Ariën - op 02/05/2021 12:56:25:
Inderdaad, die lijken te missen.

Kan je het op deze manier eens installeren?
sudo apt-get install language-pack-nl

Daarna moet hij als het goed is wel in de lijst staan.

Inmiddels al gedaan
Quote:
C
C.UTF-8
dutch
en_AG
en_AG.utf8
en_AU.utf8
en_BW.utf8
en_CA.utf8
en_DK.utf8
en_GB.utf8
en_HK.utf8
en_IE.utf8
en_IL
en_IL.utf8
en_IN
en_IN.utf8
en_NG
en_NG.utf8
en_NZ.utf8
en_PH.utf8
en_SG.utf8
en_US
en_US.iso88591
en_US.utf8
en_ZA.utf8
en_ZM
en_ZM.utf8
en_ZW.utf8
nl_AW
nl_AW.utf8
nl_BE.utf8
nl_NL
nl_NL.iso88591
nl_NL.utf8
POSIX


En heb deze code staan;
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
function determine_age($atts, $content = null) {
  extract( shortcode_atts( array(
    'dob' => '',
    'date' => 1,
    'dateformat' => 'j F Y'
  ), $atts ) );
 if ($dob == '') $dob = $content;
 $age = ($content == null) ? floor((time() - strtotime($dob)) / 31556926) : floor((time() - strtotime($content)) / 31556926);
 return ($date) ? date($dateformat, strtotime($dob)) . ' (leeftijd: ' .  $age . ')' : $age;
    setlocale(LC_TIME, "nl_NL");
echo strftime(" in Dutch is %A,");
}
add_shortcode('age', 'determine_age');


Locales update gedaan, server gereboot en nog steeds de maanden in het Engels ugh, ik zweer het, waar het bij iedereen normaal gaat gaat het bij mij weer niet zoals het hoort haha.

Ik kan natuurlijk er voor kiezen om voor 02/05/2021 te gaan maar nu irriteert het me waarom de maand niet naar Nederland gaat.
 
- Ariën -
Beheerder

- Ariën -

02/05/2021 13:10:15
Quote Anchor link
Ik zie ook dat dutch mogelijk is.

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
setlocale(LC_ALL, 'dutch', 'nl_NL');


Werkt dat wel?
Misschien moet Apache/PHP even een herstart krijgen?
 
Rebel Kain

Rebel Kain

02/05/2021 13:12:08
Quote Anchor link
Ik ga gelijk kijken, overigens run ik op litespeed.

Toevoeging op 02/05/2021 13:18:00:

Toegevoegd, alles herstart en...nog steeds in Engels. Denk dat ik maar alleen met getallen ga dan, wat zoveel werk voor zo'n klein iets en nog steeds geen verandering is mijn frustratie niet waard :)
 
- Ariën -
Beheerder

- Ariën -

02/05/2021 13:25:03
Quote Anchor link
Hm, dat is wel erg vreemd.
Ik heb geen ervaring met Litespeed, maar misschien moet je daar nog iets mee doen?
 
Rebel Kain

Rebel Kain

02/05/2021 13:32:57
Quote Anchor link
Ik switch even naar Apache om te zien of er verandering is.

Toevoeging op 02/05/2021 13:38:51:

Helaas op Apache ook in het Engels ><, ik ga met de nummers dan maar :), bedankt voor het meedenken.

Misschien enige idee hoe ik de shortcode kan laten werken met de Europese invoer?
 
- Ariën -
Beheerder

- Ariën -

02/05/2021 13:53:57
Quote Anchor link
Heb je mijn code met preg_match_all() al gezien?
Dan heb je de datums, maanden en jaar los in een array, zodat je die kan omzetten naar het standaard YYYY-MM-DD wat je dan opslaat als je het ergens in wilt verwerken.

Volgens mij zit de invoer in $atts. Dus die waarde moet je gebruiken om op verder te werken.
Gewijzigd op 02/05/2021 13:55:27 door - Ariën -
 
Ad Fundum

Ad Fundum

02/05/2021 16:02:25
Quote Anchor link
Misschien is de waarschuwing van setlocale() ontgaan?
"the locale information is maintained per process, not per thread."

Als je webserver nog meer sites met PHP heeft draaien, en je gebruikt PHP NTS (Non Thread Safe) dan is het logisch dat het niet werkt. Je kunt NTS controleren via de CLI met een commando als:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
$ php -i|grep "Thread Safety"
Thread Safety => disabled


Oplossing: gebruik PHP TS (Thread Safe) of gebruik de Intl-extentie voor i80n. Mocht Intl niet beschikbaar zijn kan je kijken bij het Symfony raamwerk, die hebben als het goed is een alternatieve implementatie van Intl: https://symfony.com/doc/current/components/intl.html
 
Willem vp

Willem vp

03/05/2021 08:57:25
Quote Anchor link
Wat ook niet helpt, is dat je een return doet vóór de setlocale()...
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.