abstract-wc-deprecated-hooks.php 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  1. <?php
  2. /**
  3. * Abstract deprecated hooks
  4. *
  5. * @package WooCommerce\Abstracts
  6. * @since 3.0.0
  7. * @version 3.3.0
  8. */
  9. if ( ! defined( 'ABSPATH' ) ) {
  10. exit;
  11. }
  12. /**
  13. * WC_Deprecated_Hooks class maps old actions and filters to new ones. This is the base class for handling those deprecated hooks.
  14. *
  15. * Based on the WCS_Hook_Deprecator class by Prospress.
  16. */
  17. abstract class WC_Deprecated_Hooks {
  18. /**
  19. * Array of deprecated hooks we need to handle.
  20. *
  21. * @var array
  22. */
  23. protected $deprecated_hooks = array();
  24. /**
  25. * Array of versions on each hook has been deprecated.
  26. *
  27. * @var array
  28. */
  29. protected $deprecated_version = array();
  30. /**
  31. * Constructor.
  32. */
  33. public function __construct() {
  34. $new_hooks = array_keys( $this->deprecated_hooks );
  35. array_walk( $new_hooks, array( $this, 'hook_in' ) );
  36. }
  37. /**
  38. * Hook into the new hook so we can handle deprecated hooks once fired.
  39. *
  40. * @param string $hook_name Hook name.
  41. */
  42. abstract public function hook_in( $hook_name );
  43. /**
  44. * Get old hooks to map to new hook.
  45. *
  46. * @param string $new_hook New hook name.
  47. * @return array
  48. */
  49. public function get_old_hooks( $new_hook ) {
  50. $old_hooks = isset( $this->deprecated_hooks[ $new_hook ] ) ? $this->deprecated_hooks[ $new_hook ] : array();
  51. $old_hooks = is_array( $old_hooks ) ? $old_hooks : array( $old_hooks );
  52. return $old_hooks;
  53. }
  54. /**
  55. * If the hook is Deprecated, call the old hooks here.
  56. */
  57. public function maybe_handle_deprecated_hook() {
  58. $new_hook = current_filter();
  59. $old_hooks = $this->get_old_hooks( $new_hook );
  60. $new_callback_args = func_get_args();
  61. $return_value = $new_callback_args[0];
  62. foreach ( $old_hooks as $old_hook ) {
  63. $return_value = $this->handle_deprecated_hook( $new_hook, $old_hook, $new_callback_args, $return_value );
  64. }
  65. return $return_value;
  66. }
  67. /**
  68. * If the old hook is in-use, trigger it.
  69. *
  70. * @param string $new_hook New hook name.
  71. * @param string $old_hook Old hook name.
  72. * @param array $new_callback_args New callback args.
  73. * @param mixed $return_value Returned value.
  74. * @return mixed
  75. */
  76. abstract public function handle_deprecated_hook( $new_hook, $old_hook, $new_callback_args, $return_value );
  77. /**
  78. * Get deprecated version.
  79. *
  80. * @param string $old_hook Old hook name.
  81. * @return string
  82. */
  83. protected function get_deprecated_version( $old_hook ) {
  84. return ! empty( $this->deprecated_version[ $old_hook ] ) ? $this->deprecated_version[ $old_hook ] : WC_VERSION;
  85. }
  86. /**
  87. * Display a deprecated notice for old hooks.
  88. *
  89. * @param string $old_hook Old hook.
  90. * @param string $new_hook New hook.
  91. */
  92. protected function display_notice( $old_hook, $new_hook ) {
  93. wc_deprecated_hook( esc_html( $old_hook ), esc_html( $this->get_deprecated_version( $old_hook ) ), esc_html( $new_hook ) );
  94. }
  95. /**
  96. * Fire off a legacy hook with it's args.
  97. *
  98. * @param string $old_hook Old hook name.
  99. * @param array $new_callback_args New callback args.
  100. * @return mixed
  101. */
  102. abstract protected function trigger_hook( $old_hook, $new_callback_args );
  103. }