web-dev-qa-db-fra.com

is_home et is_front_page problème conditionnel

J'ai cet extrait dans un fichier "portfolio-loop.php". J'utilise get_template_part pour afficher la boucle sur la page d'accueil et sur d'autres pages.

J'ai ceci dans la boucle:

<?php if( !is_home() || !is_front_page() ) { ?>
  <p><?php the_time('F Y'); ?></p>
<?php endif } ?>

Je n'arrive pas à le faire pour exclure la première page. Est-ce que ça pourrait être parce que c'est dans son propre modèle?

modifier

Ok, j'ai corrigé certaines de mes erreurs sémantiques grâce à s_ha_dum et Tom Nowell. J'ai essayé les variantes suivantes:

<?php if ( !is_home() && !is_front_page() ) { ?> 
    <!--nada -->
<?php } else { ?>
    <p><?php the_time('F j, Y'); ?></p>
<?php } ?>



//dropping is_home() and trying to keep it as simple as possible
<?php if(!is_front_page()) { ?>
    <p><?php the_time('F j, Y'); ?></p>
<?php } ?>

Je ne peux toujours pas cacher le temps sur la première page. Au mieux, '<- nada ->' apparaîtra à la fois sur ma page d'accueil (home.php) et sur mes archives (category-blog.php). Ma page de catégorie personnalisée est-elle également considérée comme une page d'accueil?

modifier 2

Ce que j'essaie de faire en clair:

J'ai une boucle sur ma page d'accueil (statique, home.php) affichant trois de mes derniers articles de blog via get_template_part. La même boucle est utilisée pour ma liste category-blog.php/archive mais affiche les 10 derniers articles. Je ne veux pas afficher la date/heure sur la page de garde pour que la disposition reste plus nette, uniquement sur les autres pages sur lesquelles cette boucle est affichée.

3
Alan

Voyons si je peux me confondre.

Si soit de vos deux conditions OR est true, le code est exécuté.

is_home et is_front_page peuvent renvoyer true pour différentes pages, inversées dans votre cas. Si vous avez une page statique, ce qui semble être le cas, alors is_home est la page d’index du blog.

Remarque: WordPress 2.1 gère cette fonction différemment des versions précédentes - Voir Page de garde statique. Si vous sélectionnez une page statique comme page d'accueil (voir is_front_page ()), cette balise sera appliquée à votre "page de messages".

http://codex.wordpress.org/Function_Reference/is_home

Cela signifie que is_home sera false pour chaque page sauf votre index de blog, ce qui signifie que votre !is_home conditionnel est true pour chaque page sauf cette page d'index de blog et votre code s'exécutera presque tout le temps.

Maintenant la documentation pour is_front_page.

Il renvoie VRAI lorsque la page principale du blog est affichée et que les affichages Paramètres-> Lecture-> Première page sont réglés sur "Vos derniers messages" ou lorsque "A page statique" et que la valeur "Page de garde" est la La page actuelle est affichée.

http://codex.wordpress.org/Function_Reference/is_front_page

Il existe deux possibilités en fonction de vos paramètres. Il peut renvoyer true pour la page d'index de votre blog ou true pour votre page statique. Je pense que vous avez une page de garde statique, donc is_front_page renverra true pour cette page et la condition !is_front_page sera fausse. Parce que !is_home est (probablement, si je vous suis) true, le code est toujours exécuté.

Si vous souhaitez exclure <p><?php the_time('F Y'); ?></p> de both de l'index du blog et de la page de couverture statique, annulez la totalité de l'instruction OR:

if( !(is_home() || is_front_page()) )

Si l'un est true alors le tout est false.

Si vous souhaitez l'exclure uniquement de la page d'accueil, vous ne devriez pas du tout avoir besoin de la partie !is_home.

Si vous utilisez && au lieu de ||, alors is_home et is_front_page doivent être false pour que le code soit exécuté. En d’autres termes, vous n’êtes pas sur l’index des blogs ni sur le front en même temps.

8
s_ha_dum

Avant de traiter votre problème principal, je dois signaler une erreur de syntaxe flagrante:

<?php if( !is_home() || !is_front_page() ) { ?>
  <p><?php the_time('F Y'); ?></p>
<?php endif } ?>

Pourquoi la endif est-elle là? Cela n'a aucun sens, et tout dans la programmation a un but/une raison. Vous pourriez aussi bien le changer en marigolds-potatoe-farm, cela aura le même effet, celui d’une erreur fatale. Alors débarrassez-vous-en.

Ceci est la déclaration de base de if:

if ( this statement is true ) {
    do this
} else {
    do that
}

Il existe un raccourci pour if (): endif; etc, n'utilisez pas ceux-ci, ils sont plus problématiques à ce stade que ce qu'ils valent.

Tout cela aurait dû être saisi et mis en évidence par votre éditeur. Si ce n'était pas le cas, vous utilisez un programme d'édition incompétent. Allez chercher un éditeur avec l'auto-complétion d'accolade, PHP linting/vérification de la syntaxe, le codage en couleur et l'auto-complétion.

Les exemples incluent mais ne sont pas limités à:

  • Netbeans
  • PHPStorm
  • SublimeText
  • Komodo Edit/IDE
  • Éclipse

Ne pas rendre les choses difficiles pour vous

Passons à votre problème de logique

