Obtener un slug de tipo de publicación personalizado para una página de archivo

10

¿Cómo descubro la barra de tipo de publicación personalizada cuando estoy en una página de archivo?

Por ejemplo, si /products/ dispara la plantilla archive-products.php , ¿cómo (de manera pragmática) obtengo la barra de tipo de publicación?

Gracias

    
pregunta Ben Everard 07.10.2012 - 13:33

7 respuestas

14

Para obtener el tipo de publicación actual use get_post_type() . Luego, pregunte get_post_type_object() para todos los datos que necesita, por ejemplo, la babosa:

$post_type = get_post_type();
if ( $post_type )
{
    $post_type_data = get_post_type_object( $post_type );
    $post_type_slug = $post_type_data->rewrite['slug'];
    echo $post_type_slug;
}
    
respondido por el fuxia 07.10.2012 - 15:48
5

Estoy usando esto fuera del bucle en la plantilla archive.php para obtener el archivo de publicación personalizado en el que estoy.

Es una combinación de los métodos recomendados por @toscho y @Rarst:

$post_type = get_queried_object();
echo $post_type->rewrite['slug'];

Actualización: @majick señaló que esto solo funciona si ha configurado la barra de reescritura para su CPT. El slug de reescritura es opcional cuando se registra un CPT y el valor predeterminado es post_type si no se establece.

    
respondido por el Jerry 29.10.2014 - 16:42
1

Debe tenerse en cuenta que si has_archive se establece en verdadero al registrar el Tipo de publicación personalizado, el archivo de tipo de publicación /cptslug/ se reescribirá internamente en ?post_type=cptslug . Así que esto también significaría que is_post_type_archive() devolverá verdadero.

Desafortunadamente, cuando la bala de reescritura registrada es diferente al tipo de publicación, en realidad no se obtiene el post_type . p.ej. si su tipo de publicación era myplugin_cars y su bala de reescritura fue cars y necesita obtener myplugin_cars , incluso esto (para evitar errores si el objeto consultado actual es no un tipo de publicación personalizada ) seguirá fallando:

$queryobject = get_queried_object();
if (has_property('rewrite',$queryobject)) {
    if (isset($queryobject->rewrite['slug'])) {
         $posttype = $queryobject->rewrite['slug'];
     }
 }

Pero como is_post_type_archive es cierto, esto es más confiable:

if (is_post_type_archive()) {
    $posttype = get_query_var('post_type');
    // which is basically the same as:
    // global $wp_query;
    // $posttype = $wp_query->query_vars['post_type'];
} 
else ($posttype = 'post';}

Pero espera, hay más ... resulta que con un poco de prueba, tampoco es así de simple ... ¿qué sucede si estás en una página de archivo de taxonomía con varios tipos de publicaciones en la taxonomía ...? ¿O asigna etiquetas de publicación a un tipo de publicación personalizado que no sea la publicación? ¿O están en una página de archivo de autor? Fecha de la página de archivo? ... o incluso tiene un tax_query o meta_query para WP_Query ?

La única respuesta confiable (sin probar cada caso de archivo posible) es hacer un bucle de las publicaciones reales en la consulta ... Aquí está la función completa que se me ocurrió para trabajar en páginas singulares y de archivo, y le permite opcionalmente, pase un objeto de consulta personalizado (o publicación de objeto / ID de publicación para publicaciones singulares):

function get_current_post_types($object=null) {

    // if a numeric value passed, assume it is a post ID
    if ( ($object) && (is_numeric($object)) ) {$object = get_post($object);}
    // if an object is passed, assume to be a post object
    if ( ($object) && (is_object($object)) ) {return get_post_type($object);}

    // standard single post type checks
    if (is_404()) {return '';}
    // update: removed this check, handled by is_singular
    // if (is_single()) {return 'post';}
    if (is_page()) {return 'page';}
    if (is_attachment()) {return 'attachment';}
    if (is_singular()) {return get_post_type();}

    // if a custom query object was not passed, use $wp_query global
    if ( (!$object) || (!is_object($object)) ) {
        global $wp_query; $object = $wp_query;
    }
    if (!is_object($object)) {return '';} // should not fail

    // if the post_type query var has been explicitly set
    // (or implicitly set on the cpt via a has_archive redirect)
    // ie. this is true for is_post_type_archive at least
    // $vqueriedposttype = get_query_var('post_type'); // $wp_query only
    if (property_exists($object,'query_vars')) {
        $posttype = $object->query_vars['post_type'];
        if ($posttype) {return $posttype;}
    }

    // handle all other cases by looping posts in query object
    $posttypes = array();
    if (method_exists($object,'found_posts')) {
        if ($object->found_posts > 0) {
            $queriedposts = $object->posts;
            foreach ($queriedposts as $queriedpost) {
                $posttype = $queriedpost->post_type;
                if (!in_array($posttype,$posttypes)) {$posttypes[] = $posttype;}
            }
            if (count($posttypes == 1)) {return $posttypes[0];}
            else {return $posttypes;}
         }
     }
     return ''; // nothin to see here
}

