Je veux pouvoir transmettre un fichier json à WP CLI, pour créer de manière itérative des articles.
J'ai donc pensé que je pourrais créer un fichier JSON:
{"post_type":"post","post_title":"Test","post_content":"[leaflet-map][leaflet-marker]","post_status":"publish"} {"post_type":"post","post_title":"Number 2","post_content":"[leaflet-map fitbounds][leaflet-circle]","post_status":"publish"}
et itérer le tableau avec jq:
> for i in $(cat posts.json | jq -c .[]); do echo $i; done
Je veux pouvoir les itérer pour exécuter une fonction similaire:
wp post create \ --post_type=post \ --post_title='Test Map' \ --post_content='[leaflet-map] [leaflet-marker]' \ --post_status='publish'
Est-ce que je peux faire cela avec jq
, ou similaire?
Le plus proche que j'ai obtenu jusqu'à présent est celui-ci: p>
cat posts.json | jq --raw-output .[]
Mais cela semble poser problème avec les espaces (valides) dans les chaînes. Résultat:
[ { "post_type": "post", "post_title": "Test", "post_content": "[leaflet-map][leaflet-marker]", "post_status": "publish" }, { "post_type": "post", "post_title": "Number 2", "post_content": "[leaflet-map fitbounds][leaflet-circle]", "post_status": "publish" } ]
Suis-je loin de cette approche, ou est-ce possible?
3 Réponses :
Utilisez un while
pour lire des lignes entières, plutôt que d'itérer sur les mots résultant de la substitution de commande.
while IFS= read -r obj; do ... done < <(jq -c '.[]' posts.json)
bonne idée. Je ne pourrais pas pour la vie de moi faire fonctionner cela jusqu'à ce que je tombe sur ta solution
Peut-être que cela fonctionnerait pour vous:
Créez un exécutable bash, appelez-le peut-être wpfunction.sh
jq -M -c '.[] | [.post_type, .post_title, .post_content, .post_status][]' \ posts.json | xargs -n4 ./wpfunction`
Puis exécutez jq
sur votre posts.json
et dirigez-le dans xargs
#!/bin/bash wp post create \ --post_type="$1"\ --post_title="$2" \ --post_content="$3" \ --post_status="$4"
J'expérimente pour voir comment cela gérerait le post_content contenant des guillemets ...
Commencez par générer un tableau des arguments que vous souhaitez passer puis convertissez-le en une forme compatible avec le shell en utilisant @sh
. Ensuite, vous pouvez passer à xargs pour appeler la commande.
$ jq -r '.[] | ["post", "create", (to_entries[] | "--\(.key)=\(.value|tojson)")] | @sh' input.json | xargs wp
c.f. stedolan.github.io/jq/manual -
-c
dit explicitement de supprimer les espaces tels que les caractères de nouvelle ligne. Essayez--indent n
dans la boucle, mais-c
pour générer vos données. Boucle avecpendant la lecture -r i; do echo "$ i" | jq --indent 2 '.'; echo "==="; terminé <<(jq -c '. []' posts.json)