web-dev-qa-db-fra.com

CPT: si plus de X images sont en post, utilisez la pagination

Sur mon site Web, j'ai un type de message personnalisé ("foto's"). Il contient des albums photo récupérés sur Facebook avec Facebook Photo Fetcher (plugin). Cela fonctionne très bien. Malheureusement, ce plugin ne permet pas la pagination. Cela peut entraîner des problèmes sur les pages contenant de nombreuses images (longs temps de chargement), tels que ici .

Parce que j'utilise un CPT, il me semble possible d'utiliser la pagination. Malheureusement, je n'ai jamais utilisé la pagination auparavant et je ne sais pas comment la mettre en œuvre. Est-ce dans la déclaration du cpt ou est-ce une fonction différente? Et comment pourrais-je le faire fonctionner uniquement lorsque les publications ont plus que X images?

Mon hypothèse serait de créer un modèle single-fotos.php qui diffère de celui par défaut car il utilise la pagination. Je ne sais pas comment afficher la pagination quand il y a plus que X images.

EDIT 1

En me basant sur la réponse de Matthew, j'ai essayé plusieurs choses. Il semble préférable de modifier le plug-in plutôt que d'essayer de créer un type de publication personnalisé.

J'ai ajouté les lignes suivantes:

// Look for Next page tag in starttag
        if( preg_match('/next=(\d+)/', $retVal['startTag'], $matches) )      $retVal['next']      =$matches[1];

...

// Add default value of next to defaults array
            $defaults = array('cols'    => 6,               //Number of columns of images (aka Number of images per row)
                              ...
                              'next'    => 42);               // Can be any number, but preferably a multitude of 'more'

...

// Output photos AND other tags such as more tag and next page
    foreach($photos as $photo)
        {
            //Output this photo (must get rid of [], or WP will try to run it as shortcode)
            ...
            $link = '<a rel="shadowbox[' . $aid . ']" class="fbPhoto" href="'.$photo->source . '" title="'.$caption_with_br.' " ><img src="' . $photo->picture . '" alt="" /></a>';
            $retVal['content'] .= "<dl class='gallery-item' style=\"width:$itemwidth%\">";
            $retVal['content'] .= "<dt class='gallery-icon'>$link</dt>";
            ...
            $retVal['content'] .= "</dl>\n";

            //Move on to the next row?
            if( $params['cols'] > 0 && ++$i % $params['cols'] == 0 ) $retVal['content'] .= "<br style=\"clear: both\" />\n\n";
            //Insert a more tag?
            if( $params['more'] > 0 && $i == $params['more'] ) $retVal['content'] .= "<!--more-->\n\n";
            //Insert a next page tag?
            if( $params['next'] > 0 && $i == $params['next'] ) $retVal['content'] .= "<!--nextpage-->\n\n";
        }
        if( $i%$params['cols'] != 0 ) $retVal['content'] .= "<br style=\"clear: both\" />\n\n";
        $retVal['content'] .= "</div>\n";

Le problème avec ceci est que la balise nextpage n'est rendue qu'une seule fois! Après 42 photos (par défaut), le tag suivant est inséré, mais après les 42 photos suivantes, il n'est pas rendu à nouveau. Je suppose que cela est tout à fait normal, mais je ne connais pas suffisamment PHP pour que toutes les multiplications de la valeur donnée (ou sinon, la valeur par défaut) soient affichées à partir de n = 1. Comment cela peut-il être fait?

EDIT 2

Notez que cela devrait fonctionner en combinaison avec une balise more et que la pagination ne devrait pas apparaître dans l'extrait de code. Donc, je ne veux pas  this dans un extrait. De plus, les commentaires et le champ de réponse ne doivent être placés que sur la dernière page.

1
Bram Vanroy

Essayer

$u = 0;
foreach($photos as $photo) {
$u++;

...

  if( ($params['next'] > 0 && $u == $params['next']) ) {
    $retVal['content'] .= "<!--nextpage-->\n\n";
    $u = 0;
  }

EDIT (explication)

dans le code affiché par OP $params['next'] > 0 && $i == $params['next'], en supposant que $i est incrémenté à chaque cycle foreach (cela n'est pas visible dans le code, mais cela peut être intuitif) lorsque $i > $params['next'] cela ne fonctionne pas et que le contenu suivant est ajouté une fois.

Dans mon code, utiliser $u = 0 après avoir ajouté <!--nextpage-->\n\n devrait fonctionner, car $ u est incrémenté à nouveau par foreach afin que mon code if( $params['next'] > 0 && $u == $params['next'] ) { devrait fonctionner pour chaque multiple de $ params ['next'].

1
gmazzap

Je ne connais pas bien ce plugin, mais en regardant la source, je pense que vous pourriez faire quelque chose comme ceci (EDIT: Cela ne fonctionne pas, parce que le plugin échoue s’il ya plus d’une balise par publication, voir ci-dessous pour une approche similaire) :

<!--FBGallery2 1234567890123456789 start=0 max=20 --><!--/FBGallery2-->

<!--nextpage-->

<!--FBGallery2 1234567890123456789 start=20 max=20 --><!--/FBGallery2-->

<!--nextpage-->

<!--FBGallery2 1234567890123456789 start=40 max=20 --><!--/FBGallery2-->

<!--nextpage-->

<!--FBGallery2 1234567890123456789 start=60 max=20 --><!--/FBGallery2-->

<!--nextpage-->

<!--FBGallery2 1234567890123456789 start=80 max=20 --><!--/FBGallery2-->

Puis utilisez les liens de page pour paginer le message.

La prochaine étape consisterait à ajouter une action sur wp_insert_post_data avant le plugin (en utilisant un numéro de priorité inférieur, comme 5) et à intercepter une version plus générique de la balise (sans pagination). Exécutez une recherche d'API avant le plugin pour connaître le nombre d'éléments, puis séparez-le par programme comme ci-dessus.

Modifier

Comme indiqué dans les commentaires, le plugin ne reconnaît pas plus d'un tag par message. Prenons une approche différente alors. La "balise magique" utilisée permet la mise en colonnes. Il compte le nombre de "cellules" et insère un <br style="clear: both" />. Si vous n'avez pas besoin de ce saut de ligne (puisque vous pouvez utiliser du CSS pur pour accomplir la même chose), vous pouvez le remplacer par la balise <!--nextpage-->. Voici un exemple de cela:

function wpse_100654_split_fb_album( $content ) {
    return str_replace( '<br style="clear: both" />', '<!--nextpage-->', $content );
}
add_action( 'wp_insert_post_data', 'wpse_100654_split_fb_album', 15 );

Si vous avez besoin de ce saut de ligne, comptez le nombre de lignes que vous voulez par page et remplacez-le tous les nth saut de ligne avec la balise nextpage.

1
Matthew Boynes