Añadir código en <head> por página o entrada
¿Existe algún plugin (o una forma relativamente fácil) para añadir código a la sección <head>
por página o entrada individual?
Tengo un sitio web multilingüe y necesito implementar el marcado rel="alternate" hreflang, por lo que necesito una forma de definir rel="alternate"
individualmente en cada página/entrada.
He buscado en los plugins de WordPress pero no he encontrado nada hasta ahora. No soy programador, así que no puedo crear algo yo mismo, ¡a menos que sea bastante sencillo!
ACTUALIZACIÓN
OK, estoy intentando crear un campo personalizado para esta funcionalidad, esto es lo que tengo hasta ahora:
<link rel="alternate" href="<?php
while (have_posts()) : the_post();
$alternate = get_post_meta($post->ID, 'alternate', false);
if ($alternate) {
echo $alternate[0];
}
endwhile;
?>" hreflang="<?php
while (have_posts()) : the_post();
$hreflang = get_post_meta($post->ID, 'hreflang', false);
if ($hreflang) {
echo $hreflang[0];
}
endwhile;
?>" />
Esto funciona bien si solo quiero añadir una página alternativa. Cuando intento añadir más, solo se añade una instancia de rel="alternate"
, reemplazando la original con la última añadida.
Además, en las páginas donde no he definido estos campos personalizados, obtengo una etiqueta vacía:
<link rel="alternate" href="" hreflang="" />
¿Alguien puede indicarme la dirección correcta para corregir estos problemas?

Como mencionaste por página/entrada, esto funcionaría para cada entrada
add_action('wp_head', 'add_link_in_head');
function add_link_in_head()
{
global $post;
if(!empty($post))
{
$alternate = get_post_meta($post->ID, 'alternate', true); // URL alternativa
$hreflang = get_post_meta($post->ID, 'hreflang', true); // Código de idioma
if(!empty($alternate) && !empty($hreflang))
{
?>
<link rel="alternate" href="<?php echo $alternate; ?>" hreflang="<?php echo $hreflang; ?>" />
<?php
}
}
}
Si no hay $alternate ni $hreflang entonces no se generará el enlace.

Usa el siguiente código en la sección <head>
:
<?php
add_action('wp_head', 'tu_funcion');
function tu_funcion() {
//tu código irá aquí
}
?>
Para más información puedes visitar aquí.

No sé cómo estás guardando tus datos, pero asumiendo que estás usando el cuadro meta "Campos personalizados" incorporado, tus múltiples páginas alternativas deberían venir como un array.
function alternate_pages_links() {
global $post;
if (!is_singular()) {
return;
}
$pat = '<link rel="alternate" href="%s" hreflang="%s" />';
$lang = get_post_meta($post->ID, 'hreflang', true);
$alt = get_post_meta($post->ID, 'alternate');
if (!empty($alt) && !empty($lang)) {
foreach ($alt as $a) {
printf($pat,$a,$lang);
}
}
}
add_action('wp_head','alternate_pages_links');
Sin embargo, veo un problema potencial. Si vas a tener múltiples pares asociados de alternate
/hreflang
por entrada, entonces necesitas guardarlos como pares en la base de datos. A menos que lo hagas, no habrá forma de saber qué hreflang
corresponde a qué alternate
. Necesitarás construir tu propio cuadro meta para eso.

Lo siento, no tengo 50 de reputación para añadir un comentario
La respuesta de dot1 es perfecta para incluir enlaces alternativos en la sección head obteniendo el valor de los meta del post, pero ahora necesitas añadir meta keys personalizadas para hreflang y valores alternativos para cada página/post desde la pantalla de edición o crear un meta box para hacerlo.
// hook del meta box para enlaces alternativos en WordPress
add_action( 'admin_init', 'add_my_link_metabox' );
// Añadir meta box
function add_my_link_metabox() {
// para posts
add_meta_box( 'link_meta_box', __( 'Atributos de Enlace Alternativo', 'Your Text Domain' ), 'my_link_data_function', 'post', 'side', 'core' );
// para páginas
add_meta_box( 'link_meta_box', __( 'Atributos de Enlace Alternativo', 'Your Text Domain' ), 'my_link_data_function', 'page', 'side', 'core' );
}
// crear una función para mostrar el metabox
function my_link_data_function() {
global $post, $post_id;
$alternate = get_post_meta($post->ID, 'alternate', true);
$hreflang = get_post_meta($post->ID, 'hreflang', true);
// generar html para el metabox ?>
<div class="admin-inside-box">
<p>
<input type="hidden" name="my_meta_nonce" value="<?php echo wp_create_nonce( basename(__FILE__) ); ?>" />
</p>
<p>
<label>Enlace alternativo</label>
<input type="text" class="widefat" name="alternate" value="<?php echo $alternate; ?>" />
</p>
<p>
<label>Atributo hreflang</label>
<input type="text" class="widefat" name="hreflang" value="<?php echo $hreflang; ?>" />
</p>
</div>
<?php
}
// ahora guardar los datos del metabox al guardar el post
// hook en la acción save_post
add_action( 'save_post', 'save_my_link_data' );
// crear función para guardar valores
function save_my_link_data() {
global $post, $post_id;
// verificar nonce
if ( !wp_verify_nonce( $_POST['my_meta_nonce'], basename(__FILE__) ) ) {
return $post_id;
}
// comprobar si el usuario actual puede editar el post
if ( !current_user_can( 'edit_post', $post_id ) ) {
return $post_id;
}
// ahora guardar/actualizar los valores en las meta keys del post
update_post_meta( $post_id, 'alternate', $_POST['alternate'] );
update_post_meta( $post_id, 'hreflang', $_POST['hreflang'] );
}
// hook para añadir enlace alternativo en wp_head
add_action('wp_head', 'add_link_in_head');
function add_link_in_head(){
global $post;
if (!empty($post)) {
$alternate = get_post_meta($post->ID, 'alternate', true);
$hreflang = get_post_meta($post->ID, 'hreflang', true);
if (!empty($alternate) && !empty($hreflang)) { ?>
<link rel="alternate" href="<?php echo $alternate; ?>" hreflang="<?php echo $hreflang; ?>" /><?php
}
}
}
Espero que esto te ayude, puedes cambiar los nombres de las funciones, etc.

¿Esto va en functions.php? Lo agregué al principio y obtuve un error: Parse error: syntax error, unexpected '<' in /xxxxxxxxx/functions.php on line 2

editado y ahora funciona, agrega esto y el código de dot1 en functions.php

Hmm, estoy obteniendo un error de análisis cada vez que agrego tu código o el de Dot a mi functions.php

@moobot ¿oh error de análisis en qué número de línea? y necesitas agregar ambos códigos, el mío y el de Dot

@moobot he editado y combinado los códigos, copia y pega el código de arriba en el functions.php de tu tema y dime si funciona.

Si estás utilizando Transposh (el plugin que he desarrollado) para gestionar tus sitios multilingües, el atributo rel=alternate se agregará automáticamente (con la opción de desactivarlo).
Sin embargo, la razón por la que estoy respondiendo esto es que, en mi experiencia, los resultados de agregar esta etiqueta han sido realmente decepcionantes, por lo que no estoy seguro de que añadirla sea útil en absoluto.
Buena suerte
