Ik hou een WordPress installatie als een soort catalogus voor mijn muziekcollectie en tegelijkertijd als web-speeltuin om mezelf dingen te leren, uit te proberen en steeds te optimaliseren.
De zwart-wit situatie is nu (dus) alsvolgt; ik heb een custom post type met x-aantal custom taxonomies en geschreven content in alle posts. In die berg van posts zitten talloze verwijzingen naar die taxonomies en ik zou ze allemaal automagisch scannen en linken waar dat mogelijk is.
Dus, wat is het plan?
De bedoeling is om de content van nu ~200 posts te scannen en te vergelijken met alle mogelijke taxonomies. Wanneer dan de taxonomy voor een label "Sony Records" bestaat, en een stuk content bevat bv. "Deze opname is in 2001 op Sony Records uitgebracht", dat het keyword van de taxonomy wordt vervangen door
Hoe pak je dat het beste aan?
Ik ben best bedreven in de WordPress markup en kan aardig overweg met PHP en database queries, maar nog niet goed genoeg om deze code uit de losse pols te schrijven. Mijn vraag is dus of jullie met me mee willen denken over de beste oplossing en/of manier om dit überhaupt aan te pakken (en is het misschien interessant voor andere juniors).
Het makkelijkst lijkt me om een plugin te maken met een script dat via een cronjob gedraaid wordt. Dat script gaat in basis alle content van de posts door;
- Haal gekoppelde taxonomies op van post-type
- Maak een array van alle keywords uit de taxonomy (ID, slug en titel)
- Loop met die array alle posts uit de taxonomy door
- Vervang alle resultaten ("Term") door links ("<a href="/{taxonomy_slug}/{keyword_slug}">Term</a>")
De code
Het eerste probleem dat ik wil tackelen is de juiste scripting om alle posts door te lezen en aan te passen. Ik dacht aan zoiets:
Maar als ik het goed heb moet je via wp_update_post de hele content vervangen. Dat zou betekenen voor elke post de hele content (gemiddeld ~2500 karakters) steeds bijgeschreven zou moeten worden. Is het misschien beter te doen via SQL met een selectieve query - kan dat überhaupt binnen één entiteit?
Ondertussen ben ik al begonnen met de opzet en kom toevallig deze plugin tegen die vrijwel exact doet wat ik wil, maar de termen niet veranderd in de database, maar via een filter laat zien bij het aanroepen van de content. Ik denk dat deze code een flinke shortcut kan zijn voor mijn project - maar het leren ervan is ook een doel dus ik ga het wel zelf doen!
De zwart-wit situatie is nu (dus) alsvolgt; ik heb een custom post type met x-aantal custom taxonomies en geschreven content in alle posts. In die berg van posts zitten talloze verwijzingen naar die taxonomies en ik zou ze allemaal automagisch scannen en linken waar dat mogelijk is.
Dus, wat is het plan?
De bedoeling is om de content van nu ~200 posts te scannen en te vergelijken met alle mogelijke taxonomies. Wanneer dan de taxonomy voor een label "Sony Records" bestaat, en een stuk content bevat bv. "Deze opname is in 2001 op Sony Records uitgebracht", dat het keyword van de taxonomy wordt vervangen door
code:
waar 'label' de slug van de taxonomy is, en 'sony-records' vanzelf de slug van de betreffende tag.1
| <a href="http://site/label/sony-records">Sony Records</a> |
Hoe pak je dat het beste aan?
Ik ben best bedreven in de WordPress markup en kan aardig overweg met PHP en database queries, maar nog niet goed genoeg om deze code uit de losse pols te schrijven. Mijn vraag is dus of jullie met me mee willen denken over de beste oplossing en/of manier om dit überhaupt aan te pakken (en is het misschien interessant voor andere juniors).
Het makkelijkst lijkt me om een plugin te maken met een script dat via een cronjob gedraaid wordt. Dat script gaat in basis alle content van de posts door;
- Haal gekoppelde taxonomies op van post-type
- Maak een array van alle keywords uit de taxonomy (ID, slug en titel)
- Loop met die array alle posts uit de taxonomy door
- Vervang alle resultaten ("Term") door links ("<a href="/{taxonomy_slug}/{keyword_slug}">Term</a>")
De code
Het eerste probleem dat ik wil tackelen is de juiste scripting om alle posts door te lezen en aan te passen. Ik dacht aan zoiets:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
| foreach (preg_split("/\s/", $text) as $word) { $string[$word] = 1; } foreach ($keywords as $keyword) { if (isset($string[$keyword])) { [wp_update_post code] } } |
Maar als ik het goed heb moet je via wp_update_post de hele content vervangen. Dat zou betekenen voor elke post de hele content (gemiddeld ~2500 karakters) steeds bijgeschreven zou moeten worden. Is het misschien beter te doen via SQL met een selectieve query - kan dat überhaupt binnen één entiteit?
Ondertussen ben ik al begonnen met de opzet en kom toevallig deze plugin tegen die vrijwel exact doet wat ik wil, maar de termen niet veranderd in de database, maar via een filter laat zien bij het aanroepen van de content. Ik denk dat deze code een flinke shortcut kan zijn voor mijn project - maar het leren ervan is ook een doel dus ik ga het wel zelf doen!
[ Voor 7% gewijzigd door Asitis op 28-06-2016 22:04 . Reden: aanvulling ]