Consejo necesario: Convertir asignaciones de categorías a valores de metadatos personalizados en WordPress

16 sept 2010, 21:24:41
Vistas: 130
Votos: 1

Antes de descubrir la capacidad de agregar un meta box (con selecciones de metadatos personalizados) al editor de páginas y entradas, estaba (y en cierta medida aún lo estoy) usando categorías para definir metadatos personalizados.

Por ejemplo, para hacer que una publicación sea nofollow o noindex, creé una categoría llamada nofollow y otra llamada noindex y asigné una o ambas categorías a una publicación o página.

Luego, en mi archivo header.php, hacía una prueba in_category para escribir las etiquetas meta apropiadas en la página.

Ejemplo:

<?php
if (in_category('noindex') && in_category('nofollow')){?>
<meta name="robots" content="noindex, nofollow">
<?php}?>

También tengo categorías personalizadas para cosas como "Desactivar Adsense en esta página", "No mostrar adjuntos de imagen en esta página", "Ocultar esta página de los menús", etc...

Así que ahora que he decidido dejar de usar categorías donde debería usar metadatos personalizados, el código anterior en header.php se convierte en...

<?php 
    if (get_post_meta( $post->ID, '_noindex', true ) && get_post_meta( $post->ID, '_nofollow', true )){?>
    <meta name="robots" content="noindex, nofollow">
<?php } ?>

Ese es mi plan, pero ahora tengo el problema de actualizar sitios que usan el método antiguo de definir opciones de publicación personalizadas mediante asignaciones de categorías.

Así que necesito una rutina que reasigne los valores de categoría a valores de metadatos personalizados para cada publicación y página en el sitio que estoy actualizando.

Solo busco algunos consejos rápidos sobre cómo abordar esto y posiblemente algunas pistas de código sobre la rutina necesaria.

Como este es un tema que se puede actualizar, como parte del proceso de actualización, me gustaría ejecutar un script una vez, cuando el tema se instala por primera vez (o el usuario hace clic en mi utilidad de actualización), que recorra la tabla de opciones y para cada instancia de una de mis asignaciones de categoría personalizada, cree la asignación de metadatos personalizados requerida para esa publicación o página.

Por ejemplo, si una publicación pertenece actualmente a la categoría "Oculta", se asignaría al metadato "_hidden".

Espero haber explicado esto lo suficientemente bien. Agradezco cualquier información que puedan proporcionar.

¿Quizás sea tan simple como una serie de declaraciones SQL personalizadas que se ejecutan para cada posible asignación de categoría?

0
Todas las respuestas a la pregunta 1
4

La idea básica sería recorrer las publicaciones y sus categorías, asignando metadatos cuando coincidan.

Algo como esto (asegúrate de probar con una copia de prueba de los datos, etc., etc.):

$posts = get_posts( array(
    'numberposts' => -1 // Obtener todas las publicaciones
) );

foreach( $posts as $post ) {

    $categories = get_the_category( $post->ID ); // Obtener categorías de la publicación

    foreach( $categories as $category ) {

        if( 'Hidden' ==  $category->name ) // Si la categoría es "Hidden"
            add_post_meta( $post->ID, '_hidden', 'yes', true ); // Añadir metadato
    }

}

Olvidé añadir la eliminación cuando se termine:

$category = get_category_by_slug( 'hidden' ); // Obtener categoría por slug
wp_delete_category( $category->term_id ); // Eliminar categoría
17 sept 2010 08:58:40
Comentarios

Se ve bien, Rarst. Lo probaré y te informaré. Muchas gracias por la respuesta rápida y exhaustiva.

Scott B Scott B
17 sept 2010 16:45:13

Esto podría no ser una buena idea si tienes una base de datos muy grande. La mayoría de los sitios probablemente podrían cargar todas las publicaciones al mismo tiempo, pero si tienes muchos miles de publicaciones, podría alcanzar el límite de tiempo de ejecución de PHP o algo similar. WP Core hace cosas como esta en fragmentos usando AJAX. Debería haber un plugin que haga esto, pero no encuentro uno.

jerclarke jerclarke
14 nov 2010 01:37:32

Si eliminaste cuidadosamente la categoría de la publicación en lugar de borrarla por completo, podrías usar un número pequeño como 500 publicaciones y simplemente recargar la página/presionar el botón hasta que no queden publicaciones en la consulta de la categoría.

jerclarke jerclarke
14 nov 2010 19:46:33

@Jeremy Clarke sí, tiene sentido. En el momento de la respuesta no profundicé en nada más complejo ya que mi respuesta inicial fue aceptada y concluí que era lo suficientemente buena para Scott.

Rarst Rarst
14 nov 2010 20:21:12