if( !is_home() || !is_front_page() ) {

Est-ce en prose anglaise:

Si ce n'est pas la page d'accueil, faites ceci, faites-le aussi si ce n'est pas la page d'accueil

Donc si c'est la page d'accueil, ça le fera. Si c'est la page d'accueil, il le fera.

Ce que je crois que tu voulais dire c'est:

s'il ne s'agit ni de la page d'accueil ni de la page d'accueil, faites-le.

Lequel est:

if ( !( is_home() || is_front_page() ) ) {

Ou cela peut être écrit comme:

if ( !is_home() && !is_front_page() ) {

Ou plus loin encore:

if ( !is_home() ) {
    if ( !is_front_page() ) {

Donc pour résumer

  • C'est la logique de base
  • Vous n'avez pas besoin de PHP compétences pour connaître la logique de base, les gens ont compris la logique booléenne vraie/fausse dans la Grèce antique, certains enfants le font à l'école
  • Une bonne compréhension de l'utilisation correcte des points complets vous aidera ici, car elle montre comment le fait de déplacer la virgule de 1 mot change entièrement le sens, tout comme le fait de déplacer le! && ou || peut faire la même chose. Tout est une question de sémantique.
  • Obtenez un bon éditeur, cela vous fait économiser beaucoup de temps et d’efforts massive
  • _ {Votre chèque a fonctionné à merveille, il s'agissait simplement de vérifier la mauvaise chose} _
5
Tom J Nowell

Si le but est tel:

Je ne veux pas afficher la date/heure sur la page de garde pour que la disposition reste plus nette, uniquement sur les autres pages sur lesquelles cette boucle est affichée.

Ensuite, vous devriez pouvoir utiliser un conditionnel simple:

<?php if ( ! is_front_page() ) { ?>
    <p><?php the_time('F Y'); ?></p>
<?php } ?>

Sans savoir exactement ce que vous essayez d'accomplir, il n'est pas vraiment possible de fournir la déclaration conditionnelle exacte dont vous avez besoin. Cela dit, voici les conditions dans lesquelles/ou/les deux is_home() et is_front_page() seront vrais et/ou faux).

En général

  • is_home() est vrai lorsque Blog Posts Index est affiché, que ce soit sur la page d'accueil du site ou sur une page statique désignée.
  • is_front_page() est vrai lorsque la page d'accueil du site est affichée, que la page d'accueil du site affiche l'index des articles de blog ou une page statique désignée.

Affichages de page d'accueil: Articles de blog

Lorsque la page d'accueil Site est définie pour afficher l'index articles de blogues:

  • 'posts' == get_option( 'show_on_front' )
  • Les deuxis_home() et is_front_page() sont true lorsque la première page de l'index des articles de blog est affichée.
  • Sur la page d'accueil Site, is_home() et is_front_page() sont tous deux true
  • is_home() est true, et is_front_page() est false, dans les pages suivantes (c'est-à-dire l'affichage paginé) de l'index des articles de blog
  • Sur toute autre page, les deux sont false

Affichages de la page d'accueil: page statique

Lorsque la Site Front Page est configurée pour afficher une page statique:

  • 'page' == get_option( 'show_on_front' )
  • is_home() est false et is_front_page() est true, sur la page de garde Site (c.-à-d. ID de page = get_option( 'page_on_front' ))
  • is_home() est true et is_front_page() est false, sur la page statique désignée pour afficher l'index Blog Posts (i.e. ID de page = get_option( 'page_for_posts' )
  • Les deuxis_home() et is_front_page() sont false sur toutes les autres pages
5
Chip Bennett

Je suppose que is_home et is_front_page sont similaires à is_page et que les likes de ce ne peuvent pas être utilisés dans The Loop .

Mon travail actuel, au moins, consiste à envoyer un variable à The Loop.

Donc, à titre d'exemple} _, disons que dans votre page d'accueil, vous avez une boucle de portefeuille ... peut-être quelque chose comme cette ligne ci-dessous:

get_template_part( 'loop', 'portfolio' );

Ajoutez une variable avant cette ligne et faites-la global pour pouvoir l'utiliser plus tard dans votre boucle, comme ceci:

global $hide_time;
$hide_time = true;
get_template_part( 'loop', 'portfolio' );

Ensuite, dans votre boucle , vous pouvez utiliser cette variable comme condition de votre boucle:

<?php
global $hide_time;
if( $hide_time != true ) { ?>
    <p><?php the_time('F Y'); ?></p>
<?php } ?>

NOTE: la variable doit être global dans les deux fichiers.

0
Giraldi

Pourquoi ne pas simplement extraire le code du modèle et le brancher à partir de votre fichier de fonctions de thèmes enfants comme ceci:

    add_action ( 'your_themes_hook', 'display_date_exclude_front_page' );
    function display_date_exclude_front_page() {
if ( !is_front_page() ) {
    echo the_time('F Y');
        }
    }

Remarque: N'oubliez pas de remplacer your_themes_hook par votre hook de thèmes ou par un hook WordPress.

is_front_page renvoie toujours la valeur true sur la page d'accueil.

is_home () renvoie true pour la page de messages, quel que soit l'endroit où il se trouve.

Cela peut être n'importe quelle page utilisant un modèle de page de blog ou la page d'accueil si vous utilisez le paramètre par défaut Paramètres de lecture sinon vous le modifiez ici.

enter image description here

0
Brad Dalton