Jump to content

Publish/Unpublish by date or by manual means.


moondawgy
 Share

Recommended Posts

To unpublish by manual means (without deleting or moving the page), edit a page, click on it's 'settings' tab and uncheck the 'guest' role from the access section.

There isn't a tool in the CMS to automate unpublishing by date. Though it could easily be implemented with a little API code (let me know if I can provide an example?).

However, I always encourage my clients not to delete or unpublish pages if they don't have to, unless they plan to setup 301 redirects. For example, let old news items drift further down the list rather than deleting them... someone, somewhere may be linking to it. Every link to your site carries value, even if the page being linked to isn't recent. At least the user gets what they expected and can explore further in your site. Delivering a 404 page is less likely to result in that outcome. Of course, there are lots of good reasons to delete or unpublish a page, so I'm just speaking about the situations where you don't necessarily have to delete it.

Another alternative to unpublishing is to enable the "hidden" status in the page editor (also on the Settings tab). A hidden page is excluded from find(), children() and siblings() results, which essentially excludes it from any of your dynamically generated navigation. It's not excluded from get() results, so the page can still be accessed by it's URL or loaded individually from the API.

Link to comment
Share on other sites

  • 2 weeks later...

I'd add a +1 for publish/unpublish by date. For example on sites with content like job adverts (and also with other things like events/courses - although in those cases I guess you might want to use more of a dedicated calendar type arrangement) we regularly prepare a number in advance and then set a date for them in the future to go live and then auto-expire on or before the day of the course/event.

I guess you could also rig up something in these sorts of cases to simply redirect to general info or overview page as they expire to avoid just getting a 404 after unpublishing if that's a concern?

Link to comment
Share on other sites

I will add this to the roadmap as a module (most likely a Fieldtype). But also wanted to follow up with the strategy that I use, and the reason why the need for a publish/unpublish by date has not come up before. It's because this is so easily accomplished with the API. It also gives you more control over how you want to react to such dates. Here's how:

Lets say I added a datetime field for publish date and/or expire date to the page's template. That template checks it's dates before it outputs anything. For example, lets assume we added a datetime field to the job_advert template called "expire_date". When we edited a job advert, we selected an expire_date of February 1, 2011. The job_advert template might have code like this:

<?php

if(time() > $page->getUnformatted('expire_date')) {
    throw new PageNotFoundException(); 
    // or print "sorry this posting has expired" if you don't want a 404
}
// print the job advert

Note that the getUnformatted() function above is necessary because ProcessWire will return a formatted date according to the format you specified when you created the field, "January 21, 2011" as an example. So using getUnformatted() is a way to ensure it returns a timestamp that you can use for comparison with other timestamps (like that returned by PHP's time() function). (Btw, that getUnformatted() function works with any field, returning text fields without entities or runtime markup, etc.)

Lets say that you also wanted to move the job advert to the trash since we now know it's expired:

<?php

if(time() > $page->getUnformatted('expire_date')) {
    $pages->trash($page); // move it to the trash
    throw new PageNotFoundException(); 
}
// print the job advert

Next lets assume that you didn't move the page to the trash, but you are just leaving it where it is and not disabling it or anything. If that's the case, you'll want to check that it's not expired when you links to your job adverts. So here's what your list_job_adverts template might look like:

<?php

$now = time(); 
$jobs = $page->children("expire_date>$now"); 

foreach($jobs as $job) {
    // print the job listing, being confident that it's not expired
}

If you had both expire_date and publish_date fields, then you'd find those jobs with something like this:

<?php

$now = time(); 
$jobs = $page->children("expire_date>$now, publish_date<=$now"); 
  • Like 2
Link to comment
Share on other sites

Also don't worry because I totally understand the need for a date-based publish/unpublish, and that's why it's on the roadmap. My intention was just to show a way that you could do it today if you wanted to. Also, I'm always looking for opportunities to post examples. :)

Link to comment
Share on other sites

What if instead of just unpublishing by date there's a list presented to you somewhere for all those pages that have an expiration date so that they allow you to either unpublish, delete or update/duplicate with today's date if needed?  This presents more flexibility to the admins.  Here's the scenario: you have an advertisement page type that you populate with links or banners from your clients.  The ad campaign could run for a month, expire and appear on such a list for you to update with a new ad.  Or a set of pictures from your audience with a "Flag as inappropriate" button, once the button is pressed X times it's sent into this list for you to review and unpublish/delete.

Link to comment
Share on other sites

@Rebecca: while [un-]publish by date would be a great function, anything you mentions is doable right now: if the banner is the case, just add field with dates [in] & [out] and have a little logic around it. As for second case, adding an [integer] field into your template with some js/php action should solve this right away, with no other functions needed

Link to comment
Share on other sites

How would one go around presenting this to the website admins without disturbing the core with this customization that would otherwise render itself useless if/when you upgrade PW?

Would you need to develop a whole new admin area inside PW separate from PW's admin area?

Link to comment
Share on other sites

Rebecca: please, start a new thread into API & Templates section describing a little better what you need, and I'll be happy to oblige [and Ryan, Antti or Martin will try too, I think].

P.S.: I was talking about doing this on the template level, but you can incorporate custom modules or even whole sections into ProcessWire [that's why it's called CMS/CMF, because it's framework too], but there aren't many that advanced tutorials and I believe that Ryan is the only one who did something that advanced, so far. In any situation, please create new thread [so we don't have that many hi-jacked threads with multiple things going on], describe your problem little better [so we can help you find tailored solution] and will go from there.

Link to comment
Share on other sites

  • 2 years later...
<?php

if(time() > $page->getUnformatted('publish_until')) {

    $pages->trash($page);

    throw new PageNotFoundException();

}

This works perfect for me with my news template. But how is it possible to do this by using the homepage template and any child page of the website, for example:

homepage

-news

--publish until yesterday (move to trash by accessing the homepage)

Thanks for your help!

Link to comment
Share on other sites

if I understand you correctly you just need to get the page(s) in question first, so something like:

$pagestobetrashed = $pages->find("publish_until < time()");

foreach($pagestobetrashed as $ptbt){

    $pages->trash($ptbt);

}

Link to comment
Share on other sites

Thank you, this works for me:

    $ptrashed = $pages->find("template=page_events");
    foreach($ptrashed as $ptrash) {
    if(time() > $ptrash->getUnformatted("publish_until")) {
    $pages->trash($ptrash);
    }
    }
  • Like 1
Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...