get_template_part desde el complemento

4

Esta es la función predeterminada get_template_part dentro de WordPress:

function get_template_part( $slug, $name = null ) {
    do_action( "get_template_part_{$slug}", $slug, $name );

    $templates = array();
    if ( isset($name) )
        $templates[] = "{$slug}-{$name}.php";

    $templates[] = "{$slug}.php";

    locate_template($templates, true, false);
}

Estoy intentando usar esa acción para localizar un archivo de bucle de tipo de publicación personalizado desde el complemento:

add_action( "get_template_part_templates/loop", function($slug, $name){
    if ("example" == $name){
        if (!locate_template("templates/loop-{$name}.php", false, false)){
            /* What do you suggest to do here? */
        }
    }   
},10,2 );

Necesito una solución que;

  1. Comprueba si el tema tiene archivos para "ejemplo" tipo de publicación personalizada
  2. Si no tiene; use los archivos de plantilla del complemento para mostrar y no use la solución predeterminada del tema

Actualizar: este es el código al que llama la parte de la plantilla en el tema:

global $post;
get_template_part( 'templates/loop', $post->post_type );
    
pregunta Ünsal Korkmaz 03.04.2013 - 00:42

2 respuestas

1

/**
*Extend WP Core get_template_part() function to load files from the within Plugin directory defined by PLUGIN_DIR_PATH constant
* * Load the page to be displayed 
* from within plugin files directory only 
* * @uses mec_locate_admin_menu_template() function 
* * @param $slug * @param null $name 
*/ 

function mec_get_admin_menu_page($slug, $name = null) {

do_action("mec_get_admin_menu_page_{$slug}", $slug, $name);

$templates = array();
if (isset($name))
    $templates[] = "{$slug}-{$name}.php";

$templates[] = "{$slug}.php";

mec_locate_admin_menu_template($templates, true, false);
}

/* Extend locate_template from WP Core 
* Define a location of your plugin file dir to a constant in this case = PLUGIN_DIR_PATH 
* Note: PLUGIN_DIR_PATH - can be any folder/subdirectory within your plugin files 
*/ 

function mec_locate_admin_menu_template($template_names, $load = false, $require_once = true ) 
{ 
$located = ''; 
foreach ( (array) $template_names as $template_name ) { 
if ( !$template_name ) continue; 

/* search file within the PLUGIN_DIR_PATH only */ 
if ( file_exists(PLUGIN_DIR_PATH . '/' . $template_name)) { 
$located = PLUGIN_DIR_PATH . '/' . $template_name; 
break; 
} 
}

if ( $load && '' != $located )
    load_template( $located, $require_once );

return $located;
}

Luego, use la función mec_get_admin_menu_page($slug, $name = null); en cualquier lugar de sus archivos de complemento, como la función get_template_part($slug, $name = null) .

mec_get_admin_menu_page('custom-page','one'); 

La función de ejemplo anterior buscará el archivo custom-page-one.php dentro de su PLUGIN_DIR_PATH y lo cargará.

También te recomiendo que uses:

define('PLUGIN_DIR_PATH', plugin_dir_path(__FILE__));

para definir la ruta del directorio de tu complemento.

    
respondido por el user36382 08.08.2013 - 09:15
1

Debe enganchar en el filtro de inclusión de plantilla, por ejemplo,

add_filter('template_include', 'my_function_name');
function my_function_name( $template ) {
 if ("example" == $name){
  $template = dirname( __FILE__ ) . '/my-template.php';
 }
 return $template;
}

Lo pregunté aquí hace un par de años y lo he usado varias veces desde entonces para proyectos :)

    
respondido por el Gareth Gillman 26.05.2016 - 21:59

Lea otras preguntas en las etiquetas