I have a plugin which creates a page upon activation and then removes it on deactivation. As part of the page creation, I wanted to use a shortcode in the post content, so I added a shortcode with add_shortcode() first.
For debug purposes, I immediately test the shortcode with shortcode_exists() and print out an appropriate log statement. The logs indicate that the shortcode exists. On the page automatically created, it just shows the shortcode name [myplugin_reference]. Even if I manually create a page and insert the shortcode, I get the same result.
I even installed a simple plugin - JSM's Show Registered Shortcodes which shows a list of registered shortcodes, and my shortcode isn't in the list.
Here is my code:
function install_myplugin() { add_shortcode( 'myplugin_reference', 'myplugin_shortcode_reference' ); if ( shortcode_exists( 'myplugin_reference' ) ) { error_log( 'Shortcode "myplugin_reference" added successfully' ); } else { error_log( 'Shortcode "myplugin_reference" not added' ); } $templates = get_page_templates(); $post = array( 'post_title' => __( 'Thank You', 'myplugin-payment-gateway' ), 'post_content' => '[myplugin_reference]', 'post_status' => 'publish', 'post_name' => 'myplugin-thank-you', 'post_type' => 'page' ); if ( isset( $templates['Full width'] ) ) { $post['page_template'] = $templates['Full width']; } $page_id = wp_insert_post( $post, true ); add_option( 'myplugin_thankyou_page_id', $page_id ); } function uninstall_myplugin() { $page_id = get_option( 'myplugin_thankyou_page_id' ); if ( $page_id ) { wp_delete_post( $page_id, true ); delete_option( 'myplugin_thankyou_page_id' ); } if ( shortcode_exists( 'myplugin_reference' ) ) { remove_shortcode( 'myplugin_reference' ); } } function myplugin_shortcode_reference() { wp_enqueue_script( 'jquery' ); ob_start(); ?> <span id="payment-ref"></span> <script type="text/javascript"> jQuery(function($) { let params = {}, paramPairs = (window.location.search).replace(/^\?/, '').split("&"); // get querystring params paramPairs.reduce((acc, current) => { const nameValue = current.split("="); return params[nameValue[0]] = decodeURIComponent(nameValue[1]); }, ""); if (!!params.reference) { $('#payment-ref').html(params.reference); } }); </script> <?php $output = ob_get_contents(); ob_end_clean(); return $output; } // Activation, Deactivation hooks register_activation_hook( __FILE__, 'install_myplugin' ); register_deactivation_hook( __FILE__, 'uninstall_myplugin' ); And this is all that appears on the page:
