• Resolved mathse

    (@mathse)


    I want to disable the auto embed feature of WordPress, when pasting arbitrary text that includes links in Gutenberg. I tried this with something like:

    add_filter('allowed_block_types', 'remove_default_blocks');
    function remove_default_blocks($allowed_blocks){
    // Get all registered blocks
    $registered_blocks = WP_Block_Type_Registry::get_instance()->get_all_registered();
    
    // unset embed block
    unset($registered_blocks['core/embed']);
    
    // Get keys from array
    $registered_blocks = array_keys($registered_blocks);
    
    // Merge allowed core blocks with plugins blocks
    return $registered_blocks;
    
    }

    This works – but unfortunately this disables all embed blogs and I want the user to manually embed e.g. YouTube. Best would be, if just the “auto embedding” could be disabled, but if the user could still choose the embed blocks manually and embed thinks.

    Can anybody help me here?

    Thanks

Viewing 10 replies - 1 through 10 (of 10 total)
  • Hi @mathse,

    do you have control over the text to be pasted? Automatic embedding will only happen on links that appear at the start of a line. You could prefix it with a . and then it won’t be expanded.

    Also, remember that you can easily undo an automatic embed by clicking on the embed, then the icon in the toolbar that appears above (for example the YouTube icon) and it will offer to “Transform to Paragraph”.

    It might not be feasible for posts with very many embeds but maybe good enough for your use case.

    Thread Starter mathse

    (@mathse)

    Hi @akirk,

    unfortunately I don’t have control over what is pasted.
    The problem is: all the blogger don’t want an embedded link (and therefore I block all “output” connections in my firewall).
    Unfortunately, many blogger just paste stuff with links, therefore my firewall blocks many “output” connections and I’m getting an E-Mail on each block.
    Since nobody of the blogger wants an embed – but just a clickable link – I think it would be best, if I could disable this feature. Unfortunately many want to embed e.g. youtube (which is also whitelisted in the firewall), so this block should work as it is.

    Hi @mathse it should be possible to do this, by removing the transforms.from property of the core/embed block.

    To do this, you need to use the registerBlockType filter in JavaScript

    https://developer.wordpress.org/block-editor/reference-guides/filters/block-filters/#blocks-registerblocktype

    This is what the JavaScript code would look like (tested on a local site with a custom plugin)

    function filterEmbedBlock( settings, name ) {
    	if ( name !== 'core/embed' ) {
    		return settings;
    	}
    	settings = lodash.omit(settings, 'transforms.from');
    	return settings;
    }
    
    wp.hooks.addFilter(
    	'blocks.registerBlockType',
    	'jonathanbossenger/create-block/todo-list',
    	filterEmbedBlock
    );

    You’ll need to build this into a custom theme or plugin, and enqueue the JavaScript using the enqueue_block_editor_assets hook

    https://developer.wordpress.org/reference/hooks/enqueue_block_editor_assets/

    I would also point out that this might have an affect on other functionality for the embed blocks, but it will disable the auto embed functionality.

    Thread Starter mathse

    (@mathse)

    @psykro Thanks for your detailled reply!
    I have a small question (since I’m pretty new to WP developing).
    Up to now I only wrote some small “must use plugins”, which I put under /wp-content/mu-plugins/

    I would prefer such an approach with your code, too, since I don’t want to change a theme, but I have problems getting your code to work.
    My naive approach was:

    
    <?php
    /* plugin name: remove auto embed
     * Description: Remove auto embedding on pasting links
     */
    
    add_filter('enqueue_block_editor_assets', 'filterEmbedBlock');
    
    function filterEmbedBlock( settings, name ) {
    	if ( name !== 'core/embed' ) {
    		return settings;
    	}
    	settings = lodash.omit(settings, 'transforms.from');
    	return settings;
    }
    
    ?>

    `

    This leads directly to an error:

    PHP message: PHP Parse error: syntax error, unexpected token “,”, expecting variable in /var/www/html/wp-content/mu-plugins/disable_embed.php on line 9

    Could you give me another hint here, how I can achieve what I want?
    Thanks and greetings!

    • This reply was modified 1 year, 11 months ago by mathse.

    Hi @mathse the code that I have shared with you is JavaScript code, not PHP. So for example what you can do is put that code in a script.js file in a plugin, and enqueue it in PHP using the enqueue_block_editor_assets hook in PHP

    Because of this JavaScript requirement, you won’t be able to add this via an mu-plugin, as mu-plugins can only be single PHP files. You can read more about developing regular plugins here – https://developer.wordpress.org/plugins/

    Thread Starter mathse

    (@mathse)

    Hi @psykro,

    thanks for the explanation. I will read into the topic and give your code a try in a few days, since I’m pretty busy at the moment.
    I will give you a feedback in some days – I just wanted to say thanks for the great help.

    Greetings

    mathse

    Thanks @mathse

    If your question has been answered, we would love if you would mark this topic as resolved in the sidebar. This helps our volunteers find the topics that still need attention and more people will get helped, possibly like you did.

    Thread Starter mathse

    (@mathse)

    @psykro Today I found some time to dig deeper into WP and integration of JS and I think I could integrate your code – it works as expected and I don’t get auto embeds anymore, as expected but still have the embed blocks available: so all in all great!

    Could you please have a look at my code, because I’m not quite sure if I need wp_enqueue_script of if this could be implemented easier?
    Here is the main plugins php file:

    <?php
    /* plugin name: disable auto embed
     * Description: Remove auto embedding on pasting links
     */
    
    function disable_scripts() {
    
      $scriptPath = '/js/disabler.js';
    
      // Enqueue frontend and editor JS
      wp_enqueue_script(
        'disable-auto-embed-js',
        plugins_url( $scriptPath, __FILE__ )
      );
    
    }
    
    add_filter('enqueue_block_editor_assets', 'disable_scripts');
    
    ?>

    And in the /js/disabler.js file is your code.
    Just because you didn’t mention wp_enqueue_script() I’m not quite sure, whether I need it and it would be great to get some feedback here.

    Thanks so much again and greetings

    mathse

    • This reply was modified 1 year, 11 months ago by mathse.

    Hi, @mathse good work figuring this out.

    There are two changes I would like to point out.

    1. The enqueue_block_editor_assets hook is an action hook, not a filter hook, so you would use it like this:

    add_action('enqueue_block_editor_assets', 'disable_scripts');

    2. You have used wp_enqueue_script 100% correctly, this is how we should enqueue scripts or styles in WordPress. The only addition I would make there is to enqueue your script with a dependency.

    
      wp_enqueue_script(
        'disable-auto-embed-js',
        plugins_url( $scriptPath, __FILE__ ), 
        array( 'wp-blocks' )
      );
    

    What this will do is make sure your script is only enqueued after the wp-blocks script, which powers the block editor.

    And one final comment, I would just prefix your disable_scripts function with a unique prefix, this ensures that it won’t conflict with any other function that might be called disable_scripts.

    Thread Starter mathse

    (@mathse)

    Hello @psykro,

    thank you so much for your review of the code and hints to improve it.
    I just applied all your proposals and everything works fine!

    So thanks again for all the help here – I will mark now the topic as solved.

    Greetings

    mathse

Viewing 10 replies - 1 through 10 (of 10 total)
  • The topic ‘Disable “auto embed” feature when pasting text and links’ is closed to new replies.