Esto confiablemente (¿lo dije?) devolverá una matriz de tipos de publicación si hay más de uno, o una cadena con el tipo de publicación única si solo hay un tipo. Todo lo que necesitas hacer es:

$posttypes = get_current_post_types();
// or pass a post ID 
$posttypes = get_current_post_types($postid);
// or pass a post object
$posttypes = get_current_post_types($post);
// or pass a custom query - that has been run
$posttypes = get_current_post_types($query);

Ejemplo de uso (solo por diversión):

add_filter('the_posts','myplugin_fading_thumbnails',10,2);
function myplugin_fading_thumbnails($posts,$query) {
    if (!is_archive()) {return $posts;}
    $cptslug = 'myplugin_slug'; $dosomethingcool = false;
    $posttypes = get_current_post_types($query);
    if ( (is_array($posttypes)) && (in_array($cptslug,$posttypes)) ) {$dosomethingcool = true;}
    elseif ($cptslug == $posttypes) {$dosomethingcool = true;}

    if ($dosomethingcool) {
        global $fadingthumbnails; $fadingthumbnails = $cptslug;
        if (!has_action('wp_footer','myplugin_cpt_script')) {
            add_action('wp_footer','myplugin_cpt_script');
        }
    }

    function myplugin_cpt_script() {
        global $fadingthumbnails;
        echo "<script>var thumbnailclass = 'img.thumbtype-".$fadingthumbnails."';
        function fadeoutthumbnails() {jQuery(thumbnailclass).fadeOut(3000,fadeinthumbnails);}
        function fadeinthumbnails() {jQuery(thumbnailclass).fadeIn(3000,fadeoutthumbnails);}
        jQuery(document).ready(function() {fadeoutthumbnails();});
        </script>";
    }

    return $posts;
 }

Para ver el efecto, cambie el tipo de publicación personalizada en el código a post , y agregue un atributo de clase thumbtype-post a sus imágenes en miniatura de la publicación ...

    
respondido por el majick 06.06.2016 - 20:53
1

Las respuestas se vuelven confusas. Y tal vez yo también, pero la pregunta titular es:

  

Obtenga el tipo de publicación personalizado slug para una página de archivo

Si te refieres a archivo de tipo de publicación de página de destino, y cuando is_post_type_archive() devuelve true , quieres que la barra que responde a actual vea el archivo:

/* returns /products/ */

$responding_name = str_replace(get_home_url(), '', get_post_type_archive_link(get_query_var('post_type')));

/* continue to get 'products' without slug slashes */
$responding_name = str_replace('/', '', $responding_name);

- FIN DE LA RESPUESTA A LA PREGUNTA -

Explicación :

No puedes confiar en el slug registrado . WordPress tampoco lo es. Por ejemplo, cuando se llama a get_post_type_archive_link() Wordpress, se está verificando las reglas de reescritura actuales para su instalación .

Donde quiera que esté, dentro o fuera del bucle, archivo actual o publicación única, invierta el mecanismo get_post_type_archive_link() . (Permalinks habilitados.)

Consideraciones:

Como se mencionó aquí, los tipos de publicación en consulta actual pueden ser un array . Puede ir más lejos con sus intensidades con el filtro del tipo de publicación que busca, por ejemplo:

$post_type = get_query_var('post_type'); 
if(is_array($post_type)) $post_type = reset($post_type);

o

if(isset($post_types[0])) $post_type = $post_types[0];

Otro punto de vista:

El ejemplo de Woocommerce está registrado con el objeto de tipo de publicación "productos" pero en realidad usa el nombre de la regla reescrito (tienda):

/* returns shop */
$responding_name = str_replace('/', '', str_replace(get_home_url(), '', get_post_type_archive_link('product')));
  

Marca, estoy usando $responding_name , porque los objetivos pueden variar.   Un archivo de publicación no existe, es solo una URL.

    
respondido por el cavameta 21.10.2017 - 20:32
0

Puedes usar este código:

$queried_object = get_queried_object();
$posttype_slug = $queried_object->query_var;
echo $posttype_slug;

use $ posttype_slug var lo que necesite

    
respondido por el Guy Ytzhak 03.06.2016 - 16:42
0

Puedes usar este código y este código funciona para mí,

 $t_slug = get_query_var('term');
    
respondido por el Navin Bhudiya 10.08.2016 - 06:50
-3
if( get_post_type( get_the_ID() ) == 'projects' )
{
  //enter code for this post type
}
    
respondido por el subair 13.03.2014 - 05:22

Lea otras preguntas en las etiquetas