Shortcode para crear informes SEO de Custom Post Types

Tabla de contenidos

El SEO es una parte esencial de cualquier estrategia de marketing digital. Ayuda a optimizar su sitio web para los motores de búsqueda, lo que a su vez aumenta la visibilidad y atrae más tráfico. Para aquellos que manejan Custom Post Types en WordPress, puede ser un desafío encontrar una solución de SEO que ofrezca una visión detallada y analítica para estos tipos de publicaciones personalizadas.

Por eso, en Generacionweb utilizamos nuestros propios shortcodes con la creación de informes SEO detallados para cualquier Custom Post Type.

Shortcode compatible con el plugin Yoast Seo

Este shortcode solo funciona con el plugin Yoast SEO debido a que está diseñado para interactuar específicamente con las metaetiquetas y los campos personalizados que este plugin añade a cada publicación. Yoast SEO es uno de los plugins de SEO más populares y completos disponibles para WordPress, proporcionando una amplia gama de características que ayudan a optimizar tu sitio web para los motores de búsqueda. Nuestro shortcode aprovecha estas características y las utiliza para generar informes SEO detallados para los Custom Post Types.

function infoseo_shortcode($atts) {
    $cpt = isset($atts['cpt']) ? $atts['cpt'] : '';

    $args = array(
        'post_type' => $cpt,
        'posts_per_page' => -1,
    );

    $posts = get_posts($args);

    $output = '';

    $output .= '<style>';
    $output .= '.index-yes { background-color: #c9f2d4; }';
    $output .= '.index-no { background-color: #e3e3e3!important; }';
    $output .= '.missing-data { background-color: #f2c9c9; }';
    $output .= '.data-invalid { background-color: #ffe1e1; }';
    $output .= '</style>';

    $output .= '<table style="font-size: 12px;">';
    $output .= '<tr>';
    $output .= '<th>Título</th>';
    $output .= '<th>Slug</th>';
    $output .= '<th>Keyword</th>';
    $output .= '<th>Título SEO</th>';
    $output .= '<th>Meta Description <br><small>(120 - 156)</small></th>';
    $output .= '<th>Imagen</th>';
    $output .= '<th>Slug de imagen</th>';
    $output .= '<th>Alt de imagen</th>';
    $output .= '<th>Estado de Indexación</th>'; // Agregamos un nuevo encabezado de columna
    $output .= '</tr>';

    foreach ($posts as $post) {
        $title = get_the_title($post->ID);
        $slug = str_replace(home_url(), '', get_permalink($post->ID));
        $keyword = get_post_meta($post->ID, '_yoast_wpseo_focuskw', true);
        $seo_title = get_post_meta($post->ID, '_yoast_wpseo_title', true);
        $meta_description = get_post_meta($post->ID, '_yoast_wpseo_metadesc', true);
        $noindex = WPSEO_Meta::get_value('meta-robots-noindex', $post->ID);
        $thumbnail = get_the_post_thumbnail_url($post->ID, 'thumbnail');
        $slug_image = basename($thumbnail);
        $alt_image = get_post_meta(get_post_thumbnail_id($post->ID), '_wp_attachment_image_alt', true);

        $indexation = ($noindex === '1') ? 'NOINDEX' : 'INDEX';

        $has_empty_fields = empty($title) || empty($slug) || empty($keyword) || empty($seo_title) || empty($meta_description) || empty($thumbnail) || empty($slug_image) || empty($alt_image);

        $row_class = $has_empty_fields ? 'missing-data' : '';

        $output .= '<tr class="' . $row_class . '">';
        $output .= '<td><a href="' . get_permalink($post->ID) . '" target="_blank">' . $title . '</a></td>';
        $output .= '<td>' . $slug . '</td>';
        $output .= '<td>' . $keyword . '</td>';
        // Check meta title length and if it's not empty
        if (!empty($seo_title)) {
            $title_class = (mb_strlen($seo_title) < 30 || mb_strlen($seo_title) > 60) ? 'data-invalid' : '';
            $output .= '<td class="' . $title_class . '">' . $seo_title . '('.mb_strlen($seo_title).')</td>';
        } else {
            $output .= '<td></td>';
        }
        // Check meta description length and if it's not empty
        if (!empty($meta_description)) {
            $description_class = (mb_strlen($meta_description) < 120 || mb_strlen($meta_description) > 156) ? 'data-invalid' : '';
            $output .= '<td class="' . $description_class . '">' . $meta_description . '('.mb_strlen($meta_description).')</td>';
        } else {
            $output .= '<td></td>';
        }

        $output .= '<td><img src="' . $thumbnail . '" /></td>';
        $output .= '<td>' . $slug_image . '</td>';
        $output .= '<td>' . $alt_image . '</td>';
        $output .= '<td>' . $indexation . '</td>'; // Agregamos el estado de indexación a la fila
        $output .= '</tr>';
    }

    $output .= '</table>';

    if ($output === '<table></table>') {
        $output = 'No se encontraron ' . $cpt . ' indexados.';
    }

    return $output;
}

add_shortcode('infoseo', 'infoseo_shortcode');

Shortcode compatible con el plugin Rank Math

Este shortcode está diseñado exclusivamente para trabajar con el plugin Rank Math SEO, ya que se integra directamente con las metaetiquetas y los campos personalizados que Rank Math añade a cada entrada. Rank Math es uno de los plugins de SEO más completos y ampliamente utilizados para WordPress, ofreciendo un conjunto diverso de herramientas que facilitan la optimización de tu sitio web para los motores de búsqueda.

