Solución cuando add_action y wp_head no muestran contenido en la sección head
Tengo un gran problema. En una página de WordPress tengo una función que genera meta tags og. Quiero "añadir" esos meta generados en la sección head. Así que escribí este código:
add_action('wp_head', '_set_meta_tag');
function _set_meta_tag()
{
global $nome;
global $descr;
global $file;
global $path_meta;
$output = "";
$output .= '<meta property="og:title" content="'.$nome.'" />';
$output .= '<meta property="og:type" content="article" />';
$output .= '<meta property="og:image" content="'; $output .= get_bloginfo('template_url'); $output .= '/includes/img/immagini_evento/'.$file.'" />';
$output .= '<meta property="og:url" content="'.$path_meta.'" />';
$output .= '<meta property="og:description" content="'.truncate(htmlentities($descr),200).'" />';
$output .= '<meta property="og:site_name" content="'; $output .= get_bloginfo('name'); $output .='" />';
echo $output;}
add_action('wp_head', '_set_meta_tag');
no muestra $output
. ¿Por qué?
¡También probé mostrando un simple "hola mundo", pero nada sucedió!
Ese código debe ejecutarse antes de que se active el hook wp_head
o no tendrá efecto alguno, y cuando se probó en un archivo mu-plugin sí funciona.
Sospecho que estás intentando enganchar esa función demasiado tarde, quizás desde dentro de un archivo de plantilla del tema después de get_header
(en la mayoría de los casos). Coloca ese código en el functions.php
del tema o en un archivo de (mu-)plugin y debería funcionar al menos en cuanto a mostrar contenido. No analicé si tiene otros errores.

De hecho, intento enlazar esta función en una página de plantilla :) ¡Gracias! Intentaré cambiarlo mañana y te aviso lo antes posible.

Cualquier código del que dependa este código debe ejecutarse antes, obviamente, así que enlaza ese código a wp_head
o antes. Si esto solo debe ejecutarse en una plantilla, probablemente puedas colocar todo tu código antes de get_header
en el archivo de plantilla, pero supongo que ese no será tu caso, que necesita ejecutarse de manera más global.

Si lo coloco en functions.php
, ¿puedo extraer un parámetro con get_query_var('id')
para luego generar en esa función una consulta MySql a través del id?

get_query_var
depende del objeto global
$wp_query
, así que "Sí", probablemente.

Funciona, pero el Botón Me Gusta de Facebook no muestra el contenido correcto. Si pego la URL en Facebook, veo el contenido correcto, pero si hago clic en el Botón Me Gusta, el contenido es incorrecto.

"El contenido es incorrecto" es una descripción bastante vaga y sin código no hay mucho más que pueda decir.

Tuve este mismo problema. Lo resolví creando mi propio hook.
Esto está en mi archivo header.php
. Mi hook se coloca antes de wp_head()
<?php my_doc_head(); ?>
<?php wp_head(); ?>
</head>
Este hook y la función callback añadida al hook están definidas en mi function.php
.
function my_doc_head() {
do_action('my_doc_head');
}
add_action('my_doc_head','my_seo_meta');
function my_seo_meta() {
global $wp_query;
$postid = $wp_query->post->ID;
//inserta cualquier código para construir $output
echo $output;
wp_reset_query();
}

¡Tu respuesta no tiene ningún sentido! ¿Podrías explicar por qué wp_head
no funciona y tu hook personalizado sí?

Me encantaría explicarlo, pero no tengo suficiente experiencia y no entiendo WordPress lo suficientemente bien como para hacerlo. Todo lo que sé es que mi función, añadida como acción a wp_head(), no funcionó. En mi investigación, encontré esta publicación, leí lo que dijo s_ha_dum y pensé "tal vez esa es la razón por la que no puedo hacer que mi función funcione, no se está ejecutando lo suficientemente pronto". Así que creé mi acción y la inserté antes de wp_head() y ¡voilà! Tal vez ayude saber que mi función obtiene datos de campos personalizados y los inserta en el head del documento (no en el encabezado de WordPress).
