暫無描述

class-admin.php 51KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981
  1. <?php
  2. namespace um\admin;
  3. // Exit if accessed directly.
  4. if ( ! defined( 'ABSPATH' ) ) {
  5. exit;
  6. }
  7. if ( ! class_exists( 'um\admin\Admin' ) ) {
  8. /**
  9. * Class Admin
  10. * @package um\admin
  11. */
  12. class Admin extends Admin_Functions {
  13. /**
  14. * @var string
  15. */
  16. public $templates_path;
  17. /**
  18. * @var array
  19. */
  20. public $role_meta;
  21. /**
  22. * @var array
  23. */
  24. public $restriction_term_meta;
  25. /**
  26. * @var array
  27. */
  28. public $member_directory_meta;
  29. /**
  30. * @var array
  31. */
  32. public $form_meta;
  33. /**
  34. * @var array
  35. */
  36. public $builder_input;
  37. /**
  38. * @var array
  39. */
  40. public $restriction_post_meta;
  41. /**
  42. * Admin constructor.
  43. */
  44. public function __construct() {
  45. parent::__construct();
  46. $this->templates_path = um_path . 'includes/admin/templates/';
  47. add_action( 'admin_init', array( &$this, 'admin_init' ), 0 );
  48. $prefix = is_network_admin() ? 'network_admin_' : '';
  49. add_filter( "{$prefix}plugin_action_links_" . um_plugin, array( &$this, 'plugin_links' ) );
  50. add_action( 'um_admin_do_action__user_cache', array( &$this, 'user_cache' ) );
  51. add_action( 'um_admin_do_action__purge_temp', array( &$this, 'purge_temp' ) );
  52. add_action( 'um_admin_do_action__manual_upgrades_request', array( &$this, 'manual_upgrades_request' ) );
  53. add_action( 'um_admin_do_action__duplicate_form', array( &$this, 'duplicate_form' ) );
  54. add_action( 'um_admin_do_action__um_hide_locale_notice', array( &$this, 'um_hide_notice' ) );
  55. add_action( 'um_admin_do_action__um_can_register_notice', array( &$this, 'um_hide_notice' ) );
  56. add_action( 'um_admin_do_action__um_hide_exif_notice', array( &$this, 'um_hide_notice' ) );
  57. add_action( 'um_admin_do_action__user_action', array( &$this, 'user_action' ) );
  58. add_action( 'um_admin_do_action__install_core_pages', array( &$this, 'install_core_pages' ) );
  59. add_filter( 'admin_body_class', array( &$this, 'admin_body_class' ), 999 );
  60. add_action( 'parent_file', array( &$this, 'parent_file' ), 9 );
  61. add_filter( 'gettext', array( &$this, 'gettext' ), 10, 4 );
  62. add_filter( 'post_updated_messages', array( &$this, 'post_updated_messages' ) );
  63. }
  64. function init_variables() {
  65. $this->role_meta = apply_filters(
  66. 'um_role_meta_map',
  67. array(
  68. '_um_priority' => array(
  69. 'sanitize' => 'int',
  70. ),
  71. '_um_can_access_wpadmin' => array(
  72. 'sanitize' => 'bool',
  73. ),
  74. '_um_can_not_see_adminbar' => array(
  75. 'sanitize' => 'bool',
  76. ),
  77. '_um_can_edit_everyone' => array(
  78. 'sanitize' => 'bool',
  79. ),
  80. '_um_can_edit_roles' => array(
  81. 'sanitize' => array( $this, 'sanitize_existed_role' ),
  82. ),
  83. '_um_can_delete_everyone' => array(
  84. 'sanitize' => 'bool',
  85. ),
  86. '_um_can_delete_roles' => array(
  87. 'sanitize' => array( $this, 'sanitize_existed_role' ),
  88. ),
  89. '_um_can_edit_profile' => array(
  90. 'sanitize' => 'bool',
  91. ),
  92. '_um_can_delete_profile' => array(
  93. 'sanitize' => 'bool',
  94. ),
  95. '_um_can_view_all' => array(
  96. 'sanitize' => 'bool',
  97. ),
  98. '_um_can_view_roles' => array(
  99. 'sanitize' => array( $this, 'sanitize_existed_role' ),
  100. ),
  101. '_um_can_make_private_profile' => array(
  102. 'sanitize' => 'bool',
  103. ),
  104. '_um_can_access_private_profile' => array(
  105. 'sanitize' => 'bool',
  106. ),
  107. '_um_profile_noindex' => array(
  108. 'sanitize' => array( $this, 'sanitize_profile_noindex' ),
  109. ),
  110. '_um_default_homepage' => array(
  111. 'sanitize' => 'bool',
  112. ),
  113. '_um_redirect_homepage' => array(
  114. 'sanitize' => 'url',
  115. ),
  116. '_um_status' => array(
  117. 'sanitize' => 'sanitize_array_key',
  118. 'default' => 'approved',
  119. 'array' => array( 'approved', 'checkmail', 'pending' ),
  120. ),
  121. '_um_auto_approve_act' => array(
  122. 'sanitize' => 'sanitize_array_key',
  123. 'default' => 'redirect_profile',
  124. 'array' => array( 'redirect_profile', 'redirect_url' ),
  125. ),
  126. '_um_auto_approve_url' => array(
  127. 'sanitize' => 'url',
  128. ),
  129. '_um_login_email_activate' => array(
  130. 'sanitize' => 'bool',
  131. ),
  132. '_um_checkmail_action' => array(
  133. 'sanitize' => 'sanitize_array_key',
  134. 'default' => 'show_message',
  135. 'array' => array( 'show_message', 'redirect_url' ),
  136. ),
  137. '_um_checkmail_message' => array(
  138. 'sanitize' => 'textarea',
  139. ),
  140. '_um_checkmail_url' => array(
  141. 'sanitize' => 'url',
  142. ),
  143. '_um_url_email_activate' => array(
  144. 'sanitize' => 'url',
  145. ),
  146. '_um_pending_action' => array(
  147. 'sanitize' => 'sanitize_array_key',
  148. 'default' => 'show_message',
  149. 'array' => array( 'show_message', 'redirect_url' ),
  150. ),
  151. '_um_pending_message' => array(
  152. 'sanitize' => 'textarea',
  153. ),
  154. '_um_pending_url' => array(
  155. 'sanitize' => 'url',
  156. ),
  157. '_um_after_login' => array(
  158. 'sanitize' => 'sanitize_array_key',
  159. 'default' => 'redirect_profile',
  160. 'array' => array( 'redirect_profile', 'redirect_url', 'refresh', 'redirect_admin' ),
  161. ),
  162. '_um_login_redirect_url' => array(
  163. 'sanitize' => 'url',
  164. ),
  165. '_um_after_logout' => array(
  166. 'sanitize' => 'sanitize_array_key',
  167. 'default' => 'redirect_home',
  168. 'array' => array( 'redirect_home', 'redirect_url' ),
  169. ),
  170. '_um_logout_redirect_url' => array(
  171. 'sanitize' => 'url',
  172. ),
  173. '_um_after_delete' => array(
  174. 'sanitize' => 'sanitize_array_key',
  175. 'default' => 'redirect_home',
  176. 'array' => array( 'redirect_home', 'redirect_url' ),
  177. ),
  178. '_um_delete_redirect_url' => array(
  179. 'sanitize' => 'url',
  180. ),
  181. 'wp_capabilities' => array(
  182. 'sanitize' => array( $this, 'sanitize_wp_capabilities' ),
  183. ),
  184. )
  185. );
  186. $this->restriction_post_meta = apply_filters(
  187. 'um_restriction_post_meta_map',
  188. array(
  189. '_um_custom_access_settings' => array(
  190. 'sanitize' => 'bool',
  191. ),
  192. '_um_accessible' => array(
  193. 'sanitize' => 'int',
  194. ),
  195. '_um_access_roles' => array(
  196. 'sanitize' => array( $this, 'sanitize_restriction_existed_role' ),
  197. ),
  198. '_um_noaccess_action' => array(
  199. 'sanitize' => 'int',
  200. ),
  201. '_um_restrict_by_custom_message' => array(
  202. 'sanitize' => 'int',
  203. ),
  204. '_um_restrict_custom_message' => array(
  205. 'sanitize' => 'wp_kses',
  206. ),
  207. '_um_access_redirect' => array(
  208. 'sanitize' => 'int',
  209. ),
  210. '_um_access_redirect_url' => array(
  211. 'sanitize' => 'url',
  212. ),
  213. '_um_access_hide_from_queries' => array(
  214. 'sanitize' => 'bool',
  215. ),
  216. )
  217. );
  218. $this->restriction_term_meta = apply_filters(
  219. 'um_restriction_term_meta_map',
  220. array(
  221. '_um_custom_access_settings' => array(
  222. 'sanitize' => 'bool',
  223. ),
  224. '_um_accessible' => array(
  225. 'sanitize' => 'int',
  226. ),
  227. '_um_access_roles' => array(
  228. 'sanitize' => array( $this, 'sanitize_restriction_existed_role' ),
  229. ),
  230. '_um_noaccess_action' => array(
  231. 'sanitize' => 'int',
  232. ),
  233. '_um_restrict_by_custom_message' => array(
  234. 'sanitize' => 'int',
  235. ),
  236. '_um_restrict_custom_message' => array(
  237. 'sanitize' => 'wp_kses',
  238. ),
  239. '_um_access_redirect' => array(
  240. 'sanitize' => 'int',
  241. ),
  242. '_um_access_redirect_url' => array(
  243. 'sanitize' => 'url',
  244. ),
  245. '_um_access_hide_from_queries' => array(
  246. 'sanitize' => 'bool',
  247. ),
  248. )
  249. );
  250. $this->member_directory_meta = apply_filters(
  251. 'um_member_directory_meta_map',
  252. array(
  253. '_um_directory_template' => array(
  254. 'sanitize' => 'text',
  255. ),
  256. '_um_mode' => array(
  257. 'sanitize' => 'key',
  258. ),
  259. '_um_view_types' => array(
  260. 'sanitize' => array( $this, 'sanitize_md_view_types' ),
  261. ),
  262. '_um_default_view' => array(
  263. 'sanitize' => 'key',
  264. ),
  265. '_um_roles' => array(
  266. 'sanitize' => array( $this, 'sanitize_restriction_existed_role' ),
  267. ),
  268. '_um_has_profile_photo' => array(
  269. 'sanitize' => 'bool',
  270. ),
  271. '_um_show_these_users' => array(
  272. 'sanitize' => 'textarea',
  273. ),
  274. '_um_exclude_these_users' => array(
  275. 'sanitize' => 'textarea',
  276. ),
  277. '_um_must_search' => array(
  278. 'sanitize' => 'bool',
  279. ),
  280. '_um_max_users' => array(
  281. 'sanitize' => 'absint',
  282. ),
  283. '_um_profiles_per_page' => array(
  284. 'sanitize' => 'absint',
  285. ),
  286. '_um_profiles_per_page_mobile' => array(
  287. 'sanitize' => 'absint',
  288. ),
  289. '_um_directory_header' => array(
  290. 'sanitize' => 'text',
  291. ),
  292. '_um_directory_header_single' => array(
  293. 'sanitize' => 'text',
  294. ),
  295. '_um_directory_no_users' => array(
  296. 'sanitize' => 'text',
  297. ),
  298. '_um_profile_photo' => array(
  299. 'sanitize' => 'bool',
  300. ),
  301. '_um_cover_photos' => array(
  302. 'sanitize' => 'bool',
  303. ),
  304. '_um_show_name' => array(
  305. 'sanitize' => 'bool',
  306. ),
  307. '_um_show_tagline' => array(
  308. 'sanitize' => 'bool',
  309. ),
  310. '_um_tagline_fields' => array(
  311. 'sanitize' => array( $this, 'sanitize_user_field' ),
  312. ),
  313. '_um_show_userinfo' => array(
  314. 'sanitize' => 'bool',
  315. ),
  316. '_um_reveal_fields' => array(
  317. 'sanitize' => array( $this, 'sanitize_user_field' ),
  318. ),
  319. '_um_show_social' => array(
  320. 'sanitize' => 'bool',
  321. ),
  322. '_um_userinfo_animate' => array(
  323. 'sanitize' => 'bool',
  324. ),
  325. '_um_search' => array(
  326. 'sanitize' => 'bool',
  327. ),
  328. '_um_roles_can_search' => array(
  329. 'sanitize' => array( $this, 'sanitize_restriction_existed_role' ),
  330. ),
  331. '_um_filters' => array(
  332. 'sanitize' => 'bool',
  333. ),
  334. '_um_roles_can_filter' => array(
  335. 'sanitize' => array( $this, 'sanitize_restriction_existed_role' ),
  336. ),
  337. '_um_search_fields' => array(
  338. 'sanitize' => array( $this, 'sanitize_filter_fields' ),
  339. ),
  340. '_um_filters_expanded' => array(
  341. 'sanitize' => 'bool',
  342. ),
  343. '_um_filters_is_collapsible' => array(
  344. 'sanitize' => 'bool',
  345. ),
  346. '_um_search_filters' => array(
  347. 'sanitize' => array( $this, 'sanitize_filter_fields' ),
  348. ),
  349. '_um_sortby' => array(
  350. 'sanitize' => 'text',
  351. ),
  352. '_um_sortby_custom' => array(
  353. 'sanitize' => 'text',
  354. ),
  355. '_um_sortby_custom_label' => array(
  356. 'sanitize' => 'text',
  357. ),
  358. '_um_enable_sorting' => array(
  359. 'sanitize' => 'bool',
  360. ),
  361. '_um_sorting_fields' => array(
  362. 'sanitize' => array( $this, 'sanitize_md_sorting_fields' ),
  363. ),
  364. )
  365. );
  366. $this->form_meta = apply_filters(
  367. 'um_form_meta_map',
  368. array(
  369. '_um_mode' => array(
  370. 'sanitize' => 'key',
  371. ),
  372. '_um_register_use_gdpr' => array(
  373. 'sanitize' => 'bool',
  374. ),
  375. '_um_register_use_gdpr_content_id' => array(
  376. 'sanitize' => 'absint',
  377. ),
  378. '_um_register_use_gdpr_toggle_show' => array(
  379. 'sanitize' => 'text',
  380. ),
  381. '_um_register_use_gdpr_toggle_hide' => array(
  382. 'sanitize' => 'text',
  383. ),
  384. '_um_register_use_gdpr_agreement' => array(
  385. 'sanitize' => 'text',
  386. ),
  387. '_um_register_use_gdpr_error_text' => array(
  388. 'sanitize' => 'text',
  389. ),
  390. '_um_register_use_custom_settings' => array(
  391. 'sanitize' => 'bool',
  392. ),
  393. '_um_register_role' => array(
  394. 'sanitize' => 'key',
  395. ),
  396. '_um_register_template' => array(
  397. 'sanitize' => 'text',
  398. ),
  399. '_um_register_max_width' => array(
  400. 'sanitize' => 'text',
  401. ),
  402. '_um_register_icons' => array(
  403. 'sanitize' => 'key',
  404. ),
  405. '_um_register_primary_btn_word' => array(
  406. 'sanitize' => 'text',
  407. ),
  408. '_um_register_secondary_btn' => array(
  409. 'sanitize' => 'bool',
  410. ),
  411. '_um_register_secondary_btn_word' => array(
  412. 'sanitize' => 'text',
  413. ),
  414. '_um_login_after_login' => array(
  415. 'sanitize' => 'key',
  416. ),
  417. '_um_login_redirect_url' => array(
  418. 'sanitize' => 'url',
  419. ),
  420. '_um_login_use_custom_settings' => array(
  421. 'sanitize' => 'bool',
  422. ),
  423. '_um_login_template' => array(
  424. 'sanitize' => 'text',
  425. ),
  426. '_um_login_max_width' => array(
  427. 'sanitize' => 'text',
  428. ),
  429. '_um_login_icons' => array(
  430. 'sanitize' => 'key',
  431. ),
  432. '_um_login_primary_btn_word' => array(
  433. 'sanitize' => 'text',
  434. ),
  435. '_um_login_secondary_btn' => array(
  436. 'sanitize' => 'bool',
  437. ),
  438. '_um_login_secondary_btn_word' => array(
  439. 'sanitize' => 'text',
  440. ),
  441. '_um_login_forgot_pass_link' => array(
  442. 'sanitize' => 'bool',
  443. ),
  444. '_um_login_show_rememberme' => array(
  445. 'sanitize' => 'bool',
  446. ),
  447. '_um_profile_metafields' => array(
  448. 'sanitize' => array( $this, 'sanitize_user_field' ),
  449. ),
  450. '_um_profile_use_custom_settings' => array(
  451. 'sanitize' => 'bool',
  452. ),
  453. '_um_profile_role' => array(
  454. 'sanitize' => array( $this, 'sanitize_existed_role' ),
  455. ),
  456. '_um_profile_template' => array(
  457. 'sanitize' => 'text',
  458. ),
  459. '_um_profile_max_width' => array(
  460. 'sanitize' => 'text',
  461. ),
  462. '_um_profile_area_max_width' => array(
  463. 'sanitize' => 'text',
  464. ),
  465. '_um_profile_icons' => array(
  466. 'sanitize' => 'key',
  467. ),
  468. '_um_profile_primary_btn_word' => array(
  469. 'sanitize' => 'text',
  470. ),
  471. '_um_profile_secondary_btn' => array(
  472. 'sanitize' => 'bool',
  473. ),
  474. '_um_profile_secondary_btn_word' => array(
  475. 'sanitize' => 'text',
  476. ),
  477. '_um_profile_cover_enabled' => array(
  478. 'sanitize' => 'bool',
  479. ),
  480. '_um_profile_coversize' => array(
  481. 'sanitize' => 'absint',
  482. ),
  483. '_um_profile_cover_ratio' => array(
  484. 'sanitize' => 'text',
  485. ),
  486. '_um_profile_disable_photo_upload' => array(
  487. 'sanitize' => 'bool',
  488. ),
  489. '_um_profile_photosize' => array(
  490. 'sanitize' => array( $this, 'sanitize_photosize' ),
  491. ),
  492. '_um_profile_photo_required' => array(
  493. 'sanitize' => 'bool',
  494. ),
  495. '_um_profile_show_name' => array(
  496. 'sanitize' => 'bool',
  497. ),
  498. '_um_profile_show_social_links' => array(
  499. 'sanitize' => 'bool',
  500. ),
  501. '_um_profile_show_bio' => array(
  502. 'sanitize' => 'bool',
  503. ),
  504. )
  505. );
  506. $this->builder_input = apply_filters(
  507. 'um_builder_input_map',
  508. array(
  509. '_in_row' => array(
  510. 'sanitize' => 'key',
  511. ),
  512. '_in_sub_row' => array(
  513. 'sanitize' => 'absint',
  514. ),
  515. '_in_column' => array(
  516. 'sanitize' => 'absint',
  517. ),
  518. '_in_group' => array(
  519. 'sanitize' => 'absint',
  520. ),
  521. '_visibility' => array(
  522. 'sanitize' => 'key',
  523. ),
  524. '_conditional_action' => array(
  525. 'sanitize' => 'key',
  526. ),
  527. '_conditional_action1' => array(
  528. 'sanitize' => 'key',
  529. ),
  530. '_conditional_action2' => array(
  531. 'sanitize' => 'key',
  532. ),
  533. '_conditional_action3' => array(
  534. 'sanitize' => 'key',
  535. ),
  536. '_conditional_action4' => array(
  537. 'sanitize' => 'key',
  538. ),
  539. '_conditional_field' => array(
  540. 'sanitize' => 'text',
  541. ),
  542. '_conditional_field1' => array(
  543. 'sanitize' => 'text',
  544. ),
  545. '_conditional_field2' => array(
  546. 'sanitize' => 'text',
  547. ),
  548. '_conditional_field3' => array(
  549. 'sanitize' => 'text',
  550. ),
  551. '_conditional_field4' => array(
  552. 'sanitize' => 'text',
  553. ),
  554. '_conditional_operator' => array(
  555. 'sanitize' => 'text',
  556. ),
  557. '_conditional_operator1' => array(
  558. 'sanitize' => 'text',
  559. ),
  560. '_conditional_operator2' => array(
  561. 'sanitize' => 'text',
  562. ),
  563. '_conditional_operator3' => array(
  564. 'sanitize' => 'text',
  565. ),
  566. '_conditional_operator4' => array(
  567. 'sanitize' => 'text',
  568. ),
  569. '_conditional_value' => array(
  570. 'sanitize' => 'text',
  571. ),
  572. '_conditional_value1' => array(
  573. 'sanitize' => 'text',
  574. ),
  575. '_conditional_value2' => array(
  576. 'sanitize' => 'text',
  577. ),
  578. '_conditional_value3' => array(
  579. 'sanitize' => 'text',
  580. ),
  581. '_conditional_value4' => array(
  582. 'sanitize' => 'text',
  583. ),
  584. '_validate' => array(
  585. 'sanitize' => 'key',
  586. ),
  587. '_custom_validate' => array(
  588. 'sanitize' => 'text',
  589. ),
  590. '_icon' => array(
  591. 'sanitize' => 'key',
  592. ),
  593. '_css_class' => array(
  594. 'sanitize' => 'text',
  595. ),
  596. '_width' => array(
  597. 'sanitize' => 'absint',
  598. ),
  599. '_divider_text' => array(
  600. 'sanitize' => 'text',
  601. ),
  602. '_padding' => array(
  603. 'sanitize' => 'text',
  604. ),
  605. '_margin' => array(
  606. 'sanitize' => 'text',
  607. ),
  608. '_border' => array(
  609. 'sanitize' => 'text',
  610. ),
  611. '_borderstyle' => array(
  612. 'sanitize' => 'key',
  613. ),
  614. '_borderradius' => array(
  615. 'sanitize' => 'text',
  616. ),
  617. '_bordercolor' => array(
  618. 'sanitize' => 'text',
  619. ),
  620. '_heading' => array(
  621. 'sanitize' => 'bool',
  622. ),
  623. '_heading_text' => array(
  624. 'sanitize' => 'text',
  625. ),
  626. '_background' => array(
  627. 'sanitize' => 'text',
  628. ),
  629. '_heading_background_color' => array(
  630. 'sanitize' => 'text',
  631. ),
  632. '_heading_text_color' => array(
  633. 'sanitize' => 'text',
  634. ),
  635. '_text_color' => array(
  636. 'sanitize' => 'text',
  637. ),
  638. '_icon_color' => array(
  639. 'sanitize' => 'text',
  640. ),
  641. '_color' => array(
  642. 'sanitize' => 'text',
  643. ),
  644. '_url_text' => array(
  645. 'sanitize' => 'text',
  646. ),
  647. '_url_target' => array(
  648. 'sanitize' => 'key',
  649. ),
  650. '_url_rel' => array(
  651. 'sanitize' => 'key',
  652. ),
  653. '_force_good_pass' => array(
  654. 'sanitize' => 'bool',
  655. ),
  656. '_force_confirm_pass' => array(
  657. 'sanitize' => 'bool',
  658. ),
  659. '_style' => array(
  660. 'sanitize' => 'key',
  661. ),
  662. '_intervals' => array(
  663. 'sanitize' => 'absint',
  664. ),
  665. '_format' => array(
  666. 'sanitize' => 'text',
  667. ),
  668. '_format_custom' => array(
  669. 'sanitize' => 'text',
  670. ),
  671. '_pretty_format' => array(
  672. 'sanitize' => 'bool',
  673. ),
  674. '_disabled_weekdays' => array(
  675. 'sanitize' => 'absint',
  676. ),
  677. '_years' => array(
  678. 'sanitize' => 'absint',
  679. ),
  680. '_years_x' => array(
  681. 'sanitize' => 'key',
  682. ),
  683. '_range_start' => array(
  684. 'sanitize' => 'text',
  685. ),
  686. '_range_end' => array(
  687. 'sanitize' => 'text',
  688. ),
  689. '_range' => array(
  690. 'sanitize' => 'key',
  691. ),
  692. '_content' => array(
  693. 'sanitize' => 'textarea',
  694. ),
  695. '_crop' => array(
  696. 'sanitize' => 'int',
  697. ),
  698. '_allowed_types' => array(
  699. 'sanitize' => 'key',
  700. ),
  701. '_upload_text' => array(
  702. 'sanitize' => 'text',
  703. ),
  704. '_upload_help_text' => array(
  705. 'sanitize' => 'text',
  706. ),
  707. '_button_text' => array(
  708. 'sanitize' => 'text',
  709. ),
  710. '_max_size' => array(
  711. 'sanitize' => 'absint',
  712. ),
  713. '_height' => array(
  714. 'sanitize' => 'text',
  715. ),
  716. '_spacing' => array(
  717. 'sanitize' => 'text',
  718. ),
  719. '_is_multi' => array(
  720. 'sanitize' => 'bool',
  721. ),
  722. '_max_selections' => array(
  723. 'sanitize' => 'absint',
  724. ),
  725. '_min_selections' => array(
  726. 'sanitize' => 'absint',
  727. ),
  728. '_max_entries' => array(
  729. 'sanitize' => 'absint',
  730. ),
  731. '_max_words' => array(
  732. 'sanitize' => 'absint',
  733. ),
  734. '_min' => array(
  735. 'sanitize' => 'empty_int',
  736. ),
  737. '_max' => array(
  738. 'sanitize' => 'empty_int',
  739. ),
  740. '_min_chars' => array(
  741. 'sanitize' => 'absint',
  742. ),
  743. '_max_chars' => array(
  744. 'sanitize' => 'absint',
  745. ),
  746. '_html' => array(
  747. 'sanitize' => 'bool',
  748. ),
  749. '_options' => array(
  750. 'sanitize' => 'textarea',
  751. ),
  752. '_title' => array(
  753. 'sanitize' => 'text',
  754. ),
  755. '_id' => array(
  756. 'sanitize' => 'text',
  757. ),
  758. '_metakey' => array(
  759. 'sanitize' => 'text',
  760. ),
  761. '_help' => array(
  762. 'sanitize' => 'text',
  763. ),
  764. '_default' => array(
  765. 'sanitize' => 'text',
  766. ),
  767. '_label' => array(
  768. 'sanitize' => 'text',
  769. ),
  770. '_label_confirm_pass' => array(
  771. 'sanitize' => 'text',
  772. ),
  773. '_placeholder' => array(
  774. 'sanitize' => 'text',
  775. ),
  776. '_public' => array(
  777. 'sanitize' => 'text',
  778. ),
  779. '_roles' => array(
  780. 'sanitize' => array( $this, 'sanitize_existed_role' ),
  781. ),
  782. '_required' => array(
  783. 'sanitize' => 'bool',
  784. ),
  785. '_editable' => array(
  786. 'sanitize' => 'bool',
  787. ),
  788. '_number' => array(
  789. 'sanitize' => 'absint',
  790. ),
  791. '_custom_dropdown_options_source' => array(
  792. 'sanitize' => 'text',
  793. ),
  794. '_parent_dropdown_relationship' => array(
  795. 'sanitize' => 'text',
  796. ),
  797. )
  798. );
  799. }
  800. /**
  801. * @param array|string $value
  802. *
  803. * @return array|string
  804. */
  805. public function sanitize_md_sorting_fields( $value ) {
  806. $filter_fields = array_merge( UM()->member_directory()->sort_fields, array( 'other' => __( 'Other (Custom Field)', 'ultimate-member' ) ) );
  807. $filter_fields = array_keys( $filter_fields );
  808. if ( '' !== $value ) {
  809. $value = array_filter(
  810. $value,
  811. function( $v, $k ) use ( $filter_fields ) {
  812. if ( 'other_data' === $k ) {
  813. return true;
  814. } else {
  815. return in_array( sanitize_text_field( $v ), $filter_fields, true );
  816. }
  817. },
  818. ARRAY_FILTER_USE_BOTH
  819. );
  820. $value = array_map(
  821. function( $item ) {
  822. if ( is_array( $item ) ) {
  823. if ( isset( $item['meta_key'] ) ) {
  824. $item['meta_key'] = sanitize_text_field( $item['meta_key'] );
  825. }
  826. if ( isset( $item['label'] ) ) {
  827. $item['label'] = sanitize_text_field( $item['label'] );
  828. }
  829. return $item;
  830. } else {
  831. return sanitize_text_field( $item );
  832. }
  833. },
  834. $value
  835. );
  836. }
  837. return $value;
  838. }
  839. /**
  840. * @param array|string $value
  841. *
  842. * @return array|string
  843. */
  844. public function sanitize_filter_fields( $value ) {
  845. $filter_fields = array_keys( UM()->member_directory()->filter_fields );
  846. if ( '' !== $value ) {
  847. $value = array_filter(
  848. $value,
  849. function( $v, $k ) use ( $filter_fields ) {
  850. return in_array( sanitize_text_field( $v ), $filter_fields, true );
  851. },
  852. ARRAY_FILTER_USE_BOTH
  853. );
  854. $value = array_map( 'sanitize_text_field', $value );
  855. }
  856. return $value;
  857. }
  858. /**
  859. * @param array|string $value
  860. *
  861. * @return array|string
  862. */
  863. public function sanitize_user_field( $value ) {
  864. $user_fields = array_keys( UM()->builtin()->all_user_fields() );
  865. if ( '' !== $value ) {
  866. $value = array_filter(
  867. $value,
  868. function( $v, $k ) use ( $user_fields ) {
  869. return in_array( sanitize_text_field( $v ), $user_fields, true );
  870. },
  871. ARRAY_FILTER_USE_BOTH
  872. );
  873. $value = array_map( 'sanitize_text_field', $value );
  874. }
  875. return $value;
  876. }
  877. /**
  878. * @param array|string $value
  879. *
  880. * @return array|string
  881. */
  882. public function sanitize_md_view_types( $value ) {
  883. $view_types = array_map(
  884. function ( $item ) {
  885. return $item['title'];
  886. },
  887. UM()->member_directory()->view_types
  888. );
  889. $view_types = array_keys( $view_types );
  890. if ( '' !== $value ) {
  891. $value = array_filter(
  892. $value,
  893. function( $v, $k ) use ( $view_types ) {
  894. return in_array( sanitize_key( $k ), $view_types, true ) && 1 === (int) $v;
  895. },
  896. ARRAY_FILTER_USE_BOTH
  897. );
  898. $value = array_map( 'sanitize_key', $value );
  899. }
  900. return $value;
  901. }
  902. /**
  903. * @param array|string $value
  904. *
  905. * @return array|string
  906. */
  907. public function sanitize_photosize( $value ) {
  908. $sizes = UM()->files()->get_profile_photo_size( 'photo_thumb_sizes' );
  909. $sizes = array_keys( $sizes );
  910. if ( '' !== $value ) {
  911. $value = in_array( absint( $value ), $sizes, true ) ? absint( $value ) : '';
  912. }
  913. return $value;
  914. }
  915. /**
  916. * @param array|string $value
  917. *
  918. * @return array|string
  919. */
  920. public function sanitize_cover_photosize( $value ) {
  921. $sizes = UM()->files()->get_profile_photo_size( 'cover_thumb_sizes' );
  922. $sizes = array_keys( $sizes );
  923. if ( '' !== $value ) {
  924. $value = in_array( absint( $value ), $sizes, true ) ? absint( $value ) : '';
  925. }
  926. return $value;
  927. }
  928. /**
  929. * @param array|string $value
  930. *
  931. * @return array|string
  932. */
  933. public function sanitize_restriction_existed_role( $value ) {
  934. $all_roles = array_keys( UM()->roles()->get_roles() );
  935. if ( '' !== $value ) {
  936. $value = array_filter(
  937. $value,
  938. function( $v, $k ) use ( $all_roles ) {
  939. return in_array( sanitize_key( $k ), $all_roles, true ) && 1 === (int) $v;
  940. },
  941. ARRAY_FILTER_USE_BOTH
  942. );
  943. $value = array_map( 'sanitize_key', $value );
  944. }
  945. return $value;
  946. }
  947. /**
  948. * @param array|string $value
  949. *
  950. * @return array|string
  951. */
  952. public function sanitize_existed_role( $value ) {
  953. $all_roles = array_keys( UM()->roles()->get_roles() );
  954. if ( '' !== $value ) {
  955. $value = array_filter(
  956. $value,
  957. function( $v, $k ) use ( $all_roles ) {
  958. return in_array( sanitize_key( $v ), $all_roles, true );
  959. },
  960. ARRAY_FILTER_USE_BOTH
  961. );
  962. $value = array_map( 'sanitize_key', $value );
  963. }
  964. return $value;
  965. }
  966. /**
  967. * @param array|string $value
  968. *
  969. * @return array|string
  970. */
  971. public function sanitize_tabs_privacy( $value ) {
  972. $all_privacy = array_keys( UM()->profile()->tabs_privacy() );
  973. if ( '' !== $value ) {
  974. $value = in_array( absint( $value ), $all_privacy, true ) ? absint( $value ) : '';
  975. }
  976. return $value;
  977. }
  978. /**
  979. * @param $value
  980. *
  981. * @return bool|string
  982. */
  983. public function sanitize_profile_noindex( $value ) {
  984. $value = '' !== $value ? (bool) $value : $value;
  985. return $value;
  986. }
  987. /**
  988. * @param $value
  989. *
  990. * @return array
  991. */
  992. public function sanitize_wp_capabilities( $value ) {
  993. $value = array_map( 'boolval', array_filter( $value ) );
  994. return $value;
  995. }
  996. /**
  997. * Sanitize role meta fields when wp-admin form has been submitted
  998. *
  999. * @param array $data
  1000. *
  1001. * @return array
  1002. */
  1003. public function sanitize_role_meta( $data ) {
  1004. $sanitized = array();
  1005. foreach ( $data as $k => $v ) {
  1006. if ( ! array_key_exists( $k, $this->role_meta ) ) {
  1007. // @todo remove since 2.2.x and leave only continue
  1008. $sanitized[ $k ] = $v;
  1009. continue;
  1010. }
  1011. if ( ! array_key_exists( 'sanitize', $this->role_meta[ $k ] ) ) {
  1012. // @todo remove since 2.2.x and leave only continue
  1013. $sanitized[ $k ] = $v;
  1014. continue;
  1015. }
  1016. if ( is_callable( $this->role_meta[ $k ]['sanitize'], true, $callable_name ) ) {
  1017. add_filter( 'um_role_meta_sanitize_' . $k, $this->role_meta[ $k ]['sanitize'], 10, 1 );
  1018. }
  1019. switch ( $this->role_meta[ $k ]['sanitize'] ) {
  1020. default:
  1021. $sanitized[ $k ] = apply_filters( 'um_role_meta_sanitize_' . $k, $data[ $k ] );
  1022. break;
  1023. case 'int':
  1024. $sanitized[ $k ] = (int) $v;
  1025. break;
  1026. case 'bool':
  1027. $sanitized[ $k ] = (bool) $v;
  1028. break;
  1029. case 'url':
  1030. $sanitized[ $k ] = esc_url_raw( $v );
  1031. break;
  1032. case 'textarea':
  1033. $sanitized[ $k ] = sanitize_textarea_field( $v );
  1034. break;
  1035. case 'sanitize_array_key':
  1036. if ( ! array_key_exists( 'default', $this->role_meta[ $k ] ) || ! array_key_exists( 'array', $this->role_meta[ $k ] ) ) {
  1037. continue 2;
  1038. }
  1039. $sanitized[ $k ] = ! in_array( sanitize_key( $v ), $this->role_meta[ $k ]['array'], true ) ? $this->role_meta[ $k ]['default'] : sanitize_key( $v );
  1040. break;
  1041. }
  1042. }
  1043. $data = $sanitized;
  1044. $data = apply_filters( 'um_save_role_meta_sanitize', $data );
  1045. return $data;
  1046. }
  1047. /**
  1048. * Sanitize post restriction meta fields when wp-admin form has been submitted
  1049. *
  1050. * @param array $data
  1051. *
  1052. * @return array
  1053. */
  1054. public function sanitize_post_restriction_meta( $data ) {
  1055. $sanitized = array();
  1056. foreach ( $data as $k => $v ) {
  1057. if ( ! array_key_exists( $k, $this->restriction_post_meta ) ) {
  1058. // @todo remove since 2.2.x and leave only continue
  1059. $sanitized[ $k ] = $v;
  1060. continue;
  1061. }
  1062. if ( ! array_key_exists( 'sanitize', $this->restriction_post_meta[ $k ] ) ) {
  1063. // @todo remove since 2.2.x and leave only continue
  1064. $sanitized[ $k ] = $v;
  1065. continue;
  1066. }
  1067. if ( is_callable( $this->restriction_post_meta[ $k ]['sanitize'], true, $callable_name ) ) {
  1068. add_filter( 'um_restriction_post_meta_sanitize_' . $k, $this->restriction_post_meta[ $k ]['sanitize'], 10, 1 );
  1069. }
  1070. switch ( $this->restriction_post_meta[ $k ]['sanitize'] ) {
  1071. default:
  1072. $sanitized[ $k ] = apply_filters( 'um_restriction_post_meta_sanitize_' . $k, $data[ $k ] );
  1073. break;
  1074. case 'int':
  1075. $sanitized[ $k ] = (int) $v;
  1076. break;
  1077. case 'bool':
  1078. $sanitized[ $k ] = (bool) $v;
  1079. break;
  1080. case 'url':
  1081. $sanitized[ $k ] = esc_url_raw( $v );
  1082. break;
  1083. case 'textarea':
  1084. $sanitized[ $k ] = sanitize_textarea_field( $v );
  1085. break;
  1086. case 'wp_kses':
  1087. $sanitized[ $k ] = wp_kses_post( $v );
  1088. break;
  1089. }
  1090. }
  1091. $data = $sanitized;
  1092. $data = apply_filters( 'um_save_restriction_post_meta_sanitize', $data );
  1093. return $data;
  1094. }
  1095. /**
  1096. * Sanitize term restriction meta fields when wp-admin form has been submitted
  1097. *
  1098. * @param array $data
  1099. *
  1100. * @return array
  1101. */
  1102. public function sanitize_term_restriction_meta( $data ) {
  1103. $sanitized = array();
  1104. foreach ( $data as $k => $v ) {
  1105. if ( ! array_key_exists( $k, $this->restriction_term_meta ) ) {
  1106. // @todo remove since 2.2.x and leave only continue
  1107. $sanitized[ $k ] = $v;
  1108. continue;
  1109. }
  1110. if ( ! array_key_exists( 'sanitize', $this->restriction_term_meta[ $k ] ) ) {
  1111. // @todo remove since 2.2.x and leave only continue
  1112. $sanitized[ $k ] = $v;
  1113. continue;
  1114. }
  1115. if ( is_callable( $this->restriction_term_meta[ $k ]['sanitize'], true, $callable_name ) ) {
  1116. add_filter( 'um_restriction_term_meta_sanitize_' . $k, $this->restriction_term_meta[ $k ]['sanitize'], 10, 1 );
  1117. }
  1118. switch ( $this->restriction_term_meta[ $k ]['sanitize'] ) {
  1119. default:
  1120. $sanitized[ $k ] = apply_filters( 'um_restriction_term_meta_sanitize_' . $k, $data[ $k ] );
  1121. break;
  1122. case 'int':
  1123. $sanitized[ $k ] = (int) $v;
  1124. break;
  1125. case 'bool':
  1126. $sanitized[ $k ] = (bool) $v;
  1127. break;
  1128. case 'url':
  1129. $sanitized[ $k ] = esc_url_raw( $v );
  1130. break;
  1131. case 'textarea':
  1132. $sanitized[ $k ] = sanitize_textarea_field( $v );
  1133. break;
  1134. case 'wp_kses':
  1135. $sanitized[ $k ] = wp_kses_post( $v );
  1136. break;
  1137. }
  1138. }
  1139. $data = $sanitized;
  1140. $data = apply_filters( 'um_save_restriction_term_meta_sanitize', $data );
  1141. return $data;
  1142. }
  1143. /**
  1144. * Sanitize member directory meta when wp-admin form has been submitted
  1145. *
  1146. * @todo checking all sanitize types
  1147. *
  1148. * @param array $data
  1149. *
  1150. * @return array
  1151. */
  1152. public function sanitize_member_directory_meta( $data ) {
  1153. $sanitized = array();
  1154. foreach ( $data as $k => $v ) {
  1155. if ( ! array_key_exists( $k, $this->member_directory_meta ) ) {
  1156. // @todo remove since 2.2.x and leave only continue
  1157. $sanitized[ $k ] = $v;
  1158. continue;
  1159. }
  1160. if ( ! array_key_exists( 'sanitize', $this->member_directory_meta[ $k ] ) ) {
  1161. // @todo remove since 2.2.x and leave only continue
  1162. $sanitized[ $k ] = $v;
  1163. continue;
  1164. }
  1165. if ( is_callable( $this->member_directory_meta[ $k ]['sanitize'], true, $callable_name ) ) {
  1166. add_filter( 'um_member_directory_meta_sanitize_' . $k, $this->member_directory_meta[ $k ]['sanitize'], 10, 1 );
  1167. }
  1168. switch ( $this->member_directory_meta[ $k ]['sanitize'] ) {
  1169. default:
  1170. $sanitized[ $k ] = apply_filters( 'um_member_directory_meta_sanitize_' . $k, $data[ $k ] );
  1171. break;
  1172. case 'int':
  1173. $sanitized[ $k ] = (int) $v;
  1174. break;
  1175. case 'bool':
  1176. $sanitized[ $k ] = (bool) $v;
  1177. break;
  1178. case 'url':
  1179. if ( is_array( $v ) ) {
  1180. $sanitized[ $k ] = array_map( 'esc_url_raw', $v );
  1181. } else {
  1182. $sanitized[ $k ] = esc_url_raw( $v );
  1183. }
  1184. break;
  1185. case 'text':
  1186. $sanitized[ $k ] = sanitize_text_field( $v );
  1187. break;
  1188. case 'textarea':
  1189. $sanitized[ $k ] = sanitize_textarea_field( $v );
  1190. break;
  1191. case 'key':
  1192. if ( is_array( $v ) ) {
  1193. $sanitized[ $k ] = array_map( 'sanitize_key', $v );
  1194. } else {
  1195. $sanitized[ $k ] = sanitize_key( $v );
  1196. }
  1197. break;
  1198. case 'absint':
  1199. if ( is_array( $v ) ) {
  1200. $sanitized[ $k ] = array_map( 'absint', $v );
  1201. } else {
  1202. $sanitized[ $k ] = absint( $v );
  1203. }
  1204. break;
  1205. }
  1206. }
  1207. $data = $sanitized;
  1208. $data = apply_filters( 'um_save_member_directory_meta_sanitize', $data );
  1209. return $data;
  1210. }
  1211. /**
  1212. * Sanitize builder field meta when wp-admin form has been submitted
  1213. *
  1214. * @todo checking all sanitize types
  1215. *
  1216. * @param array $data
  1217. *
  1218. * @return array
  1219. */
  1220. public function sanitize_builder_field_meta( $data ) {
  1221. $sanitized = array();
  1222. foreach ( $data as $k => $v ) {
  1223. if ( ! array_key_exists( $k, $this->builder_input ) ) {
  1224. // @todo remove since 2.2.x and leave only continue
  1225. $sanitized[ $k ] = $v;
  1226. continue;
  1227. }
  1228. if ( ! array_key_exists( 'sanitize', $this->builder_input[ $k ] ) ) {
  1229. // @todo remove since 2.2.x and leave only continue
  1230. $sanitized[ $k ] = $v;
  1231. continue;
  1232. }
  1233. if ( is_callable( $this->builder_input[ $k ]['sanitize'], true, $callable_name ) ) {
  1234. add_filter( 'um_builder_input_sanitize_' . $k, $this->builder_input[ $k ]['sanitize'], 10, 1 );
  1235. }
  1236. switch ( $this->builder_input[ $k ]['sanitize'] ) {
  1237. default:
  1238. $sanitized[ $k ] = apply_filters( 'um_builder_input_sanitize_' . $k, $data[ $k ] );
  1239. break;
  1240. case 'int':
  1241. $sanitized[ $k ] = (int) $v;
  1242. break;
  1243. case 'empty_int':
  1244. $sanitized[ $k ] = ( '' !== $v ) ? (int) $v : '';
  1245. break;
  1246. case 'bool':
  1247. $sanitized[ $k ] = (bool) $v;
  1248. break;
  1249. case 'url':
  1250. if ( is_array( $v ) ) {
  1251. $sanitized[ $k ] = array_map( 'esc_url_raw', $v );
  1252. } else {
  1253. $sanitized[ $k ] = esc_url_raw( $v );
  1254. }
  1255. break;
  1256. case 'text':
  1257. $sanitized[ $k ] = sanitize_text_field( $v );
  1258. break;
  1259. case 'textarea':
  1260. $sanitized[ $k ] = sanitize_textarea_field( $v );
  1261. break;
  1262. case 'wp_kses':
  1263. $sanitized[ $k ] = wp_kses_post( $v );
  1264. break;
  1265. case 'key':
  1266. if ( is_array( $v ) ) {
  1267. $sanitized[ $k ] = array_map( 'sanitize_key', $v );
  1268. } else {
  1269. $sanitized[ $k ] = sanitize_key( $v );
  1270. }
  1271. break;
  1272. case 'absint':
  1273. if ( is_array( $v ) ) {
  1274. $sanitized[ $k ] = array_map( 'absint', $v );
  1275. } else {
  1276. $sanitized[ $k ] = absint( $v );
  1277. }
  1278. break;
  1279. case 'empty_absint':
  1280. if ( is_array( $v ) ) {
  1281. $sanitized[ $k ] = array_map( 'absint', $v );
  1282. } else {
  1283. $sanitized[ $k ] = ( '' !== $v ) ? absint( $v ) : '';
  1284. }
  1285. break;
  1286. }
  1287. }
  1288. $data = $sanitized;
  1289. $data = apply_filters( 'um_save_builder_input_sanitize', $data );
  1290. return $data;
  1291. }
  1292. /**
  1293. * Sanitize form meta when wp-admin form has been submitted
  1294. *
  1295. * @todo checking all sanitize types
  1296. *
  1297. * @param array $data
  1298. *
  1299. * @return array
  1300. */
  1301. public function sanitize_form_meta( $data ) {
  1302. $sanitized = array();
  1303. foreach ( $data as $k => $v ) {
  1304. if ( ! array_key_exists( $k, $this->form_meta ) ) {
  1305. // @todo remove since 2.2.x and leave only continue
  1306. $sanitized[ $k ] = $v;
  1307. continue;
  1308. }
  1309. if ( ! array_key_exists( 'sanitize', $this->form_meta[ $k ] ) ) {
  1310. // @todo remove since 2.2.x and leave only continue
  1311. $sanitized[ $k ] = $v;
  1312. continue;
  1313. }
  1314. if ( is_callable( $this->form_meta[ $k ]['sanitize'], true, $callable_name ) ) {
  1315. add_filter( 'um_form_meta_sanitize_' . $k, $this->form_meta[ $k ]['sanitize'], 10, 1 );
  1316. }
  1317. switch ( $this->form_meta[ $k ]['sanitize'] ) {
  1318. default:
  1319. $sanitized[ $k ] = apply_filters( 'um_form_meta_sanitize_' . $k, $data[ $k ] );
  1320. break;
  1321. case 'int':
  1322. $sanitized[ $k ] = (int) $v;
  1323. break;
  1324. case 'bool':
  1325. $sanitized[ $k ] = (bool) $v;
  1326. break;
  1327. case 'url':
  1328. if ( is_array( $v ) ) {
  1329. $sanitized[ $k ] = array_map( 'esc_url_raw', $v );
  1330. } else {
  1331. $sanitized[ $k ] = esc_url_raw( $v );
  1332. }
  1333. break;
  1334. case 'text':
  1335. $sanitized[ $k ] = sanitize_text_field( $v );
  1336. break;
  1337. case 'textarea':
  1338. $sanitized[ $k ] = sanitize_textarea_field( $v );
  1339. break;
  1340. case 'key':
  1341. if ( is_array( $v ) ) {
  1342. $sanitized[ $k ] = array_map( 'sanitize_key', $v );
  1343. } else {
  1344. $sanitized[ $k ] = sanitize_key( $v );
  1345. }
  1346. break;
  1347. case 'absint':
  1348. if ( is_array( $v ) ) {
  1349. $sanitized[ $k ] = array_map( 'absint', $v );
  1350. } else {
  1351. $sanitized[ $k ] = absint( $v );
  1352. }
  1353. break;
  1354. }
  1355. }
  1356. $data = $sanitized;
  1357. $data = apply_filters( 'um_save_form_meta_sanitize', $data );
  1358. return $data;
  1359. }
  1360. /**
  1361. * Sanitize options when wp-admin form has been submitted
  1362. *
  1363. * @todo checking all sanitize types
  1364. *
  1365. * @param array $data
  1366. *
  1367. * @return array
  1368. */
  1369. public function sanitize_options( $data ) {
  1370. $sanitized = array();
  1371. foreach ( $data as $k => $v ) {
  1372. if ( ! array_key_exists( $k, UM()->admin_settings()->settings_map ) ) {
  1373. // @todo remove since 2.2.x and leave only continue
  1374. $sanitized[ $k ] = $v;
  1375. continue;
  1376. }
  1377. if ( ! array_key_exists( 'sanitize', UM()->admin_settings()->settings_map[ $k ] ) ) {
  1378. // @todo remove since 2.2.x and leave only continue
  1379. $sanitized[ $k ] = $v;
  1380. continue;
  1381. }
  1382. if ( is_callable( UM()->admin_settings()->settings_map[ $k ]['sanitize'], true, $callable_name ) ) {
  1383. add_filter( 'um_settings_sanitize_' . $k, UM()->admin_settings()->settings_map[ $k ]['sanitize'], 10, 1 );
  1384. }
  1385. switch ( UM()->admin_settings()->settings_map[ $k ]['sanitize'] ) {
  1386. default:
  1387. $sanitized[ $k ] = apply_filters( 'um_settings_sanitize_' . $k, $v );
  1388. break;
  1389. case 'int':
  1390. $sanitized[ $k ] = (int) $v;
  1391. break;
  1392. case 'absint':
  1393. if ( is_array( $v ) ) {
  1394. $sanitized[ $k ] = array_map( 'absint', $v );
  1395. } else {
  1396. $sanitized[ $k ] = absint( $v );
  1397. }
  1398. break;
  1399. case 'key':
  1400. if ( is_array( $v ) ) {
  1401. $sanitized[ $k ] = array_map( 'sanitize_key', $v );
  1402. } else {
  1403. $sanitized[ $k ] = sanitize_key( $v );
  1404. }
  1405. break;
  1406. case 'bool':
  1407. $sanitized[ $k ] = (bool) $v;
  1408. break;
  1409. case 'url':
  1410. if ( is_array( $v ) ) {
  1411. $sanitized[ $k ] = array_map( 'esc_url_raw', $v );
  1412. } else {
  1413. $sanitized[ $k ] = esc_url_raw( $v );
  1414. }
  1415. break;
  1416. case 'wp_kses':
  1417. $sanitized[ $k ] = wp_kses_post( $v );
  1418. break;
  1419. case 'textarea':
  1420. $sanitized[ $k ] = sanitize_textarea_field( $v );
  1421. break;
  1422. case 'text':
  1423. $sanitized[ $k ] = sanitize_text_field( $v );
  1424. break;
  1425. }
  1426. }
  1427. $data = $sanitized;
  1428. $data = apply_filters( 'um_save_settings_sanitize', $data );
  1429. return $data;
  1430. }
  1431. /**
  1432. * Adds class to our admin pages
  1433. *
  1434. * @param $classes
  1435. *
  1436. * @return string
  1437. */
  1438. public function admin_body_class( $classes ) {
  1439. if ( $this->is_um_screen() ) {
  1440. return "$classes um-admin";
  1441. }
  1442. return $classes;
  1443. }
  1444. /**
  1445. *
  1446. */
  1447. public function manual_upgrades_request() {
  1448. if ( ! is_admin() || ! current_user_can( 'manage_options' ) ) {
  1449. die();
  1450. }
  1451. $last_request = get_option( 'um_last_manual_upgrades_request', false );
  1452. if ( empty( $last_request ) || time() > $last_request + DAY_IN_SECONDS ) {
  1453. if ( is_multisite() ) {
  1454. $blogs_ids = get_sites();
  1455. foreach( $blogs_ids as $b ) {
  1456. switch_to_blog( $b->blog_id );
  1457. wp_clean_update_cache();
  1458. UM()->plugin_updater()->um_checklicenses();
  1459. update_option( 'um_last_manual_upgrades_request', time() );
  1460. restore_current_blog();
  1461. }
  1462. } else {
  1463. wp_clean_update_cache();
  1464. UM()->plugin_updater()->um_checklicenses();
  1465. update_option( 'um_last_manual_upgrades_request', time() );
  1466. }
  1467. $url = add_query_arg( array( 'page' => 'ultimatemember', 'update' => 'got_updates' ), admin_url( 'admin.php' ) );
  1468. } else {
  1469. $url = add_query_arg( array( 'page' => 'ultimatemember', 'update' => 'often_updates' ), admin_url( 'admin.php' ) );
  1470. }
  1471. exit( wp_redirect( $url ) );
  1472. }
  1473. /**
  1474. * Core pages installation
  1475. */
  1476. function install_core_pages() {
  1477. if ( ! is_admin() ) {
  1478. die();
  1479. }
  1480. UM()->setup()->install_default_pages();
  1481. //check empty pages in settings
  1482. $empty_pages = array();
  1483. $pages = UM()->config()->permalinks;
  1484. if ( $pages && is_array( $pages ) ) {
  1485. foreach ( $pages as $slug => $page_id ) {
  1486. $page = get_post( $page_id );
  1487. if ( ! isset( $page->ID ) && in_array( $slug, array_keys( UM()->config()->core_pages ) ) ) {
  1488. $empty_pages[] = $slug;
  1489. }
  1490. }
  1491. }
  1492. //if there aren't empty pages - then hide pages notice
  1493. if ( empty( $empty_pages ) ) {
  1494. $hidden_notices = get_option( 'um_hidden_admin_notices', array() );
  1495. $hidden_notices[] = 'wrong_pages';
  1496. update_option( 'um_hidden_admin_notices', $hidden_notices );
  1497. }
  1498. $url = add_query_arg( array( 'page' => 'um_options' ), admin_url( 'admin.php' ) );
  1499. exit( wp_redirect( $url ) );
  1500. }
  1501. /**
  1502. * Clear all users cache
  1503. *
  1504. * @param $action
  1505. */
  1506. function user_cache( $action ) {
  1507. global $wpdb;
  1508. if ( ! is_admin() || ! current_user_can( 'manage_options' ) ) {
  1509. die();
  1510. }
  1511. $wpdb->query( "DELETE FROM {$wpdb->options} WHERE option_name LIKE 'um_cache_userdata_%'" );
  1512. $url = add_query_arg( array( 'page' => 'ultimatemember', 'update' => 'cleared_cache' ), admin_url( 'admin.php' ) );
  1513. exit( wp_redirect( $url ) );
  1514. }
  1515. /**
  1516. * Purge temp uploads dir
  1517. * @param $action
  1518. */
  1519. function purge_temp( $action ) {
  1520. if ( ! is_admin() || ! current_user_can( 'manage_options' ) ) {
  1521. die();
  1522. }
  1523. UM()->files()->remove_dir( UM()->files()->upload_temp );
  1524. $url = add_query_arg( array( 'page' => 'ultimatemember', 'update' => 'purged_temp' ), admin_url( 'admin.php' ) );
  1525. exit( wp_redirect( $url ) );
  1526. }
  1527. /**
  1528. * Duplicate form
  1529. *
  1530. * @param $action
  1531. */
  1532. function duplicate_form( $action ) {
  1533. if ( ! is_admin() || ! current_user_can('manage_options') ) {
  1534. die();
  1535. }
  1536. if ( ! isset( $_REQUEST['post_id'] ) || ! is_numeric( $_REQUEST['post_id'] ) ) {
  1537. die();
  1538. }
  1539. $post_id = absint( $_REQUEST['post_id'] );
  1540. $n = array(
  1541. 'post_type' => 'um_form',
  1542. 'post_title' => sprintf( __( 'Duplicate of %s', 'ultimate-member' ), get_the_title( $post_id ) ),
  1543. 'post_status' => 'publish',
  1544. 'post_author' => get_current_user_id(),
  1545. );
  1546. $n_id = wp_insert_post( $n );
  1547. $n_fields = get_post_custom( $post_id );
  1548. foreach ( $n_fields as $key => $value ) {
  1549. if ( $key == '_um_custom_fields' ) {
  1550. $the_value = unserialize( $value[0] );
  1551. } else {
  1552. $the_value = $value[0];
  1553. }
  1554. update_post_meta( $n_id, $key, $the_value );
  1555. }
  1556. delete_post_meta( $n_id, '_um_core' );
  1557. $url = admin_url( 'edit.php?post_type=um_form' );
  1558. $url = add_query_arg( 'update', 'form_duplicated', $url );
  1559. exit( wp_redirect( $url ) );
  1560. }
  1561. /**
  1562. * Action to hide notices in admin
  1563. *
  1564. * @param $action
  1565. */
  1566. function um_hide_notice( $action ) {
  1567. if ( ! is_admin() || ! current_user_can( 'manage_options' ) ) {
  1568. die();
  1569. }
  1570. update_option( $action, 1 );
  1571. exit( wp_redirect( remove_query_arg( 'um_adm_action' ) ) );
  1572. }
  1573. /**
  1574. * Various user actions
  1575. *
  1576. * @param $action
  1577. */
  1578. function user_action( $action ) {
  1579. if ( ! is_admin() || ! current_user_can( 'edit_users' ) ) {
  1580. die();
  1581. }
  1582. if ( ! isset( $_REQUEST['sub'] ) ) {
  1583. die();
  1584. }
  1585. if ( ! isset( $_REQUEST['user_id'] ) ) {
  1586. die();
  1587. }
  1588. um_fetch_user( absint( $_REQUEST['user_id'] ) );
  1589. $subaction = sanitize_key( $_REQUEST['sub'] );
  1590. /**
  1591. * UM hook
  1592. *
  1593. * @type action
  1594. * @title um_admin_user_action_hook
  1595. * @description Action on bulk user subaction
  1596. * @input_vars
  1597. * [{"var":"$subaction","type":"string","desc":"Bulk Subaction"}]
  1598. * @change_log
  1599. * ["Since: 2.0"]
  1600. * @usage add_action( 'um_admin_user_action_hook', 'function_name', 10, 1 );
  1601. * @example
  1602. * <?php
  1603. * add_action( 'um_admin_user_action_hook', 'my_admin_user_action', 10, 1 );
  1604. * function my_admin_user_action( $subaction ) {
  1605. * // your code here
  1606. * }
  1607. * ?>
  1608. */
  1609. do_action( 'um_admin_user_action_hook', $subaction );
  1610. /**
  1611. * UM hook
  1612. *
  1613. * @type action
  1614. * @title um_admin_user_action_{$subaction}_hook
  1615. * @description Action on bulk user subaction
  1616. * @change_log
  1617. * ["Since: 2.0"]
  1618. * @usage add_action( 'um_admin_user_action_{$subaction}_hook', 'function_name', 10 );
  1619. * @example
  1620. * <?php
  1621. * add_action( 'um_admin_user_action_{$subaction}_hook', 'my_admin_user_action', 10 );
  1622. * function my_admin_user_action() {
  1623. * // your code here
  1624. * }
  1625. * ?>
  1626. */
  1627. do_action( "um_admin_user_action_{$subaction}_hook" );
  1628. um_reset_user();
  1629. wp_redirect( add_query_arg( 'update', 'user_updated', admin_url( '?page=ultimatemember' ) ) );
  1630. exit;
  1631. }
  1632. /**
  1633. * Add any custom links to plugin page
  1634. *
  1635. * @param array $links
  1636. *
  1637. * @return array
  1638. */
  1639. function plugin_links( $links ) {
  1640. $more_links[] = '<a href="http://docs.ultimatemember.com/">' . __( 'Docs', 'ultimate-member' ) . '</a>';
  1641. $more_links[] = '<a href="'.admin_url().'admin.php?page=um_options">' . __( 'Settings', 'ultimate-member' ) . '</a>';
  1642. $links = $more_links + $links;
  1643. return $links;
  1644. }
  1645. /**
  1646. * Init admin action/filters + request handlers
  1647. */
  1648. function admin_init() {
  1649. $this->init_variables();
  1650. if ( is_admin() && current_user_can( 'manage_options' ) && ! empty( $_REQUEST['um_adm_action'] ) ) {
  1651. $action = sanitize_key( $_REQUEST['um_adm_action'] );
  1652. /**
  1653. * UM hook
  1654. *
  1655. * @type action
  1656. * @title um_admin_do_action__
  1657. * @description Make some action on custom admin action
  1658. * @input_vars
  1659. * [{"var":"$action","type":"string","desc":"Admin Action"}]
  1660. * @change_log
  1661. * ["Since: 2.0"]
  1662. * @usage add_action( 'um_admin_do_action__', 'function_name', 10, 1 );
  1663. * @example
  1664. * <?php
  1665. * add_action( 'um_admin_do_action__', 'my_admin_do_action', 10, 1 );
  1666. * function my_admin_do_action( $action ) {
  1667. * // your code here
  1668. * }
  1669. * ?>
  1670. */
  1671. do_action( 'um_admin_do_action__', $action );
  1672. /**
  1673. * UM hook
  1674. *
  1675. * @type action
  1676. * @title um_admin_do_action__{$action}
  1677. * @description Make some action on custom admin $action
  1678. * @input_vars
  1679. * [{"var":"$action","type":"string","desc":"Admin Action"}]
  1680. * @change_log
  1681. * ["Since: 2.0"]
  1682. * @usage add_action( 'um_admin_do_action__{$action}', 'function_name', 10, 1 );
  1683. * @example
  1684. * <?php
  1685. * add_action( 'um_admin_do_action__{$action}', 'my_admin_do_action', 10, 1 );
  1686. * function my_admin_do_action( $action ) {
  1687. * // your code here
  1688. * }
  1689. * ?>
  1690. */
  1691. do_action( "um_admin_do_action__{$action}", $action );
  1692. }
  1693. }
  1694. /**
  1695. * Updated post messages
  1696. *
  1697. * @param array $messages
  1698. *
  1699. * @return array
  1700. */
  1701. function post_updated_messages( $messages ) {
  1702. global $post_ID;
  1703. $post_type = get_post_type( $post_ID );
  1704. if ( $post_type == 'um_form' ) {
  1705. $messages['um_form'] = array(
  1706. 0 => '',
  1707. 1 => __( 'Form updated.', 'ultimate-member' ),
  1708. 2 => __( 'Custom field updated.', 'ultimate-member' ),
  1709. 3 => __( 'Custom field deleted.', 'ultimate-member' ),
  1710. 4 => __( 'Form updated.', 'ultimate-member' ),
  1711. 5 => isset( $_GET['revision'] ) ? __( 'Form restored to revision.', 'ultimate-member' ) : false,
  1712. 6 => __( 'Form created.', 'ultimate-member' ),
  1713. 7 => __( 'Form saved.', 'ultimate-member' ),
  1714. 8 => __( 'Form submitted.', 'ultimate-member' ),
  1715. 9 => __( 'Form scheduled.', 'ultimate-member' ),
  1716. 10 => __( 'Form draft updated.', 'ultimate-member' ),
  1717. );
  1718. }
  1719. return $messages;
  1720. }
  1721. /**
  1722. * Gettext filters
  1723. *
  1724. * @param $translation
  1725. * @param $text
  1726. * @param $domain
  1727. *
  1728. * @return string
  1729. */
  1730. function gettext( $translation, $text, $domain ) {
  1731. global $post;
  1732. if ( isset( $post->post_type ) && $this->is_plugin_post_type() ) {
  1733. $translations = get_translations_for_domain( $domain );
  1734. if ( $text == 'Publish' ) {
  1735. return $translations->translate( 'Create' );
  1736. } elseif ( $text == 'Move to Trash' ) {
  1737. return $translations->translate( 'Delete' );
  1738. }
  1739. }
  1740. return $translation;
  1741. }
  1742. /**
  1743. * Fix parent file for correct highlighting
  1744. *
  1745. * @param $parent_file
  1746. *
  1747. * @return string
  1748. */
  1749. function parent_file( $parent_file ) {
  1750. global $current_screen;
  1751. $screen_id = $current_screen->id;
  1752. if ( strstr( $screen_id, 'um_' ) ) {
  1753. $parent_file = 'ultimatemember';
  1754. }
  1755. return $parent_file;
  1756. }
  1757. /**
  1758. * @since 2.0
  1759. *
  1760. * @return core\Admin_Notices()
  1761. */
  1762. function notices() {
  1763. if ( empty( UM()->classes['admin_notices'] ) ) {
  1764. UM()->classes['admin_notices'] = new core\Admin_Notices();
  1765. }
  1766. return UM()->classes['admin_notices'];
  1767. }
  1768. }
  1769. }