Drucken Sie den Shortcode im benutzerdefinierten Aktions-Hook nicht dort, wo der Shortcode eingegeben wird

Ich habe meinem Thema einen benutzerdefinierten Aktions-Hook hinzugefügt. Ich möchte in der Lage sein, einen shortcode irgendwo in the_content () einzugeben und den shortcode-Druck zu haben, wo der benutzerdefinierte Aktions-Hook eher der Punkt ist, von dem der shortcode eingegeben wurde.

Der Shortcode zeigt eine Galerie und den benutzerdefinierten Hook in der Kopfzeile an.

Es funktioniert, wenn ich do_shortcode () direkt im Action Callback, aber der Shortcode auf allen Seiten anzeigt. Ich weiß also, dass der Hook funktioniert, aber ich möchte nur, dass die Galerie im Header der Seiten anzeigt, dass der Shortcode in the_content () eingegeben wird.

Solutions Collecting From Web of "Drucken Sie den Shortcode im benutzerdefinierten Aktions-Hook nicht dort, wo der Shortcode eingegeben wird"

Ich denke, ich würde eine Meta-Box verwenden:

// create the meta box function dht_box() { add_meta_box( 'dht_box', // id, used as the html id att __( 'Do Header Thing' ), // meta box title 'dht_cb', // callback function, spits out the content 'post' // post type or page. This adds to posts only ); } function dht_cb($post) { $meta = get_post_meta($post->ID,'do_header_thing',true); echo ''; } add_action( 'add_meta_boxes', 'dht_box' ); // save the data add_action( 'save_post', function ($post_id) { if (isset($_POST['do_header_thing'])) { add_post_meta($post_id,'do_header_thing',true); } else { delete_post_meta($post_id,'do_header_thing',true); } } ); 

Verwenden Sie dann in Ihrer Vorlagendatei oder auf einem geeigneten Hook:

 if (is_single()) { $obj = get_queried_object(); $dht = get_post_meta($obj->ID,'do_header_thing',true); if (!empty($dht)) { echo 'Yay'; } } 

Sehr roher Code, aber das sollte dir die Idee geben.

Sie rufen also eine benutzerdefinierte Aktion wie do_action('print_gallery'); In der Kopfzeile möchten Sie jetzt, dass diese Aktion ausgetriggers wird, den Inhalt eines Shorcodes ausgibt, der irgendwo in den Post-Inhalt eingefügt wird.

Natürlich, wenn Sie the_content() drucken, the_content() Sie nicht, dass der Shortcode erneut gedruckt wird.

In der function, die die Aktion print_gallery , können Sie beispielsweise print_gallery einfügen:

 add_action('print_gallery', 'print_gallery_shortcode'); function print_gallery_shortcode() { if ( ! is_single() ) return; $shortcode_name = 'gallery'; $content = get_queried_object()->post_content; if ( preg_match_all( '/'. get_shortcode_regex() .'/s', $content, $matches ) && array_key_exists( 2, $matches ) && in_array( $shortcode_name, $matches[2] ) ) { foreach ( $matches[2] as $i => $sc ) { if ( $sc == $shortcode_name ) { echo do_shortcode( $matches[0][$i] ); // prevent shortcode is printed again in the post content add_shortcode($shortcode_name, '__return_false'); } } } } 

Ich habe den standardmäßigen wordpress [gallery] shortcode verwendet, wenn Sie einen benutzerdefinierten verwenden, ersetzen Sie einfach den Namen des shortcodes in der Variable $shortcode_name .

Jetzt können Sie den Shortcode überall im Inhalt einfügen und die Shortcode-Ausgabe wird gedruckt, während Sie do_action('print_gallery') anstelle des Inhalts haben.

(Natürlich, wenn die function the_content() vor do_action('print_gallery') wird, erhält man ein Duplikat von shortcode: meine function kann nicht verhindern, dass etwas bereits passiert ist.)

Beachten Sie, dass die function nicht mit anderen Shortcodes im Post-Inhalt interferiert, die normal im Inhalt gedruckt werden.