function infoseo_shortcode($atts) {
    $cpt = isset($atts['cpt']) ? $atts['cpt'] : '';

    $args = array(
        'post_type' => $cpt,
        'posts_per_page' => -1,
    );

    $posts = get_posts($args);

    $output = '';

    $output .= '<style>';
    $output .= '.index-yes { background-color: #c9f2d4; }';
    $output .= '.index-no { background-color: #e3e3e3!important; }';
    $output .= '.missing-data { background-color: #f2c9c9; }';
    $output .= '.data-invalid { background-color: #ffe1e1; }';
    $output .= '</style>';

    $output .= '<table style="font-size: 12px;">';
    $output .= '<tr>';
    $output .= '<th>Título</th>';
    $output .= '<th>Slug</th>';
    $output .= '<th>Keyword</th>';
    $output .= '<th>Título SEO</th>';
    $output .= '<th>Meta Description <br><small>(120 - 156)</small></th>';
    $output .= '<th>Imagen</th>';
    $output .= '<th>Slug de imagen</th>';
    $output .= '<th>Alt de imagen</th>';
    $output .= '</tr>';

    foreach ($posts as $post) {
        $title = get_the_title($post->ID);
        $slug = str_replace(home_url(), '', get_permalink($post->ID));
        $thumbnail_id = get_post_thumbnail_id($post->ID);
        $thumbnail = get_the_post_thumbnail_url($post->ID, 'thumbnail');
        $slug_image = basename(get_attached_file($thumbnail_id));
        $alt_image = get_post_meta($thumbnail_id, '_wp_attachment_image_alt', true);

        // Try to get Rank Math data
        $keyword = get_post_meta($post->ID, 'rank_math_focus_keyword', true);
        $seo_title = get_post_meta($post->ID, 'rank_math_title', true);
        $meta_description = get_post_meta($post->ID, 'rank_math_description', true);

        $has_empty_fields = empty($title) || empty($slug) || empty($keyword) || empty($seo_title) || empty($meta_description) || empty($thumbnail) || empty($slug_image) || empty($alt_image);

        $row_class = $has_empty_fields ? 'missing-data' : '';

        $output .= '<tr class="' . $row_class . '">';
        $output .= '<td><a href="' . get_permalink($post->ID) . '" target="_blank">' . $title . '</a></td>';
        $output .= '<td>' . $slug . '</td>';
        $output .= '<td>' . $keyword . '</td>';
        // Check meta title length and if it's not empty
        if (!empty($seo_title)) {
            $title_class = (mb_strlen($seo_title) < 30 || mb_strlen($seo_title) > 60) ? 'data-invalid' : '';
            $output .= '<td class="' . $title_class . '">' . $seo_title . '('.mb_strlen($seo_title).')</td>';
        } else {
            $output .= '<td></td>';
        }

        // Check meta description length and if it's not empty
        if (!empty($meta_description)) {
            $description_class = (mb_strlen($meta_description) < 120 || mb_strlen($meta_description) > 156) ? 'data-invalid' : '';
            $output .= '<td class="' . $description_class . '">' . $meta_description . '('.mb_strlen($meta_description).')</td>';
        } else {
            $output .= '<td></td>';
        }

        $output .= '<td><img style="width:100px" src="' . $thumbnail . '" /></td>';
        $output .= '<td>' . $slug_image . '</td>';
        $output .= '<td>' . $alt_image . '</td>';
        $output .= '</tr>';
    }

    $output .= '</table>';

    if ($output === '<table></table>') {
        $output = 'No se encontraron ' . $cpt . ' indexados.';
    }

    return $output;
}

add_shortcode('infoseo', 'infoseo_shortcode');

 

¿Cómo utilizar el plugin?

Ejemplo:

Captura de pantalla 2023 07 21 a las 15.41.34

Para utilizar este shortcode y generar informes SEO para tus Custom Post Types, sigue estos pasos:

  1. Asegúrate de tener instalado y activado el plugin Yoast SEO o Rank Math en tu sitio WordPress.
  2. Agrega el código del shortcode en el archivo functions.php de tu tema o en un plugin tipo Snippets.
  3. Crea una nueva página en tu sitio WordPress donde quieras mostrar el informe SEO. En el editor de contenido de esta página, inserta el shortcode,  añadiendo en cpt=»page» o con el nombre de tu Custom Post Type. También puedes utilizar ‘post’, ‘product’, etc.
  4. Publica la página y visita la URL para ver el informe SEO generado.

Recomendamos configurar la página del informe como privada para que solo los administradores y editores puedan acceder a ella. Esto se puede hacer en la configuración de visibilidad de la página en el editor de WordPress. Al hacerlo, te aseguras de que la información detallada de SEO de tus Custom Post Types no sea accesible para el público general, manteniendo así la seguridad y privacidad de tus datos SEO.

 

Picture of Jose Hilario
Jose Hilario
¡Apasionado del diseño web! Especializado en WordPress, WooCommerce y Elementor PRO. Me encanta diseñar páginas web atractivas y optimizadas para SEO. Mi objetivo: impulsar a las empresas con un diseño web atractivo y funcional.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Categorías

¿Necesitas una web? Contacta con nosotros.

Relacionados: