Imprimir shortcode en gancho de acción personalizada no donde está ingresado el shortcode

He añadido un gancho de acción personalizada en mi tema. Quiero ser capaz de introducir un código corto en cualquier lugar en the_content() y tener el shortcode impresión fueron el gancho de acción personalizada bastante entonces es el punto desde donde fue introducido el shortcode. El shortcode muestra una galería y el gancho personalizado en la cabecera.

Funciona si lo do_shortcode() directamente en el callback de acción pero el shortcode muestra en todas las páginas. Sé el gancho trabajando pero yo solo quiero la Pinacoteca para exhibir en el encabezado de las páginas que se introduce el shortcode en the_content()..



Solución 1

Yo creo que usaría una caja meta:
// 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 '<input type="checkbox" name="do_header_thing" ',checked($meta),' />';
}
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);
    }
  }
);
Luego, en el archivo de plantilla o en un apropiado del gancho de uso:
if (is_single()) {
  $obj = get_queried_object();
  $dht = get_post_meta($obj->ID,'do_header_thing',true);
  if (!empty($dht)) { 
    echo 'Yay';
  }
}
Código muy crudo, pero te dará la idea..

Solución 2

Así que llama a una acción personalizada como
do_action('print_gallery');
en la cabecera, ahora quieres que cuando se activa esta acción se imprime el contenido de un shorcode insertado en cualquier lugar en el contenido del mensaje. Por supuesto, cuando se imprime
the_content()
No quieres que el shortcode se imprime otra vez. Así, en la función que enlaza
print_gallery
acción puede insertar algo como esto:
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'); } } } }
He utilizado el estándar wordpress
[gallery]
shortcode, si utilizas uno personalizado, simplemente reemplace el nombre de código en el
$shortcode_name
variable. Ahora usted puede insertar el shortcode por todas partes que usted quiere en el contenido y la salida de shortcode es impreso donde que tienes
do_action('print_gallery')
en vez de en el contenido.

(Por supuesto, si la función
the_content()
se llama antes de que
do_action('print_gallery')
obtendrás un duplicado de shortcode: mi función no puede evitar algo que ya pasó...) Tenga en cuenta que la función no interfiera con otros shortcodes insertado en el contenido de los correos que aparecen normalmente en el contenido..




Problemas relacionados

Llama shortcode desde dentro de su función de callback.

¿Filtro de salida específico shortcode?

Usar la acción de ganchos en el interior de un shortcode

Cómo utilizar shortcode dentro de shortcode en tema

Cómo imprimir [embed] código en wordpress

Tratando de usar código para un plugin en presentación personalizada del tema sensible

Galería de exhibición en la parte inferior después de contenido

Cómo comprobar si un shortcode se utiliza más de una vez en el mismo post

shortcode salidas antes el contenido de la página

Función para mostrar sólo de primera instancia de shortcode

Filtro de todo contenido excepto la salida de un shortcode

Código para la salida de las pantallas de wp_get_archives en la parte superior del poste

Source: Stack Exchange Inc; License: cc by-sa 3.0 Contacto / Contact