web-dev-qa-db-fra.com

Est-il possible d'utiliser une seule publication personnalisée comme page d'accueil du site

Je sais que je peux définir une page statique en tant que page d'accueil, mais est-il possible de définir un seul message personnalisé en tant que page d'accueil du site?

J'ai créé un type de message personnalisé appelé "portefeuille" dans lequel les utilisateurs peuvent ajouter tout le travail qu'ils ont fait en tant que message. J'ai besoin que l'un de ces messages soit affiché comme page d'accueil, exactement comme si vous définissiez une page d'accueil statique dans les paramètres de lecture.

Merci d'avance!

3
Javier Villanueva

Vous ne voulez pas qu'un post soit la page de couverture, vous voulez qu'un type de poste personnalisé soit la page de couverture. Maintenant que nous avons la terminologie exacte, oui c'est possible.

Un client m'a demandé une fois de faire exactement la même chose. Ils avaient un type de message personnalisé dont ils avaient besoin affiché sur la page d'accueil. Cela était aussi simple que d’ajouter un filtre pour leur permettre de sélectionner une "pile" (leur type de publication personnalisé) à partir de la page de lecture:

function add_pages_to_dropdown( $pages, $r ){
    if ( ! isset( $r[ 'name' ] ) )
        return $pages;

    if ( 'page_on_front' == $r[ 'name' ] ) {
        $args = array(
            'post_type' => 'portfolio'
        );

        $portfolios = get_posts( $args );
        $pages = array_merge( $pages, $portfolios );
    }

    return $pages;
}
add_filter( 'get_pages', 'add_pages_to_dropdown', 10, 2 );

Ensuite, il vous suffit de styliser vos modèles pour utiliser les données correctement.

10
EAMann

Il y a de nombreuses façons d'y parvenir, même si certaines sont plus avancées que d'autres:

  1. Marquez le message de blog comme collant , puis définissez Messages par page sur 1 (Dashboard -> Settings -> Reading).
  2. Créez un modèle front-page.php personnalisé et interrogez le message en question, soit via la désignation sticky post, soit via la méta personnalisée post
  3. Créez un modèle front-page.php personnalisé et créez une barre latérale dynamique (zone du widget) dans laquelle vous ajoutez un widget pour afficher le message en question.
  4. (Insérer beaucoup d'autres méthodes ici ...)

Mais je dois demander: pourquoi ne pas simplement mettre le contenu de cet article de blog dans une page statique , puis attribuer cette page statique à la page avant?

Modifier

Sur la base de votre question clarification:

Eh bien, c’est une exigence du client. J’ai créé un type de message personnalisé appelé "portfolio", dans lequel il ajoute tout le travail qu’il a effectué. lecture des paramètres, mise à jour de la question.

Vous devrez utiliser l'une des méthodes suivantes:

  1. Filtrez la liste déroulante page_on_front, comme le suggère @EAMann
  2. Créez un fichier modèle front-page.php, qui interroge le bon message dans Portfolio, via une méta personnalisée ou d'autres moyens.
2
Chip Bennett

EAManns répond que c'est bien, mais ne fait rien s'il n'y a aucune page dans la base de données (puisque l'option permettant de choisir des pages de garde statiques est masquée si aucune page n'est créée). Ceci est ma tentative de résoudre ce problème:

add_filter('get_pages', function ($pages, $r) {
    if (function_exists('get_current_screen') && 'options-reading' === get_current_screen()->id) {
        $pages = array_merge($pages, get_posts(['post_type' => 'area']));
    }

    return $pages;
}, 10, 2);

(Où "zone" doit être remplacé par le nom de votre type de publication personnalisé.)

1
fiskhandlarn

Pourquoi ne pas définir un champ méta personnalisé pour "Utiliser comme page d'accueil", puis interroger cette méta et obtenir le ou les messages associés et les afficher ... naturellement, tout cela serait en front-page.php

1
mor7ifer

J'ai essayé la solution par EAMann ça marche, mais comme fiskhandlarn a remarqué que ça ne marche pas s'il n'y a pas de pages du tout. Et sa solution n'a pas fonctionné pour moi. Donc, je suggère une autre solution peut-être trop simple, mais cela fait le travail.

add_filter( 'get_pages', 'add_pages_to_dropdown', 10, 2 );
function add_pages_to_dropdown( $pages, $r ){
    if ( ! isset( $r[ 'name' ] ) ) {
        $r['name'] = 'page_on_front';
    }
    if ( 'page_on_front' == $r[ 'name' ] ) {
        $args = array(
            'post_type' => 'device'
        );
        $portfolios = get_posts( $args );
        $pages = array_merge( $pages, $portfolios );
    }
    return $pages;
}
0
user1032559