=== Inline JavaScript in Head ===
Contributors: palasthotel, greatestview, janaeggebrecht
Donate link: https://palasthotel.de/
Tags: javascript, scripts, enqueue, inline, head, performance, filter, hook
Requires at least: 4.0
Tested up to: 7.0.2
Stable tag: 1.2.1
Requires PHP: 5.4
License: GPL-3.0-or-later
License URI: https://www.gnu.org/licenses/gpl-3.0.html

RETIRED — no longer maintained. Please deactivate and remove this plugin; the description explains what to use instead.

== Description ==
**This plugin is retired and no longer maintained. Please deactivate and remove it.**

Since 2020 this readme pointed at *Embed JavaScript File Content* as the successor.
That plugin has now been retired as well, so this notice was sending you to a dead
end. There is no successor plugin — here is what to do instead.

= What to do instead =

If you wrote the script yourself, do not route a file through a plugin — write the
code inline in the first place. WordPress has supported that since 4.5:

`wp_add_inline_script( 'my-handle', 'if (!("localStorage" in window)) { /* ... */ }', 'before' );`

For code that has to run before anything paints, print it in `wp_head` directly.
Both are simpler, and neither breaks a Content Security Policy the way an inlined
file does — this plugin sets neither a nonce nor a hash, so a strict `script-src`
blocks its output.

For a script you do not control, dequeue it and re-add its content yourself:

`add_action( 'wp_enqueue_scripts', function () {
	$handle = 'some-foreign-handle';
	$src    = wp_scripts()->registered[ $handle ]->src ?? null;
	if ( ! $src ) {
		return;
	}
	$path = ABSPATH . ltrim( wp_make_link_relative( $src ), '/' );
	if ( ! is_readable( $path ) ) {
		return;
	}
	wp_dequeue_script( $handle );
	wp_add_inline_script( 'some-handle-you-own', file_get_contents( $path ) );
}, 20 );`

You decide there how the file is located, which is the part this plugin got wrong:
it resolved the path relative to the current working directory, so the result
depended on which entry script served the request.

= Why it is being retired =

The benefit it was written for has largely gone. Under HTTP/1.1 every file cost a
round trip, so inlining a small critical script was a real win. HTTP/2 and HTTP/3
multiplex requests and removed most of that cost, while inlining still gives up
browser caching — the code travels with every HTML response instead of being cached
once.

= How it used to work =

In some cases you cannot wait for a JavaScript file to load, even if it is placed early in the `<head>` section of your template. You can benefit from better performance, if you place the JavaScript code directly inside a `<script>` tag into the header. This is where this plugin comes in: It provides a filter `inline_javascript_in_head_handles`, which takes JavaScript handles, dequeues those scripts and echos their code content inline into the head section instead of linking them via a script tag.

Please beware that placing lots of JavaScript code inline in the `<head>` section can be critical! First you lose caching benefits and second the document size can increase easily. A general rule of thumb is that you should only consider JavaScript files for inline placement, which are critical and which have a file size lower than ~500 Bytes.

= Example =

`
add_action( 'wp_enqueue_scripts', 'my_scripts' );
function my_scripts() {
	// Some critical script is enqueued
	wp_enqueue_script( 'js-detection', get_template_directory_uri() . '/js/js-detection.js' );
}

/**
 * Define JavaScript handles to be echoed inline in the html head section.
 */
add_filter( 'inline_javascript_in_head_handles', 'my_inline_javascript_in_head_handles', -20 );
function my_inline_javascript_in_head_handles( $handles ) {
	$scripts = [ 'js-detection' ];

	return array_merge( $handles, $scripts );
}
`


== Installation ==

Please do not install this plugin any more — it is retired. See the description for
what to use instead.

To remove it: drop the `inline_javascript_in_head_handles` filter from your theme or
plugin, then deactivate and delete the plugin. It stores no options and creates no
database tables, so nothing is left behind.

== Upgrade Notice ==

= 1.2.1 =
This plugin is retired, and the successor this readme named since 2020 has been
retired too. The description now explains what to use instead. Please deactivate and
remove the plugin.

== Changelog ==

= 1.2.1 =
* Final release. The plugin is retired. The successor named here since 2020, Embed JavaScript File Content, has been retired as well, so the readme now explains what to use instead rather than pointing at another deprecated plugin.

= 1.2.0 =
* CAUTION: Last update! This plugin is now deprecated (see description section)
* Bugfix: Some scripts could have gotten lost under certain conditions.

= 1.1.2 =
* readme.txt code appearance screwed up, now hopefully fixed.

= 1.1.1 =
* readme.txt update

= 1.1 =
* Added filter `inline_javascript_in_head_wrap_try_catch`, which can add add a try catch wrapper around the JavaScript code.

= 1.0 =
* First release
