Comment obtenir l'identifiant de publication de type de publication personnalisé à partir de Slug?

18

Est-il possible de récupérer l'identifiant de publication de type de publication personnalisé uniquement à partir de slug?

Autant je sais que nous pouvons obtenir d'id en utilisant le titre. Mais il peut y avoir le même titre dans un type de message personnalisé, de sorte que les slugs sont uniques, est-ce possible ???

stlawrance
la source

Réponses:

40

Vous pouvez utiliser get_page_by_path()- ne laissez pas le nom vous tromper, le troisième argument est le type de message:

if ( $post = get_page_by_path( 'the_slug', OBJECT, 'post_type' ) )
    $id = $post->ID;
else
    $id = 0;
TheDeadMedic
la source
7

Si vous attendez quelques jours et passez à Wordpress 4.4 qui sortira le 8 décembre ( AFAIK ), vous pouvez utiliser le nouveau post_name__inparamètre dans WP_Querylequel prend un tableau de limaces

EXEMPLE

Si vous avez besoin de l'objet de publication complet

$args = [
    'post_type'      => 'my_custom_post_type',
    'posts_per_page' => 1,
    'post_name__in'  => ['post-slug']
];
$q = get_posts( $args );
var_dump( $q );

Si vous avez seulement besoin de l'ID

$args = [
    'post_type'      => 'my_custom_post_type',
    'posts_per_page' => 1,
    'post_name__in'  => ['post-slug'],
    'fields'         => 'ids' 
];
$q = get_posts( $args );
var_dump( $q );
Pieter Goosen
la source
Sympa, mais probablement un peu intensif pour obtenir un post par slug? Pourquoi ont-ils ajouté cette fonctionnalité!?
TheDeadMedic
1
@TheDeadMedic Mighty pourrait être un peu intensif oui, je n'ai pas vraiment testé les performances à ce sujet, juste ajouté comme moyen d'alternative ;-). Quant à savoir pourquoi, je ne sais vraiment pas, ressemble à l'une de ces choses agréables à avoir inutiles pour lesquelles WordPress est si célèbre. La convention de dénomination, à mon humble avis, est également erronée, tout comme la post_namepropriété et le category_nameparamètre, qui auraient dû être sluget nonname
Pieter Goosen
Nice :) wow en fait pour moi sa belle mise à jour :)
stlawrance
1
@TheDeadMedic Il n'y a pas de décalage horaire entre ma méthode et la vôtre. J'obtiens constamment entre 0,002 et 0,005 secondes pour exécuter chacune de nos requêtes. En outre, les deux méthodes exécutent une seule requête. ;-)
Pieter Goosen
1
@TheDeadMedic Je voulais juste dire que PHP a moins de travail à faire - oui, bien sûr, tout à fait d'accord. Il est toujours agréable de connaître des alternatives ( bien que ce ne soit pas toujours le meilleur ) et d'avoir une sorte de référence. Profitez ;-)
Pieter Goosen
5

Si vous voulez juste l'identifiant de l'article, cela fera l'affaire en une seule ligne.

url_to_postid( site_url('the_slug') );
Syclone
la source
1
C'est url_to_postidune fonction très flexible: vous pouvez passer n'importe quel type de permalien / URL complète et obtenir le post-ID le plus précis pour cette URL. Cependant, en raison de l'utilisation flexible, il est assez lent (en particulier avec beaucoup de points d'extrémité / post-types). Si vous ne passez qu'un slug pour un type de message spécifique, il est beaucoup plus rapide à utiliserget_page_by_path()
Philipp