Diagnósticos Compartidos de Forge Suite
Cuando Field Forge está activo, el panel compartido Forge Suite > Configuración y Salud está disponible en el administrador de WordPress. Su acción AJAX de solo lectura es forge_suite_health_check; requiere manage_options y el nonce localizado forge_suite_health_check. La respuesta devuelve diagnósticos para plugins de Forge activos, registros de licencia locales, preparación del widget de créditos, API de Avakode /health, enlaces permanentes y plugins de origen de migración/integración como ACF y ACF Pro. No importa datos de ACF, crea grupos de campos, escribe valores de campos, llama a puntos finales de IA, gasta créditos o cambia el estado de licencia/Freemius.
Haciendo que tu Tema Funcione con Field Forge
Field Forge almacena valores en tablas de base de datos personalizadas (wp_fieldforge_values) en lugar de wp_postmeta. Proporciona una capa de función compatible con ACF para que el código de tema existente funcione sin modificaciones. Esto significa que puedes usar get_field(), the_field(), have_rows() y todas las demás funciones familiares: Field Forge las registra automáticamente cuando ACF no está activo. Durante las solicitudes de activación de ACF, Field Forge se remite a ACF para que ACF Pro pueda ser habilitado para migración sin un fatal de redeclaración de PHP.
// functions.php -- ensure field functions are always available
if ( ! function_exists( 'get_field' ) ) {
// Field Forge (or ACF) is not active -- provide fallbacks
function get_field( $selector, $post_id = false ) {
return get_post_meta( $post_id ?: get_the_ID(), $selector, true );
}
}Este patrón asegura que tu tema nunca se rompa incluso si Field Forge está desactivado. La alternativa lee desde wp_postmeta, que es donde WordPress estándar almacena campos personalizados.
// Check for Field Forge (not ACF)
if ( defined( 'FIELDFORGE_VERSION' ) ) {
// Field Forge-specific code here
$version = FIELDFORGE_VERSION; // e.g., '1.2.0'
}
// Check for Field Forge PRO features
if ( defined( 'FIELDFORGE_PRO' ) && FIELDFORGE_PRO ) {
// PRO-only code: repeaters, flexible content, options pages, etc.
}<?php
// single.php -- display custom fields on a post
$subtitle = get_field( 'subtitle' );
$hero_image = get_field( 'hero_image' ); // Returns array when return_format = 'array'
if ( $subtitle ) : ?>
<h2 class="entry-subtitle"><?php echo esc_html( $subtitle ); ?></h2>
<?php endif; ?>
<?php if ( $hero_image ) : ?>
<img src="<?php echo esc_url( $hero_image['url'] ); ?>"
alt="<?php echo esc_attr( $hero_image['alt'] ); ?>"
width="<?php echo esc_attr( $hero_image['width'] ); ?>"
height="<?php echo esc_attr( $hero_image['height'] ); ?>">
<?php endif; ?><p class="lead"><?php the_field( 'lead_text' ); ?></p><?php // archive.php or index.php
if ( have_posts() ) :
while ( have_posts() ) : the_post(); ?>
<article class="post-card">
<?php $thumb = get_field( 'card_thumbnail' ); ?>
<?php if ( $thumb ) : ?>
<img src="<?php echo esc_url( $thumb['url'] ); ?>"
alt="<?php echo esc_attr( $thumb['alt'] ); ?>"
class="post-card__image">
<?php endif; ?>
<h2><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></h2>
<p><?php the_field( 'excerpt_text' ); ?></p>
</article>
<?php endwhile;
endif; ?><?php
/**
* Template Name: About Us
*/
get_header();
$team_photo = get_field( 'team_photo' );
$mission = get_field( 'mission_statement' );
$founded_year = get_field( 'founded_year' );
?>
<main class="about-page">
<section class="about-hero">
<?php if ( $team_photo ) : ?>
<img src="<?php echo esc_url( $team_photo['url'] ); ?>"
alt="<?php echo esc_attr( $team_photo['alt'] ); ?>">
<?php endif; ?>
<div class="about-hero__content">
<h1><?php the_title(); ?></h1>
<?php if ( $mission ) : ?>
<blockquote><?php echo esc_html( $mission ); ?></blockquote>
<?php endif; ?>
<?php if ( $founded_year ) : ?>
<p class="founded">Established <?php echo esc_html( $founded_year ); ?></p>
<?php endif; ?>
</div>
</section>
</main>
<?php get_footer(); ?>Declaración de Soporte del Tema
No se requiere ninguna llamada especial add_theme_support(). Field Forge activa su capa de compatibilidad automáticamente cuando ACF no está activo. Si ACF está activo junto a Field Forge, las funciones de ACF tienen prioridad y Field Forge actúa solo como un backend de almacenamiento. La misma protección se aplica durante la activación de wp-admin y la API de plugins de WordPress, por lo que habilitar ACF Pro después de que Field Forge ya esté activo no redeclara get_field().
Estructura Recomendada del Tema
Organiza tus archivos de tema para una integración limpia de Field Forge:
my-theme/
functions.php # Load field setup, register blocks
inc/
fieldforge-setup.php # Options pages, programmatic field groups
template-functions.php # Helper functions wrapping get_field()
template-parts/
content-*.php # Partial templates using fields
builder/ # Flexible content section templates
blocks/ # PHP block templates
fieldforge-json/ # Local JSON sync directory (PRO)<?php
// inc/template-functions.php
/**
* Get the hero image URL with a fallback.
*
* @param int|false $post_id Post ID or false for current post.
* @return string Image URL.
*/
function theme_get_hero_image( $post_id = false ) {
$image = get_field( 'hero_image', $post_id );
if ( $image && isset( $image['url'] ) ) {
return $image['url'];
}
return get_template_directory_uri() . '/assets/img/default-hero.jpg';
}
/**
* Render social links from options page.
*/
function theme_render_social_links() {
$platforms = [ 'facebook', 'twitter', 'instagram', 'linkedin', 'youtube' ];
echo '<div class="social-links">';
foreach ( $platforms as $platform ) {
$url = get_field( 'social_' . $platform, 'options' );
if ( $url ) {
printf(
'<a href="%s" class="social-link social-link--%s" target="_blank" rel="noopener">%s</a>',
esc_url( $url ),
esc_attr( $platform ),
esc_html( ucfirst( $platform ) )
);
}
}
echo '</div>';
}—