@automattic/newspack-blocks 1.37.0 → 1.48.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (292) hide show
  1. package/.cache/babel/00255e6096be9e31ec354db849dfefaa.json.gz +0 -0
  2. package/.cache/babel/0265bee20d709ac92f56456637727f4b.json.gz +0 -0
  3. package/.cache/babel/02986ba19dc461a152ea1c45f3f36a27.json.gz +0 -0
  4. package/.cache/babel/06a1700c1a4a989fc7886c86bf6223f7.json.gz +0 -0
  5. package/.cache/babel/07169c73863508b392f15022920bd0b6.json.gz +0 -0
  6. package/.cache/babel/0a5083e561829e3884cb5c71388adc3f.json.gz +0 -0
  7. package/.cache/babel/0a713997b6e4f45849ed6a4bff79cca5.json.gz +0 -0
  8. package/.cache/babel/0a9506bf649ffbe854e75459cf6b8972.json.gz +0 -0
  9. package/.cache/babel/0c12c4398bbbf2d771b13dd1d0e64097.json.gz +0 -0
  10. package/.cache/babel/0f8c18da204f4cc2777ca3191f10c309.json.gz +0 -0
  11. package/.cache/babel/0fced15ed787cc4239bb53c1d12892e6.json.gz +0 -0
  12. package/.cache/babel/10faf7c74a89e9aa4d8b9528a654913e.json.gz +0 -0
  13. package/.cache/babel/1353b411b65a123b5dc35012db11aa1d.json.gz +0 -0
  14. package/.cache/babel/1729336f326db1cf54b9c1671dc5e36c.json.gz +0 -0
  15. package/.cache/babel/17a433ab631a32d0712f3f75cf85ea99.json.gz +0 -0
  16. package/.cache/babel/1948e72d907f681ff771881ad6800ee1.json.gz +0 -0
  17. package/.cache/babel/1ab4bf44aa14d2eb7e6911900a3b2c12.json.gz +0 -0
  18. package/.cache/babel/1decfd137cac87a75bd83ffbd39c9106.json.gz +0 -0
  19. package/.cache/babel/2143ceff6d186bc13bc902e0f1f33dbf.json.gz +0 -0
  20. package/.cache/babel/23c63332718e167968a7c2a8a5f730eb.json.gz +0 -0
  21. package/.cache/babel/24bf53676e12293cbf88d01e649fd167.json.gz +0 -0
  22. package/.cache/babel/26ba0bb46844575022e54a8819fbf405.json.gz +0 -0
  23. package/.cache/babel/281ca171ce8947f87f574df11059e00b.json.gz +0 -0
  24. package/.cache/babel/28700b83434e4dbfb9a20d7ec0a7e7a4.json.gz +0 -0
  25. package/.cache/babel/29cf8eeea8630ade027e34459f2e49ee.json.gz +0 -0
  26. package/.cache/babel/2b0dd254a46223a93e6259d2b797a7e7.json.gz +0 -0
  27. package/.cache/babel/2da6786ede3ddda4c86eeac524a6a796.json.gz +0 -0
  28. package/.cache/babel/2e7ce10fdee94274b48d528f94c32b34.json.gz +0 -0
  29. package/.cache/babel/2f93fed1706a40d82122281cc3677074.json.gz +0 -0
  30. package/.cache/babel/3a59b710e9745ef93148d6d74ee7d16f.json.gz +0 -0
  31. package/.cache/babel/3b2c440027c793c8f7978d7622cbfca0.json.gz +0 -0
  32. package/.cache/babel/3ca939ace4af88e266942d93837ab37a.json.gz +0 -0
  33. package/.cache/babel/3e671670c4d395cd1804ef4be31955e4.json.gz +0 -0
  34. package/.cache/babel/3e69fe002d9973c0030152a51da9477a.json.gz +0 -0
  35. package/.cache/babel/3f5f8ea603fd57850c6683c750fe53d8.json.gz +0 -0
  36. package/.cache/babel/41abaaadb68b0657a95fa0c356873def.json.gz +0 -0
  37. package/.cache/babel/421ac952d6b472ba18e1cb95ef65f42a.json.gz +0 -0
  38. package/.cache/babel/424185dd50e91d8dee5fdae43086010e.json.gz +0 -0
  39. package/.cache/babel/427a6423ebde76bcb488747127e47351.json.gz +0 -0
  40. package/.cache/babel/43e800659f23430a181fb4fc328eb6ef.json.gz +0 -0
  41. package/.cache/babel/469651017a2b6f3b9f63fda034974b3a.json.gz +0 -0
  42. package/.cache/babel/480d26447b7ee019a37e4e18422403e9.json.gz +0 -0
  43. package/.cache/babel/4b58fad313d90a4c1577a2766e6c924c.json.gz +0 -0
  44. package/.cache/babel/4d2d42fea63650192d1a3a5648b621c5.json.gz +0 -0
  45. package/.cache/babel/4d8c26a76e77fa64d01f30a5f2d62f85.json.gz +0 -0
  46. package/.cache/babel/4f606ce6656565507a74aaac8dc21eea.json.gz +0 -0
  47. package/.cache/babel/505f37592f4c601ccdc1581ca89d9009.json.gz +0 -0
  48. package/.cache/babel/50aaf34aa54b2cd3058518e42850bb62.json.gz +0 -0
  49. package/.cache/babel/51fbf389462feb111228ba7ec64c631d.json.gz +0 -0
  50. package/.cache/babel/51fc90ae5fe129a095172032f304dc2c.json.gz +0 -0
  51. package/.cache/babel/53dbf5484c5601528c2fd8d7fe728b78.json.gz +0 -0
  52. package/.cache/babel/58e4535574062eb2d8fa56d002e7190d.json.gz +0 -0
  53. package/.cache/babel/5aa5e8d1492938c62999de022c4b220e.json.gz +0 -0
  54. package/.cache/babel/5d64e475284e52c104df17e26066b17b.json.gz +0 -0
  55. package/.cache/babel/6333c664d69f13036f42bcf575c8e65d.json.gz +0 -0
  56. package/.cache/babel/635c439786b8522888342779b28ee9ee.json.gz +0 -0
  57. package/.cache/babel/648cffdd5ec4a2446f8935a17b98080b.json.gz +0 -0
  58. package/.cache/babel/64b0dd478e6f2dd51de5ee20e311aee7.json.gz +0 -0
  59. package/.cache/babel/6531721abbc0b3906b28b268ed7914af.json.gz +0 -0
  60. package/.cache/babel/66bf5585c7901a76c7d4014fa9ffed40.json.gz +0 -0
  61. package/.cache/babel/6ef313cb6d3a59f73a6b78e1a729fb13.json.gz +0 -0
  62. package/.cache/babel/6f14eed506421f15710d3dfafe3dcd93.json.gz +0 -0
  63. package/.cache/babel/70f6c01d8c6bc3efc41c97eaf49f7617.json.gz +0 -0
  64. package/.cache/babel/72321dde68f0bb9c334d90d6f4584be8.json.gz +0 -0
  65. package/.cache/babel/76c815fab58595f57e01af6591791d57.json.gz +0 -0
  66. package/.cache/babel/7c10f4d554daa8efe1e0a4457fb6d27b.json.gz +0 -0
  67. package/.cache/babel/7dffccddd9780ab37fb79f809947c2cd.json.gz +0 -0
  68. package/.cache/babel/7e5162e3319cd5d6fca6c0db0516aaeb.json.gz +0 -0
  69. package/.cache/babel/803192c922f7d419648bab7e1201b22e.json.gz +0 -0
  70. package/.cache/babel/81f3f0f896d29cdf88f8543dedb77787.json.gz +0 -0
  71. package/.cache/babel/84c019d3d643195fb37d08110f15f8c9.json.gz +0 -0
  72. package/.cache/babel/853c31db7c4351f2f36d1021c667224d.json.gz +0 -0
  73. package/.cache/babel/88ec99735ea4f314937736f04360ff8c.json.gz +0 -0
  74. package/.cache/babel/8959ab8fcfa783cb56e9418b99c0951c.json.gz +0 -0
  75. package/.cache/babel/8b9624d721f8706682e33fe1853c8287.json.gz +0 -0
  76. package/.cache/babel/8de5c373bbc4b6fbeec373d582935887.json.gz +0 -0
  77. package/.cache/babel/8f24517cff634d2e91c19e51be8816cc.json.gz +0 -0
  78. package/.cache/babel/901e1bb823eca196b594baa35a35a81c.json.gz +0 -0
  79. package/.cache/babel/90dbc666ff9fa3b88f305fe90a9917bf.json.gz +0 -0
  80. package/.cache/babel/91b62dfd9475df7a39dc08fbd43847f9.json.gz +0 -0
  81. package/.cache/babel/956daf27323e3b87bf8bf9bbf58881ed.json.gz +0 -0
  82. package/.cache/babel/959e9b81103c539a9d85ac60955451b9.json.gz +0 -0
  83. package/.cache/babel/963b1e44be998c4dcc6845745c377369.json.gz +0 -0
  84. package/.cache/babel/966b41ac1317b3e03ca1e59f7eb57e8c.json.gz +0 -0
  85. package/.cache/babel/969d5992cc682e3b43761ef02c10b851.json.gz +0 -0
  86. package/.cache/babel/99df128bb528d0f95a56b311801d14c1.json.gz +0 -0
  87. package/.cache/babel/9b33e7d21f3fc4955a536a033cced71b.json.gz +0 -0
  88. package/.cache/babel/9c5ec84f77314a621c01ad77da7ccb58.json.gz +0 -0
  89. package/.cache/babel/9d325af12a88623602a5f8c2fce04847.json.gz +0 -0
  90. package/.cache/babel/a413e4d325543836d0800684bb26ed04.json.gz +0 -0
  91. package/.cache/babel/a5405f86b8d1485e62a125275507e60f.json.gz +0 -0
  92. package/.cache/babel/a7f7461321ca6fd4360df04bb894c106.json.gz +0 -0
  93. package/.cache/babel/a8a6812e1c7b65cc6d0bdebe2a35c8ca.json.gz +0 -0
  94. package/.cache/babel/aa89cfc4c88fcc465b8d74af824e7f6b.json.gz +0 -0
  95. package/.cache/babel/adbaeb5ddf5612b3dcd233a3f6f17bf2.json.gz +0 -0
  96. package/.cache/babel/ae18cd6ec42a3366c73435b62a9f5f70.json.gz +0 -0
  97. package/.cache/babel/aea149ee1ec6fa3ca7839c63f5edd78d.json.gz +0 -0
  98. package/.cache/babel/af1b34067a69854e109c0b0e45d90e43.json.gz +0 -0
  99. package/.cache/babel/b3a335ab950f502914013810b43b0ad5.json.gz +0 -0
  100. package/.cache/babel/b6cfba15cda3404d4b1041df448ed2b2.json.gz +0 -0
  101. package/.cache/babel/ba711530bd319618a0510d8361bebb45.json.gz +0 -0
  102. package/.cache/babel/ba77e682225df6126b636458055601d9.json.gz +0 -0
  103. package/.cache/babel/bab8189a74eee8d72702d1510b52b3b3.json.gz +0 -0
  104. package/.cache/babel/bd8741020db56bb5d999252812d1d717.json.gz +0 -0
  105. package/.cache/babel/beaa874c5e01203d9dbe23cb89405276.json.gz +0 -0
  106. package/.cache/babel/c196c9b8c21953c474acdaa9029b3cbf.json.gz +0 -0
  107. package/.cache/babel/c1e31e6c217023eb3d3fd5d3de486ac3.json.gz +0 -0
  108. package/.cache/babel/c3aa996443e7f377aa423bcc03ffc617.json.gz +0 -0
  109. package/.cache/babel/c481eae84d69b65405a44af442dbfea7.json.gz +0 -0
  110. package/.cache/babel/c4a817d6c4bf6eb3687ffccc5c2df801.json.gz +0 -0
  111. package/.cache/babel/c8b10cf6f706fb669d6dd7564385768d.json.gz +0 -0
  112. package/.cache/babel/caa2f98ba4af6eba0605543f690693c6.json.gz +0 -0
  113. package/.cache/babel/cada4b2cecb2c1fcc48b7a7ecda54907.json.gz +0 -0
  114. package/.cache/babel/d1bed5404789c427c32965ac6ecad0d9.json.gz +0 -0
  115. package/.cache/babel/d395e8c0a9c63680f2dcf90ca0e91d4a.json.gz +0 -0
  116. package/.cache/babel/d4672090e0dd9a73bfb00bd770b23643.json.gz +0 -0
  117. package/.cache/babel/d4c81f65fe6d78cdbdcf1ef901b7ba1b.json.gz +0 -0
  118. package/.cache/babel/d515ddc0797ea256ff7271507737e9ce.json.gz +0 -0
  119. package/.cache/babel/d742848d263503f79168f1a6b8a52097.json.gz +0 -0
  120. package/.cache/babel/d834b41d7028519ecd0cbc8c65d33dde.json.gz +0 -0
  121. package/.cache/babel/d9060b9162e7caf974db0b90b6134727.json.gz +0 -0
  122. package/.cache/babel/d946975b9beac51a39f600461e84b1b6.json.gz +0 -0
  123. package/.cache/babel/daf0af780cff2270b1ae0e4b97a5a4ab.json.gz +0 -0
  124. package/.cache/babel/db5215643b0737dc5245972a5c25f736.json.gz +0 -0
  125. package/.cache/babel/dd57b8d31664b147b9f1e3f5cd18cc2a.json.gz +0 -0
  126. package/.cache/babel/e0c78bdaae19f15e2dd4a773e842422b.json.gz +0 -0
  127. package/.cache/babel/e1a2c7e4fc3afe9cc6e03d60f4e4a23d.json.gz +0 -0
  128. package/.cache/babel/e210ff9aa99df972b8d81c4bda70f642.json.gz +0 -0
  129. package/.cache/babel/e259a73f84d5b92b94e6d094719264c3.json.gz +0 -0
  130. package/.cache/babel/e6ce03a9908c9c4dc2c723531f1073f6.json.gz +0 -0
  131. package/.cache/babel/e8a1501dd8e4b3389ecdc8f722622359.json.gz +0 -0
  132. package/.cache/babel/eb3bb371036da362c42db50248d0b180.json.gz +0 -0
  133. package/.cache/babel/eb854e03c810bdb969497b2a36119bfa.json.gz +0 -0
  134. package/.cache/babel/ec25bb53826070b7f301e64f02355b8c.json.gz +0 -0
  135. package/.cache/babel/edbaca20e4a65f850c3d8321c1945718.json.gz +0 -0
  136. package/.cache/babel/f059f1ca9e49d5c3e655d20339860dce.json.gz +0 -0
  137. package/.cache/babel/f24c559fb42ef906405966598baf5f80.json.gz +0 -0
  138. package/.cache/babel/f2f333c3c546ad711d722d782decd450.json.gz +0 -0
  139. package/.cache/babel/f42c854ce8f1dc1a6e6fe7c510b033a5.json.gz +0 -0
  140. package/.cache/babel/f5211608f22c2e12594eafdbc4e66aa5.json.gz +0 -0
  141. package/.cache/babel/f645b8c88a49718cd778e3595212d4eb.json.gz +0 -0
  142. package/.cache/babel/f66dda5c4e4e9d04eb6b7411fcb12a65.json.gz +0 -0
  143. package/.cache/babel/f9d5b6f3f5438342dba75c2ce6143eef.json.gz +0 -0
  144. package/.cache/babel/fc9c60ee1d2e8783ba4c08db5cf97d40.json.gz +0 -0
  145. package/.cache/babel/fd558798cea72d04fb826468a89d72aa.json.gz +0 -0
  146. package/.cache/babel/fe735cbd0f6e131e28d8b6eb1f39141b.json.gz +0 -0
  147. package/.eslintrc.js +3 -26
  148. package/.nvmrc +1 -0
  149. package/CHANGELOG.md +422 -0
  150. package/babel.config.js +6 -0
  151. package/block-list.json +1 -1
  152. package/composer.json +2 -2
  153. package/composer.lock +446 -161
  154. package/dist/author-list/view.asset.php +1 -0
  155. package/dist/author-list/view.css +1 -0
  156. package/dist/author-list/view.js +1 -0
  157. package/dist/author-list/view.rtl.css +1 -0
  158. package/dist/author-profile/view.asset.php +1 -0
  159. package/dist/author-profile/view.css +1 -0
  160. package/dist/author-profile/view.js +1 -0
  161. package/dist/author-profile/view.rtl.css +1 -0
  162. package/dist/block_styles.asset.php +1 -0
  163. package/dist/block_styles.css +1 -0
  164. package/dist/block_styles.js +1 -0
  165. package/dist/block_styles.rtl.css +1 -0
  166. package/dist/carousel/view.asset.php +1 -0
  167. package/dist/carousel/view.css +1 -0
  168. package/dist/carousel/view.js +1 -0
  169. package/dist/carousel/view.rtl.css +1 -0
  170. package/dist/donate/view.asset.php +1 -0
  171. package/dist/donate/view.css +1 -0
  172. package/dist/donate/view.js +1 -0
  173. package/dist/donate/view.rtl.css +1 -0
  174. package/dist/donateStreamlined.asset.php +1 -0
  175. package/dist/donateStreamlined.css +1 -0
  176. package/dist/donateStreamlined.js +1 -0
  177. package/dist/donateStreamlined.rtl.css +1 -0
  178. package/dist/editor.asset.php +1 -0
  179. package/dist/editor.css +1 -0
  180. package/dist/editor.js +41 -0
  181. package/dist/editor.rtl.css +1 -0
  182. package/dist/homepage-articles/view.asset.php +1 -0
  183. package/dist/homepage-articles/view.css +1 -0
  184. package/dist/homepage-articles/view.js +1 -0
  185. package/dist/homepage-articles/view.rtl.css +1 -0
  186. package/dist/iframe/view.asset.php +1 -0
  187. package/dist/iframe/view.css +1 -0
  188. package/dist/iframe/view.js +1 -0
  189. package/dist/iframe/view.rtl.css +1 -0
  190. package/includes/class-newspack-blocks-api.php +14 -69
  191. package/includes/class-newspack-blocks-patterns.php +4 -1
  192. package/includes/class-newspack-blocks.php +421 -95
  193. package/newspack-blocks.php +26 -2
  194. package/package.json +31 -129
  195. package/postcss.config.js +11 -0
  196. package/src/block-patterns/subscribe-2.php +1 -1
  197. package/src/block-patterns/subscribe-3.php +1 -1
  198. package/src/block-patterns/subscribe-7.php +12 -0
  199. package/src/block-patterns/subscribe-8.php +12 -0
  200. package/src/block-patterns/subscribe-9.php +12 -0
  201. package/src/block-styles/core/columns/editor.scss +5 -8
  202. package/src/block-styles/core/columns/view.scss +83 -42
  203. package/src/blocks/author-list/block.json +82 -0
  204. package/src/blocks/author-list/class-wp-rest-newspack-author-list-controller.php +387 -0
  205. package/src/blocks/author-list/edit.js +527 -0
  206. package/src/blocks/author-list/editor.js +7 -0
  207. package/src/blocks/author-list/editor.scss +1 -0
  208. package/src/blocks/author-list/index.js +45 -0
  209. package/src/blocks/author-list/view.js +5 -0
  210. package/src/blocks/author-list/view.php +175 -0
  211. package/src/blocks/author-list/view.scss +46 -0
  212. package/src/blocks/author-profile/block.json +8 -0
  213. package/src/blocks/author-profile/class-wp-rest-newspack-authors-controller.php +69 -14
  214. package/src/blocks/author-profile/edit.js +212 -189
  215. package/src/blocks/author-profile/editor.scss +1 -1
  216. package/src/blocks/author-profile/single-author.js +100 -0
  217. package/src/blocks/author-profile/view.php +38 -92
  218. package/src/blocks/author-profile/view.scss +120 -1
  219. package/src/blocks/carousel/create-swiper.js +14 -5
  220. package/src/blocks/carousel/edit.js +4 -2
  221. package/src/blocks/carousel/editor.scss +3 -12
  222. package/src/blocks/carousel/view.js +1 -1
  223. package/src/blocks/carousel/view.php +9 -5
  224. package/src/blocks/carousel/view.scss +29 -3
  225. package/src/blocks/donate/class-wp-rest-newspack-donate-controller.php +22 -24
  226. package/src/blocks/donate/edit.js +49 -42
  227. package/src/blocks/donate/editor.scss +27 -3
  228. package/src/blocks/donate/index.js +31 -4
  229. package/src/blocks/donate/streamlined/index.js +248 -0
  230. package/src/blocks/donate/streamlined/index.test.js +125 -0
  231. package/src/blocks/donate/streamlined/style.scss +324 -0
  232. package/src/blocks/donate/streamlined/utils.js +174 -0
  233. package/src/blocks/donate/streamlined/utils.test.js +18 -0
  234. package/src/blocks/donate/view.php +77 -36
  235. package/src/blocks/donate/view.scss +291 -0
  236. package/src/blocks/homepage-articles/block.json +8 -0
  237. package/src/blocks/homepage-articles/class-wp-rest-newspack-articles-controller.php +24 -78
  238. package/src/blocks/homepage-articles/edit.js +26 -0
  239. package/src/blocks/homepage-articles/store.js +11 -1
  240. package/src/blocks/homepage-articles/templates/article.php +31 -3
  241. package/src/blocks/homepage-articles/templates/articles-loop.php +6 -5
  242. package/src/blocks/homepage-articles/utils.js +11 -10
  243. package/src/blocks/homepage-articles/view.php +4 -1
  244. package/src/blocks/homepage-articles/view.scss +69 -24
  245. package/src/blocks/iframe/block.json +34 -0
  246. package/src/blocks/iframe/class-wp-rest-newspack-iframe-controller.php +345 -0
  247. package/src/blocks/iframe/edit.js +252 -0
  248. package/src/blocks/iframe/editor.js +7 -0
  249. package/src/blocks/iframe/editor.scss +84 -0
  250. package/src/blocks/iframe/icons.js +10 -0
  251. package/src/blocks/iframe/iframe-placeholder.js +180 -0
  252. package/src/blocks/iframe/index.js +48 -0
  253. package/src/blocks/iframe/view.js +5 -0
  254. package/src/blocks/iframe/view.php +130 -0
  255. package/src/blocks/iframe/view.scss +9 -0
  256. package/src/blocks/video-playlist/view.php +4 -3
  257. package/src/components/query-controls.js +5 -4
  258. package/src/setup/editor.js +0 -1
  259. package/src/shared/js/utils.js +1 -1
  260. package/src/templates/author-profile-card.php +99 -0
  261. package/vendor/autoload.php +7 -0
  262. package/vendor/composer/ClassLoader.php +572 -0
  263. package/vendor/composer/InstalledVersions.php +350 -0
  264. package/vendor/composer/LICENSE +21 -0
  265. package/vendor/composer/autoload_classmap.php +10 -0
  266. package/vendor/composer/autoload_namespaces.php +9 -0
  267. package/vendor/composer/autoload_psr4.php +9 -0
  268. package/vendor/composer/autoload_real.php +55 -0
  269. package/vendor/composer/autoload_static.php +20 -0
  270. package/vendor/composer/installed.json +5 -0
  271. package/vendor/composer/installed.php +23 -0
  272. package/webpack.config.js +2 -3
  273. package/.circleci/config.yml +0 -96
  274. package/.distignore +0 -36
  275. package/.editorconfig +0 -22
  276. package/.github/ISSUE_TEMPLATE/Bug_report.md +0 -21
  277. package/.github/ISSUE_TEMPLATE/Enhancement.md +0 -17
  278. package/.github/ISSUE_TEMPLATE/Feature_request.md +0 -17
  279. package/.github/PULL_REQUEST_TEMPLATE.md +0 -29
  280. package/.github/workflows/main.yml +0 -15
  281. package/.phpcs.xml.dist +0 -55
  282. package/.prettierrc +0 -10
  283. package/.stylelintrc +0 -21
  284. package/.travis.yml +0 -67
  285. package/phpunit.xml.dist +0 -16
  286. package/src/blocks/author-profile/shared.scss +0 -95
  287. package/src/blocks/donate/streamlined.js +0 -180
  288. package/src/blocks/donate/streamlined.scss +0 -124
  289. package/src/setup/public-path.js +0 -13
  290. package/src/setup/view.js +0 -4
  291. package/tests/bootstrap.php +0 -31
  292. package/tests/test-sample.php +0 -20
