register_activation_hook doesn’t execute without add_action(‘init’,’some-function’)

The register_activation_hook() function takes two parameters: the first parameter is the path to the main plugin file, and the second parameter is the name of the function to be executed when the plugin is activated. In your case, you are passing the plugin directory path to the register_activation_hook() function instead of the path to the main plugin file.

To fix this, you need to change the first parameter of the register_activation_hook() function to the path to the main plugin file.

define('PROMO_DIR_PATH', plugin_dir_path(__FILE__));

function activate_promo_card() {
  // ...
}

function deactivate_promo_card() {
  // ...
}

register_activation_hook( __FILE__, 'activate_promo_card' );
register_deactivation_hook( __FILE__, 'deactivate_promo_card' );