Listar todas las páginas que contienen shortcode (WordPress)

3 minutos de lectura

Estoy escribiendo un complemento para wordpress que crea códigos cortos. En esta página de configuración de complementos, me gustaría que enumere en qué páginas se está utilizando el shortcode. (Para facilitar el acceso y ubicarlos para cambios rápidos).

Supuse que sería algo con get_post(), donde buscó todas las publicaciones que coincidían con un filtro, luego las enumeró, pero parece que no puedo averiguar cuál sería la sintaxis para eso, o si esto es posible.

¿Alguna sugerencia?

  • aunque puede colocar un enlace que le notifique cuándo se está llamando/analizando su shortcode, eso aún dependería de que se cargue cada página. Vas a tener que hacer una consulta DB con seguridad. puede usar obtener publicaciones, recorrer todas las publicaciones y luego usar strpos en los campos apropiados (contenido, metaboxes personalizados, etc.), alternativamente, puede consultar la base de datos directamente: SELECT * FROM wp_postmeta` DONDE meta_value COMO ‘%[hello]%’ LÍMITE 0,1000`; esto le dará el conjunto de resultados que incluye post_ids

    – bakú

    20 de diciembre de 2018 a las 21:32


  • Recorrer todas las publicaciones no es tan buena idea. Simplemente haga un gancho en la publicación guardar/actualizar y verifique si esta publicación usó su código abreviado o no. Si lo usa, coloque la identificación de la publicación en la nueva tabla personalizada y simplemente obtenga todos los registros de su tabla personalizada.

    – amedv

    20 de diciembre de 2018 a las 23:38

  • No estoy de acuerdo, esto requiere que todas las publicaciones se hayan cargado al menos una vez para que se realice el registro. es decir, cuando instale y active su complemento por primera vez, esa lista estará incompleta. podría minimizar las consultas innecesarias simplemente haciendo su consulta/bucle en la instalación del complemento (y luego agregando esos registros a una tabla personalizada como sugiere amedv) o podría envolver dicha consulta en un caché transitorio

    – bakú

    21 de diciembre de 2018 a las 0:27


  • Trabajando en la implementación de un sistema usando la consulta: SELECT * FROM wp_posts DÓNDE post_content COMO ‘%[mod-%’ AND post_status = ‘publish’ LIMIT 0,1000 based off of @baku ‘s comment. Will post results.

    – Riley Magnuson

    Dec 21, 2018 at 0:35

I figured this out with help from the wordpress forums.

Managed to do it like this:

global $wpdb;
$query = "SELECT ID, post_title, guid FROM ".$wpdb->posts." WHERE post_content LIKE '%[mod-%' AND post_status="publish"";
$results = $wpdb->get_results ($query);

Then displayed it like so:

<?php foreach ( $results as $results ) { ?><p><a>ID;?>"><?php echo $results->post_title;?></a><br></p><?php } ?>

This will list all pages containing “[mod-” and provide a link to them.

I’ve put it in a handy shortcode 🙂

Please note: this filters for some post status’ only.

add_shortcode('find_posts_with_shortcode', function ($atts = []) { $aportes = wp_parse_args($aportes, [
        'tag' => false,
    ]);  si (!$aciertos['tag']) { return __('Se requiere el parámetro "etiqueta"');  } $etiqueta = recortar($atributos['tag']);  // Adaptado de shortcodes.php#add_shortcode if (0 !== preg_match('@[<>&/\[\]\x00-\x20=]@', $tag)) { /* traductores: 1: nombre de código abreviado, 2: lista de caracteres reservados separados por espacios.  */ return sprintf(__('Nombre de shortcode no válido: %1$s. No use espacios ni caracteres reservados: %2$s'), $etiqueta, '& /  [ ] =');  } global $wpdb;  $consulta = $wpdb->prepare( "SELECCIONE id, post_title, post_status FROM $wpdb->posts DONDE (post_content LIKE %s O post_content LIKE %s) Y post_status IN ('publicar', 'privado', 'borrador') ORDENAR POR post_title", '%[' . $wpdb->esc_like($tag) . ' %', // i.e. [tag param..]
        '%[' . $wpdb->esc_like($tag) . ']%' // es decir [tag]
    );  $shortcode_usages = $wpdb->get_results($consulta);  if (count($shortcode_usages) == 0) { return __('No se encontró ningún uso');  } ob_inicio();  foreach ($shortcode_usages as $post) { echo '' .  $post->post_title .  ' (' . $post->post_status . ')
'; } devuelve ob_get_clean(); });

¿Ha sido útil esta solución?