@@ -0,0 +1,387 @@
1
+ <?php
2
+ /**
3
+ * WP_REST_Newspack_Authors_Controller file.
4
+ *
5
+ * @package WordPress
6
+ */
7
+
8
+ // phpcs:disable WordPress.NamingConventions.PrefixAllGlobals.NonPrefixedClassFound
9
+ /**
10
+ * Class WP_REST_Newspack_Authors_Controller.
11
+ */
12
+ class WP_REST_Newspack_Author_List_Controller extends WP_REST_Newspack_Authors_Controller {
13
+ // phpcs:enable WordPress.NamingConventions.PrefixAllGlobals.NonPrefixedClassFound
14
+
15
+ /**
16
+ * Constructs the controller.
17
+ *
18
+ * @access public
19
+ */
20
+ public function __construct() {
21
+ $this->namespace = 'newspack-blocks/v1';
22
+ $this->rest_base = 'author-list';
23
+ }
24
+
25
+ /**
26
+ * Registers the necessary REST API routes.
27
+ *
28
+ * @access public
29
+ */
30
+ public function register_routes() {
31
+ // Endpoint to get authors.
32
+ register_rest_route(
33
+ $this->namespace,
34
+ '/' . $this->rest_base,
35
+ [
36
+ [
37
+ 'methods' => WP_REST_Server::READABLE,
38
+ 'callback' => [ $this, 'api_get_all_authors' ],
39
+ 'args' => [
40
+ 'author_id' => [
41
+ 'sanitize_callback' => 'absint',
42
+ ],
43
+ 'offset' => [
44
+ 'sanitize_callback' => 'absint',
45
+ ],
46
+ 'per_page' => [
47
+ 'sanitize_callback' => 'absint',
48
+ ],
49
+ 'search' => [
50
+ 'sanitize_callback' => 'sanitize_text_field',
51
+ ],
52
+ 'fields' => [
53
+ 'sanitize_callback' => 'sanitize_text_field',
54
+ ],
55
+ ],
56
+ 'permission_callback' => '__return_true',
57
+ ],
58
+ ]
59
+ );
60
+ }
61
+
62
+ /**
63
+ * Get a list of user roles on this site that have the edit_posts capability.
64
+ *
65
+ * @return array List of roles with edit_posts capability.
66
+ */
67
+ public function get_editable_roles() {
68
+ global $wp_roles;
69
+
70
+ $editable_roles = array_reduce(
71
+ $wp_roles->roles,
72
+ function( $acc, $role ) {
73
+ if ( isset( $role['capabilities'] ) && isset( $role['capabilities']['edit_posts'] ) && $role['capabilities']['edit_posts'] ) {
74
+ $acc[] = $role['name'];
75
+ }
76
+ return $acc;
77
+ },
78
+ []
79
+ );
80
+
81
+ /**
82
+ * Filter the array of editable roles so other plugins can add/remove as needed.
83
+ * The array should be a flat array of the name of each role as registered via add_role.
84
+ * https://developer.wordpress.org/reference/functions/add_role/
85
+ *
86
+ * @param array $editable_roles Array of editable role names as registered via add_role.
87
+ *
88
+ * @return array Filtered array of roles.
89
+ */
90
+ return apply_filters( 'newspack_blocks_author_list_editable_roles', $editable_roles );
91
+ }
92
+
93
+ /**
94
+ * API request handler to fetch all authors matching the given request params.
95
+ *
96
+ * @param WP_REST_Request $request Request object.
97
+ * @return WP_REST_Response
98
+ */
99
+ public function api_get_all_authors( $request ) {
100
+ $options = [];
101
+
102
+ if ( ! empty( $request->get_param( 'authorType' ) ) ) {
103
+ $options['author_type'] = $request->get_param( 'authorType' );
104
+ }
105
+
106
+ if ( ! empty( $request->get_param( 'authorRoles' ) ) ) {
107
+ $options['author_roles'] = $request->get_param( 'authorRoles' );
108
+ }
109
+
110
+ if ( ! empty( $request->get_param( 'exclude' ) ) && is_array( $request->get_param( 'exclude' ) ) ) {
111
+ $options['exclude'] = $request->get_param( 'exclude' ); // phpcs:ignore WordPressVIPMinimum.Performance.WPQueryParams.PostNotIn_exclude
112
+ }
113
+
114
+ if ( ! empty( $request->get_param( 'excludeEmpty' ) ) ) {
115
+ $options['exclude_empty'] = true;
116
+ }
117
+
118
+ if ( ! empty( $request->get_param( 'avatarHideDefault' ) ) ) {
119
+ $options['avatar_hide_default'] = true;
120
+ }
121
+
122
+ if ( ! empty( $request->get_param( 'fields' ) ) ) {
123
+ $options['fields'] = explode( ',', $request->get_param( 'fields' ) );
124
+ }
125
+
126
+ $combined_authors = $this->get_all_authors( $options );
127
+ $response = new \WP_REST_Response( $combined_authors );
128
+ $response->header( 'x-wp-total', count( $combined_authors ) );
129
+
130
+ return rest_ensure_response( $response );
131
+ }
132
+
133
+ /**
134
+ * Returns an array of combined authors and guest authors.
135
+ *
136
+ * @param array $options Associative array of options used to query authors.
137
+ *
138
+ * @return array Array of all matching authors and/or guest authors on the site.
139
+ */
140
+ public function get_all_authors( $options = [] ) {
141
+ $default_options = [
142
+ 'author_type' => 'all',
143
+ 'author_roles' => $this->get_editable_roles(),
144
+ 'avatar_hide_default' => false,
145
+ 'exclude' => [], // phpcs:ignore WordPressVIPMinimum.Performance.WPQueryParams.PostNotIn_exclude
146
+ 'exclude_empty' => false,
147
+ 'fields' => [ 'id', 'name', 'bio', 'email', 'social', 'avatar', 'url' ],
148
+ 'per_page' => 10,
149
+ ];
150
+ $options = wp_parse_args( $options, $default_options );
151
+ $fields = $options['fields'];
152
+ $current_page = 1;
153
+
154
+ // Array to store all authors.
155
+ $all_guest_authors = [];
156
+ $all_users = [];
157
+
158
+ // Get Co-authors guest authors, only if CAP plugin is active and the author type specified includes guest authors.
159
+ if ( in_array( $options['author_type'], [ 'all', 'guest-authors' ], true ) && class_exists( 'CoAuthors_Guest_Authors' ) ) {
160
+ $guest_author_args = [
161
+ 'post_type' => 'guest-author',
162
+ 'posts_per_page' => $options['per_page'],
163
+ 'orderby' => 'title',
164
+ 'order' => 'ASC',
165
+ ];
166
+
167
+ if ( ! empty( $options['exclude'] ) ) {
168
+ $guest_author_args['post__not_in'] = $options['exclude'];
169
+ }
170
+
171
+ $results = new \WP_Query( $guest_author_args );
172
+ $number_of_pages = $results->max_num_pages;
173
+ $all_guest_authors = array_merge( $all_guest_authors, $results->posts );
174
+
175
+ // Keep querying until we have all guest authors.
176
+ if ( $current_page < $number_of_pages ) {
177
+ while ( $current_page < $number_of_pages ) {
178
+ $current_page ++;
179
+ $guest_author_args['paged'] = $current_page;
180
+ $results = new \WP_Query( $guest_author_args );
181
+ $all_guest_authors = array_merge( $all_guest_authors, $results->posts );
182
+ }
183
+ }
184
+ }
185
+
186
+ if ( in_array( $options['author_type'], [ 'all', 'users' ], true ) ) {
187
+ // Reset current page for new query.
188
+ $current_page = 1;
189
+ $exclude_empty = $options['exclude_empty'] ? true : false;
190
+ $published_post_types = $exclude_empty ? [ 'post' ] : null;
191
+
192
+ // Get WP users.
193
+ $user_args = [
194
+ 'role__in' => $options['author_roles'],
195
+ 'orderby' => 'display_name',
196
+ 'order' => 'ASC',
197
+ 'number' => $options['per_page'],
198
+ /**
199
+ * Filter the post types to check for user query. By default, only users with at least one
200
+ * published post will be included in the results. Filter this array to add/remove post types
201
+ * or set to `null` to include all users even if they have no published posts.
202
+ *
203
+ * @param array|null $post_types Array of post types to check, or null to bypass the check.
204
+ * @param boolean $exclude_empty True if the block is set to exclude authors with 0 posts, otherwise false.
205
+ *
206
+ * @return array|null Filtered value.
207
+ */
208
+ 'has_published_posts' => apply_filters( 'newspack_blocks_author_list_post_types', $published_post_types, $exclude_empty ),
209
+ ];
210
+
211
+ if ( ! empty( $options['exclude'] ) ) {
212
+ $user_args['exclude'] = $options['exclude']; // phpcs:ignore WordPressVIPMinimum.Performance.WPQueryParams.PostNotIn_exclude
213
+ }
214
+
215
+ $results = new \WP_User_Query( $user_args );
216
+ $user_total = $results->get_total();
217
+ $number_of_pages = ceil( $user_total / $options['per_page'] );
218
+ $all_users = array_merge( $all_users, $results->get_results() );
219
+
220
+ // Keep querying until we have all users.
221
+ if ( $current_page < $number_of_pages ) {
222
+ while ( $current_page < $number_of_pages ) {
223
+ $current_page ++;
224
+ $user_args['paged'] = $current_page;
225
+ $results = new \WP_User_Query( $user_args );
226
+ $all_users = array_merge( $all_users, $results->get_results() );
227
+ }
228
+ }
229
+ }
230
+
231
+ // Format and combine results.
232
+ $linked_accounts = []; // Keep track of linked accounts so we can exclude WP users in favor of the guest authors.
233
+ $combined_authors = array_merge(
234
+ array_reduce(
235
+ $all_guest_authors,
236
+ function( $acc, $guest_author ) use ( $fields, $options, &$linked_accounts ) {
237
+ if ( $guest_author && class_exists( 'CoAuthors_Guest_Authors' ) ) {
238
+ $last_name = get_post_meta( $guest_author->ID, 'cap-last_name', true );
239
+ $guest_author_data = [
240
+ 'id' => intval( $guest_author->ID ),
241
+ 'registered' => $guest_author->post_date,
242
+ 'is_guest' => true,
243
+ 'last_name' => ! empty( $last_name ) && false !== strpos( $guest_author->post_title, $last_name ) ? $last_name : $guest_author->post_title,
244
+ ];
245
+
246
+ $guest_author = ( new CoAuthors_Guest_Authors() )->get_guest_author_by( 'id', $guest_author->ID );
247
+ $author_term = ( new CoAuthors_Plus() )->get_author_term( $guest_author );
248
+ $post_count = is_object( $author_term ) && isset( $author_term->count ) ? $author_term->count : 0;
249
+ $linked_account = isset( $guest_author->linked_account ) ? $guest_author->linked_account : null;
250
+
251
+ // Post count = guest author posts + linked WP user posts.
252
+ if ( ! empty( $linked_account ) ) {
253
+ $linked_accounts[] = $linked_account;
254
+ $linked_user = get_user_by( 'login', $linked_account );
255
+
256
+ if ( $linked_user ) {
257
+ $post_count += function_exists( 'wpcom_vip_count_user_posts' ) ?
258
+ wpcom_vip_count_user_posts(
259
+ $linked_user->ID,
260
+ [ 'any' ], // Any post type.
261
+ true // But public posts only.
262
+ ) :
263
+ count_user_posts( // phpcs:ignore WordPressVIPMinimum.Functions.RestrictedFunctions.count_user_posts_count_user_posts
264
+ $linked_user->ID,
265
+ [ 'any' ], // Any post type.
266
+ true // But public posts only.
267
+ );
268
+ }
269
+ }
270
+
271
+ // Only include users with at least one published post.
272
+ if ( 0 === $post_count && $options['exclude_empty'] ) {
273
+ return $acc;
274
+ }
275
+
276
+ if ( in_array( 'login', $fields, true ) ) {
277
+ $guest_author_data['login'] = $guest_author->user_login;
278
+ }
279
+ if ( in_array( 'name', $fields, true ) ) {
280
+ $guest_author_data['name'] = $guest_author->display_name;
281
+ }
282
+ if ( in_array( 'bio', $fields, true ) ) {
283
+ $guest_author_data['bio'] = get_post_meta( $guest_author->ID, 'cap-description', true );
284
+ }
285
+ if ( in_array( 'email', $fields, true ) ) {
286
+ $email_data = $this->get_email( $guest_author->ID );
287
+
288
+ if ( $email_data ) {
289
+ $guest_author_data['email'] = $email_data;
290
+ }
291
+ }
292
+ if ( in_array( 'avatar', $fields, true ) && function_exists( 'coauthors_get_avatar' ) ) {
293
+ $avatar = coauthors_get_avatar( $guest_author, 256, $options['avatar_hide_default'] ? 'blank' : '' );
294
+ $is_default = false !== strpos( $avatar, 'avatar-default' ) || false !== strpos( $avatar, 'd=blank' );
295
+
296
+ if ( $avatar && ( ! $is_default || ! $options['avatar_hide_default'] ) ) {
297
+ $guest_author_data['avatar'] = $avatar;
298
+ }
299
+ }
300
+ if ( in_array( 'url', $fields, true ) ) {
301
+ $guest_author_data['url'] = esc_urL(
302
+ get_site_urL( null, '?author_name=' . get_post_meta( $guest_author->ID, 'cap-user_login', true ) )
303
+ );
304
+ }
305
+ if ( in_array( 'social', $fields, true ) ) {
306
+ $guest_author_data['social'] = $this->get_social( $guest_author->ID );
307
+ }
308
+
309
+ $acc[] = $guest_author_data;
310
+ }
311
+ return $acc;
312
+ },
313
+ []
314
+ ),
315
+ array_reduce(
316
+ $all_users,
317
+ function( $acc, $user ) use ( $fields, $options, &$linked_accounts ) {
318
+ if ( $user ) {
319
+ $is_linked = in_array( $user->data->user_login, $linked_accounts, true );
320
+
321
+ // If linked to a guest author, show only the guest author.
322
+ if ( $is_linked ) {
323
+ return $acc;
324
+ }
325
+
326
+ $last_name = get_user_meta( intval( $user->data->ID ), 'last_name', true );
327
+ $fallback_name = ! empty( $user->data->display_name ) ? $user->data->display_name : $user->data->user_login;
328
+ $user_data = [
329
+ 'id' => intval( $user->data->ID ),
330
+ 'registered' => $user->data->user_registered,
331
+ 'is_guest' => false,
332
+ 'last_name' => ! empty( $last_name ) && false !== strpos( $fallback_name, $last_name ) ? $last_name : $fallback_name,
333
+ ];
334
+
335
+ if ( in_array( 'login', $fields, true ) ) {
336
+ $user_data['login'] = $user->data->user_login;
337
+ }
338
+ if ( in_array( 'name', $fields, true ) ) {
339
+ $user_data['name'] = $user->data->display_name;
340
+ }
341
+ if ( in_array( 'bio', $fields, true ) ) {
342
+ $user_data['bio'] = get_the_author_meta( 'description', $user->data->ID );
343
+ }
344
+ if ( in_array( 'email', $fields, true ) ) {
345
+ $email_data = $this->get_email( $user->data->ID, false, $user->data->user_email );
346
+
347
+ if ( $email_data ) {
348
+ $user_data['email'] = $email_data;
349
+ }
350
+ }
351
+ if ( in_array( 'avatar', $fields, true ) ) {
352
+ $avatar = get_avatar( $user->data->ID, 256, $options['avatar_hide_default'] ? 'blank' : '' );
353
+ $is_default = false !== strpos( $avatar, 'avatar-default' ) || false !== strpos( $avatar, 'd=blank' );
354
+
355
+ if ( $avatar && ( ! $is_default || ! $options['avatar_hide_default'] ) ) {
356
+ $user_data['avatar'] = $avatar;
357
+ }
358
+ }
359
+ if ( in_array( 'url', $fields, true ) ) {
360
+ $user_data['url'] = esc_urL( get_author_posts_url( $user->data->ID ) );
361
+ }
362
+ if ( in_array( 'social', $fields, true ) ) {
363
+ $user_data['social'] = $this->get_social( $user->data->ID );
364
+ }
365
+
366
+ $acc[] = $user_data;
367
+ }
368
+ return $acc;
369
+ },
370
+ []
371
+ )
372
+ );
373
+
374
+ // Sort combined authors array by last name (or display name if none).
375
+ usort(
376
+ $combined_authors,
377
+ function( $a, $b ) {
378
+ return strcmp(
379
+ strtolower( $a['last_name'] ),
380
+ strtolower( $b['last_name'] )
381
+ );
382
+ }
383
+ );
384
+
385
+ return $combined_authors;
386
+ }
387
+ }